1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-29 20:05:35 +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 2004-04-02 John Camelon
Added SelectionParseTest::testBaseCase_FunctionDeclaration(). Added SelectionParseTest::testBaseCase_FunctionDeclaration().
Added SelectionParseTest::testBaseCase_FunctionDeclaration2(). 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( f2.previouslyDeclared() );
assertFalse( i.hasNext() ); 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 public void testBug54639() throws Exception
{ {
Writer writer = new StringWriter(); Writer writer = new StringWriter();
@ -1547,129 +1305,6 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
assertFalse( i.hasNext() ); 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 public void testBug55163() throws Exception
{ {
Writer writer = new StringWriter(); 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 ) ) ); 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{ public void testBug55673() throws Exception{
Writer writer = new StringWriter(); Writer writer = new StringWriter();
writer.write( "struct Example { int i; int ( * pfi ) ( int ); }; "); writer.write( "struct Example { int i; int ( * pfi ) ( int ); }; ");
@ -1836,65 +1352,4 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
assertEquals( thePointer.getName(), "pA" ); assertEquals( thePointer.getName(), "pA" );
assertFalse( i.hasNext() ); 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) public void enterTemplateInstantiation(IASTTemplateInstantiation instantiation)
{ {
// TODO Auto-generated method stub pushScope( instantiation );
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -427,8 +426,8 @@ public class CompleteParseBaseTest extends TestCase
*/ */
public void exitTemplateExplicitInstantiation(IASTTemplateInstantiation instantiation) public void exitTemplateExplicitInstantiation(IASTTemplateInstantiation instantiation)
{ {
// TODO Auto-generated method stub popScope();
getCurrentScope().addDeclaration( instantiation );
} }
/* (non-Javadoc) /* (non-Javadoc)

View file

@ -41,6 +41,7 @@ public class ParserTestSuite extends TestCase {
suite.addTestSuite( SelectionParseTest.class ); suite.addTestSuite( SelectionParseTest.class );
suite.addTestSuite( CompleteParseASTExpressionTest.class ); suite.addTestSuite( CompleteParseASTExpressionTest.class );
suite.addTestSuite( CompleteParseASTSymbolIteratorTest.class ); suite.addTestSuite( CompleteParseASTSymbolIteratorTest.class );
suite.addTestSuite( CompleteParseASTTemplateTest.class );
return suite; 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 2004-04-02 John Camelon
Updated SelectionSearch to work for functions, variables with initializers, etc. Updated SelectionSearch to work for functions, variables with initializers, etc.
Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=39705 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 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); public IASTTemplateInstantiation createTemplateInstantiation(IASTScope scope, int startingOffset, int startingLine);

View file

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

View file

@ -10,25 +10,73 @@
***********************************************************************/ ***********************************************************************/
package org.eclipse.cdt.internal.core.parser.ast.complete; 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.ISourceElementRequestor;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.IASTDeclaration; import org.eclipse.cdt.core.parser.ast.IASTDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTScope; 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.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 * @author jcamelon
* *
*/ */
public class ASTTemplateInstantiation extends ASTNode implements IASTTemplateInstantiation public class ASTTemplateInstantiation extends ASTSymbol implements IASTTemplateInstantiation
{ {
/** private ITemplateFactory factory;
* private IASTScope ownerScope;
*/ private IASTTemplateDeclaration instantiatedTemplate;
public ASTTemplateInstantiation() private ISymbol instance;
{
super(); private NamedOffsets offsets = new NamedOffsets();
// TODO Auto-generated constructor stub
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) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTTemplate#getOwnedDeclaration() * @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) public void setStartingOffsetAndLineNumber(int offset, int lineNumber)
{ {
// TODO Auto-generated method stub offsets.setStartingOffsetAndLineNumber( offset, lineNumber );
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#setEndingOffset(int) * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#setEndingOffset(int)
*/ */
public void setEndingOffsetAndLineNumber(int offset, int lineNumber) public void setEndingOffsetAndLineNumber(int offset, int lineNumber)
{ {
// TODO Auto-generated method stub offsets.setEndingOffsetAndLineNumber( offset, lineNumber );
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getStartingOffset() * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getStartingOffset()
*/ */
public int getStartingOffset() public int getStartingOffset()
{ {
// TODO Auto-generated method stub return offsets.getStartingOffset();
return 0;
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getEndingOffset() * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getEndingOffset()
*/ */
public int getEndingOffset() public int getEndingOffset()
{ {
// TODO Auto-generated method stub return offsets.getEndingOffset();
return 0;
} }
/* (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) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTScopedElement#getOwnerScope() * @see org.eclipse.cdt.core.parser.ast.IASTScopedElement#getOwnerScope()
*/ */
public IASTScope getOwnerScope() public IASTScope getOwnerScope()
{ {
// TODO Auto-generated method stub return ownerScope;
return null;
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#acceptElement(org.eclipse.cdt.core.parser.ISourceElementRequestor) * @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) public void enterScope(ISourceElementRequestor requestor)
{ {
// TODO Auto-generated method stub try
{
requestor.enterTemplateInstantiation(this);
}
catch (Exception e)
{
/* do nothing */
}
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#exitScope(org.eclipse.cdt.core.parser.ISourceElementRequestor) * @see org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate#exitScope(org.eclipse.cdt.core.parser.ISourceElementRequestor)
*/ */
public void exitScope(ISourceElementRequestor requestor) public void exitScope(ISourceElementRequestor requestor)
{ {
// TODO Auto-generated method stub try
{
requestor.exitTemplateExplicitInstantiation(this);
}
catch (Exception e)
{
/* do nothing */
}
} }
/* (non-Javadoc) /* (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 // TODO Auto-generated method stub
return 0; return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getEndingLine()
*/
public int getEndingLine() {
// TODO Auto-generated method stub
return 0;
} }
} }

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.IASTOffsetableNamedElement;
import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTTemplateParameter; 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.ast.NamedOffsets;
import org.eclipse.cdt.internal.core.parser.pst.ISymbol; import org.eclipse.cdt.internal.core.parser.pst.ISymbol;
import org.eclipse.cdt.internal.core.parser.pst.TypeInfo; import org.eclipse.cdt.internal.core.parser.pst.TypeInfo;
@ -28,7 +29,7 @@ public class ASTTemplateParameter extends ASTSymbol implements IASTTemplateParam
// private ParamKind kind; // private ParamKind kind;
// private String identifier; // private String identifier;
//private ISymbol symbol; //private ISymbol symbol;
private String defaultValue; private IASTTypeId defaultValue;
private ASTParameterDeclaration parameter; private ASTParameterDeclaration parameter;
private List parms; private List parms;
private final NamedOffsets offsets = new NamedOffsets(); private final NamedOffsets offsets = new NamedOffsets();
@ -39,7 +40,7 @@ public class ASTTemplateParameter extends ASTSymbol implements IASTTemplateParam
* @param parameter2 * @param parameter2
* @param parms2 * @param parms2
*/ */
public ASTTemplateParameter(ISymbol sym, String defVal, IASTParameterDeclaration param, List parms ) { public ASTTemplateParameter(ISymbol sym, IASTTypeId defVal, IASTParameterDeclaration param, List parms ) {
super( sym ); super( sym );
symbol = sym; symbol = sym;
defaultValue = defVal; defaultValue = defVal;
@ -69,7 +70,7 @@ public class ASTTemplateParameter extends ASTSymbol implements IASTTemplateParam
* @see org.eclipse.cdt.core.parser.ast.IASTTemplateParameter#getDefaultValueIdExpression() * @see org.eclipse.cdt.core.parser.ast.IASTTemplateParameter#getDefaultValueIdExpression()
*/ */
public String getDefaultValueIdExpression() { public String getDefaultValueIdExpression() {
return defaultValue; return ( defaultValue != null ) ? defaultValue.toString() : ""; //$NON-NLS-1$
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTTemplateParameter#getParameterDeclaration() * @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(); return ((ASTScope)currentScope).getContainerSymbol();
else if ( currentScope instanceof ASTTemplateDeclaration ) else if ( currentScope instanceof ASTTemplateDeclaration )
return ((ASTTemplateDeclaration)currentScope).getContainerSymbol(); return ((ASTTemplateDeclaration)currentScope).getContainerSymbol();
else if ( currentScope instanceof ASTTemplateInstantiation )
return ((ASTTemplateInstantiation)currentScope).getContainerSymbol();
else else
return scopeToSymbol(((ASTAnonymousDeclaration)currentScope).getOwnerScope()); return scopeToSymbol(((ASTAnonymousDeclaration)currentScope).getOwnerScope());
} }
@ -678,7 +680,11 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( name.getSegmentCount() != 1 ) // qualified name if( name.getSegmentCount() != 1 ) // qualified name
{ {
ITokenDuple containerSymbolName = name.getLeadingSegments(); 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 ) if( currentScopeSymbol == null )
handleProblem( IProblem.SEMANTIC_NAME_NOT_FOUND, containerSymbolName.toString(), containerSymbolName.getFirstToken().getOffset(), containerSymbolName.getLastToken().getEndOffset(), containerSymbolName.getLastToken().getLineNumber() ); 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 //template-id
List [] array = name.getTemplateIdArgLists(); List [] array = name.getTemplateIdArgLists();
if( array != null ){ if( array != null ){
isTemplateId = true;
templateIdArgList = array[ array.length - 1 ]; templateIdArgList = array[ array.length - 1 ];
isTemplateId = (templateIdArgList != null);
} }
newSymbolName = nameToken.getImage(); newSymbolName = nameToken.getImage();
} }
int i = 0;
ISymbol classSymbol = null; ISymbol classSymbol = null;
if( !newSymbolName.equals("") && !isTemplateId ){ //$NON-NLS-1$ if( !newSymbolName.equals("") && !isTemplateId ){ //$NON-NLS-1$
try try
@ -843,6 +849,12 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
*/ */
protected IASTReference createReference(ISymbol symbol, String referenceElementName, int offset ) throws ASTSemanticException 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 "; // assert (symbol != null ) : "createReference cannot be called on null symbol ";
if( symbol.getTypeInfo().checkBit( TypeInfo.isTypedef ) || if( symbol.getTypeInfo().checkBit( TypeInfo.isTypedef ) ||
symbol.getASTExtension().getPrimaryDeclaration() instanceof IASTTypedefDeclaration ) symbol.getASTExtension().getPrimaryDeclaration() instanceof IASTTypedefDeclaration )
@ -1756,7 +1768,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
catch (ParserSymbolTableException e) catch (ParserSymbolTableException e)
{ {
handleProblem( e.createProblemID(), image ); handleProblem( e.createProblemID(), image,typeName.getStartOffset(), typeName.getEndOffset(), typeName.getLineNumber() );
} }
} }
s.setTypeSymbol( typeSymbol ); s.setTypeSymbol( typeSymbol );
@ -2360,7 +2372,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
newSymbol); newSymbol);
setPointerOperators( newSymbol, abstractDeclaration.getPointerOperators(), abstractDeclaration.getArrayModifiers() ); setPointerOperators( newSymbol, abstractDeclaration.getPointerOperators(), abstractDeclaration.getArrayModifiers() );
newSymbol.setIsForwardDeclaration(isStatic); newSymbol.setIsForwardDeclaration( isStatic || isExtern );
boolean previouslyDeclared = false; boolean previouslyDeclared = false;
if(!isStatic){ if(!isStatic){
ISymbol variableDeclaration = lookupQualifiedName(ownerScope, name.toString(), new ArrayList(), false, LookupType.UNQUALIFIED); 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( public IASTTemplateParameter createTemplateParameter(
ParamKind kind, ParamKind kind,
String identifier, String identifier,
String defaultValue, IASTTypeId defaultValue,
IASTParameterDeclaration parameter, IASTParameterDeclaration parameter,
List parms ) throws ASTSemanticException List parms,
IASTCodeScope parameterScope ) throws ASTSemanticException
{ {
ISymbol symbol = null; ISymbol symbol = null;
if( kind == ParamKind.TEMPLATE_LIST ){ 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 ); ASTTemplateParameter ast = new ASTTemplateParameter( symbol, defaultValue, parameter, parms );
attachSymbolExtension( symbol, ast, false ); attachSymbolExtension( symbol, ast, false );
@ -2687,8 +2712,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
IASTScope scope, IASTScope scope,
int startingOffset, int startingLine) int startingOffset, int startingLine)
{ {
// TODO Auto-generated method stub return new ASTTemplateInstantiation( scope );
return new ASTTemplateInstantiation();
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTFactory#createTemplateSpecialization(org.eclipse.cdt.core.parser.ast.IASTScope, int) * @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( 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 = pst.newDerivableContainerSymbol( newSymbolName, pstType );
checkSymbol.setIsForwardDeclaration( true ); checkSymbol.setIsForwardDeclaration( true );
@ -2841,7 +2879,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
if( checkSymbol != null ){ 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 checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTEnumerationSpecifier
) )
{ {
@ -2849,7 +2890,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
attachSymbolExtension( checkSymbol, elab, isForewardDecl ); attachSymbolExtension( checkSymbol, elab, isForewardDecl );
return elab; return elab;
} }
if( checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTElaboratedTypeSpecifier ) if( checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTElaboratedTypeSpecifier )
return (IASTElaboratedTypeSpecifier)checkSymbol.getASTExtension().getPrimaryDeclaration(); return (IASTElaboratedTypeSpecifier)checkSymbol.getASTExtension().getPrimaryDeclaration();
} else { } else {
@ -2966,6 +3007,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
return TypeInfo.t__Bool; return TypeInfo.t__Bool;
else if( type == IASTSimpleTypeSpecifier.Type.CHAR ) else if( type == IASTSimpleTypeSpecifier.Type.CHAR )
return TypeInfo.t_char; return TypeInfo.t_char;
else if ( type == IASTSimpleTypeSpecifier.Type.WCHAR_T )
return TypeInfo.t_wchar_t;
else if( type == IASTSimpleTypeSpecifier.Type.DOUBLE ) else if( type == IASTSimpleTypeSpecifier.Type.DOUBLE )
return TypeInfo.t_double; return TypeInfo.t_double;
else if( type == IASTSimpleTypeSpecifier.Type.FLOAT ) else if( type == IASTSimpleTypeSpecifier.Type.FLOAT )

View file

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

View file

@ -10,9 +10,13 @@
***********************************************************************/ ***********************************************************************/
package org.eclipse.cdt.internal.core.parser.ast.quick; 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.ISourceElementRequestor;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.IASTDeclaration; import org.eclipse.cdt.core.parser.ast.IASTDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTScope; 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.core.parser.ast.IASTTemplateInstantiation;
import org.eclipse.cdt.internal.core.parser.ast.Offsets; import org.eclipse.cdt.internal.core.parser.ast.Offsets;
@ -133,5 +137,21 @@ public class ASTTemplateInstantiation extends ASTDeclaration implements IASTTemp
public int getEndingLine() { public int getEndingLine() {
return offsets.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) /* (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) * @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) /* (non-Javadoc)

View file

@ -19,6 +19,7 @@ import java.util.Map;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; 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.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.PtrOp;
import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.eType; 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 ); ITemplateSymbol template = (ITemplateSymbol) templates.get( templates.size() - 1 );
List params = template.getParameterList(); List params = ( template != null ) ? template.getParameterList() : null;
if( params.size() == 0 ){ if( params == null ){
//explicit instantiation
addExplicitInstantiation( origTemplate, args );
} else if( params.size() == 0 ){
//explicit specialization //explicit specialization
addExplicitSpecialization( origTemplate, symbol, args ); addExplicitSpecialization( origTemplate, symbol, args );
} else { } 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 { private void addExplicitSpecialization( ITemplateSymbol template, ISymbol symbol, List arguments ) throws ParserSymbolTableException {
Iterator templatesIter = templates.iterator(); Iterator templatesIter = templates.iterator();
Iterator argsIter = arguments.iterator(); Iterator argsIter = arguments.iterator();

View file

@ -122,6 +122,10 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb
} else { } else {
throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTemplateArgument ); 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 { } else {
throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTemplateArgument ); throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTemplateArgument );