From dc66afff944b6393738cab96cb13e7495e784196 Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Thu, 29 Apr 2004 19:39:21 +0000 Subject: [PATCH] fix bug 60422 - Template offsets are not correct in Structural Parse mode Fix bug 60480 - Template parameter is not parsed correctly in Structural parse mode fix offset information for template parameters --- .../cdt/core/parser/ast/IASTFactory.java | 2 +- .../cdt/internal/core/parser/Parser.java | 48 +++++++--- .../ast/complete/ASTTemplateDeclaration.java | 14 ++- .../ast/complete/ASTTemplateParameter.java | 7 +- .../ast/complete/CompleteParseASTFactory.java | 31 +++--- .../expression/ExpressionParseASTFactory.java | 3 +- .../ast/quick/ASTTemplateParameter.java | 96 ++++++++++++++++++- .../ast/quick/QuickParseASTFactory.java | 4 +- .../core/parser/pst/ParserSymbolTable.java | 10 ++ .../core/parser/pst/TemplateSymbol.java | 32 +++---- 10 files changed, 194 insertions(+), 53 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTFactory.java index d441b5ac0db..839af708357 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTFactory.java @@ -212,7 +212,7 @@ public interface IASTFactory public IASTTemplateDeclaration createTemplateDeclaration( IASTScope scope, List templateParameters, boolean exported, int startingOffset, int startingLine ) throws ASTSemanticException; - public IASTTemplateParameter createTemplateParameter( IASTTemplateParameter.ParamKind kind, String identifier, IASTTypeId defaultValue, IASTParameterDeclaration parameter, List parms, IASTCodeScope parameterScope ) throws ASTSemanticException; + public IASTTemplateParameter createTemplateParameter( IASTTemplateParameter.ParamKind kind, String identifier, IASTTypeId defaultValue, IASTParameterDeclaration parameter, List parms, IASTCodeScope parameterScope, int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine ) throws ASTSemanticException; public IASTTemplateInstantiation createTemplateInstantiation(IASTScope scope, int startingOffset, int startingLine); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java index 4c93be8a5da..5c4f4ac0b87 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java @@ -428,6 +428,7 @@ public abstract class Parser extends ExpressionParser implements IParser protected IASTDeclaration templateDeclaration(IASTScope scope) throws EndOfFileException, BacktrackException { + IToken mark = mark(); IToken firstToken = null; boolean exported = false; if (LT(1) == IToken.t_export) @@ -452,6 +453,7 @@ public abstract class Parser extends ExpressionParser implements IParser catch (Exception e) { logException( "templateDeclaration:createTemplateInstantiation", e ); //$NON-NLS-1$ + backup( mark ); throw backtrack; } templateInstantiation.enterScope( requestor ); @@ -480,6 +482,7 @@ public abstract class Parser extends ExpressionParser implements IParser catch (Exception e) { logException( "templateDeclaration:createTemplateSpecialization", e ); //$NON-NLS-1$ + backup( mark ); throw backtrack; } templateSpecialization.enterScope(requestor); @@ -524,6 +527,7 @@ public abstract class Parser extends ExpressionParser implements IParser } catch (BacktrackException bt) { + backup( mark ); throw bt; } } @@ -569,11 +573,10 @@ public abstract class Parser extends ExpressionParser implements IParser return returnValue; if (LT(1) == IToken.t_class || LT(1) == IToken.t_typename) { - IASTTemplateParameter.ParamKind kind = - (consume().getType() == IToken.t_class) - ? IASTTemplateParameter.ParamKind.CLASS - : IASTTemplateParameter.ParamKind.TYPENAME; - + IASTTemplateParameter.ParamKind kind = (consume().getType() == IToken.t_class) + ? IASTTemplateParameter.ParamKind.CLASS + : IASTTemplateParameter.ParamKind.TYPENAME; + IToken startingToken = lastToken; IToken id = null; IASTTypeId typeId = null; try @@ -603,7 +606,12 @@ public abstract class Parser extends ExpressionParser implements IParser typeId, null, null, - ( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null )); + ( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null, + startingToken.getOffset(), startingToken.getLineNumber(), + (id != null) ? id.getOffset() : 0, + (id != null) ? id.getEndOffset() : 0, + (id != null) ? id.getLineNumber() : 0, + lastToken.getEndOffset(), lastToken.getLineNumber() )); } catch (Exception e) { @@ -615,6 +623,7 @@ public abstract class Parser extends ExpressionParser implements IParser else if (LT(1) == IToken.t_template) { consume(IToken.t_template); + IToken startingToken = lastToken; consume(IToken.tLT); List subResult = templateParameterList(parameterScope); @@ -643,7 +652,12 @@ public abstract class Parser extends ExpressionParser implements IParser optionalTypeId, null, subResult, - ( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null )); + ( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null, + startingToken.getOffset(), startingToken.getLineNumber(), + (optionalId != null) ? optionalId.getOffset() : 0, + (optionalId != null) ? optionalId.getEndOffset() : 0, + (optionalId != null) ? optionalId.getLineNumber() : 0, + lastToken.getEndOffset(), lastToken.getLineNumber() )); } catch (Exception e) { @@ -660,10 +674,8 @@ public abstract class Parser extends ExpressionParser implements IParser { ParameterCollection c = new ParameterCollection(); parameterDeclaration(c, parameterScope); - DeclarationWrapper wrapper = - (DeclarationWrapper)c.getParameters().get(0); - Declarator declarator = - (Declarator)wrapper.getDeclarators().next(); + DeclarationWrapper wrapper = (DeclarationWrapper)c.getParameters().get(0); + Declarator declarator = (Declarator)wrapper.getDeclarators().next(); try { returnValue.add( @@ -677,11 +689,17 @@ public abstract class Parser extends ExpressionParser implements IParser wrapper.getTypeSpecifier(), declarator.getPointerOperators(), declarator.getArrayModifiers(), - null, null, declarator.getName() == null - ? "" //$NON-NLS-1$ - : declarator.getName(), declarator.getInitializerClause(), wrapper.getStartingOffset(), wrapper.getStartingLine(), declarator.getNameStartOffset(), declarator.getNameEndOffset(), declarator.getNameLine(), wrapper.getEndOffset(), wrapper.getEndLine()), + null, null, + declarator.getName() == null ? "" : declarator.getName(), //$NON-NLS-1$ + declarator.getInitializerClause(), + wrapper.getStartingOffset(), wrapper.getStartingLine(), + declarator.getNameStartOffset(), declarator.getNameEndOffset(), declarator.getNameLine(), + wrapper.getEndOffset(), wrapper.getEndLine()), null, - ( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null )); + ( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null, + wrapper.getStartingOffset(), wrapper.getStartingLine(), + declarator.getNameStartOffset(), declarator.getNameEndOffset(), declarator.getNameLine(), + wrapper.getEndOffset(), wrapper.getEndLine() )); } catch (Exception e) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTemplateDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTemplateDeclaration.java index 3cf4500a7fd..ad67645a40f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTemplateDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTemplateDeclaration.java @@ -11,6 +11,7 @@ package org.eclipse.cdt.internal.core.parser.ast.complete; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import org.eclipse.cdt.core.parser.ISourceElementRequestor; @@ -21,6 +22,7 @@ import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration; import org.eclipse.cdt.internal.core.parser.ast.NamedOffsets; import org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol; import org.eclipse.cdt.internal.core.parser.pst.ISymbol; +import org.eclipse.cdt.internal.core.parser.pst.ISymbolASTExtension; import org.eclipse.cdt.internal.core.parser.pst.ITemplateFactory; import org.eclipse.cdt.internal.core.parser.pst.ITemplateSymbol; import org.eclipse.cdt.internal.core.parser.pst.StandardSymbolExtension; @@ -63,7 +65,7 @@ public class ASTTemplateDeclaration extends ASTSymbol implements IASTTemplateDec factory.pushTemplate( template ); - templateParameters = parameters; + templateParameters = ( parameters != null ) ? parameters : new LinkedList(); ownerScope = scope; } @@ -85,8 +87,14 @@ public class ASTTemplateDeclaration extends ASTSymbol implements IASTTemplateDec public IASTDeclaration getOwnedDeclaration() { if( owned != null && owned.getASTExtension() != null ){ - ASTNode node = owned.getASTExtension().getPrimaryDeclaration(); - return ( node instanceof IASTDeclaration ) ? (IASTDeclaration)node : null; + ISymbolASTExtension extension = owned.getASTExtension(); + Iterator i = extension.getAllDefinitions(); + ASTSymbol s = null; + while( i.hasNext() ){ + s = (ASTSymbol) i.next(); + } + + return s; } IContainerSymbol ownedSymbol = getTemplateSymbol().getTemplatedSymbol(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTemplateParameter.java index 4833a8df7d0..8113aa25cf0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTTemplateParameter.java @@ -40,12 +40,17 @@ public class ASTTemplateParameter extends ASTSymbol implements IASTTemplateParam * @param parameter2 * @param parms2 */ - public ASTTemplateParameter(ISymbol sym, IASTTypeId defVal, IASTParameterDeclaration param, List parms ) { + public ASTTemplateParameter(ISymbol sym, IASTTypeId defVal, IASTParameterDeclaration param, List parms, int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine ) { super( sym ); symbol = sym; defaultValue = defVal; parameter = (ASTParameterDeclaration) param; this.parms = parms; + + setStartingOffsetAndLineNumber(startingOffset, startingLine); + setEndingOffsetAndLineNumber(endingOffset, endingLine); + setNameOffset(nameOffset); + setNameEndOffsetAndLineNumber( nameEndOffset, nameLine ); } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTTemplateParameter#getTemplateParameterKind() diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java index bcd8a943305..ebb21a09f45 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java @@ -909,12 +909,16 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto return null; } + Iterator i = symbol.getASTExtension().getAllDefinitions(); + ASTSymbol declaration = i.hasNext() ? (ASTSymbol) i.next() : null; + ASTSymbol definition = i.hasNext() ? (ASTSymbol) i.next() : null; + // assert (symbol != null ) : "createReference cannot be called on null symbol "; if( symbol.getTypeInfo().checkBit( TypeInfo.isTypedef ) || symbol.getASTExtension().getPrimaryDeclaration() instanceof IASTTypedefDeclaration ) - return new ASTTypedefReference( offset, referenceElementName, (IASTTypedefDeclaration)symbol.getASTExtension().getPrimaryDeclaration()); + return new ASTTypedefReference( offset, referenceElementName, (IASTTypedefDeclaration)declaration); else if( symbol.getType() == TypeInfo.t_namespace ) - return new ASTNamespaceReference( offset, referenceElementName, (IASTNamespaceDefinition)symbol.getASTExtension().getPrimaryDeclaration()); + return new ASTNamespaceReference( offset, referenceElementName, (IASTNamespaceDefinition)declaration); else if( symbol.getType() == TypeInfo.t_class || symbol.getType() == TypeInfo.t_struct || symbol.getType() == TypeInfo.t_union ) @@ -922,10 +926,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto else if( symbol.getType() == TypeInfo.t_enumeration ) return new ASTEnumerationReference( offset, referenceElementName, (IASTEnumerationSpecifier)symbol.getASTExtension().getPrimaryDeclaration() ); else if( symbol.getType() == TypeInfo.t_enumerator ) - return new ASTEnumeratorReference( offset, referenceElementName, (IASTEnumerator)symbol.getASTExtension().getPrimaryDeclaration() ); + return new ASTEnumeratorReference( offset, referenceElementName, (IASTEnumerator)declaration ); else if(( symbol.getType() == TypeInfo.t_function ) || (symbol.getType() == TypeInfo.t_constructor)) { - ASTNode referenced = symbol.getASTExtension().getPrimaryDeclaration(); + ASTNode referenced = (definition != null) ? definition : declaration; if( referenced instanceof IASTMethod ) return new ASTMethodReference( offset, referenceElementName, (IASTMethod)referenced ); else @@ -947,7 +951,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto symbol.getContainingSymbol().getType() == TypeInfo.t_struct || symbol.getContainingSymbol().getType() == TypeInfo.t_union ) { - return new ASTFieldReference( offset, referenceElementName, (IASTField)symbol.getASTExtension().getPrimaryDeclaration()); + return new ASTFieldReference( offset, referenceElementName, (IASTField)(definition != null ? definition : declaration )); } else if( ( symbol.getContainingSymbol().getType() == TypeInfo.t_function || symbol.getContainingSymbol().getType() == TypeInfo.t_constructor ) && @@ -955,11 +959,11 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto ((IParameterizedSymbol)symbol.getContainingSymbol()).getParameterList() != null && ((IParameterizedSymbol)symbol.getContainingSymbol()).getParameterList().contains( symbol ) ) { - return new ASTParameterReference( offset, referenceElementName, (IASTParameterDeclaration)symbol.getASTExtension().getPrimaryDeclaration() ); + return new ASTParameterReference( offset, referenceElementName, (IASTParameterDeclaration)declaration ); } else { - ASTNode s = symbol.getASTExtension().getPrimaryDeclaration(); + ASTNode s = (definition != null) ? definition : declaration; if(s instanceof IASTVariable) return new ASTVariableReference( offset, referenceElementName, (IASTVariable)s); else if (s instanceof IASTParameterDeclaration) @@ -2807,7 +2811,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto IASTTypeId defaultValue, IASTParameterDeclaration parameter, List parms, - IASTCodeScope parameterScope ) throws ASTSemanticException + IASTCodeScope parameterScope, + int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine ) throws ASTSemanticException { ISymbol symbol = null; if( kind == ParamKind.TEMPLATE_LIST ){ @@ -2830,7 +2835,6 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto if( kind == ParamKind.CLASS || kind == ParamKind.TYPENAME ){ symbol.getTypeInfo().setTemplateParameterType( TypeInfo.t_typeName ); } else /*ParamKind.PARAMETER*/ { - pst.newSymbol( identifier, TypeInfo.t_templateParameter ); symbol.setName( parameter.getName() ); symbol.setTypeInfo( ((ASTSimpleTypeSpecifier)parameter.getTypeSpecifier()).getSymbol().getTypeInfo() ); symbol.getTypeInfo().setTemplateParameterType( symbol.getType() ); @@ -2852,7 +2856,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto } catch (ASTNotImplementedException e1) { } } - ASTTemplateParameter ast = new ASTTemplateParameter( symbol, defaultValue, parameter, parms ); + + ASTTemplateParameter ast = new ASTTemplateParameter( symbol, defaultValue, parameter, parms, startingOffset, startingLine, nameOffset, nameEndOffset, nameLine, endingOffset, endingLine ); attachSymbolExtension( symbol, ast, false ); @@ -2865,7 +2870,9 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto IASTScope scope, int startingOffset, int startingLine) { - return new ASTTemplateInstantiation( scope ); + ASTTemplateInstantiation inst = new ASTTemplateInstantiation( scope ); + inst.setStartingOffsetAndLineNumber( startingOffset, startingLine ); + return inst; } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createTemplateSpecialization(org.eclipse.cdt.core.parser.ast.IASTScope, int) @@ -2877,7 +2884,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto ITemplateSymbol template = pst.newTemplateSymbol( ParserSymbolTable.EMPTY_NAME ); ASTTemplateSpecialization ast = new ASTTemplateSpecialization( template, scope ); - + ast.setStartingOffsetAndLineNumber( startingOffset, startingLine ); attachSymbolExtension( template, ast, false ); return ast; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/expression/ExpressionParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/expression/ExpressionParseASTFactory.java index 5b738907b8a..3e8bcebea1a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/expression/ExpressionParseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/expression/ExpressionParseASTFactory.java @@ -737,7 +737,8 @@ public class ExpressionParseASTFactory extends BaseASTFactory implements IASTFac String identifier, IASTTypeId defaultValue, IASTParameterDeclaration parameter, - List parms, IASTCodeScope parameterScope) { + List parms, IASTCodeScope parameterScope, + int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine) { // TODO Auto-generated method stub return null; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTTemplateParameter.java index 37a33aa2e74..35d1d9ee595 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTTemplateParameter.java @@ -16,15 +16,18 @@ import java.util.List; import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException; import org.eclipse.cdt.core.parser.ast.IASTNode; +import org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement; import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.parser.ast.IASTTemplateParameter; +import org.eclipse.cdt.internal.core.parser.ast.NamedOffsets; /** * @author jcamelon * */ -public class ASTTemplateParameter implements IASTTemplateParameter +public class ASTTemplateParameter implements IASTTemplateParameter, IASTOffsetableNamedElement { + private final NamedOffsets offsets = new NamedOffsets(); private final List templateParms; private final IASTParameterDeclaration parameter; private final ParamKind kind; @@ -36,14 +39,19 @@ public class ASTTemplateParameter implements IASTTemplateParameter * @param defaultValue * @param parameter */ - public ASTTemplateParameter(ParamKind kind, String identifier, String defaultValue, IASTParameterDeclaration parameter, List templateParms) + public ASTTemplateParameter(ParamKind kind, String identifier, String defaultValue, IASTParameterDeclaration parameter, List templateParms, int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine ) { this.kind = kind; this.identifier = identifier; this.defaultValue = defaultValue; this.parameter = parameter; this.templateParms = templateParms; + setStartingOffsetAndLineNumber( startingOffset, startingLine ); + setEndingOffsetAndLineNumber( endingOffset, endingLine ); + setNameOffset( nameOffset ); + setNameEndOffsetAndLineNumber(nameEndOffset, nameLine); } + /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTTemplateParameter#getTemplateParameterKind() */ @@ -102,5 +110,89 @@ public class ASTTemplateParameter implements IASTTemplateParameter // TODO Auto-generated method stub return null; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getName() + */ + public String getName() { + return identifier; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameOffset() + */ + public int getNameOffset() { + return offsets.getNameOffset(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#setNameOffset(int) + */ + public void setNameOffset(int o) { + offsets.setNameOffset( o ); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameEndOffset() + */ + public int getNameEndOffset() { + return offsets.getNameEndOffset(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#setNameEndOffsetAndLineNumber(int, int) + */ + public void setNameEndOffsetAndLineNumber(int offset, int lineNumber) { + offsets.setNameEndOffsetAndLineNumber( offset, lineNumber ); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameLineNumber() + */ + public int getNameLineNumber() { + return offsets.getNameLineNumber(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#setStartingOffsetAndLineNumber(int, int) + */ + public void setStartingOffsetAndLineNumber(int offset, int lineNumber) { + offsets.setStartingOffsetAndLineNumber( offset, lineNumber ); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#setEndingOffsetAndLineNumber(int, int) + */ + public void setEndingOffsetAndLineNumber(int offset, int lineNumber) { + offsets.setEndingOffsetAndLineNumber(offset, lineNumber); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getStartingOffset() + */ + public int getStartingOffset() { + return offsets.getStartingOffset(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getEndingOffset() + */ + public int getEndingOffset() { + return offsets.getEndingOffset(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getStartingLine() + */ + public int getStartingLine() { + return offsets.getStartingLine(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getEndingLine() + */ + public int getEndingLine() { + return offsets.getEndingLine(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/QuickParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/QuickParseASTFactory.java index 3083585743e..7544242ca3b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/QuickParseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/QuickParseASTFactory.java @@ -248,9 +248,9 @@ public class QuickParseASTFactory extends BaseASTFactory implements IASTFactory /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createTemplateParameter(org.eclipse.cdt.core.parser.ast.IASTTemplateParameter.ParameterKind, org.eclipse.cdt.core.parser.IToken, java.lang.String, org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration) */ - public IASTTemplateParameter createTemplateParameter(IASTTemplateParameter.ParamKind kind, String identifier, IASTTypeId defaultValue, IASTParameterDeclaration parameter, List parms, IASTCodeScope parameterScope) + public IASTTemplateParameter createTemplateParameter(IASTTemplateParameter.ParamKind kind, String identifier, IASTTypeId defaultValue, IASTParameterDeclaration parameter, List parms, IASTCodeScope parameterScope, int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine) { - return new ASTTemplateParameter( kind, identifier, defaultValue != null ? defaultValue.getTypeOrClassName() : "", parameter, parms ); //$NON-NLS-1$ + return new ASTTemplateParameter( kind, identifier, defaultValue != null ? defaultValue.getTypeOrClassName() : "", parameter, parms, startingOffset, startingLine, nameOffset, nameEndOffset, nameLine, endingOffset, endingLine ); //$NON-NLS-1$ } /* (non-Javadoc) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java index 5a0f1acc404..98fe5540073 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java @@ -58,36 +58,46 @@ public class ParserSymbolTable { } public IContainerSymbol newContainerSymbol( String name ){ + if( name == null ) name = EMPTY_NAME; return new ContainerSymbol( this, name ); } public IContainerSymbol newContainerSymbol( String name, TypeInfo.eType type ){ + if( name == null ) name = EMPTY_NAME; return new ContainerSymbol( this, name, type ); } public ISymbol newSymbol( String name ){ + if( name == null ) name = EMPTY_NAME; return new BasicSymbol( this, name ); } public ISymbol newSymbol( String name, TypeInfo.eType type ){ + if( name == null ) name = EMPTY_NAME; return new BasicSymbol( this, name, type ); } public IDerivableContainerSymbol newDerivableContainerSymbol( String name ){ + if( name == null ) name = EMPTY_NAME; return new DerivableContainerSymbol( this, name ); } public IDerivableContainerSymbol newDerivableContainerSymbol( String name, TypeInfo.eType type ){ + if( name == null ) name = EMPTY_NAME; return new DerivableContainerSymbol( this, name, type ); } public IParameterizedSymbol newParameterizedSymbol( String name ){ + if( name == null ) name = EMPTY_NAME; return new ParameterizedSymbol( this, name ); } public IParameterizedSymbol newParameterizedSymbol( String name, TypeInfo.eType type ){ + if( name == null ) name = EMPTY_NAME; return new ParameterizedSymbol( this, name, type ); } public ITemplateSymbol newTemplateSymbol( String name ){ + if( name == null ) name = EMPTY_NAME; return new TemplateSymbol( this, name ); } public ISpecializedSymbol newSpecializedSymbol( String name ){ + if( name == null ) name = EMPTY_NAME; return new SpecializedSymbol( this, name ); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateSymbol.java index d5b44a2f35f..7986895e248 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateSymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateSymbol.java @@ -202,33 +202,33 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb if( !param.isType( TypeInfo.t_templateParameter ) ) return false; - if( param.getName().equals( getName() ) ){ + if( !getName().equals( ParserSymbolTable.EMPTY_NAME ) && param.getName().equals( getName() ) ){ return false; } if( param.getTypeInfo().getTemplateParameterType() != TypeInfo.t_typeName && - param.getTypeInfo().getTemplateParameterType() != TypeInfo.t_template ) + param.getTypeInfo().getTemplateParameterType() != TypeInfo.t_template ) { - if( param.isType( TypeInfo.t_bool, TypeInfo.t_int ) || - param.isType( TypeInfo.t_enumerator ) ) - { - return true; - } - - //a non-tpye template parameter shall have one of the following: + TypeInfo info = param.getTypeInfo(); + //a non-type template parameter shall have one of the following: //integral or enumeration type //pointer to object or pointer to function //reference to object or reference to function //pointer to member + //14.1-7 //A non-type template-parameter shall not be declared to have floating point, class or void type - if( param.isType( TypeInfo.t_float ) || - param.isType( TypeInfo.t_double )|| - param.isType( TypeInfo.t_class ) || - param.isType( TypeInfo.t_void ) ) - { - return false; - } + if( info.getPtrOperators().size() == 0 ) + if( info.getTemplateParameterType() == TypeInfo.t_float || + info.getTemplateParameterType() == TypeInfo.t_double || + info.getTemplateParameterType() == TypeInfo.t_class || + info.getTemplateParameterType() == TypeInfo.t_struct || + info.getTemplateParameterType() == TypeInfo.t_union || + info.getTemplateParameterType() == TypeInfo.t_enumeration || + info.getTemplateParameterType() == TypeInfo.t_void ) + { + return false; + } } return true; }