1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 08:55:25 +02:00

handle template explicit instantiations

partial fix for bug 56834
handle use of template default parameters
This commit is contained in:
Andrew Niefer 2004-04-02 19:20:34 +00:00
parent f594128873
commit 4973e16836
17 changed files with 882 additions and 611 deletions

View file

@ -1,3 +1,12 @@
2004-04-02 Andrew Niefer
- created CompleteParseASTTemplateTest, added it to the ParserTestSuite and moved all the template tests from
CompleteParseASTTest to it.
- added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.testBug56834()
- added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.testDefaultTemplateParameters()
- added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.testBug56834WithInstantiation()
- added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.testDefaultTemplateParameterWithDeferedInstance()
- added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.testExplicitInstantiation()
2004-04-02 John Camelon
Added SelectionParseTest::testBaseCase_FunctionDeclaration().
Added SelectionParseTest::testBaseCase_FunctionDeclaration2().

View file

@ -0,0 +1,646 @@
/*
* Created on Mar 30, 2004
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
package org.eclipse.cdt.core.parser.tests;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Iterator;
import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTField;
import org.eclipse.cdt.core.parser.ast.IASTFunction;
import org.eclipse.cdt.core.parser.ast.IASTMethod;
import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition;
import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTTemplateInstantiation;
import org.eclipse.cdt.core.parser.ast.IASTTemplateParameter;
import org.eclipse.cdt.core.parser.ast.IASTTemplatedDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTVariable;
import org.eclipse.cdt.internal.core.parser.ParserException;
/**
* @author aniefer
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
public class CompleteParseASTTemplateTest extends CompleteParseBaseTest {
/**
* @param name
*/
public CompleteParseASTTemplateTest(String name) {
super(name);
}
public void testTemplateClassDeclaration() throws Exception
{
Writer writer = new StringWriter();
writer.write( "template < class T > class A { T t; }; " );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
Iterator params = template.getTemplateParameters();
IASTTemplateParameter T = (IASTTemplateParameter) params.next();
assertEquals( T.getIdentifier(), "T" );
assertFalse( params.hasNext() );
assertFalse( i.hasNext() );
i = getDeclarations( template );
IASTClassSpecifier classA = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
assertEquals( classA.getName(), "A" );
assertFalse( i.hasNext() );
i = getDeclarations( classA );
IASTField t = (IASTField) i.next();
assertEquals( t.getName(), "t" );
IASTSimpleTypeSpecifier specifier = (IASTSimpleTypeSpecifier) t.getAbstractDeclaration().getTypeSpecifier();
assertEquals( specifier.getTypename(), "T" );
//assertEquals( specifier.getTypeSpecifier(), T ); //TODO uncomment when bug 54029 is fixed
}
public void testTemplateFunction() throws Exception
{
Writer writer = new StringWriter();
writer.write( "template < class T > void f( T t ){} " );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
Iterator params = template.getTemplateParameters();
IASTTemplateParameter T = (IASTTemplateParameter) params.next();
assertEquals( T.getIdentifier(), "T" );
assertFalse( params.hasNext() );
assertFalse( i.hasNext() );
i = getDeclarations( template );
IASTFunction f = (IASTFunction) i.next();
assertEquals( f.getName(), "f" );
params = f.getParameters();
IASTParameterDeclaration t = (IASTParameterDeclaration) params.next();
assertEquals( t.getName(), "t" );
IASTSimpleTypeSpecifier typeSpec = (IASTSimpleTypeSpecifier) t.getTypeSpecifier();
assertEquals( typeSpec.getTypename(), "T" );
//assertEquals( typeSpec.getTypeSpecifier(), T ); //TODO uncomment when bug 54029 is fixed
}
public void testTemplateFunctionDefinition() throws Exception
{
Writer writer = new StringWriter();
writer.write( "template <class T> void f( T t );" );
writer.write( "template <class U> void f( U u ) { }" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
Iterator params = template.getTemplateParameters();
IASTTemplateParameter T = (IASTTemplateParameter) params.next();
assertEquals( T.getIdentifier(), "T" );
assertFalse( params.hasNext() );
Iterator tempDecls = getDeclarations( template );
IASTFunction f = (IASTFunction) tempDecls.next();
assertEquals( f.getName(), "f" );
assertFalse( f.hasFunctionBody() );
assertFalse( tempDecls.hasNext() );
params = f.getParameters();
IASTParameterDeclaration t = (IASTParameterDeclaration) params.next();
assertEquals( t.getName(), "t" );
IASTSimpleTypeSpecifier typeSpec = (IASTSimpleTypeSpecifier) t.getTypeSpecifier();
assertEquals( typeSpec.getTypename(), "T" );
//assertEquals( typeSpec.getTypeSpecifier(), T ); //TODO uncomment when bug 54029 is fixed
IASTTemplateDeclaration template2 = (IASTTemplateDeclaration) i.next();
params = template2.getTemplateParameters();
IASTTemplateParameter U = (IASTTemplateParameter) params.next();
assertEquals( U.getIdentifier(), "U" );
assertFalse( params.hasNext() );
tempDecls = getDeclarations( template2 );
IASTFunction f2 = (IASTFunction) tempDecls.next();
assertEquals( f2.getName(), "f" );
assertTrue( f2.previouslyDeclared() );
params = f2.getParameters();
IASTParameterDeclaration u = (IASTParameterDeclaration) params.next();
assertEquals( u.getName(), "u" );
typeSpec = (IASTSimpleTypeSpecifier) u.getTypeSpecifier();
assertEquals( typeSpec.getTypename(), "U" );
//assertEquals( typeSpec.getTypeSpecifier(), U ); //TODO uncomment when bug 54029 is fixed
assertFalse( i.hasNext() );
}
public void testClassMemberTemplate() throws Exception{
Writer writer = new StringWriter();
writer.write( "namespace N { " );
writer.write( " class A { " );
writer.write( " template < class T > T f();" );
writer.write( " }; " );
writer.write( "}" );
writer.write( "template <class U> U N::A::f() {} " );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTNamespaceDefinition N = (IASTNamespaceDefinition) i.next();
Iterator i2 = getDeclarations( N );
IASTClassSpecifier A = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i2.next()).getTypeSpecifier();
assertFalse( i2.hasNext() );
i2 = getDeclarations( A );
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i2.next();
Iterator params = template.getTemplateParameters();
IASTTemplateParameter T = (IASTTemplateParameter) params.next();
assertFalse( params.hasNext() );
assertFalse( i2.hasNext() );
i2 = getDeclarations( template );
IASTMethod f = (IASTMethod) i2.next();
assertEquals( ((IASTSimpleTypeSpecifier)f.getReturnType().getTypeSpecifier()).getTypename(), "T" );
assertFalse( i2.hasNext() );
IASTTemplateDeclaration template2 = (IASTTemplateDeclaration) i.next();
params = template.getTemplateParameters();
IASTTemplateParameter U = (IASTTemplateParameter) params.next();
assertFalse( params.hasNext() );
assertFalse( i.hasNext() );
i2 = getDeclarations( template2 );
IASTMethod f2 = (IASTMethod) i2.next();
assertEquals( ((IASTSimpleTypeSpecifier)f2.getReturnType().getTypeSpecifier()).getTypename(), "U" );
assertQualifiedName( f2.getFullyQualifiedName(), new String [] { "N", "A", "f" } );
assertTrue( f2.previouslyDeclared() );
assertFalse( i2.hasNext() );
}
public void testOverloadedFunctionTemplates() throws Exception
{
Writer writer = new StringWriter();
writer.write( " template < class T > void f ( T ) {} " );
writer.write( " template < class T > void f ( T * ) {} " );
writer.write( " int * p;" );
writer.write( " void main () {" );
writer.write( " f( p );" );
writer.write( " f( *p );" );
writer.write( " }" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template1 = (IASTTemplateDeclaration) i.next();
IASTTemplateParameter T1 = (IASTTemplateParameter) template1.getTemplateParameters().next();
IASTFunction f1 = (IASTFunction) template1.getOwnedDeclaration();
IASTTemplateDeclaration template2 = (IASTTemplateDeclaration) i.next();
IASTFunction f2 = (IASTFunction) template2.getOwnedDeclaration();
IASTTemplateParameter T2 = (IASTTemplateParameter) template2.getTemplateParameters().next();
IASTVariable p = (IASTVariable) i.next();
IASTFunction main = (IASTFunction) i.next();
assertFalse( i.hasNext() );
assertAllReferences( 6, createTaskList( new Task( T1 ),
new Task( T2 ),
new Task( f1, 1, false, false ),
new Task( p, 2 ),
new Task( f2, 1, false, false ) ) );
}
public void testOverloadedFunctionTemplates_2() throws Exception
{
Writer writer = new StringWriter();
writer.write("template< class T > struct A { }; \n");
writer.write("template< class T > void h( const T & ); //#1 \n");
writer.write("template< class T > void h( A<T>& ); //#2 \n");
writer.write("void foo() { \n");
writer.write(" A<int> z; \n");
writer.write(" h( z ); //calls 2 \n");
writer.write(" const A<int> z2; \n");
writer.write(" h( z2 ); //calls 1 because 2 is not callable. \n");
writer.write( "} \n");
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration templateA = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration templateh1 = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration templateh2 = (IASTTemplateDeclaration) i.next();
IASTClassSpecifier A = (IASTClassSpecifier) templateA.getOwnedDeclaration();
IASTFunction h1 = (IASTFunction) templateh1.getOwnedDeclaration();
IASTFunction h2 = (IASTFunction) templateh2.getOwnedDeclaration();
IASTTemplateParameter T1 = (IASTTemplateParameter) templateA.getTemplateParameters().next();
IASTTemplateParameter T2 = (IASTTemplateParameter) templateh1.getTemplateParameters().next();
IASTTemplateParameter T3 = (IASTTemplateParameter) templateh2.getTemplateParameters().next();
IASTFunction foo = (IASTFunction) i.next();
assertFalse( i.hasNext() );
i = getDeclarations( foo );
IASTVariable z = (IASTVariable) i.next();
IASTVariable z2 = (IASTVariable) i.next();
assertFalse( i.hasNext() );
assertEquals( ((IASTSimpleTypeSpecifier)z.getAbstractDeclaration().getTypeSpecifier()).getTypeSpecifier(), A );
assertEquals( ((IASTSimpleTypeSpecifier)z2.getAbstractDeclaration().getTypeSpecifier()).getTypeSpecifier(), A );
assertAllReferences( 9, createTaskList( new Task( T2 ),
new Task( T3 ),
new Task( A, 3 ),
new Task( z ),
new Task( z2 ),
new Task( h1, 1, false, false ),
new Task( h2, 1, false, false ) ) );
}
public void testTemplateClassPartialSpecialization() throws Exception
{
Writer writer = new StringWriter();
writer.write( "template < class T1, class T2, int I > class A {}; //#1\n" );
writer.write( "template < class T, int I > class A < T, T*, I > {}; //#2\n");
writer.write( "template < class T1, class T2, int I > class A < T1*, T2, I > {}; //#3\n");
writer.write( "template < class T > class A < int, T*, 5 > {}; //#4\n");
writer.write( "template < class T1, class T2, int I > class A < T1, T2*, I > {}; //#5\n");
writer.write( "A <int, int, 1> a1; //uses #1 \n");
writer.write( "A <int, int*, 1> a2; //uses #2, T is int, I is 1 \n");
writer.write( "A <int, char*, 5> a4; //uses #4, T is char \n");
writer.write( "A <int, char*, 1> a5; //uses #5, T is int, T2 is char, I is1 \n");
Iterator i = parse( writer.toString() ).getDeclarations();
writer.write( " A <int*, int*, 2> amgiguous; //ambiguous, matches #3 & #5 \n");
try{
//we expect this parse to fail because of the ambiguity in the last line
parse( writer.toString() );
assertFalse( true );
} catch ( ParserException e ){
assertEquals( e.getMessage(), "FAILURE" );
}
IASTTemplateDeclaration template1 = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration spec2 = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration spec3 = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration spec4 = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration spec5 = (IASTTemplateDeclaration) i.next();
IASTVariable a1 = (IASTVariable) i.next();
IASTVariable a2 = (IASTVariable) i.next();
IASTVariable a4 = (IASTVariable) i.next();
IASTVariable a5 = (IASTVariable) i.next();
assertFalse( i.hasNext() );
IASTClassSpecifier A1 = (IASTClassSpecifier)template1.getOwnedDeclaration();
IASTClassSpecifier A2 = (IASTClassSpecifier)spec2.getOwnedDeclaration();
IASTClassSpecifier A3 = (IASTClassSpecifier)spec3.getOwnedDeclaration();
IASTClassSpecifier A4 = (IASTClassSpecifier)spec4.getOwnedDeclaration();
IASTClassSpecifier A5 = (IASTClassSpecifier)spec5.getOwnedDeclaration();
assertEquals( ((IASTSimpleTypeSpecifier)a1.getAbstractDeclaration().getTypeSpecifier()).getTypeSpecifier(), A1 );
assertEquals( ((IASTSimpleTypeSpecifier)a2.getAbstractDeclaration().getTypeSpecifier()).getTypeSpecifier(), A2 );
assertEquals( ((IASTSimpleTypeSpecifier)a4.getAbstractDeclaration().getTypeSpecifier()).getTypeSpecifier(), A4 );
assertEquals( ((IASTSimpleTypeSpecifier)a5.getAbstractDeclaration().getTypeSpecifier()).getTypeSpecifier(), A5 );
}
public void testTemplateInstanceAsBaseClause() throws Exception
{
Writer writer = new StringWriter();
writer.write( "template< class T > class A { T t; }; \n" );
writer.write( "class B : public A< int > {}; \n" );
writer.write( "void f( int ); \n" );
writer.write( "void main(){ \n" );
writer.write( " B b; \n" );
writer.write( " f( b.t ); \n" ); //if this function call is good, it implies that b.t is type int
writer.write( "} \n" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
IASTTemplateParameter T = (IASTTemplateParameter) template.getTemplateParameters().next();
IASTClassSpecifier B = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
IASTFunction f = (IASTFunction) i.next();
IASTFunction main = (IASTFunction) i.next();
assertFalse( i.hasNext() );
IASTClassSpecifier A = (IASTClassSpecifier) template.getOwnedDeclaration();
i = getDeclarations( A );
IASTField t = (IASTField) i.next();
assertFalse( i.hasNext() );
i = getDeclarations( main );
IASTVariable b = (IASTVariable) i.next();
assertFalse( i.hasNext() );
assertAllReferences( 6, createTaskList( new Task( T ),
new Task( A ),
new Task( B ),
new Task( b ),
new Task( t ),
new Task( f ) ) );
}
public void testTemplateParameterAsBaseClause() throws Exception
{
Writer writer = new StringWriter();
writer.write( "template < class T > class A : public T {}; \n" );
writer.write( "class B { int i; }; \n" );
writer.write( "void main() { \n" );
writer.write( " A<B> a; \n" );
writer.write( " a.i; \n" );
writer.write( "} \n" );
writer.write( "\n" );
Iterator iter = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) iter.next();
IASTTemplateParameter T = (IASTTemplateParameter) template.getTemplateParameters().next();
IASTClassSpecifier B = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)iter.next()).getTypeSpecifier();
IASTFunction main = (IASTFunction) iter.next();
assertFalse( iter.hasNext() );
IASTClassSpecifier A = (IASTClassSpecifier) template.getOwnedDeclaration();
iter = getDeclarations( B );
IASTVariable i = (IASTVariable) iter.next();
iter = getDeclarations( main );
IASTVariable a = (IASTVariable) iter.next();
assertAllReferences( 5, createTaskList( new Task( T ), new Task( A ), new Task( B ), new Task( a ), new Task( i ) ) );
}
public void testTypedefedTemplate() throws Exception{
Writer writer = new StringWriter();
writer.write( "template < class T > class _A{ int x; }; \n" );
writer.write( "typedef _A < char > A; \n" );
writer.write( "void foo() { \n" );
writer.write( " A a; \n" );
writer.write( " a.x; \n" );
writer.write( "} \n" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration _A = (IASTTemplateDeclaration) i.next();
IASTTypedefDeclaration A = (IASTTypedefDeclaration) i.next();
IASTFunction foo = (IASTFunction) i.next();
IASTClassSpecifier classA = (IASTClassSpecifier) _A.getOwnedDeclaration();
IASTVariable x = (IASTVariable) getDeclarations( classA ).next();
IASTVariable a = (IASTVariable) getDeclarations( foo ).next();
assertAllReferences( 4, createTaskList( new Task( classA ), new Task( A ), new Task( a ), new Task( x ) ) );
}
public void testTypedefedTemplate_2() throws Exception{
Writer writer = new StringWriter();
writer.write( "template < class T > struct A { T x; }; \n" );
writer.write( "template < class U > struct B { \n" );
writer.write( " typedef A< U > AU; \n" );
writer.write( " void f( U ); \n" );
writer.write( " void f( char ); \n" );
writer.write( " void g(){ \n" );
writer.write( " AU au; \n" );
writer.write( " f( au.x ); \n" );
writer.write( " } \n" );
writer.write( "}; \n" );
writer.write( "void f2( int ); \n" );
writer.write( "void f2( char ); \n" );
writer.write( "void h(){ \n" );
writer.write( " B< int >::AU b; \n" );
writer.write( " f2( b.x ); \n" );
writer.write( "} \n" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration tA = (IASTTemplateDeclaration) i.next();
IASTTemplateParameter T = (IASTTemplateParameter) tA.getTemplateParameters().next();
IASTClassSpecifier A = (IASTClassSpecifier) tA.getOwnedDeclaration();
IASTField x = (IASTField) getDeclarations( A ).next();
IASTTemplateDeclaration tB = (IASTTemplateDeclaration) i.next();
IASTClassSpecifier B = (IASTClassSpecifier) tB.getOwnedDeclaration();
IASTTemplateParameter U = (IASTTemplateParameter) tB.getTemplateParameters().next();
IASTFunction f21 = (IASTFunction) i.next();
IASTFunction f22 = (IASTFunction) i.next();
IASTFunction h = (IASTFunction) i.next();
i = getDeclarations( B );
IASTTypedefDeclaration AU = (IASTTypedefDeclaration) i.next();
IASTMethod f11 = (IASTMethod) i.next();
IASTMethod f12 = (IASTMethod) i.next();
IASTMethod g = (IASTMethod) i.next();
IASTVariable au = (IASTVariable) getDeclarations( g ).next();
IASTVariable b = (IASTVariable) getDeclarations( h ).next();
assertAllReferences( 13, createTaskList( new Task( A ),
new Task( T ),
new Task( U, 2 ),
new Task( AU, 2 ),
new Task( au ),
new Task( x, 2 ),
new Task( f11, 1, false, false ),
new Task( B ),
new Task( b ),
new Task( f21, 1, false, false ) ) );
}
public void testInstantiatingDeferredInstances() throws Exception{
Writer writer = new StringWriter();
writer.write( "template < class T > struct A { A < T > next; }; \n" );
writer.write( "A< int > a; \n" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
IASTTemplateParameter T = (IASTTemplateParameter) template.getTemplateParameters().next();
IASTClassSpecifier A = (IASTClassSpecifier) template.getOwnedDeclaration();
IASTField next = (IASTField) getDeclarations( A ).next();
IASTVariable a = (IASTVariable) i.next();
assertAllReferences( 3, createTaskList( new Task( A, 2 ), new Task( T ) ) );
}
public void testTemplateArgumentDeduction() throws Exception{
Writer writer = new StringWriter();
writer.write( "template< class T > struct B {}; \n" );
writer.write( "template< class T > struct D : public B < T > {}; \n" );
writer.write( "struct D2 : public B< int > {}; \n" );
writer.write( "template< class T > T f( B<T> & ) {} \n" );
writer.write( "void test( int ); \n" );
writer.write( "void test( char ); \n" );
writer.write( "void main() { \n" );
writer.write( " D<int> d; \n" );
writer.write( " D2 d2; \n" );
writer.write( " test( f( d ) ); \n" );
writer.write( " test( f( d2 ) ); \n" );
writer.write( "} \n" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration templateB = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration templateD = (IASTTemplateDeclaration) i.next();
IASTClassSpecifier D2 = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
IASTTemplateDeclaration templateF = (IASTTemplateDeclaration) i.next();
IASTFunction test1 = (IASTFunction) i.next();
IASTFunction test2 = (IASTFunction) i.next();
IASTFunction main = (IASTFunction) i.next();
assertFalse( i.hasNext() );
assertReferenceTask( new Task( test1, 2, false, false ) );
}
public void testClassTemplateStaticMemberDefinition() throws Exception {
Writer writer = new StringWriter();
writer.write( "template< class T > class A{ \n" );
writer.write( " typedef T * PT; \n" );
writer.write( " static T member; \n" );
writer.write( "}; \n" );
writer.write( "template< class T> A<T>::PT A<T>::member = null; \n" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
IASTTemplateParameter T1 = (IASTTemplateParameter) template.getTemplateParameters().next();
IASTTemplateDeclaration template2 = (IASTTemplateDeclaration) i.next();
IASTTemplateParameter T2 = (IASTTemplateParameter) template2.getTemplateParameters().next();
IASTField member = (IASTField) getDeclarations( template2 ).next();
assertEquals( member.getName(), "member" );
assertReferenceTask( new Task( T1, 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 ) );
}
public void testBug56834() throws Exception{
Iterator i = parse( "template < class T, class U = T > class A;" ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
assertFalse( i.hasNext() );
i = template.getTemplateParameters();
IASTTemplateParameter T = (IASTTemplateParameter) i.next();
IASTTemplateParameter U = (IASTTemplateParameter) i.next();
}
public void testDefaultTemplateParameters() throws Exception {
Iterator i = parse( "template < class T = int > class A{}; A<> a;" ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
IASTVariable a = (IASTVariable) i.next();
}
public void testBug56834WithInstantiation() throws Exception{
Writer writer = new StringWriter();
writer.write( "template< class T, class U = T > class A {};" );
writer.write( "A< char > a;" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
IASTVariable a = (IASTVariable) i.next();
}
public void testDefaultTemplateParameterWithDeferedInstance() throws Exception{
Writer writer = new StringWriter();
writer.write( "template < class T > class A; \n" );
writer.write( "template < class U, class V = A< U > > class B; \n" );
writer.write( "B< int > b;" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration templateA = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration templateB = (IASTTemplateDeclaration) i.next();
IASTVariable b = (IASTVariable) i.next();
}
public void testExplicitInstantiation() throws Exception{
Writer writer = new StringWriter();
writer.write( "template < class T > class A { }; " );
writer.write( "template class A< int >; " );
writer.write( "A< int > a; " );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
IASTClassSpecifier A = (IASTClassSpecifier) template.getOwnedDeclaration();
IASTTemplateInstantiation instance = (IASTTemplateInstantiation) i.next();
IASTVariable var = (IASTVariable) i.next();
assertAllReferences( 2, createTaskList( new Task( A, 2 ) ) );
}
}

View file

@ -1283,249 +1283,7 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
assertFalse( f2.previouslyDeclared() );
assertFalse( i.hasNext() );
}
public void testTemplateClassDeclaration() throws Exception
{
Writer writer = new StringWriter();
writer.write( "template < class T > class A { T t; }; " );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
Iterator params = template.getTemplateParameters();
IASTTemplateParameter T = (IASTTemplateParameter) params.next();
assertEquals( T.getIdentifier(), "T" );
assertFalse( params.hasNext() );
assertFalse( i.hasNext() );
i = getDeclarations( template );
IASTClassSpecifier classA = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
assertEquals( classA.getName(), "A" );
assertFalse( i.hasNext() );
i = getDeclarations( classA );
IASTField t = (IASTField) i.next();
assertEquals( t.getName(), "t" );
IASTSimpleTypeSpecifier specifier = (IASTSimpleTypeSpecifier) t.getAbstractDeclaration().getTypeSpecifier();
assertEquals( specifier.getTypename(), "T" );
//assertEquals( specifier.getTypeSpecifier(), T ); //TODO uncomment when bug 54029 is fixed
}
public void testTemplateFunction() throws Exception
{
Writer writer = new StringWriter();
writer.write( "template < class T > void f( T t ){} " );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
Iterator params = template.getTemplateParameters();
IASTTemplateParameter T = (IASTTemplateParameter) params.next();
assertEquals( T.getIdentifier(), "T" );
assertFalse( params.hasNext() );
assertFalse( i.hasNext() );
i = getDeclarations( template );
IASTFunction f = (IASTFunction) i.next();
assertEquals( f.getName(), "f" );
params = f.getParameters();
IASTParameterDeclaration t = (IASTParameterDeclaration) params.next();
assertEquals( t.getName(), "t" );
IASTSimpleTypeSpecifier typeSpec = (IASTSimpleTypeSpecifier) t.getTypeSpecifier();
assertEquals( typeSpec.getTypename(), "T" );
//assertEquals( typeSpec.getTypeSpecifier(), T ); //TODO uncomment when bug 54029 is fixed
}
public void testTemplateFunctionDefinition() throws Exception
{
Writer writer = new StringWriter();
writer.write( "template <class T> void f( T t );" );
writer.write( "template <class U> void f( U u ) { }" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
Iterator params = template.getTemplateParameters();
IASTTemplateParameter T = (IASTTemplateParameter) params.next();
assertEquals( T.getIdentifier(), "T" );
assertFalse( params.hasNext() );
Iterator tempDecls = getDeclarations( template );
IASTFunction f = (IASTFunction) tempDecls.next();
assertEquals( f.getName(), "f" );
assertFalse( f.hasFunctionBody() );
assertFalse( tempDecls.hasNext() );
params = f.getParameters();
IASTParameterDeclaration t = (IASTParameterDeclaration) params.next();
assertEquals( t.getName(), "t" );
IASTSimpleTypeSpecifier typeSpec = (IASTSimpleTypeSpecifier) t.getTypeSpecifier();
assertEquals( typeSpec.getTypename(), "T" );
//assertEquals( typeSpec.getTypeSpecifier(), T ); //TODO uncomment when bug 54029 is fixed
IASTTemplateDeclaration template2 = (IASTTemplateDeclaration) i.next();
params = template2.getTemplateParameters();
IASTTemplateParameter U = (IASTTemplateParameter) params.next();
assertEquals( U.getIdentifier(), "U" );
assertFalse( params.hasNext() );
tempDecls = getDeclarations( template2 );
IASTFunction f2 = (IASTFunction) tempDecls.next();
assertEquals( f2.getName(), "f" );
assertTrue( f2.previouslyDeclared() );
params = f2.getParameters();
IASTParameterDeclaration u = (IASTParameterDeclaration) params.next();
assertEquals( u.getName(), "u" );
typeSpec = (IASTSimpleTypeSpecifier) u.getTypeSpecifier();
assertEquals( typeSpec.getTypename(), "U" );
//assertEquals( typeSpec.getTypeSpecifier(), U ); //TODO uncomment when bug 54029 is fixed
assertFalse( i.hasNext() );
}
public void testClassMemberTemplate() throws Exception{
Writer writer = new StringWriter();
writer.write( "namespace N { " );
writer.write( " class A { " );
writer.write( " template < class T > T f();" );
writer.write( " }; " );
writer.write( "}" );
writer.write( "template <class U> U N::A::f() {} " );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTNamespaceDefinition N = (IASTNamespaceDefinition) i.next();
Iterator i2 = getDeclarations( N );
IASTClassSpecifier A = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i2.next()).getTypeSpecifier();
assertFalse( i2.hasNext() );
i2 = getDeclarations( A );
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i2.next();
Iterator params = template.getTemplateParameters();
IASTTemplateParameter T = (IASTTemplateParameter) params.next();
assertFalse( params.hasNext() );
assertFalse( i2.hasNext() );
i2 = getDeclarations( template );
IASTMethod f = (IASTMethod) i2.next();
assertEquals( ((IASTSimpleTypeSpecifier)f.getReturnType().getTypeSpecifier()).getTypename(), "T" );
assertFalse( i2.hasNext() );
IASTTemplateDeclaration template2 = (IASTTemplateDeclaration) i.next();
params = template.getTemplateParameters();
IASTTemplateParameter U = (IASTTemplateParameter) params.next();
assertFalse( params.hasNext() );
assertFalse( i.hasNext() );
i2 = getDeclarations( template2 );
IASTMethod f2 = (IASTMethod) i2.next();
assertEquals( ((IASTSimpleTypeSpecifier)f2.getReturnType().getTypeSpecifier()).getTypename(), "U" );
assertQualifiedName( f2.getFullyQualifiedName(), new String [] { "N", "A", "f" } );
assertTrue( f2.previouslyDeclared() );
assertFalse( i2.hasNext() );
}
public void testOverloadedFunctionTemplates() throws Exception
{
Writer writer = new StringWriter();
writer.write( " template < class T > void f ( T ) {} " );
writer.write( " template < class T > void f ( T * ) {} " );
writer.write( " int * p;" );
writer.write( " void main () {" );
writer.write( " f( p );" );
writer.write( " f( *p );" );
writer.write( " }" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template1 = (IASTTemplateDeclaration) i.next();
IASTTemplateParameter T1 = (IASTTemplateParameter) template1.getTemplateParameters().next();
IASTFunction f1 = (IASTFunction) template1.getOwnedDeclaration();
IASTTemplateDeclaration template2 = (IASTTemplateDeclaration) i.next();
IASTFunction f2 = (IASTFunction) template2.getOwnedDeclaration();
IASTTemplateParameter T2 = (IASTTemplateParameter) template2.getTemplateParameters().next();
IASTVariable p = (IASTVariable) i.next();
IASTFunction main = (IASTFunction) i.next();
assertFalse( i.hasNext() );
assertAllReferences( 6, createTaskList( new Task( T1 ),
new Task( T2 ),
new Task( f1, 1, false, false ),
new Task( p, 2 ),
new Task( f2, 1, false, false ) ) );
}
public void testOverloadedFunctionTemplates_2() throws Exception
{
Writer writer = new StringWriter();
writer.write("template< class T > struct A { }; \n");
writer.write("template< class T > void h( const T & ); //#1 \n");
writer.write("template< class T > void h( A<T>& ); //#2 \n");
writer.write("void foo() { \n");
writer.write(" A<int> z; \n");
writer.write(" h( z ); //calls 2 \n");
writer.write(" const A<int> z2; \n");
writer.write(" h( z2 ); //calls 1 because 2 is not callable. \n");
writer.write( "} \n");
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration templateA = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration templateh1 = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration templateh2 = (IASTTemplateDeclaration) i.next();
IASTClassSpecifier A = (IASTClassSpecifier) templateA.getOwnedDeclaration();
IASTFunction h1 = (IASTFunction) templateh1.getOwnedDeclaration();
IASTFunction h2 = (IASTFunction) templateh2.getOwnedDeclaration();
IASTTemplateParameter T1 = (IASTTemplateParameter) templateA.getTemplateParameters().next();
IASTTemplateParameter T2 = (IASTTemplateParameter) templateh1.getTemplateParameters().next();
IASTTemplateParameter T3 = (IASTTemplateParameter) templateh2.getTemplateParameters().next();
IASTFunction foo = (IASTFunction) i.next();
assertFalse( i.hasNext() );
i = getDeclarations( foo );
IASTVariable z = (IASTVariable) i.next();
IASTVariable z2 = (IASTVariable) i.next();
assertFalse( i.hasNext() );
assertEquals( ((IASTSimpleTypeSpecifier)z.getAbstractDeclaration().getTypeSpecifier()).getTypeSpecifier(), A );
assertEquals( ((IASTSimpleTypeSpecifier)z2.getAbstractDeclaration().getTypeSpecifier()).getTypeSpecifier(), A );
assertAllReferences( 9, createTaskList( new Task( T2 ),
new Task( T3 ),
new Task( A, 3 ),
new Task( z ),
new Task( z2 ),
new Task( h1, 1, false, false ),
new Task( h2, 1, false, false ) ) );
}
public void testBug54639() throws Exception
{
Writer writer = new StringWriter();
@ -1547,129 +1305,6 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
assertFalse( i.hasNext() );
}
public void testTemplateClassPartialSpecialization() throws Exception
{
Writer writer = new StringWriter();
writer.write( "template < class T1, class T2, int I > class A {}; //#1\n" );
writer.write( "template < class T, int I > class A < T, T*, I > {}; //#2\n");
writer.write( "template < class T1, class T2, int I > class A < T1*, T2, I > {}; //#3\n");
writer.write( "template < class T > class A < int, T*, 5 > {}; //#4\n");
writer.write( "template < class T1, class T2, int I > class A < T1, T2*, I > {}; //#5\n");
writer.write( "A <int, int, 1> a1; //uses #1 \n");
writer.write( "A <int, int*, 1> a2; //uses #2, T is int, I is 1 \n");
writer.write( "A <int, char*, 5> a4; //uses #4, T is char \n");
writer.write( "A <int, char*, 1> a5; //uses #5, T is int, T2 is char, I is1 \n");
Iterator i = parse( writer.toString() ).getDeclarations();
writer.write( " A <int*, int*, 2> amgiguous; //ambiguous, matches #3 & #5 \n");
try{
//we expect this parse to fail because of the ambiguity in the last line
parse( writer.toString() );
assertFalse( true );
} catch ( ParserException e ){
assertEquals( e.getMessage(), "FAILURE" );
}
IASTTemplateDeclaration template1 = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration spec2 = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration spec3 = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration spec4 = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration spec5 = (IASTTemplateDeclaration) i.next();
IASTVariable a1 = (IASTVariable) i.next();
IASTVariable a2 = (IASTVariable) i.next();
IASTVariable a4 = (IASTVariable) i.next();
IASTVariable a5 = (IASTVariable) i.next();
assertFalse( i.hasNext() );
IASTClassSpecifier A1 = (IASTClassSpecifier)template1.getOwnedDeclaration();
IASTClassSpecifier A2 = (IASTClassSpecifier)spec2.getOwnedDeclaration();
IASTClassSpecifier A3 = (IASTClassSpecifier)spec3.getOwnedDeclaration();
IASTClassSpecifier A4 = (IASTClassSpecifier)spec4.getOwnedDeclaration();
IASTClassSpecifier A5 = (IASTClassSpecifier)spec5.getOwnedDeclaration();
assertEquals( ((IASTSimpleTypeSpecifier)a1.getAbstractDeclaration().getTypeSpecifier()).getTypeSpecifier(), A1 );
assertEquals( ((IASTSimpleTypeSpecifier)a2.getAbstractDeclaration().getTypeSpecifier()).getTypeSpecifier(), A2 );
assertEquals( ((IASTSimpleTypeSpecifier)a4.getAbstractDeclaration().getTypeSpecifier()).getTypeSpecifier(), A4 );
assertEquals( ((IASTSimpleTypeSpecifier)a5.getAbstractDeclaration().getTypeSpecifier()).getTypeSpecifier(), A5 );
}
public void testTemplateInstanceAsBaseClause() throws Exception
{
Writer writer = new StringWriter();
writer.write( "template< class T > class A { T t; }; \n" );
writer.write( "class B : public A< int > {}; \n" );
writer.write( "void f( int ); \n" );
writer.write( "void main(){ \n" );
writer.write( " B b; \n" );
writer.write( " f( b.t ); \n" ); //if this function call is good, it implies that b.t is type int
writer.write( "} \n" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
IASTTemplateParameter T = (IASTTemplateParameter) template.getTemplateParameters().next();
IASTClassSpecifier B = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
IASTFunction f = (IASTFunction) i.next();
IASTFunction main = (IASTFunction) i.next();
assertFalse( i.hasNext() );
IASTClassSpecifier A = (IASTClassSpecifier) template.getOwnedDeclaration();
i = getDeclarations( A );
IASTField t = (IASTField) i.next();
assertFalse( i.hasNext() );
i = getDeclarations( main );
IASTVariable b = (IASTVariable) i.next();
assertFalse( i.hasNext() );
assertAllReferences( 6, createTaskList( new Task( T ),
new Task( A ),
new Task( B ),
new Task( b ),
new Task( t ),
new Task( f ) ) );
}
public void testTemplateParameterAsBaseClause() throws Exception
{
Writer writer = new StringWriter();
writer.write( "template < class T > class A : public T {}; \n" );
writer.write( "class B { int i; }; \n" );
writer.write( "void main() { \n" );
writer.write( " A<B> a; \n" );
writer.write( " a.i; \n" );
writer.write( "} \n" );
writer.write( "\n" );
Iterator iter = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) iter.next();
IASTTemplateParameter T = (IASTTemplateParameter) template.getTemplateParameters().next();
IASTClassSpecifier B = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)iter.next()).getTypeSpecifier();
IASTFunction main = (IASTFunction) iter.next();
assertFalse( iter.hasNext() );
IASTClassSpecifier A = (IASTClassSpecifier) template.getOwnedDeclaration();
iter = getDeclarations( B );
IASTVariable i = (IASTVariable) iter.next();
iter = getDeclarations( main );
IASTVariable a = (IASTVariable) iter.next();
assertAllReferences( 5, createTaskList( new Task( T ), new Task( A ), new Task( B ), new Task( a ), new Task( i ) ) );
}
public void testBug55163() throws Exception
{
Writer writer = new StringWriter();
@ -1691,125 +1326,6 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
assertAllReferences( 7, createTaskList( new Task( n ), new Task( i, 5 ), new Task( di ) ) );
}
public void testTypedefedTemplate() throws Exception{
Writer writer = new StringWriter();
writer.write( "template < class T > class _A{ int x; }; \n" );
writer.write( "typedef _A < char > A; \n" );
writer.write( "void foo() { \n" );
writer.write( " A a; \n" );
writer.write( " a.x; \n" );
writer.write( "} \n" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration _A = (IASTTemplateDeclaration) i.next();
IASTTypedefDeclaration A = (IASTTypedefDeclaration) i.next();
IASTFunction foo = (IASTFunction) i.next();
IASTClassSpecifier classA = (IASTClassSpecifier) _A.getOwnedDeclaration();
IASTVariable x = (IASTVariable) getDeclarations( classA ).next();
IASTVariable a = (IASTVariable) getDeclarations( foo ).next();
assertAllReferences( 4, createTaskList( new Task( classA ), new Task( A ), new Task( a ), new Task( x ) ) );
}
public void testTypedefedTemplate_2() throws Exception{
Writer writer = new StringWriter();
writer.write( "template < class T > struct A { T x; }; \n" );
writer.write( "template < class U > struct B { \n" );
writer.write( " typedef A< U > AU; \n" );
writer.write( " void f( U ); \n" );
writer.write( " void f( char ); \n" );
writer.write( " void g(){ \n" );
writer.write( " AU au; \n" );
writer.write( " f( au.x ); \n" );
writer.write( " } \n" );
writer.write( "}; \n" );
writer.write( "void f2( int ); \n" );
writer.write( "void f2( char ); \n" );
writer.write( "void h(){ \n" );
writer.write( " B< int >::AU b; \n" );
writer.write( " f2( b.x ); \n" );
writer.write( "} \n" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration tA = (IASTTemplateDeclaration) i.next();
IASTTemplateParameter T = (IASTTemplateParameter) tA.getTemplateParameters().next();
IASTClassSpecifier A = (IASTClassSpecifier) tA.getOwnedDeclaration();
IASTField x = (IASTField) getDeclarations( A ).next();
IASTTemplateDeclaration tB = (IASTTemplateDeclaration) i.next();
IASTClassSpecifier B = (IASTClassSpecifier) tB.getOwnedDeclaration();
IASTTemplateParameter U = (IASTTemplateParameter) tB.getTemplateParameters().next();
IASTFunction f21 = (IASTFunction) i.next();
IASTFunction f22 = (IASTFunction) i.next();
IASTFunction h = (IASTFunction) i.next();
i = getDeclarations( B );
IASTTypedefDeclaration AU = (IASTTypedefDeclaration) i.next();
IASTMethod f11 = (IASTMethod) i.next();
IASTMethod f12 = (IASTMethod) i.next();
IASTMethod g = (IASTMethod) i.next();
IASTVariable au = (IASTVariable) getDeclarations( g ).next();
IASTVariable b = (IASTVariable) getDeclarations( h ).next();
assertAllReferences( 13, createTaskList( new Task( A ),
new Task( T ),
new Task( U, 2 ),
new Task( AU, 2 ),
new Task( au ),
new Task( x, 2 ),
new Task( f11, 1, false, false ),
new Task( B ),
new Task( b ),
new Task( f21, 1, false, false ) ) );
}
public void testInstantiatingDeferredInstances() throws Exception{
Writer writer = new StringWriter();
writer.write( "template < class T > struct A { A < T > next; }; \n" );
writer.write( "A< int > a; \n" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
IASTTemplateParameter T = (IASTTemplateParameter) template.getTemplateParameters().next();
IASTClassSpecifier A = (IASTClassSpecifier) template.getOwnedDeclaration();
IASTField next = (IASTField) getDeclarations( A ).next();
IASTVariable a = (IASTVariable) i.next();
assertAllReferences( 3, createTaskList( new Task( A, 2 ), new Task( T ) ) );
}
public void testTemplateArgumentDeduction() throws Exception{
Writer writer = new StringWriter();
writer.write( "template< class T > struct B {}; \n" );
writer.write( "template< class T > struct D : public B < T > {}; \n" );
writer.write( "struct D2 : public B< int > {}; \n" );
writer.write( "template< class T > T f( B<T> & ) {} \n" );
writer.write( "void test( int ); \n" );
writer.write( "void test( char ); \n" );
writer.write( "void main() { \n" );
writer.write( " D<int> d; \n" );
writer.write( " D2 d2; \n" );
writer.write( " test( f( d ) ); \n" );
writer.write( " test( f( d2 ) ); \n" );
writer.write( "} \n" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration templateB = (IASTTemplateDeclaration) i.next();
IASTTemplateDeclaration templateD = (IASTTemplateDeclaration) i.next();
IASTClassSpecifier D2 = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
IASTTemplateDeclaration templateF = (IASTTemplateDeclaration) i.next();
IASTFunction test1 = (IASTFunction) i.next();
IASTFunction test2 = (IASTFunction) i.next();
IASTFunction main = (IASTFunction) i.next();
assertFalse( i.hasNext() );
assertReferenceTask( new Task( test1, 2, false, false ) );
}
public void testBug55673() throws Exception{
Writer writer = new StringWriter();
writer.write( "struct Example { int i; int ( * pfi ) ( int ); }; ");
@ -1836,65 +1352,4 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
assertEquals( thePointer.getName(), "pA" );
assertFalse( i.hasNext() );
}
public void testClassTemplateStaticMemberDefinition() throws Exception {
Writer writer = new StringWriter();
writer.write( "template< class T > class A{ \n" );
writer.write( " typedef T * PT; \n" );
writer.write( " static T member; \n" );
writer.write( "}; \n" );
writer.write( "template< class T> A<T>::PT A<T>::member = null; \n" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTTemplateDeclaration template = (IASTTemplateDeclaration) i.next();
IASTTemplateParameter T1 = (IASTTemplateParameter) template.getTemplateParameters().next();
IASTTemplateDeclaration template2 = (IASTTemplateDeclaration) i.next();
IASTTemplateParameter T2 = (IASTTemplateParameter) template2.getTemplateParameters().next();
IASTField member = (IASTField) getDeclarations( template2 ).next();
assertEquals( member.getName(), "member" );
assertReferenceTask( new Task( T1, 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

@ -365,8 +365,7 @@ public class CompleteParseBaseTest extends TestCase
*/
public void enterTemplateInstantiation(IASTTemplateInstantiation instantiation)
{
// TODO Auto-generated method stub
pushScope( instantiation );
}
/* (non-Javadoc)
@ -427,8 +426,8 @@ public class CompleteParseBaseTest extends TestCase
*/
public void exitTemplateExplicitInstantiation(IASTTemplateInstantiation instantiation)
{
// TODO Auto-generated method stub
popScope();
getCurrentScope().addDeclaration( instantiation );
}
/* (non-Javadoc)

View file

@ -41,6 +41,7 @@ public class ParserTestSuite extends TestCase {
suite.addTestSuite( SelectionParseTest.class );
suite.addTestSuite( CompleteParseASTExpressionTest.class );
suite.addTestSuite( CompleteParseASTSymbolIteratorTest.class );
suite.addTestSuite( CompleteParseASTTemplateTest.class );
return suite;
}
}

View file

@ -1,3 +1,9 @@
2004-04-02 Andrew Niefer
- partial handling template explicit instantiations
- bug 56834 - Symbols not available until end of parameter list, fixed for templates using temporary code block
- change IASTFactory.createTemplateParameter to take an IASTTypeId for the default value
- handle instantiating templates using default value that is a deferred instance
2004-04-02 John Camelon
Updated SelectionSearch to work for functions, variables with initializers, etc.
Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=39705

View file

@ -210,7 +210,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, String defaultValue, IASTParameterDeclaration parameter, List parms ) throws ASTSemanticException;
public IASTTemplateParameter createTemplateParameter( IASTTemplateParameter.ParamKind kind, String identifier, IASTTypeId defaultValue, IASTParameterDeclaration parameter, List parms, IASTCodeScope parameterScope ) throws ASTSemanticException;
public IASTTemplateInstantiation createTemplateInstantiation(IASTScope scope, int startingOffset, int startingLine);

View file

@ -14,6 +14,8 @@ package org.eclipse.cdt.core.parser.ast;
* @author jcamelon
*
*/
public interface IASTTemplateInstantiation extends IASTTemplate, IASTDeclaration, IASTOffsetableElement {
public interface IASTTemplateInstantiation extends IASTTemplate, IASTDeclaration, IASTScope, IASTOffsetableElement {
public IASTTemplateDeclaration getInstantiatedTemplate();
}

View file

@ -445,7 +445,7 @@ public abstract class Parser extends ExpressionParser implements IParser
throw backtrack;
}
templateInstantiation.enterScope( requestor );
declaration(scope, templateInstantiation, null);
declaration(templateInstantiation, templateInstantiation, null);
templateInstantiation.setEndingOffsetAndLineNumber(lastToken.getEndOffset(), lastToken.getLineNumber());
templateInstantiation.exitScope( requestor );
@ -546,6 +546,10 @@ public abstract class Parser extends ExpressionParser implements IParser
// iterate through the template parameter list
List returnValue = new ArrayList();
IASTScope parameterScope = astFactory.createNewCodeBlock( scope );
if( parameterScope == null )
parameterScope = scope;
for (;;)
{
if (LT(1) == IToken.tGT)
@ -568,7 +572,7 @@ public abstract class Parser extends ExpressionParser implements IParser
if (LT(1) == IToken.tASSIGN) // optional = type-id
{
consume(IToken.tASSIGN);
typeId = typeId(scope, false); // type-id
typeId = typeId(parameterScope, false); // type-id
}
}
@ -583,9 +587,10 @@ public abstract class Parser extends ExpressionParser implements IParser
astFactory.createTemplateParameter(
kind,
( id == null )? "" : id.getImage(), //$NON-NLS-1$
(typeId == null) ? null : typeId.getTypeOrClassName(),
typeId,
null,
null));
null,
( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null ));
}
catch (Exception e)
{
@ -598,7 +603,7 @@ public abstract class Parser extends ExpressionParser implements IParser
consume(IToken.t_template);
consume(IToken.tLT);
List subResult = templateParameterList(scope);
List subResult = templateParameterList(parameterScope);
consume(IToken.tGT);
consume(IToken.t_class);
IToken optionalId = null;
@ -610,7 +615,7 @@ public abstract class Parser extends ExpressionParser implements IParser
if (LT(1) == IToken.tASSIGN) // optional = type-id
{
consume(IToken.tASSIGN);
optionalTypeId = typeId(scope, false);
optionalTypeId = typeId(parameterScope, false);
}
}
@ -621,9 +626,10 @@ public abstract class Parser extends ExpressionParser implements IParser
astFactory.createTemplateParameter(
IASTTemplateParameter.ParamKind.TEMPLATE_LIST,
( optionalId == null )? "" : optionalId.getImage(), //$NON-NLS-1$
( optionalTypeId == null ) ? "" : optionalTypeId.toString(), //$NON-NLS-1$
optionalTypeId,
null,
subResult));
subResult,
( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null ));
}
catch (Exception e)
{
@ -638,7 +644,7 @@ public abstract class Parser extends ExpressionParser implements IParser
else
{
ParameterCollection c = new ParameterCollection();
parameterDeclaration(c, scope);
parameterDeclaration(c, parameterScope);
DeclarationWrapper wrapper =
(DeclarationWrapper)c.getParameters().get(0);
Declarator declarator =
@ -659,7 +665,8 @@ public abstract class Parser extends ExpressionParser implements IParser
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,
( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null ));
}
catch (Exception e)
{

View file

@ -10,25 +10,73 @@
***********************************************************************/
package org.eclipse.cdt.internal.core.parser.ast.complete;
import java.util.Iterator;
import org.eclipse.cdt.core.parser.ISourceElementRequestor;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.IASTDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTTemplateInstantiation;
import org.eclipse.cdt.internal.core.parser.ast.NamedOffsets;
import org.eclipse.cdt.internal.core.parser.pst.ForewardDeclaredSymbolExtension;
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;
/**
* @author jcamelon
*
*/
public class ASTTemplateInstantiation extends ASTNode implements IASTTemplateInstantiation
public class ASTTemplateInstantiation extends ASTSymbol implements IASTTemplateInstantiation
{
/**
*
*/
public ASTTemplateInstantiation()
{
super();
// TODO Auto-generated constructor stub
private ITemplateFactory factory;
private IASTScope ownerScope;
private IASTTemplateDeclaration instantiatedTemplate;
private ISymbol instance;
private NamedOffsets offsets = new NamedOffsets();
public ASTTemplateInstantiation( IASTScope scope ){
super( null );
IContainerSymbol container = ((ASTScope)scope).getContainerSymbol();
factory = container.getSymbolTable().newTemplateFactory();
factory.setContainingSymbol( container );
factory.setASTExtension( new StandardSymbolExtension( factory, this ) );
factory.pushTemplate( null );
ownerScope = scope;
}
public IASTTemplateDeclaration getInstantiatedTemplate(){
return instantiatedTemplate;
}
public void releaseFactory(){
factory = null;
}
public void setInstanceSymbol( ISymbol sym ){
instance = sym;
ITemplateSymbol template = (ITemplateSymbol) instance.getInstantiatedSymbol().getContainingSymbol();
instantiatedTemplate = (IASTTemplateDeclaration) template.getASTExtension().getPrimaryDeclaration();
setSymbol( instance.getInstantiatedSymbol().getContainingSymbol() );
}
public ISymbol getInstanceSymbol(){
return instance;
}
public IContainerSymbol getContainerSymbol()
{
return factory != null ? (IContainerSymbol) factory : ((ASTTemplateDeclaration)getInstantiatedTemplate()).getContainerSymbol();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTTemplate#getOwnedDeclaration()
*/
@ -49,38 +97,47 @@ public class ASTTemplateInstantiation extends ASTNode implements IASTTemplateIns
*/
public void setStartingOffsetAndLineNumber(int offset, int lineNumber)
{
// TODO Auto-generated method stub
offsets.setStartingOffsetAndLineNumber( offset, lineNumber );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#setEndingOffset(int)
*/
public void setEndingOffsetAndLineNumber(int offset, int lineNumber)
{
// TODO Auto-generated method stub
offsets.setEndingOffsetAndLineNumber( offset, lineNumber );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getStartingOffset()
*/
public int getStartingOffset()
{
// TODO Auto-generated method stub
return 0;
return offsets.getStartingOffset();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getEndingOffset()
*/
public int getEndingOffset()
{
// TODO Auto-generated method stub
return 0;
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();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTScopedElement#getOwnerScope()
*/
public IASTScope getOwnerScope()
{
// TODO Auto-generated method stub
return null;
return ownerScope;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor)
@ -94,27 +151,35 @@ public class ASTTemplateInstantiation extends ASTNode implements IASTTemplateIns
*/
public void enterScope(ISourceElementRequestor requestor)
{
// TODO Auto-generated method stub
try
{
requestor.enterTemplateInstantiation(this);
}
catch (Exception e)
{
/* do nothing */
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#exitScope(org.eclipse.cdt.core.parser.ISourceElementRequestor)
*/
public void exitScope(ISourceElementRequestor requestor)
{
// TODO Auto-generated method stub
try
{
requestor.exitTemplateExplicitInstantiation(this);
}
catch (Exception e)
{
/* do nothing */
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getStartingLine()
* @see org.eclipse.cdt.core.parser.ast.IASTScope#getDeclarations()
*/
public int getStartingLine() {
public Iterator getDeclarations() throws ASTNotImplementedException {
// TODO Auto-generated method stub
return 0;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getEndingLine()
*/
public int getEndingLine() {
// TODO Auto-generated method stub
return 0;
return null;
}
}

View file

@ -13,6 +13,7 @@ import org.eclipse.cdt.core.parser.ISourceElementRequestor;
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.core.parser.ast.IASTTypeId;
import org.eclipse.cdt.internal.core.parser.ast.NamedOffsets;
import org.eclipse.cdt.internal.core.parser.pst.ISymbol;
import org.eclipse.cdt.internal.core.parser.pst.TypeInfo;
@ -28,7 +29,7 @@ public class ASTTemplateParameter extends ASTSymbol implements IASTTemplateParam
// private ParamKind kind;
// private String identifier;
//private ISymbol symbol;
private String defaultValue;
private IASTTypeId defaultValue;
private ASTParameterDeclaration parameter;
private List parms;
private final NamedOffsets offsets = new NamedOffsets();
@ -39,7 +40,7 @@ public class ASTTemplateParameter extends ASTSymbol implements IASTTemplateParam
* @param parameter2
* @param parms2
*/
public ASTTemplateParameter(ISymbol sym, String defVal, IASTParameterDeclaration param, List parms ) {
public ASTTemplateParameter(ISymbol sym, IASTTypeId defVal, IASTParameterDeclaration param, List parms ) {
super( sym );
symbol = sym;
defaultValue = defVal;
@ -69,7 +70,7 @@ public class ASTTemplateParameter extends ASTSymbol implements IASTTemplateParam
* @see org.eclipse.cdt.core.parser.ast.IASTTemplateParameter#getDefaultValueIdExpression()
*/
public String getDefaultValueIdExpression() {
return defaultValue;
return ( defaultValue != null ) ? defaultValue.toString() : ""; //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTTemplateParameter#getParameterDeclaration()

View file

@ -481,6 +481,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
return ((ASTScope)currentScope).getContainerSymbol();
else if ( currentScope instanceof ASTTemplateDeclaration )
return ((ASTTemplateDeclaration)currentScope).getContainerSymbol();
else if ( currentScope instanceof ASTTemplateInstantiation )
return ((ASTTemplateInstantiation)currentScope).getContainerSymbol();
else
return scopeToSymbol(((ASTAnonymousDeclaration)currentScope).getOwnerScope());
}
@ -678,7 +680,11 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( name.getSegmentCount() != 1 ) // qualified name
{
ITokenDuple containerSymbolName = name.getLeadingSegments();
currentScopeSymbol = (IContainerSymbol)lookupQualifiedName( currentScopeSymbol, containerSymbolName, references, true);
ISymbol temp = lookupQualifiedName( currentScopeSymbol, containerSymbolName, references, true);
if( temp instanceof IDeferredTemplateInstance )
currentScopeSymbol = ((IDeferredTemplateInstance)temp).getTemplate().getTemplatedSymbol();
else
currentScopeSymbol = (IContainerSymbol) temp;
if( currentScopeSymbol == null )
handleProblem( IProblem.SEMANTIC_NAME_NOT_FOUND, containerSymbolName.toString(), containerSymbolName.getFirstToken().getOffset(), containerSymbolName.getLastToken().getEndOffset(), containerSymbolName.getLastToken().getLineNumber() );
@ -689,13 +695,13 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
//template-id
List [] array = name.getTemplateIdArgLists();
if( array != null ){
isTemplateId = true;
templateIdArgList = array[ array.length - 1 ];
isTemplateId = (templateIdArgList != null);
}
newSymbolName = nameToken.getImage();
}
int i = 0;
ISymbol classSymbol = null;
if( !newSymbolName.equals("") && !isTemplateId ){ //$NON-NLS-1$
try
@ -843,6 +849,12 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
*/
protected IASTReference createReference(ISymbol symbol, String referenceElementName, int offset ) throws ASTSemanticException
{
if( symbol.getASTExtension() == null ){
//referenced symbol doesn't have an attached AST node, could happen say for the copy constructor added
//by the symbol table.
return null;
}
// assert (symbol != null ) : "createReference cannot be called on null symbol ";
if( symbol.getTypeInfo().checkBit( TypeInfo.isTypedef ) ||
symbol.getASTExtension().getPrimaryDeclaration() instanceof IASTTypedefDeclaration )
@ -1756,7 +1768,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
}
catch (ParserSymbolTableException e)
{
handleProblem( e.createProblemID(), image );
handleProblem( e.createProblemID(), image,typeName.getStartOffset(), typeName.getEndOffset(), typeName.getLineNumber() );
}
}
s.setTypeSymbol( typeSymbol );
@ -2360,7 +2372,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
newSymbol);
setPointerOperators( newSymbol, abstractDeclaration.getPointerOperators(), abstractDeclaration.getArrayModifiers() );
newSymbol.setIsForwardDeclaration(isStatic);
newSymbol.setIsForwardDeclaration( isStatic || isExtern );
boolean previouslyDeclared = false;
if(!isStatic){
ISymbol variableDeclaration = lookupQualifiedName(ownerScope, name.toString(), new ArrayList(), false, LookupType.UNQUALIFIED);
@ -2639,9 +2651,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
public IASTTemplateParameter createTemplateParameter(
ParamKind kind,
String identifier,
String defaultValue,
IASTTypeId defaultValue,
IASTParameterDeclaration parameter,
List parms ) throws ASTSemanticException
List parms,
IASTCodeScope parameterScope ) throws ASTSemanticException
{
ISymbol symbol = null;
if( kind == ParamKind.TEMPLATE_LIST ){
@ -2674,6 +2687,18 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
}
}
IContainerSymbol codeScope = ((ASTCodeScope)parameterScope).getContainerSymbol();
try {
codeScope.addSymbol( symbol );
} catch (ParserSymbolTableException e) {
}
if( defaultValue != null ){
try {
symbol.getTypeInfo().setDefault( defaultValue.getTypeSymbol().getTypeInfo() );
} catch (ASTNotImplementedException e1) {
}
}
ASTTemplateParameter ast = new ASTTemplateParameter( symbol, defaultValue, parameter, parms );
attachSymbolExtension( symbol, ast, false );
@ -2687,8 +2712,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
IASTScope scope,
int startingOffset, int startingLine)
{
// TODO Auto-generated method stub
return new ASTTemplateInstantiation();
return new ASTTemplateInstantiation( scope );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTFactory#createTemplateSpecialization(org.eclipse.cdt.core.parser.ast.IASTScope, int)
@ -2811,7 +2835,21 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( isForewardDecl )
{
if( checkSymbol == null )
if( scope instanceof IASTTemplateInstantiation )
{
if( isTemplateId ){
checkSymbol = pst.newDerivableContainerSymbol( newSymbolName, pstType );
try {
currentScopeSymbol.addTemplateId( checkSymbol, args );
} catch (ParserSymbolTableException e) {
handleProblem(e.createProblemID(),nameToken.getImage(), nameToken.getOffset(), nameToken.getEndOffset(), nameToken.getLineNumber() );
}
} else {
handleProblem( IProblem.SEMANTIC_INVALID_TEMPLATE, nameToken.getImage() );
}
checkSymbol = ((ASTTemplateInstantiation)scope).getInstanceSymbol();
}
else if( checkSymbol == null )
{
checkSymbol = pst.newDerivableContainerSymbol( newSymbolName, pstType );
checkSymbol.setIsForwardDeclaration( true );
@ -2841,7 +2879,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
}
if( checkSymbol != null ){
if( checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTClassSpecifier ||
if( scope instanceof IASTTemplateInstantiation ){
addReference( references, createReference( checkSymbol, newSymbolName, nameToken.getOffset() ));
}
if( checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTClassSpecifier ||
checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTEnumerationSpecifier
)
{
@ -2849,7 +2890,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
attachSymbolExtension( checkSymbol, elab, isForewardDecl );
return elab;
}
if( checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTElaboratedTypeSpecifier )
return (IASTElaboratedTypeSpecifier)checkSymbol.getASTExtension().getPrimaryDeclaration();
} else {
@ -2966,6 +3007,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
return TypeInfo.t__Bool;
else if( type == IASTSimpleTypeSpecifier.Type.CHAR )
return TypeInfo.t_char;
else if ( type == IASTSimpleTypeSpecifier.Type.WCHAR_T )
return TypeInfo.t_wchar_t;
else if( type == IASTSimpleTypeSpecifier.Type.DOUBLE )
return TypeInfo.t_double;
else if( type == IASTSimpleTypeSpecifier.Type.FLOAT )

View file

@ -754,9 +754,9 @@ public class ExpressionParseASTFactory extends BaseASTFactory implements IASTFac
public IASTTemplateParameter createTemplateParameter(
ParamKind kind,
String identifier,
String defaultValue,
IASTTypeId defaultValue,
IASTParameterDeclaration parameter,
List parms) {
List parms, IASTCodeScope parameterScope) {
// TODO Auto-generated method stub
return null;
}

View file

@ -10,9 +10,13 @@
***********************************************************************/
package org.eclipse.cdt.internal.core.parser.ast.quick;
import java.util.Iterator;
import org.eclipse.cdt.core.parser.ISourceElementRequestor;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.IASTDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTTemplateInstantiation;
import org.eclipse.cdt.internal.core.parser.ast.Offsets;
@ -133,5 +137,21 @@ public class ASTTemplateInstantiation extends ASTDeclaration implements IASTTemp
public int getEndingLine() {
return offsets.getEndingLine();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTTemplateInstantiation#getInstantiatedTemplate()
*/
public IASTTemplateDeclaration getInstantiatedTemplate() {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTScope#getDeclarations()
*/
public Iterator getDeclarations() throws ASTNotImplementedException {
// TODO Auto-generated method stub
return null;
}
}

View file

@ -256,9 +256,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, String defaultValue, IASTParameterDeclaration parameter, List parms)
public IASTTemplateParameter createTemplateParameter(IASTTemplateParameter.ParamKind kind, String identifier, IASTTypeId defaultValue, IASTParameterDeclaration parameter, List parms, IASTCodeScope parameterScope)
{
return new ASTTemplateParameter( kind, identifier, defaultValue, parameter, parms );
return new ASTTemplateParameter( kind, identifier, defaultValue != null ? defaultValue.getTypeOrClassName() : "", parameter, parms ); //$NON-NLS-1$
}
/* (non-Javadoc)

View file

@ -19,6 +19,7 @@ import java.util.Map;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
import org.eclipse.cdt.internal.core.parser.ast.complete.ASTTemplateDeclaration;
import org.eclipse.cdt.internal.core.parser.ast.complete.ASTTemplateInstantiation;
import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.PtrOp;
import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.eType;
@ -63,8 +64,11 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor
ITemplateSymbol template = (ITemplateSymbol) templates.get( templates.size() - 1 );
List params = template.getParameterList();
if( params.size() == 0 ){
List params = ( template != null ) ? template.getParameterList() : null;
if( params == null ){
//explicit instantiation
addExplicitInstantiation( origTemplate, args );
} else if( params.size() == 0 ){
//explicit specialization
addExplicitSpecialization( origTemplate, symbol, args );
} else {
@ -260,6 +264,15 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor
}
}
private void addExplicitInstantiation( ITemplateSymbol origTemplate, List args ) throws ParserSymbolTableException {
ISymbol instance = origTemplate.instantiate( args );
if( getASTExtension() != null ){
ASTTemplateInstantiation templateInstance = (ASTTemplateInstantiation) getASTExtension().getPrimaryDeclaration();
templateInstance.releaseFactory();
templateInstance.setInstanceSymbol( instance );
}
}
private void addExplicitSpecialization( ITemplateSymbol template, ISymbol symbol, List arguments ) throws ParserSymbolTableException {
Iterator templatesIter = templates.iterator();
Iterator argsIter = arguments.iterator();

View file

@ -122,6 +122,10 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb
} else {
throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTemplateArgument );
}
} else if( arg.isType( TypeInfo.t_type ) && arg.getTypeSymbol() instanceof IDeferredTemplateInstance ){
IDeferredTemplateInstance deferred = (IDeferredTemplateInstance) arg.getTypeSymbol();
arg = new TypeInfo( arg );
arg.setTypeSymbol( deferred.instantiate( this, map ) );
}
} else {
throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTemplateArgument );