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:
parent
f594128873
commit
4973e16836
17 changed files with 882 additions and 611 deletions
|
@ -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().
|
||||||
|
|
|
@ -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 ) ) );
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 ) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
Loading…
Add table
Reference in a new issue