1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-06 17:26:01 +02:00

better handling of template template parameters

This commit is contained in:
Andrew Niefer 2004-03-26 20:08:05 +00:00
parent 1bf2a95bf6
commit 8dde2f9a0e
7 changed files with 118 additions and 24 deletions

View file

@ -1,4 +1,8 @@
2003-04-26 Andrew Niefer 2004-03-26 Andrew Niefer
template template parameters
- added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testTemplateTemplateParameter()
2004-03-26 Andrew Niefer
test references to symbols in template-ids test references to symbols in template-ids
- modified parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testOverloadedFunctionTemplates_2() - modified parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testOverloadedFunctionTemplates_2()
- modified parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testTemplateParameterAsBaseClause() - modified parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testTemplateParameterAsBaseClause()
@ -6,26 +10,26 @@
- modified parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testInstantiatingDeferredInstances() - modified parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testInstantiatingDeferredInstances()
- modified parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testClassTemplateStaticMemberDefinition() - modified parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testClassTemplateStaticMemberDefinition()
2003-04-25 Andrew Niefer 2004-03-25 Andrew Niefer
-added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testClassTemplateStaticMemberDefinition() -added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testClassTemplateStaticMemberDefinition()
-modified parser/org/eclipse/cdt/core/parser/tests/QuickParseASTTests.testPointersToMemberFunctions -modified parser/org/eclipse/cdt/core/parser/tests/QuickParseASTTests.testPointersToMemberFunctions
2003-03-23 Andrew Niefer 2004-03-23 Andrew Niefer
bug 55673 & fix recursive loop in template instantiation bug 55673 & fix recursive loop in template instantiation
-parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testInstantiatingDeferredInstances() -parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testInstantiatingDeferredInstances()
-parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testTemplateArgumentDeduction() -parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testTemplateArgumentDeduction()
-parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testBug55673() -parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testBug55673()
2003-03-22 John Camelon 2004-03-22 John Camelon
Added CompleteParseASTTest::testBug54531(). Added CompleteParseASTTest::testBug54531().
2003-03-22 Andrew Niefer 2004-03-22 Andrew Niefer
Typedefs & templates Typedefs & templates
- added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testTypedefedTemplate() - added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testTypedefedTemplate()
- added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testTypedefedTemplate_2() - added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testTypedefedTemplate_2()
- added parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.testCompletionInTypeDef() - added parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.testCompletionInTypeDef()
2003-03-18 Andrew Niefer 2004-03-18 Andrew Niefer
parsing template-ids parsing template-ids
- added parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.test54778() - added parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.test54778()
- modified parser/org/eclipse/cdt/core/parser/tests/CompleteParseBaseTests.java - modified parser/org/eclipse/cdt/core/parser/tests/CompleteParseBaseTests.java

View file

@ -1858,4 +1858,43 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
assertReferenceTask( new Task( T1, 2, false, false ) ); assertReferenceTask( new Task( T1, 2, false, false ) );
assertReferenceTask( new Task( T2, 2, false, false ) ); assertReferenceTask( new Task( T2, 2, false, false ) );
} }
public void testTemplateTemplateParameter() throws Exception{
Writer writer = new StringWriter();
writer.write( " template< class T > class A { ");
writer.write( " int x; ");
writer.write( " }; ");
writer.write( " template < class T > class A < T * > { ");
writer.write( " long x; ");
writer.write( " }; ");
writer.write( " template< template< class U > class V > class C{ ");
writer.write( " V< int > y; ");
writer.write( " V< int * > z; ");
writer.write( " }; ");
writer.write( " void f( int ); ");
writer.write( " void f( long ); ");
writer.write( " void main() { ");
writer.write( " C< A > c; ");
writer.write( " f( c.y.x ); ");
writer.write( " f( c.z.x ); ");
writer.write( " } ");
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration templateA = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration templateA2 = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration templateC = (IASTTemplateDeclaration) i.next();
IASTFunction f1 = (IASTFunction) i.next();
IASTFunction f2 = (IASTFunction) i.next();
IASTFunction main = (IASTFunction) i.next();
IASTVariable c = (IASTVariable) getDeclarations( main ).next();
IASTSimpleTypeSpecifier spec = (IASTSimpleTypeSpecifier) c.getAbstractDeclaration().getTypeSpecifier();
IASTClassSpecifier C = (IASTClassSpecifier) spec.getTypeSpecifier();
assertReferenceTask( new Task( f1, 1, false, false ) );
assertReferenceTask( new Task( f2, 1, false, false ) );
}
} }

View file

@ -1,3 +1,6 @@
2004-03-26 Andrew Niefer
- handle template template parameters
2004-03-26 Andrew Niefer 2004-03-26 Andrew Niefer
-report references to symbols used in a template-id. -report references to symbols used in a template-id.

View file

@ -2615,7 +2615,6 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
{ {
ITemplateSymbol template = pst.newTemplateSymbol( ParserSymbolTable.EMPTY_NAME ); ITemplateSymbol template = pst.newTemplateSymbol( ParserSymbolTable.EMPTY_NAME );
List functionParameters = new LinkedList();
// the lookup requires a list of type infos // the lookup requires a list of type infos
// instead of a list of IASTParameterDeclaration // instead of a list of IASTParameterDeclaration
Iterator iter = templateParameters.iterator(); Iterator iter = templateParameters.iterator();
@ -2644,12 +2643,28 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
IASTParameterDeclaration parameter, IASTParameterDeclaration parameter,
List parms ) throws ASTSemanticException List parms ) throws ASTSemanticException
{ {
ISymbol symbol = pst.newSymbol( identifier, TypeInfo.t_templateParameter ); ISymbol symbol = null;
if( kind == ParamKind.TEMPLATE_LIST ){
ITemplateSymbol template = pst.newTemplateSymbol( identifier );
template.setType( TypeInfo.t_templateParameter );
template.getTypeInfo().setTemplateParameterType( TypeInfo.t_template );
Iterator iter = parms.iterator();
while (iter.hasNext()){
ASTTemplateParameter param = (ASTTemplateParameter)iter.next();
try {
template.addTemplateParameter( param.getSymbol() );
} catch (ParserSymbolTableException e) {
handleProblem( e.createProblemID(), "", param.getStartingOffset(), param.getEndingOffset(), param.getStartingLine() ); //$NON-NLS-1$
}
}
symbol = template;
} else {
symbol = pst.newSymbol( identifier, TypeInfo.t_templateParameter );
if( kind == ParamKind.CLASS || kind == ParamKind.TYPENAME ){ if( kind == ParamKind.CLASS || kind == ParamKind.TYPENAME ){
symbol.getTypeInfo().setTemplateParameterType( TypeInfo.t_typeName ); symbol.getTypeInfo().setTemplateParameterType( TypeInfo.t_typeName );
} else if ( kind == ParamKind.TEMPLATE_LIST ){
symbol.getTypeInfo().setTemplateParameterType( TypeInfo.t_template );
} else /*ParamKind.PARAMETER*/ { } else /*ParamKind.PARAMETER*/ {
pst.newSymbol( identifier, TypeInfo.t_templateParameter );
symbol.setName( parameter.getName() ); symbol.setName( parameter.getName() );
symbol.setTypeInfo( ((ASTSimpleTypeSpecifier)parameter.getTypeSpecifier()).getSymbol().getTypeInfo() ); symbol.setTypeInfo( ((ASTSimpleTypeSpecifier)parameter.getTypeSpecifier()).getSymbol().getTypeInfo() );
symbol.getTypeInfo().setTemplateParameterType( symbol.getType() ); symbol.getTypeInfo().setTemplateParameterType( symbol.getType() );
@ -2657,6 +2672,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
setPointerOperators( symbol, parameter.getPointerOperators(), parameter.getArrayModifiers() ); setPointerOperators( symbol, parameter.getPointerOperators(), parameter.getArrayModifiers() );
} }
}
ASTTemplateParameter ast = new ASTTemplateParameter( symbol, defaultValue, parameter, parms ); ASTTemplateParameter ast = new ASTTemplateParameter( symbol, defaultValue, parameter, parms );

View file

@ -426,6 +426,16 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol {
ISymbol found = ParserSymbolTable.resolveAmbiguities( data ); ISymbol found = ParserSymbolTable.resolveAmbiguities( data );
if( isTemplateMember() && found instanceof ITemplateSymbol ) { if( isTemplateMember() && found instanceof ITemplateSymbol ) {
boolean areWithinTemplate = false;
IContainerSymbol container = getContainingSymbol();
while( container != null ){
if( container == found ){
areWithinTemplate = true;
break;
}
container = container.getContainingSymbol();
}
if( areWithinTemplate )
return TemplateEngine.instantiateWithinTemplateScope( this, (ITemplateSymbol) found ); return TemplateEngine.instantiateWithinTemplateScope( this, (ITemplateSymbol) found );
} }

View file

@ -72,21 +72,43 @@ public class DeferredTemplateInstance extends BasicSymbol implements IDeferredTe
} }
public boolean isType( TypeInfo.eType type, TypeInfo.eType upperType ){ public boolean isType( TypeInfo.eType type, TypeInfo.eType upperType ){
return _template.getTemplatedSymbol().isType( type, upperType ); ISymbol symbol = _template.getTemplatedSymbol();
if( symbol != null )
return symbol.isType( type, upperType );
else
return super.isType( type, upperType );
} }
public TypeInfo.eType getType(){ public TypeInfo.eType getType(){
return _template.getTemplatedSymbol().getType(); ISymbol symbol = _template.getTemplatedSymbol();
if( symbol != null )
return symbol.getType();
else
return super.getType();
} }
public TypeInfo getTypeInfo(){ public TypeInfo getTypeInfo(){
return _template.getTemplatedSymbol().getTypeInfo(); ISymbol symbol = _template.getTemplatedSymbol();
if( symbol != null )
return symbol.getTypeInfo();
else
return super.getTypeInfo();
} }
public boolean isType( TypeInfo.eType type ){ public boolean isType( TypeInfo.eType type ){
return _template.getTemplatedSymbol().isType( type ); return _template.getTemplatedSymbol().isType( type );
} }
public ISymbolASTExtension getASTExtension(){
if( super.getASTExtension() != null )
return super.getASTExtension();
else if( _template.getTemplatedSymbol() != null )
return _template.getTemplatedSymbol().getASTExtension();
else
return _template.getASTExtension();
}
private ITemplateSymbol _template; private ITemplateSymbol _template;
private List _arguments; private List _arguments;
} }

View file

@ -164,7 +164,7 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb
} }
public void addTemplateParameter( ISymbol param ) throws ParserSymbolTableException { public void addTemplateParameter( ISymbol param ) throws ParserSymbolTableException {
if( isType( TypeInfo.t_template ) ){ if( isType( TypeInfo.t_template ) || getTypeInfo().getTemplateParameterType() == TypeInfo.t_template ){
if( !isAllowableTemplateParameter( param ) ){ if( !isAllowableTemplateParameter( param ) ){
throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTemplateParameter ); throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTemplateParameter );
} }