mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-01 06:05:24 +02:00
fix bug 60422 - Template offsets are not correct in Structural Parse mode
Fix bug 60480 - Template parameter <int> is not parsed correctly in Structural parse mode fix offset information for template parameters
This commit is contained in:
parent
f12fae4a2a
commit
dc66afff94
10 changed files with 194 additions and 53 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 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)
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
*/
|
||||
|
@ -103,4 +111,88 @@ public class ASTTemplateParameter implements IASTTemplateParameter
|
|||
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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
|
@ -202,30 +202,30 @@ 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 )
|
||||
{
|
||||
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 ) )
|
||||
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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue