mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-03 14:25:37 +02:00
Template Bindings
-Distinguish between specializations and instantiations - better handling of explicit specializations - don't need to instantiate an explicit specialization
This commit is contained in:
parent
8fb7e7383f
commit
2bd9664bb0
42 changed files with 1678 additions and 939 deletions
|
@ -659,41 +659,6 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest {
|
|||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
[--Start Example(CPP 14.5.2-2):
|
||||
template <class T> struct A {
|
||||
void f(int);
|
||||
template <class T2> void f(T2);
|
||||
};
|
||||
template <> void A<int>::f(int) { } // nontemplate member
|
||||
template <> template <> void A<int>::f<>(int) { } // template member
|
||||
int main()
|
||||
{
|
||||
A<char> ac;
|
||||
ac.f(1); //nontemplate
|
||||
ac.f('c'); //template
|
||||
ac.f<>(1); //template
|
||||
}
|
||||
--End Example]
|
||||
*/
|
||||
public void test14_5_2s2() throws Exception {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append("template <class T> struct A {\n"); //$NON-NLS-1$
|
||||
buffer.append("void f(int);\n"); //$NON-NLS-1$
|
||||
buffer.append("template <class T2> void f(T2);\n"); //$NON-NLS-1$
|
||||
buffer.append("};\n"); //$NON-NLS-1$
|
||||
buffer.append("template <> void A<int>::f(int) { } // nontemplate member\n"); //$NON-NLS-1$
|
||||
buffer.append("template <> template <> void A<int>::f<>(int) { } // template member\n"); //$NON-NLS-1$
|
||||
buffer.append("int main()\n"); //$NON-NLS-1$
|
||||
buffer.append("{\n"); //$NON-NLS-1$
|
||||
buffer.append("A<char> ac;\n"); //$NON-NLS-1$
|
||||
buffer.append("ac.f(1); //nontemplate\n"); //$NON-NLS-1$
|
||||
buffer.append("ac.f('c'); //template\n"); //$NON-NLS-1$
|
||||
buffer.append("ac.f<>(1); //template\n"); //$NON-NLS-1$
|
||||
buffer.append("}\n"); //$NON-NLS-1$
|
||||
parse(buffer.toString(), ParserLanguage.CPP, true, 3); //should be 0
|
||||
}
|
||||
|
||||
/**
|
||||
[--Start Example(CPP 14.5.3-1):
|
||||
|
|
|
@ -11733,6 +11733,41 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
|
|||
parse(buffer.toString(), ParserLanguage.CPP, false, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
[--Start Example(CPP 14.5.2-2):
|
||||
template <class T> struct A {
|
||||
void f(int);
|
||||
template <class T2> void f(T2);
|
||||
};
|
||||
template <> void A<int>::f(int) { } // nontemplate member
|
||||
template <> template <> void A<int>::f<>(int) { } // template member
|
||||
int main()
|
||||
{
|
||||
A<char> ac;
|
||||
ac.f(1); //nontemplate
|
||||
ac.f('c'); //template
|
||||
ac.f<>(1); //template
|
||||
}
|
||||
--End Example]
|
||||
*/
|
||||
public void test14_5_2s2() throws Exception {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append("template <class T> struct A {\n"); //$NON-NLS-1$
|
||||
buffer.append("void f(int);\n"); //$NON-NLS-1$
|
||||
buffer.append("template <class T2> void f(T2);\n"); //$NON-NLS-1$
|
||||
buffer.append("};\n"); //$NON-NLS-1$
|
||||
buffer.append("template <> void A<int>::f(int) { } // nontemplate member\n"); //$NON-NLS-1$
|
||||
buffer.append("template <> template <> void A<int>::f<>(int) { } // template member\n"); //$NON-NLS-1$
|
||||
buffer.append("int main()\n"); //$NON-NLS-1$
|
||||
buffer.append("{\n"); //$NON-NLS-1$
|
||||
buffer.append("A<char> ac;\n"); //$NON-NLS-1$
|
||||
buffer.append("ac.f(1); //nontemplate\n"); //$NON-NLS-1$
|
||||
buffer.append("ac.f('c'); //template\n"); //$NON-NLS-1$
|
||||
buffer.append("ac.f<>(1); //template\n"); //$NON-NLS-1$
|
||||
buffer.append("}\n"); //$NON-NLS-1$
|
||||
parse(buffer.toString(), ParserLanguage.CPP, true, 0); //should be 0
|
||||
}
|
||||
|
||||
/**
|
||||
[--Start Example(CPP 14.5.4-5):
|
||||
template<class T1, class T2, int I> class A<T1, T2, I> { }; // error
|
||||
|
|
|
@ -24,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.IPointerType;
|
|||
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||
|
@ -31,11 +32,12 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
|
||||
|
@ -102,22 +104,22 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
assertSame( A_int, a.getType() );
|
||||
|
||||
assertTrue( A_int instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)A_int).getOriginalBinding(), A );
|
||||
assertSame( ((ICPPTemplateInstance)A_int).getTemplateDefinition(), A );
|
||||
|
||||
ICPPClassScope A_int_Scope = (ICPPClassScope) A_int.getCompositeScope();
|
||||
assertNotSame( A_int_Scope, ((ICompositeType) A).getCompositeScope() );
|
||||
|
||||
ICPPField t = (ICPPField) col.getName(11).resolveBinding();
|
||||
assertTrue( t instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)t).getOriginalBinding(), t1 );
|
||||
assertTrue( t instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)t).getSpecializedBinding(), t1 );
|
||||
assertSame( t.getScope(), A_int_Scope );
|
||||
IType type = t.getType();
|
||||
assertTrue( type instanceof IBasicType );
|
||||
assertEquals( ((IBasicType)type).getType(), IBasicType.t_int );
|
||||
|
||||
t = (ICPPField) col.getName(13).resolveBinding();
|
||||
assertTrue( t instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)t).getOriginalBinding(), t2 );
|
||||
assertTrue( t instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)t).getSpecializedBinding(), t2 );
|
||||
assertSame( t.getScope(), A_int_Scope );
|
||||
type = t.getType();
|
||||
assertTrue( type instanceof IPointerType );
|
||||
|
@ -149,11 +151,11 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
|
||||
ICPPClassType A_int = (ICPPClassType) col.getName(7).resolveBinding();
|
||||
assertTrue( A_int instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)A_int).getOriginalBinding(), A );
|
||||
assertSame( ((ICPPTemplateInstance)A_int).getTemplateDefinition(), A );
|
||||
|
||||
ICPPMethod f_int = (ICPPMethod) col.getName(11).resolveBinding();
|
||||
assertTrue( f_int instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)f_int).getOriginalBinding(), f );
|
||||
assertTrue( f_int instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)f_int).getSpecializedBinding(), f );
|
||||
ft = f_int.getType();
|
||||
assertTrue( ft.getReturnType() instanceof IBasicType );
|
||||
assertTrue( ((IPointerType)ft.getParameterTypes()[0]).getType() instanceof IBasicType );
|
||||
|
@ -189,7 +191,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
|
||||
ICPPFunction f3 = (ICPPFunction) col.getName(11).resolveBinding();
|
||||
assertTrue( f3 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)f3).getOriginalBinding(), f );
|
||||
assertSame( ((ICPPTemplateInstance)f3).getTemplateDefinition(), f );
|
||||
|
||||
assertInstances( col, T, 5 );
|
||||
}
|
||||
|
@ -214,7 +216,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
|
||||
assertSame( U, U2 );
|
||||
assertSame( pair, p );
|
||||
assertSame( pi.getOriginalBinding(), pair );
|
||||
assertSame( pi.getTemplateDefinition(), pair );
|
||||
}
|
||||
|
||||
public void testBasicClassPartialSpecialization() throws Exception {
|
||||
|
@ -230,13 +232,13 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
ICPPTemplateParameter T1 = (ICPPTemplateParameter) col.getName(0).resolveBinding();
|
||||
ICPPClassTemplate A1 = (ICPPClassTemplate) col.getName(1).resolveBinding();
|
||||
ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(2).resolveBinding();
|
||||
ICPPClassTemplate A2 = (ICPPClassTemplate) col.getName(3).resolveBinding();
|
||||
ICPPClassTemplatePartialSpecialization A2 = (ICPPClassTemplatePartialSpecialization) col.getName(3).resolveBinding();
|
||||
ICPPTemplateParameter T3 = (ICPPTemplateParameter) col.getName(5).resolveBinding();
|
||||
ICPPClassTemplate A3 = (ICPPClassTemplate) col.getName(7).resolveBinding();
|
||||
ICPPClassTemplatePartialSpecialization A3 = (ICPPClassTemplatePartialSpecialization) col.getName(7).resolveBinding();
|
||||
ICPPTemplateParameter T4 = (ICPPTemplateParameter) col.getName(6).resolveBinding();
|
||||
|
||||
assertTrue( A2 instanceof ICPPTemplateSpecialization );
|
||||
assertTrue( ((ICPPTemplateSpecialization)A2).isPartialSpecialization() );
|
||||
assertSame( A2.getPrimaryClassTemplate(), A1 );
|
||||
assertSame( A3.getPrimaryClassTemplate(), A1 );
|
||||
assertNotSame( T1, T2 );
|
||||
assertNotSame( A1, A2 );
|
||||
assertNotSame( A1, A3 );
|
||||
|
@ -266,6 +268,10 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
ICPPFunctionTemplate foo2 = (ICPPFunctionTemplate) col.getName(18).resolveBinding();
|
||||
assertSame( foo1, foo2 );
|
||||
|
||||
ITypedef TYPE = (ITypedef) col.getName(2).resolveBinding();
|
||||
assertSame( TYPE, col.getName(8).resolveBinding() );
|
||||
assertSame( TYPE, col.getName(17).resolveBinding() );
|
||||
|
||||
assertInstances( col, T1, 6 );
|
||||
}
|
||||
|
||||
|
@ -301,7 +307,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
IFunction f2 = (IFunction) col.getName(5).resolveBinding();
|
||||
|
||||
assertTrue( f2 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)f2).getOriginalBinding(), f1 );
|
||||
assertSame( ((ICPPTemplateInstance)f2).getTemplateDefinition(), f1 );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -339,7 +345,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
|
||||
IFunction f = (IFunction) col.getName(14).resolveBinding();
|
||||
assertTrue( f instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)f).getOriginalBinding(), f3 );
|
||||
assertSame( ((ICPPTemplateInstance)f).getTemplateDefinition(), f3 );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -413,7 +419,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
|
||||
ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding();
|
||||
ICPPTemplateInstance A_T = (ICPPTemplateInstance) col.getName(2).resolveBinding();
|
||||
assertSame( A_T.getOriginalBinding(), A );
|
||||
assertSame( A_T.getTemplateDefinition(), A );
|
||||
|
||||
ICPPTemplateInstance A_T2 = (ICPPTemplateInstance) col.getName(6).resolveBinding();
|
||||
assertSame( A_T, A_T2 );
|
||||
|
@ -427,8 +433,8 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
assertTrue( bt instanceof IPointerType );
|
||||
|
||||
ICPPVariable a2 = (ICPPVariable) col.getName(15).resolveBinding();
|
||||
assertTrue( a2 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)a2).getOriginalBinding(), a );
|
||||
assertTrue( a2 instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)a2).getSpecializedBinding(), a );
|
||||
IType at = a2.getType();
|
||||
assertTrue( at instanceof IPointerType );
|
||||
|
||||
|
@ -459,8 +465,8 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
ICPPClassTemplate A4 = (ICPPClassTemplate) col.getName(20).resolveBinding();
|
||||
ICPPClassTemplate A5 = (ICPPClassTemplate) col.getName(26).resolveBinding();
|
||||
|
||||
assertTrue( A3 instanceof ICPPTemplateSpecialization );
|
||||
assertSame( ((ICPPTemplateSpecialization)A3).getPrimaryTemplateDefinition(), A1 );
|
||||
assertTrue( A3 instanceof ICPPClassTemplatePartialSpecialization );
|
||||
assertSame( ((ICPPClassTemplatePartialSpecialization)A3).getPrimaryClassTemplate(), A1 );
|
||||
|
||||
ICPPTemplateTypeParameter T1 = (ICPPTemplateTypeParameter) col.getName(11).resolveBinding();
|
||||
ICPPTemplateTypeParameter T2 = (ICPPTemplateTypeParameter) col.getName(12).resolveBinding();
|
||||
|
@ -481,10 +487,10 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
IProblemBinding R5 = (IProblemBinding) col.getName(43).resolveBinding();
|
||||
assertEquals( R5.getID(), IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP );
|
||||
|
||||
assertSame( R1.getOriginalBinding(), A1 );
|
||||
assertSame( R2.getOriginalBinding(), A2 );
|
||||
assertSame( R4.getOriginalBinding(), A5 );
|
||||
assertSame( R3.getOriginalBinding(), A4 );
|
||||
assertSame( R1.getTemplateDefinition(), A1 );
|
||||
assertSame( R2.getTemplateDefinition(), A2 );
|
||||
assertSame( R4.getTemplateDefinition(), A5 );
|
||||
assertSame( R3.getTemplateDefinition(), A4 );
|
||||
}
|
||||
|
||||
public void test14_7_3_FunctionExplicitSpecialization() throws Exception {
|
||||
|
@ -492,7 +498,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
buffer.append("template <class T> void f(T); \n"); //$NON-NLS-1$
|
||||
buffer.append("template <class T> void f(T*); \n"); //$NON-NLS-1$
|
||||
buffer.append("template <> void f(int); //ok \n"); //$NON-NLS-1$
|
||||
buffer.append("template <> void f<int>(int*); // OK \n"); //$NON-NLS-1$
|
||||
buffer.append("template <> void f<int>(int*); //ok \n"); //$NON-NLS-1$
|
||||
|
||||
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP );
|
||||
CPPNameCollector col = new CPPNameCollector();
|
||||
|
@ -501,14 +507,11 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
ICPPFunctionTemplate fT1 = (ICPPFunctionTemplate) col.getName(1).resolveBinding();
|
||||
ICPPFunctionTemplate fT2 = (ICPPFunctionTemplate) col.getName(5).resolveBinding();
|
||||
|
||||
ICPPTemplateSpecialization f1 = (ICPPTemplateSpecialization) col.getName(8).resolveBinding();
|
||||
ICPPTemplateSpecialization f2 = (ICPPTemplateSpecialization) col.getName(10).resolveBinding();
|
||||
ICPPSpecialization f1 = (ICPPSpecialization) col.getName(8).resolveBinding();
|
||||
ICPPSpecialization f2 = (ICPPSpecialization) col.getName(10).resolveBinding();
|
||||
|
||||
assertFalse( f1.isPartialSpecialization() );
|
||||
assertFalse( f2.isPartialSpecialization() );
|
||||
|
||||
assertSame( f1.getPrimaryTemplateDefinition(), fT1 );
|
||||
assertSame( f2.getPrimaryTemplateDefinition(), fT2 );
|
||||
assertSame( f1.getSpecializedBinding(), fT1 );
|
||||
assertSame( f2.getSpecializedBinding(), fT2 );
|
||||
}
|
||||
|
||||
public void test_14_5_5_1_FunctionTemplates_1() throws Exception {
|
||||
|
@ -524,7 +527,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
|
||||
ICPPFunction ref = (ICPPFunction) col.getName(6).resolveBinding();
|
||||
assertTrue( ref instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)ref).getOriginalBinding(), f );
|
||||
assertSame( ((ICPPTemplateInstance)ref).getTemplateDefinition(), f );
|
||||
}
|
||||
|
||||
public void test_14_5_5_1_FunctionTemplates_2() throws Exception {
|
||||
|
@ -540,7 +543,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
|
||||
ICPPFunction ref = (ICPPFunction) col.getName(6).resolveBinding();
|
||||
assertTrue( ref instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)ref).getOriginalBinding(), f );
|
||||
assertSame( ((ICPPTemplateInstance)ref).getTemplateDefinition(), f );
|
||||
}
|
||||
|
||||
public void test_14_8_1s2_FunctionTemplates() throws Exception {
|
||||
|
@ -558,7 +561,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
ICPPFunction ref1 = (ICPPFunction) col.getName(8).resolveBinding();
|
||||
|
||||
assertTrue( ref1 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance) ref1).getOriginalBinding(), f );
|
||||
assertSame( ((ICPPTemplateInstance) ref1).getTemplateDefinition(), f );
|
||||
}
|
||||
|
||||
public void test14_8_3s6_FunctionTemplates() throws Exception {
|
||||
|
@ -575,7 +578,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
ICPPFunctionTemplate f = (ICPPFunctionTemplate) col.getName(1).resolveBinding();
|
||||
ICPPFunction ref = (ICPPFunction) col.getName(5).resolveBinding();
|
||||
assertTrue( ref instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)ref).getOriginalBinding(), f );
|
||||
assertSame( ((ICPPTemplateInstance)ref).getTemplateDefinition(), f );
|
||||
}
|
||||
|
||||
public void test14_5_5_2s6_FunctionTemplates() throws Exception {
|
||||
|
@ -606,10 +609,10 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
ICPPFunction ref2 = (ICPPFunction) col.getName(21).resolveBinding();
|
||||
|
||||
assertTrue( ref1 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance) ref1).getOriginalBinding(), f2 );
|
||||
assertSame( ((ICPPTemplateInstance) ref1).getTemplateDefinition(), f2 );
|
||||
|
||||
assertTrue( ref2 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance) ref2).getOriginalBinding(), g2 );
|
||||
assertSame( ((ICPPTemplateInstance) ref2).getTemplateDefinition(), g2 );
|
||||
}
|
||||
|
||||
public void test14_6_1s1_LocalNames() throws Exception {
|
||||
|
@ -628,7 +631,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
ICPPClassType x2 = (ICPPClassType) col.getName(4).resolveBinding();
|
||||
|
||||
assertTrue( x1 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)x1).getOriginalBinding(), X );
|
||||
assertSame( ((ICPPTemplateInstance)x1).getTemplateDefinition(), X );
|
||||
|
||||
assertSame( x1, x2 );
|
||||
}
|
||||
|
@ -653,9 +656,9 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
|
||||
assertNotSame( f1, f2 );
|
||||
assertTrue( f1 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)f1).getOriginalBinding(), f );
|
||||
assertSame( ((ICPPTemplateInstance)f1).getTemplateDefinition(), f );
|
||||
assertTrue( f2 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)f2).getOriginalBinding(), f );
|
||||
assertSame( ((ICPPTemplateInstance)f2).getTemplateDefinition(), f );
|
||||
|
||||
IType fr1 = f1.getType().getReturnType();
|
||||
IType fr2 = f2.getType().getReturnType();
|
||||
|
@ -682,8 +685,11 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
ICPPFunctionTemplate f1 = (ICPPFunctionTemplate) col.getName(1).resolveBinding();
|
||||
ICPPFunctionTemplate g1 = (ICPPFunctionTemplate) col.getName(6).resolveBinding();
|
||||
|
||||
ICPPTemplateSpecialization f2 = (ICPPTemplateSpecialization) col.getName(9).resolveBinding();
|
||||
ICPPTemplateSpecialization g2 = (ICPPTemplateSpecialization) col.getName(12).resolveBinding();
|
||||
ICPPSpecialization f2 = (ICPPSpecialization) col.getName(9).resolveBinding();
|
||||
ICPPSpecialization g2 = (ICPPSpecialization) col.getName(12).resolveBinding();
|
||||
|
||||
assertSame( f2.getSpecializedBinding(), f1 );
|
||||
assertSame( g2.getSpecializedBinding(), g1 );
|
||||
|
||||
assertFalse( ((ICPPFunction)f1).isInline() );
|
||||
assertTrue( ((ICPPFunction)g1).isInline() );
|
||||
|
@ -711,7 +717,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
ICPPVariable x = (ICPPVariable) col.getName(9).resolveBinding();
|
||||
IType t = x.getType();
|
||||
assertTrue( t instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance) t).getOriginalBinding(), X );
|
||||
assertSame( ((ICPPTemplateInstance) t).getTemplateDefinition(), X );
|
||||
|
||||
ICPPField a = (ICPPField) col.getName(5).resolveBinding();
|
||||
ICPPField a1 = (ICPPField) col.getName(11).resolveBinding();
|
||||
|
@ -719,14 +725,14 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
ICPPField a3 = (ICPPField) col.getName(13).resolveBinding();
|
||||
ICPPField a4 = (ICPPField) col.getName(14).resolveBinding();
|
||||
|
||||
assertTrue( a1 instanceof ICPPTemplateInstance );
|
||||
assertTrue( a2 instanceof ICPPTemplateInstance );
|
||||
assertTrue( a3 instanceof ICPPTemplateInstance );
|
||||
assertTrue( a4 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)a1).getOriginalBinding(), a );
|
||||
assertSame( ((ICPPTemplateInstance)a2).getOriginalBinding(), a );
|
||||
assertSame( ((ICPPTemplateInstance)a3).getOriginalBinding(), a );
|
||||
assertSame( ((ICPPTemplateInstance)a4).getOriginalBinding(), a );
|
||||
assertTrue( a1 instanceof ICPPSpecialization );
|
||||
assertTrue( a2 instanceof ICPPSpecialization );
|
||||
assertTrue( a3 instanceof ICPPSpecialization );
|
||||
assertTrue( a4 instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)a1).getSpecializedBinding(), a );
|
||||
assertSame( ((ICPPSpecialization)a2).getSpecializedBinding(), a );
|
||||
assertSame( ((ICPPSpecialization)a3).getSpecializedBinding(), a );
|
||||
assertSame( ((ICPPSpecialization)a4).getSpecializedBinding(), a );
|
||||
}
|
||||
|
||||
public void test14_6_1s2() throws Exception {
|
||||
|
@ -742,18 +748,17 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
tu.accept( col );
|
||||
|
||||
ICPPClassTemplate Y = (ICPPClassTemplate) col.getName(1).resolveBinding();
|
||||
ICPPTemplateSpecialization Yspec = (ICPPTemplateSpecialization) col.getName(2).resolveBinding();
|
||||
ICPPSpecialization Yspec = (ICPPSpecialization) col.getName(2).resolveBinding();
|
||||
|
||||
assertTrue( Yspec instanceof ICPPClassType );
|
||||
assertSame( Yspec.getPrimaryTemplateDefinition(), Y );
|
||||
assertSame( Yspec.getSpecializedBinding(), Y );
|
||||
|
||||
ICPPClassType y1 = (ICPPClassType) col.getName(4).resolveBinding();
|
||||
assertTrue( y1 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)y1).getOriginalBinding(), Yspec );
|
||||
assertSame( y1, Yspec );
|
||||
|
||||
ICPPClassType y2 = (ICPPClassType) col.getName(6).resolveBinding();
|
||||
assertTrue( y2 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)y2).getOriginalBinding(), Y );
|
||||
assertSame( ((ICPPTemplateInstance)y2).getTemplateDefinition(), Y );
|
||||
}
|
||||
|
||||
public void testBug45129() throws Exception {
|
||||
|
@ -775,7 +780,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
IBinding g2 = col.getName(14).resolveBinding();
|
||||
|
||||
assertTrue( f2 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)f2).getOriginalBinding(), f1 );
|
||||
assertSame( ((ICPPTemplateInstance)f2).getTemplateDefinition(), f1 );
|
||||
assertSame( g1, g2 );
|
||||
}
|
||||
|
||||
|
@ -798,12 +803,13 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
ICPPFunction f2 = (ICPPFunction) col.getName(8).resolveBinding();
|
||||
|
||||
assertTrue( f2 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)f2).getOriginalBinding(), f1 );
|
||||
assertSame( ((ICPPTemplateInstance)f2).getTemplateDefinition(), f1 );
|
||||
|
||||
IFunctionType ft = f2.getType();
|
||||
assertTrue( ft.getReturnType() instanceof IBasicType );
|
||||
assertEquals( ((IBasicType)ft.getReturnType()).getType(), IBasicType.t_int );
|
||||
}
|
||||
|
||||
public void testBug76951_2() throws Exception {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append("template <class T, class U = T > class A { \n"); //$NON-NLS-1$
|
||||
|
@ -828,11 +834,11 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
|
||||
ICPPClassType A1 = (ICPPClassType) col.getName(7).resolveBinding();
|
||||
assertTrue( A1 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)A1).getOriginalBinding(), A );
|
||||
assertSame( ((ICPPTemplateInstance)A1).getTemplateDefinition(), A );
|
||||
|
||||
ICPPField u2 = (ICPPField) col.getName(11).resolveBinding();
|
||||
assertTrue( u2 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)u2).getOriginalBinding(), u1 );
|
||||
assertTrue( u2 instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)u2).getSpecializedBinding(), u1 );
|
||||
|
||||
IType type = u2.getType();
|
||||
assertTrue( type instanceof IBasicType );
|
||||
|
@ -856,7 +862,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
|
||||
assertSame( A1, A2 );
|
||||
assertTrue( A1 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)A1).getOriginalBinding(), A );
|
||||
assertSame( ((ICPPTemplateInstance)A1).getTemplateDefinition(), A );
|
||||
}
|
||||
|
||||
public void testTemplateParameterDeclarations() throws Exception {
|
||||
|
@ -900,16 +906,16 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
|
||||
assertSame( A1, A2 );
|
||||
assertTrue( A1 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)A1).getOriginalBinding(), A );
|
||||
assertSame( ((ICPPTemplateInstance)A1).getTemplateDefinition(), A );
|
||||
|
||||
ICPPClassType AI = (ICPPClassType) col.getName(10).resolveBinding();
|
||||
ICPPMethod f2 = (ICPPMethod) col.getName(14).resolveBinding();
|
||||
ICPPField pA2 = (ICPPField) col.getName(17).resolveBinding();
|
||||
|
||||
assertTrue( f2 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)f2).getOriginalBinding(), f );
|
||||
assertTrue( pA2 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)pA2).getOriginalBinding(), pA );
|
||||
assertTrue( f2 instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)f2).getSpecializedBinding(), f );
|
||||
assertTrue( pA2 instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)pA2).getSpecializedBinding(), pA );
|
||||
|
||||
IType paT = pA2.getType();
|
||||
assertTrue( paT instanceof IPointerType );
|
||||
|
@ -920,4 +926,169 @@ public class AST2TemplateTests extends AST2BaseTest {
|
|||
assertTrue( pT instanceof IPointerType );
|
||||
assertSame( ((IPointerType)pT).getType(), AI );
|
||||
}
|
||||
|
||||
public void test14_5_2s2_MemberSpecializations() throws Exception {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append("template <class T> struct A { \n"); //$NON-NLS-1$
|
||||
buffer.append(" void f(int); \n"); //$NON-NLS-1$
|
||||
buffer.append(" template <class T2> void f(T2); \n"); //$NON-NLS-1$
|
||||
buffer.append("}; \n"); //$NON-NLS-1$
|
||||
buffer.append("template <> void A<int>::f(int) { } //nontemplate \n"); //$NON-NLS-1$
|
||||
buffer.append("template <> template <> void A<int>::f<>(int) { } //template \n"); //$NON-NLS-1$
|
||||
buffer.append("int main() { \n"); //$NON-NLS-1$
|
||||
buffer.append(" A<int> ac; \n"); //$NON-NLS-1$
|
||||
buffer.append(" ac.f(1); //nontemplate \n"); //$NON-NLS-1$
|
||||
buffer.append(" ac.f('c'); //template \n"); //$NON-NLS-1$
|
||||
buffer.append(" ac.f<>(1); //template \n"); //$NON-NLS-1$
|
||||
buffer.append("} \n"); //$NON-NLS-1$
|
||||
|
||||
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP );
|
||||
CPPNameCollector col = new CPPNameCollector();
|
||||
tu.accept( col );
|
||||
|
||||
ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding();
|
||||
ICPPMethod f1 = (ICPPMethod) col.getName(2).resolveBinding();
|
||||
ICPPMethod f2 = (ICPPMethod) col.getName(5).resolveBinding();
|
||||
|
||||
ICPPMethod f1_2 = (ICPPMethod) col.getName(11).resolveBinding();
|
||||
assertNotSame( f1, f1_2 );
|
||||
assertTrue( f1_2 instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)f1_2).getSpecializedBinding(), f1 );
|
||||
|
||||
ICPPClassType A2 = (ICPPClassType) col.getName(9).resolveBinding();
|
||||
assertTrue( A2 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)A2).getTemplateDefinition(), A );
|
||||
|
||||
ICPPMethod f2_2 = (ICPPMethod) col.getName(16).resolveBinding();
|
||||
assertTrue( f2_2 instanceof ICPPSpecialization );
|
||||
IBinding speced = ((ICPPSpecialization)f2_2).getSpecializedBinding();
|
||||
assertTrue( speced instanceof ICPPFunctionTemplate && speced instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)speced).getSpecializedBinding(), f2 );
|
||||
|
||||
ICPPClassType A3 = (ICPPClassType) col.getName(14).resolveBinding();
|
||||
assertSame( A2, A3 );
|
||||
|
||||
ICPPClassType A4 = (ICPPClassType) col.getName(20).resolveBinding();
|
||||
assertSame( A2, A4 );
|
||||
|
||||
IFunction r1 = (IFunction) col.getName(24).resolveBinding();
|
||||
IFunction r2 = (IFunction) col.getName(26).resolveBinding();
|
||||
IFunction r3 = (IFunction) col.getName(28).resolveBinding();
|
||||
|
||||
assertSame( r1, f1_2 );
|
||||
assertTrue( r2 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)r2).getTemplateDefinition(), speced );
|
||||
assertSame( r3, f2_2 );
|
||||
}
|
||||
|
||||
public void testClassSpecializations() throws Exception {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append("template <class T> class A { }; \n"); //$NON-NLS-1$
|
||||
buffer.append("template <> class A<int> {}; \n"); //$NON-NLS-1$
|
||||
buffer.append("A<char> ac; \n"); //$NON-NLS-1$
|
||||
buffer.append("A<int> ai; \n"); //$NON-NLS-1$
|
||||
|
||||
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP );
|
||||
CPPNameCollector col = new CPPNameCollector();
|
||||
tu.accept( col );
|
||||
|
||||
ICPPClassTemplate A1 = (ICPPClassTemplate) col.getName(1).resolveBinding();
|
||||
ICPPClassType A2 = (ICPPClassType) col.getName(2).resolveBinding();
|
||||
|
||||
assertTrue( A2 instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)A2).getSpecializedBinding(), A1 );
|
||||
|
||||
ICPPClassType r1 = (ICPPClassType) col.getName(4).resolveBinding();
|
||||
ICPPClassType r2 = (ICPPClassType) col.getName(7).resolveBinding();
|
||||
|
||||
assertTrue( r1 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)r1).getTemplateDefinition(), A1 );
|
||||
assertSame( r2, A2 );
|
||||
}
|
||||
|
||||
public void test14_7_3s5_SpecializationMemberDefinition() throws Exception {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append("template<class T> struct A { \n"); //$NON-NLS-1$
|
||||
buffer.append(" void f(T) { } \n"); //$NON-NLS-1$
|
||||
buffer.append("}; \n"); //$NON-NLS-1$
|
||||
buffer.append("template<> struct A<int> { \n"); //$NON-NLS-1$
|
||||
buffer.append(" void f(int); \n"); //$NON-NLS-1$
|
||||
buffer.append("}; \n"); //$NON-NLS-1$
|
||||
buffer.append("void h(){ \n"); //$NON-NLS-1$
|
||||
buffer.append(" A<int> a; \n"); //$NON-NLS-1$
|
||||
buffer.append(" a.f(16); // A<int>::f must be defined somewhere \n"); //$NON-NLS-1$
|
||||
buffer.append("} \n"); //$NON-NLS-1$
|
||||
buffer.append("// explicit specialization syntax not used for a member of \n"); //$NON-NLS-1$
|
||||
buffer.append("// explicitly specialized class template specialization \n"); //$NON-NLS-1$
|
||||
buffer.append("void A<int>::f(int) { } \n"); //$NON-NLS-1$
|
||||
|
||||
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP );
|
||||
CPPNameCollector col = new CPPNameCollector();
|
||||
tu.accept( col );
|
||||
|
||||
ICPPClassTemplate A1 = (ICPPClassTemplate) col.getName(1).resolveBinding();
|
||||
ICPPMethod f1 = (ICPPMethod) col.getName(2).resolveBinding();
|
||||
|
||||
ICPPClassType A2 = (ICPPClassType) col.getName(5).resolveBinding();
|
||||
assertTrue( A2 instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)A2).getSpecializedBinding(), A1 );
|
||||
|
||||
ICPPMethod f2 = (ICPPMethod) col.getName(7).resolveBinding();
|
||||
assertNotSame( f1, f2 );
|
||||
|
||||
ICPPClassType A3 = (ICPPClassType) col.getName(10).resolveBinding();
|
||||
assertSame( A3, A2 );
|
||||
ICPPMethod f3 = (ICPPMethod) col.getName(14).resolveBinding();
|
||||
assertSame( f3, f2 );
|
||||
|
||||
ICPPClassType A4 = (ICPPClassType) col.getName(16).resolveBinding();
|
||||
assertSame( A4, A2 );
|
||||
ICPPMethod f4 = (ICPPMethod) col.getName(18).resolveBinding();
|
||||
assertSame( f4, f3 );
|
||||
}
|
||||
|
||||
public void testNestedSpecializations() throws Exception {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
buffer.append("class C{}; \n"); //$NON-NLS-1$
|
||||
buffer.append("template <class T> class A { \n"); //$NON-NLS-1$
|
||||
buffer.append(" template <class T2> class B { \n"); //$NON-NLS-1$
|
||||
buffer.append(" T f( T2 ); \n"); //$NON-NLS-1$
|
||||
buffer.append(" }; \n"); //$NON-NLS-1$
|
||||
buffer.append("}; \n"); //$NON-NLS-1$
|
||||
buffer.append("void g(){ \n"); //$NON-NLS-1$
|
||||
buffer.append(" A<int>::B<C> b; \n"); //$NON-NLS-1$
|
||||
buffer.append(" C c; \n"); //$NON-NLS-1$
|
||||
buffer.append(" b.f( c ); \n"); //$NON-NLS-1$
|
||||
buffer.append("} \n"); //$NON-NLS-1$
|
||||
|
||||
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP );
|
||||
CPPNameCollector col = new CPPNameCollector();
|
||||
tu.accept( col );
|
||||
|
||||
ICPPClassType C = (ICPPClassType) col.getName(0).resolveBinding();
|
||||
ICPPClassTemplate A = (ICPPClassTemplate) col.getName(2).resolveBinding();
|
||||
ICPPClassTemplate B = (ICPPClassTemplate) col.getName(4).resolveBinding();
|
||||
ICPPMethod f = (ICPPMethod) col.getName(6).resolveBinding();
|
||||
|
||||
ICPPClassType A1 = (ICPPClassType) col.getName(11).resolveBinding();
|
||||
assertTrue( A1 instanceof ICPPTemplateInstance );
|
||||
assertSame( ((ICPPTemplateInstance)A1).getTemplateDefinition(), A );
|
||||
|
||||
ICPPClassType B1 = (ICPPClassType) col.getName(13).resolveBinding();
|
||||
assertTrue( B1 instanceof ICPPTemplateInstance );
|
||||
ICPPClassType B2 = (ICPPClassType) ((ICPPTemplateInstance)B1).getTemplateDefinition();
|
||||
assertTrue( B2 instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)B2).getSpecializedBinding(), B );
|
||||
|
||||
//we might want this to be a specialization of a specialization, but for now, this is easier
|
||||
ICPPMethod f1 = (ICPPMethod) col.getName(20).resolveBinding();
|
||||
assertTrue( f1 instanceof ICPPSpecialization );
|
||||
assertSame( ((ICPPSpecialization)f1).getSpecializedBinding(), f );
|
||||
|
||||
IFunctionType ft = f1.getType();
|
||||
assertTrue( ft.getReturnType() instanceof IBasicType );
|
||||
assertEquals( ((IBasicType)ft.getReturnType()).getType(), IBasicType.t_int );
|
||||
|
||||
assertSame( ft.getParameterTypes()[0], C );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ package org.eclipse.cdt.core.dom.ast;
|
|||
* @author Doug Schaefer
|
||||
*/
|
||||
public interface IType extends Cloneable {
|
||||
public static final IType [] EMPTY_TYPE_ARRAY = new IType[0];
|
||||
public Object clone();
|
||||
|
||||
/**
|
||||
|
|
|
@ -13,9 +13,11 @@
|
|||
*/
|
||||
package org.eclipse.cdt.core.dom.ast.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public interface ICPPClassTemplate extends ICPPTemplateDefinition {
|
||||
|
||||
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException;
|
||||
}
|
||||
|
|
|
@ -19,23 +19,30 @@ import org.eclipse.cdt.core.dom.ast.IType;
|
|||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public interface ICPPTemplateSpecialization extends ICPPTemplateDefinition {
|
||||
public static final ICPPTemplateSpecialization[] EMPTY_TEMPLATE_SPECIALIZATION_ARRAY = new ICPPTemplateSpecialization[0];
|
||||
|
||||
/**
|
||||
* This interface represents a class template partial specialization. A partial specialization is
|
||||
* a class template in its own right.
|
||||
*
|
||||
* eg:
|
||||
* template <class T> class A {}; //the primary class template
|
||||
* template <class T> class A<T*> {}; //a partial specialization of the primary class template
|
||||
*
|
||||
* @author aniefer
|
||||
*/
|
||||
public interface ICPPClassTemplatePartialSpecialization extends ICPPClassTemplate {
|
||||
public static final ICPPClassTemplatePartialSpecialization[] EMPTY_PARTIAL_SPECIALIZATION_ARRAY = new ICPPClassTemplatePartialSpecialization[0];
|
||||
|
||||
/**
|
||||
* get the arguments to this specialization
|
||||
* @return
|
||||
*/
|
||||
public IType [] getArguments() throws DOMException;
|
||||
|
||||
/**
|
||||
* is this a partial specialization? if not, this will be an explicit specialization
|
||||
* @return
|
||||
*/
|
||||
public boolean isPartialSpecialization() throws DOMException;
|
||||
|
||||
/**
|
||||
* get the ICPPTemplateDefinition which this is a specialization of
|
||||
* @return
|
||||
*/
|
||||
public ICPPTemplateDefinition getPrimaryTemplateDefinition() throws DOMException;
|
||||
public ICPPClassTemplate getPrimaryClassTemplate() throws DOMException;
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
/*************************************************************************
|
||||
* Copyright (c) 2005 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/cpl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
*/
|
||||
/*
|
||||
* Created on Apr 29, 2005
|
||||
*/
|
||||
package org.eclipse.cdt.core.dom.ast.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
|
||||
/**
|
||||
* For an instantiation of a class template, the members of that instantiation will be
|
||||
* specializations of the members of the original class template.
|
||||
* For an instantiation of a function template, the parameters will be specializations
|
||||
* of the parameters of the original function template.
|
||||
*
|
||||
* Specializations can also be explicitly defined
|
||||
* @author aniefer
|
||||
*
|
||||
*/
|
||||
public interface ICPPSpecialization extends ICPPBinding {
|
||||
/**
|
||||
* get the original binding that this is a specialization of
|
||||
* @return
|
||||
*/
|
||||
public IBinding getSpecializedBinding();
|
||||
}
|
|
@ -26,5 +26,5 @@ public interface ICPPTemplateDefinition extends ICPPBinding{
|
|||
*/
|
||||
public ICPPTemplateParameter[] getTemplateParameters() throws DOMException;
|
||||
|
||||
public ICPPTemplateSpecialization[] getTemplateSpecializations() throws DOMException;
|
||||
|
||||
}
|
||||
|
|
|
@ -13,20 +13,36 @@
|
|||
*/
|
||||
package org.eclipse.cdt.core.dom.ast.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public interface ICPPTemplateInstance extends IBinding {
|
||||
|
||||
/**
|
||||
* This interface represents an instantiation of a class or function template.
|
||||
* An instantiated template is a specialization of that template.
|
||||
*
|
||||
* An instance of a class template will also implement ICPPClassType and similarily
|
||||
* a function template instance will also implement ICPPFunction (or even ICPPMethod
|
||||
* or ICPPConstructor as appropriate)
|
||||
*
|
||||
* @author aniefer
|
||||
*/
|
||||
public interface ICPPTemplateInstance extends ICPPSpecialization {
|
||||
|
||||
/**
|
||||
* Get the original binding of which this is an instance of
|
||||
* get the template that this was instantiated from
|
||||
* @return
|
||||
*/
|
||||
public IBinding getOriginalBinding();
|
||||
public ICPPTemplateDefinition getTemplateDefinition();
|
||||
|
||||
/**
|
||||
* get the types of the arguments the template was instantiated with.
|
||||
* @return
|
||||
*/
|
||||
public IType [] getArguments();
|
||||
|
||||
/**
|
||||
* return a map which maps from template parameter to the corresponding
|
||||
|
@ -34,9 +50,4 @@ public interface ICPPTemplateInstance extends IBinding {
|
|||
* @return
|
||||
*/
|
||||
public ObjectMap getArgumentMap();
|
||||
|
||||
public IType [] getArguments();
|
||||
|
||||
public ICPPTemplateDefinition getTemplate();
|
||||
|
||||
}
|
||||
|
|
|
@ -44,7 +44,8 @@ public class CPPBaseClause implements ICPPBase {
|
|||
throw new DOMException( this );
|
||||
}
|
||||
}
|
||||
ICPPASTBaseSpecifier base = null;
|
||||
private ICPPASTBaseSpecifier base = null;
|
||||
private ICPPClassType baseClass = null;
|
||||
|
||||
public CPPBaseClause( ICPPASTBaseSpecifier base ){
|
||||
this.base = base;
|
||||
|
@ -54,14 +55,17 @@ public class CPPBaseClause implements ICPPBase {
|
|||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBase#getBaseClass()
|
||||
*/
|
||||
public ICPPClassType getBaseClass() {
|
||||
IBinding baseClass = base.getName().resolveBinding();
|
||||
if( baseClass instanceof ICPPClassType )
|
||||
return (ICPPClassType) baseClass;
|
||||
else if( baseClass instanceof IProblemBinding ){
|
||||
return new CPPClassType.CPPClassTypeProblem( base.getName(), ((IProblemBinding)baseClass).getID(), base.getName().toCharArray() );
|
||||
}
|
||||
|
||||
return new CPPClassType.CPPClassTypeProblem( base.getName(), IProblemBinding.SEMANTIC_NAME_NOT_FOUND, base.getName().toCharArray() );
|
||||
if( baseClass == null ){
|
||||
IBinding b = base.getName().resolveBinding();
|
||||
if( b instanceof ICPPClassType )
|
||||
baseClass = (ICPPClassType) b;
|
||||
else if( b instanceof IProblemBinding ){
|
||||
baseClass = new CPPClassType.CPPClassTypeProblem( base.getName(), ((IProblemBinding)b).getID(), base.getName().toCharArray() );
|
||||
} else {
|
||||
baseClass = new CPPClassType.CPPClassTypeProblem( base.getName(), IProblemBinding.SEMANTIC_NAME_NOT_FOUND, base.getName().toCharArray() );
|
||||
}
|
||||
}
|
||||
return baseClass;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -88,4 +92,8 @@ public class CPPBaseClause implements ICPPBase {
|
|||
return base.isVirtual();
|
||||
}
|
||||
|
||||
public void setBaseClass(ICPPClassType cls) {
|
||||
baseClass = cls;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ public class CPPClassInstanceScope implements ICPPClassScope {
|
|||
}
|
||||
|
||||
private ICPPClassType getOriginalClass(){
|
||||
return (ICPPClassType) instance.getOriginalBinding();
|
||||
return (ICPPClassType) instance.getTemplateDefinition();
|
||||
}
|
||||
public boolean isFullyCached(){
|
||||
if( !isFullyCached ){
|
||||
|
@ -83,7 +83,7 @@ public class CPPClassInstanceScope implements ICPPClassScope {
|
|||
} else {
|
||||
binding = forceResolve ? n.resolveBinding() : n.getBinding();
|
||||
if( binding != null ){
|
||||
binding = CPPTemplates.createInstance( this, binding, instance.getArgumentMap(), instance.getArguments() );
|
||||
binding = CPPTemplates.createSpecialization( this, binding, instance.getArgumentMap() );
|
||||
if( instanceMap == ObjectMap.EMPTY_MAP )
|
||||
instanceMap = new ObjectMap(2);
|
||||
instanceMap.put( n, binding );
|
||||
|
@ -93,7 +93,7 @@ public class CPPClassInstanceScope implements ICPPClassScope {
|
|||
if( instanceMap.containsKey( obj ) ){
|
||||
binding = (IBinding) instanceMap.get( obj );
|
||||
} else {
|
||||
binding = CPPTemplates.createInstance( this, (IBinding) obj, instance.getArgumentMap(), instance.getArguments() );
|
||||
binding = CPPTemplates.createSpecialization( this, (IBinding) obj, instance.getArgumentMap() );
|
||||
if( instanceMap == ObjectMap.EMPTY_MAP )
|
||||
instanceMap = new ObjectMap(2);
|
||||
instanceMap.put( obj, binding );
|
||||
|
|
|
@ -0,0 +1,181 @@
|
|||
/*************************************************************************
|
||||
* Copyright (c) 2005 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/cpl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
*/
|
||||
/*
|
||||
* Created on Apr 29, 2005
|
||||
*/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IField;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*
|
||||
*/
|
||||
public class CPPClassSpecialization extends CPPSpecialization implements
|
||||
ICPPClassType, ICPPInternalClassType {
|
||||
|
||||
/**
|
||||
* @param specialized
|
||||
* @param scope
|
||||
*/
|
||||
public CPPClassSpecialization(IBinding specialized, ICPPScope scope, ObjectMap argumentMap) {
|
||||
super(specialized, scope, argumentMap);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getBases()
|
||||
*/
|
||||
public ICPPBase[] getBases() throws DOMException {
|
||||
ICPPClassType cls = (ICPPClassType) getSpecializedBinding();
|
||||
if( cls != null ){
|
||||
ICPPBase [] bases = cls.getBases();
|
||||
for (int i = 0; i < bases.length; i++) {
|
||||
ICPPClassType T = bases[i].getBaseClass();
|
||||
if( T instanceof ICPPTemplateTypeParameter && argumentMap.containsKey( T ) ){
|
||||
IType t = (IType) argumentMap.get( T );
|
||||
if( t instanceof ICPPClassType )
|
||||
((CPPBaseClause)bases[i]).setBaseClass( (ICPPClassType) argumentMap.get(T) );
|
||||
}
|
||||
}
|
||||
return bases;
|
||||
}
|
||||
// TODO Auto-generated method stub
|
||||
return ICPPBase.EMPTY_BASE_ARRAY;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getFields()
|
||||
*/
|
||||
public IField[] getFields() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#findField(java.lang.String)
|
||||
*/
|
||||
public IField findField(String name) throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getDeclaredFields()
|
||||
*/
|
||||
public ICPPField[] getDeclaredFields() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getMethods()
|
||||
*/
|
||||
public ICPPMethod[] getMethods() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getAllDeclaredMethods()
|
||||
*/
|
||||
public ICPPMethod[] getAllDeclaredMethods() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getDeclaredMethods()
|
||||
*/
|
||||
public ICPPMethod[] getDeclaredMethods() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getConstructors()
|
||||
*/
|
||||
public ICPPConstructor[] getConstructors() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return ICPPConstructor.EMPTY_CONSTRUCTOR_ARRAY;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getFriends()
|
||||
*/
|
||||
public IBinding[] getFriends() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.ICompositeType#getKey()
|
||||
*/
|
||||
public int getKey() throws DOMException {
|
||||
return ((ICPPClassType)getSpecializedBinding()).getKey();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.ICompositeType#getCompositeScope()
|
||||
*/
|
||||
public IScope getCompositeScope() throws DOMException {
|
||||
IASTNode definition = getDefinition();
|
||||
if( definition != null ){
|
||||
IASTNode node = definition.getParent();
|
||||
while( node instanceof IASTName )
|
||||
node = node.getParent();
|
||||
if( node instanceof ICPPASTCompositeTypeSpecifier )
|
||||
return ((ICPPASTCompositeTypeSpecifier)node).getScope();
|
||||
}
|
||||
return ((ICPPClassType)getSpecializedBinding()).getCompositeScope();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IType#isSameType(org.eclipse.cdt.core.dom.ast.IType)
|
||||
*/
|
||||
public boolean isSameType(IType type) {
|
||||
return type == this;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#createDelegate(org.eclipse.cdt.core.dom.ast.IASTName)
|
||||
*/
|
||||
public ICPPDelegate createDelegate(IASTName name) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
public Object clone() {
|
||||
// TODO Auto-generated method stub
|
||||
return this;
|
||||
}
|
||||
|
||||
public ICPPMethod[] getConversionOperators() {
|
||||
// TODO Auto-generated method stub
|
||||
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
|
||||
}
|
||||
|
||||
}
|
|
@ -34,11 +34,12 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
|
||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
||||
|
@ -49,6 +50,8 @@ import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
|||
public class CPPClassTemplate extends CPPTemplateDefinition implements
|
||||
ICPPClassTemplate, ICPPClassType, ICPPInternalClassType {
|
||||
|
||||
private ICPPClassTemplatePartialSpecialization [] partialSpecializations = null;
|
||||
|
||||
private class FindDefinitionAction extends CPPASTVisitor {
|
||||
private char [] nameArray = CPPClassTemplate.this.getNameCharArray();
|
||||
public IASTName result = null;
|
||||
|
@ -102,14 +105,15 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements
|
|||
super(name);
|
||||
}
|
||||
|
||||
public ICPPTemplateInstance deferredInstance( IType [] arguments ){
|
||||
ICPPTemplateInstance instance = getInstance( arguments );
|
||||
public ICPPSpecialization deferredInstance( IType [] arguments ){
|
||||
ICPPSpecialization instance = getInstance( arguments );
|
||||
if( instance == null ){
|
||||
instance = new CPPDeferredClassInstance( this, arguments );
|
||||
addInstance( arguments, instance );
|
||||
addSpecialization( arguments, instance );
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
private void checkForDefinition(){
|
||||
FindDefinitionAction action = new FindDefinitionAction();
|
||||
IASTNode node = CPPVisitor.getContainingBlockItem( declarations[0] ).getParent();
|
||||
|
@ -125,6 +129,11 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements
|
|||
|
||||
return;
|
||||
}
|
||||
|
||||
public void addPartialSpecialization( ICPPClassTemplatePartialSpecialization spec ){
|
||||
partialSpecializations = (ICPPClassTemplatePartialSpecialization[]) ArrayUtil.append( ICPPClassTemplatePartialSpecialization.class, partialSpecializations, spec );
|
||||
}
|
||||
|
||||
private ICPPASTCompositeTypeSpecifier getCompositeTypeSpecifier(){
|
||||
if( definition != null ){
|
||||
return (ICPPASTCompositeTypeSpecifier) definition.getParent();
|
||||
|
@ -302,4 +311,9 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements
|
|||
return ((ITypedef)type).isSameType( this );
|
||||
return false;
|
||||
}
|
||||
|
||||
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() {
|
||||
partialSpecializations = (ICPPClassTemplatePartialSpecialization[]) ArrayUtil.trim( ICPPClassTemplatePartialSpecialization.class, partialSpecializations );
|
||||
return partialSpecializations;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
/**********************************************************************
|
||||
* Copyright (c) 2005 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/cpl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
**********************************************************************/
|
||||
/*
|
||||
* Created on Apr 5, 2005
|
||||
*/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate implements
|
||||
ICPPClassTemplatePartialSpecialization {
|
||||
|
||||
private IType [] arguments;
|
||||
/**
|
||||
* @param name
|
||||
*/
|
||||
public CPPClassTemplatePartialSpecialization(ICPPASTTemplateId name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateSpecialization#getArguments()
|
||||
*/
|
||||
public IType[] getArguments() {
|
||||
if( arguments == null ){
|
||||
ICPPASTTemplateId id = (ICPPASTTemplateId) getTemplateName();
|
||||
arguments = CPPTemplates.createTypeArray( id.getTemplateArguments() );
|
||||
}
|
||||
return arguments;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization#getPrimaryClassTemplate()
|
||||
*/
|
||||
public ICPPClassTemplate getPrimaryClassTemplate() {
|
||||
ICPPASTTemplateId id = (ICPPASTTemplateId) getTemplateName();
|
||||
return (ICPPClassTemplate) id.getTemplateName().resolveBinding();
|
||||
}
|
||||
|
||||
public IBinding instantiate( IType [] args ){
|
||||
ICPPSpecialization instance = getInstance( args );
|
||||
if( instance != null ){
|
||||
return instance;
|
||||
}
|
||||
|
||||
IType [] specArgs = getArguments();
|
||||
if( specArgs.length != arguments.length ){
|
||||
return null;
|
||||
}
|
||||
|
||||
ObjectMap argMap = new ObjectMap( specArgs.length );
|
||||
int numSpecArgs = specArgs.length;
|
||||
for( int i = 0; i < numSpecArgs; i++ ){
|
||||
IType spec = specArgs[i];
|
||||
IType arg = args[i];
|
||||
|
||||
//If the argument is a template parameter, we can't instantiate yet, defer for later
|
||||
if( arg instanceof ICPPTemplateParameter ){
|
||||
return deferredInstance( args );
|
||||
}
|
||||
try {
|
||||
if( !CPPTemplates.deduceTemplateArgument( argMap, spec, arg ) )
|
||||
return null;
|
||||
} catch (DOMException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
ICPPTemplateParameter [] params = getTemplateParameters();
|
||||
int numParams = params.length;
|
||||
for( int i = 0; i < numParams; i++ ){
|
||||
if( params[i] instanceof IType && !argMap.containsKey( params[i] ) )
|
||||
return null;
|
||||
}
|
||||
|
||||
instance = (ICPPTemplateInstance) CPPTemplates.createInstance( (ICPPScope) getScope(), this, argMap, args );
|
||||
addSpecialization( args, instance );
|
||||
|
||||
return instance;
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
/**********************************************************************
|
||||
/*************************************************************************
|
||||
* Copyright (c) 2005 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v1.0
|
||||
|
@ -7,102 +7,95 @@
|
|||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
**********************************************************************/
|
||||
*/
|
||||
/*
|
||||
* Created on Apr 5, 2005
|
||||
* Created on May 2, 2005
|
||||
*/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateSpecialization;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*
|
||||
*/
|
||||
public class CPPClassTemplateSpecialization extends CPPClassTemplate implements
|
||||
ICPPTemplateSpecialization {
|
||||
public class CPPClassTemplateSpecialization extends CPPClassSpecialization
|
||||
implements ICPPClassTemplate, ICPPInternalTemplate {
|
||||
|
||||
private IType [] arguments;
|
||||
private ObjectMap instances = null;
|
||||
|
||||
/**
|
||||
* @param name
|
||||
* @param specialized
|
||||
* @param scope
|
||||
* @param argumentMap
|
||||
*/
|
||||
public CPPClassTemplateSpecialization(ICPPASTTemplateId name) {
|
||||
super(name);
|
||||
public CPPClassTemplateSpecialization(IBinding specialized,
|
||||
ICPPScope scope, ObjectMap argumentMap) {
|
||||
super(specialized, scope, argumentMap);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateSpecialization#getArguments()
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate#getPartialSpecializations()
|
||||
*/
|
||||
public IType[] getArguments() {
|
||||
if( arguments == null ){
|
||||
ICPPASTTemplateId id = (ICPPASTTemplateId) getTemplateName();
|
||||
arguments = CPPTemplates.createTypeArray( id.getTemplateArguments() );
|
||||
}
|
||||
return arguments;
|
||||
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() {
|
||||
// TODO Auto-generated method stub
|
||||
return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateSpecialization#isPartialSpecialization()
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition#getTemplateParameters()
|
||||
*/
|
||||
public boolean isPartialSpecialization() {
|
||||
return getTemplateParameters().length > 0;
|
||||
public ICPPTemplateParameter[] getTemplateParameters() throws DOMException {
|
||||
ICPPClassTemplate template = (ICPPClassTemplate) getSpecializedBinding();
|
||||
return template.getTemplateParameters();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateSpecialization#getPrimaryTemplateDefinition()
|
||||
*/
|
||||
public ICPPTemplateDefinition getPrimaryTemplateDefinition() {
|
||||
ICPPASTTemplateId id = (ICPPASTTemplateId) getTemplateName();
|
||||
return (ICPPTemplateDefinition) id.getTemplateName().resolveBinding();
|
||||
public void addSpecialization(IType[] arguments, ICPPSpecialization specialization) {
|
||||
if( instances == null )
|
||||
instances = new ObjectMap(2);
|
||||
instances.put( arguments, specialization );
|
||||
}
|
||||
|
||||
public IBinding instantiate( IType [] args ){
|
||||
ICPPTemplateInstance instance = getInstance( args );
|
||||
if( instance != null ){
|
||||
return instance;
|
||||
}
|
||||
|
||||
IType [] specArgs = getArguments();
|
||||
if( specArgs.length != arguments.length ){
|
||||
|
||||
public ICPPSpecialization getInstance( IType [] arguments ) {
|
||||
if( instances == null )
|
||||
return null;
|
||||
}
|
||||
|
||||
ObjectMap argMap = new ObjectMap( specArgs.length );
|
||||
int numSpecArgs = specArgs.length;
|
||||
for( int i = 0; i < numSpecArgs; i++ ){
|
||||
IType spec = specArgs[i];
|
||||
IType arg = args[i];
|
||||
|
||||
//If the argument is a template parameter, we can't instantiate yet, defer for later
|
||||
if( arg instanceof ICPPTemplateParameter ){
|
||||
return deferredInstance( args );
|
||||
}
|
||||
try {
|
||||
if( !CPPTemplates.deduceTemplateArgument( argMap, spec, arg ) )
|
||||
return null;
|
||||
} catch (DOMException e) {
|
||||
return null;
|
||||
int found = -1;
|
||||
for( int i = 0; i < instances.size(); i++ ){
|
||||
IType [] args = (IType[]) instances.keyAt( i );
|
||||
if( args.length == arguments.length ){
|
||||
int j = 0;
|
||||
for(; j < args.length; j++) {
|
||||
if( !( args[j].isSameType( arguments[j] ) ) )
|
||||
break;
|
||||
}
|
||||
if( j == args.length ){
|
||||
found = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ICPPTemplateParameter [] params = getTemplateParameters();
|
||||
int numParams = params.length;
|
||||
for( int i = 0; i < numParams; i++ ){
|
||||
if( params[i] instanceof IType && !argMap.containsKey( params[i] ) )
|
||||
return null;
|
||||
if( found != -1 ){
|
||||
return (ICPPSpecialization) instances.getAt(found);
|
||||
}
|
||||
|
||||
instance = (ICPPTemplateInstance) CPPTemplates.createInstance( (ICPPScope) getScope(), this, argMap, args );
|
||||
addInstance( args, instance );
|
||||
|
||||
return instance;
|
||||
return null;
|
||||
}
|
||||
|
||||
public IBinding instantiate(IType[] arguments) {
|
||||
// TODO Auto-generated method stub
|
||||
return CPPTemplates.instantiateTemplate( this, arguments, argumentMap );
|
||||
}
|
||||
|
||||
public ICPPSpecialization deferredInstance(IType[] arguments) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,7 +15,6 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
|||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IField;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
|
@ -27,30 +26,21 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public class CPPDeferredClassInstance /*extends CPPInstance*/ implements
|
||||
ICPPTemplateInstance, ICPPClassType, ICPPInternalBinding {
|
||||
public class CPPDeferredClassInstance extends CPPInstance implements ICPPClassType {
|
||||
|
||||
public IType [] arguments = null;
|
||||
public ICPPClassTemplate classTemplate = null;
|
||||
|
||||
public CPPDeferredClassInstance(ICPPClassTemplate orig, IType [] arguments ) {
|
||||
super( null, orig, null, arguments );
|
||||
this.arguments = arguments;
|
||||
this.classTemplate = orig;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance#getArguments()
|
||||
*/
|
||||
public IType[] getArguments() {
|
||||
return arguments;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getBases()
|
||||
|
@ -122,22 +112,6 @@ public class CPPDeferredClassInstance /*extends CPPInstance*/ implements
|
|||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDeclarations()
|
||||
*/
|
||||
public IASTNode[] getDeclarations() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDefinition()
|
||||
*/
|
||||
public IASTNode getDefinition() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#createDelegate(org.eclipse.cdt.core.dom.ast.IASTName)
|
||||
*/
|
||||
|
@ -161,30 +135,6 @@ public class CPPDeferredClassInstance /*extends CPPInstance*/ implements
|
|||
return ((ICPPClassType)classTemplate).getCompositeScope();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedName()
|
||||
*/
|
||||
public String[] getQualifiedName() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedNameCharArray()
|
||||
*/
|
||||
public char[][] getQualifiedNameCharArray() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#isGloballyQualified()
|
||||
*/
|
||||
public boolean isGloballyQualified() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see java.lang.Object#clone()
|
||||
*/
|
||||
|
@ -192,71 +142,6 @@ public class CPPDeferredClassInstance /*extends CPPInstance*/ implements
|
|||
return this;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getName()
|
||||
*/
|
||||
public String getName() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getNameCharArray()
|
||||
*/
|
||||
public char[] getNameCharArray() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
|
||||
*/
|
||||
public IScope getScope() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDefinition(org.eclipse.cdt.core.dom.ast.IASTNode)
|
||||
*/
|
||||
public void addDefinition(IASTNode node) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDeclaration(org.eclipse.cdt.core.dom.ast.IASTNode)
|
||||
*/
|
||||
public void addDeclaration(IASTNode node) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
public void removeDeclaration(IASTNode node) {
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance#getOriginalBinding()
|
||||
*/
|
||||
public IBinding getOriginalBinding() {
|
||||
return classTemplate;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance#getArgumentMap()
|
||||
*/
|
||||
public ObjectMap getArgumentMap() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance#getTemplate()
|
||||
*/
|
||||
public ICPPTemplateDefinition getTemplate() {
|
||||
return classTemplate;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param argMap
|
||||
* @return
|
||||
|
@ -269,7 +154,7 @@ public class CPPDeferredClassInstance /*extends CPPInstance*/ implements
|
|||
newArgs[i] = CPPTemplates.instantiateType( arguments[i], argMap );
|
||||
}
|
||||
|
||||
return (IType) ((CPPTemplateDefinition)classTemplate).instantiate( newArgs );
|
||||
return (IType) ((ICPPInternalTemplate)classTemplate).instantiate( newArgs );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
|
|
@ -15,8 +15,6 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
|||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunctionType;
|
||||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
|
@ -24,18 +22,13 @@ import org.eclipse.cdt.core.dom.ast.IType;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public class CPPDeferredFunctionInstance /*extends CPPInstance*/ implements
|
||||
ICPPFunction, ICPPTemplateInstance, ICPPInternalFunction {
|
||||
public class CPPDeferredFunctionInstance extends CPPInstance implements ICPPFunction, ICPPInternalFunction {
|
||||
|
||||
private IType[] arguments;
|
||||
private ICPPFunctionTemplate functionTemplate;
|
||||
|
||||
/**
|
||||
* @param scope
|
||||
|
@ -43,7 +36,7 @@ public class CPPDeferredFunctionInstance /*extends CPPInstance*/ implements
|
|||
* @param argMap
|
||||
*/
|
||||
public CPPDeferredFunctionInstance( ICPPFunctionTemplate template, IType[] arguments ) {
|
||||
this.functionTemplate = template;
|
||||
super( null, template, null, arguments );
|
||||
this.arguments = arguments;
|
||||
}
|
||||
|
||||
|
@ -58,7 +51,7 @@ public class CPPDeferredFunctionInstance /*extends CPPInstance*/ implements
|
|||
* @see org.eclipse.cdt.core.dom.ast.IFunction#getParameters()
|
||||
*/
|
||||
public IParameter[] getParameters() throws DOMException {
|
||||
return ((ICPPFunction)functionTemplate).getParameters();
|
||||
return ((ICPPFunction)getTemplateDefinition()).getParameters();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -85,78 +78,6 @@ public class CPPDeferredFunctionInstance /*extends CPPInstance*/ implements
|
|||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedName()
|
||||
*/
|
||||
public String[] getQualifiedName() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedNameCharArray()
|
||||
*/
|
||||
public char[][] getQualifiedNameCharArray() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#isGloballyQualified()
|
||||
*/
|
||||
public boolean isGloballyQualified() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getName()
|
||||
*/
|
||||
public String getName() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getNameCharArray()
|
||||
*/
|
||||
public char[] getNameCharArray() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
|
||||
*/
|
||||
public IScope getScope() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance#getOriginalBinding()
|
||||
*/
|
||||
public IBinding getOriginalBinding() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance#getArgumentMap()
|
||||
*/
|
||||
public ObjectMap getArgumentMap() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance#getTemplate()
|
||||
*/
|
||||
public ICPPTemplateDefinition getTemplate() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction#isMutable()
|
||||
*/
|
||||
|
@ -205,22 +126,6 @@ public class CPPDeferredFunctionInstance /*extends CPPInstance*/ implements
|
|||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDeclarations()
|
||||
*/
|
||||
public IASTNode[] getDeclarations() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDefinition()
|
||||
*/
|
||||
public IASTNode getDefinition() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#createDelegate(org.eclipse.cdt.core.dom.ast.IASTName)
|
||||
*/
|
||||
|
@ -229,26 +134,6 @@ public class CPPDeferredFunctionInstance /*extends CPPInstance*/ implements
|
|||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDefinition(org.eclipse.cdt.core.dom.ast.IASTNode)
|
||||
*/
|
||||
public void addDefinition(IASTNode node) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDeclaration(org.eclipse.cdt.core.dom.ast.IASTNode)
|
||||
*/
|
||||
public void addDeclaration(IASTNode node) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
public void removeDeclaration(IASTNode node) {
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction#isStatic(boolean)
|
||||
*/
|
||||
|
|
|
@ -23,14 +23,13 @@ import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
|||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public class CPPEnumeration implements IEnumeration, ICPPInternalBinding, ICPPBinding {
|
||||
public class CPPEnumeration implements IEnumeration, ICPPInternalBinding {
|
||||
public static class CPPEnumerationDelegate extends CPPDelegate implements IEnumeration {
|
||||
public CPPEnumerationDelegate( IASTName name, IEnumeration binding ) {
|
||||
super( name, binding );
|
||||
|
|
|
@ -23,14 +23,13 @@ import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
|||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public class CPPEnumerator implements IEnumerator, ICPPInternalBinding, ICPPBinding {
|
||||
public class CPPEnumerator implements IEnumerator, ICPPInternalBinding {
|
||||
public static class CPPEnumeratorDelegate extends CPPDelegate implements IEnumerator {
|
||||
public CPPEnumeratorDelegate( IASTName name, IEnumerator binding ) {
|
||||
super( name, binding );
|
||||
|
|
|
@ -14,33 +14,38 @@
|
|||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPField.CPPFieldDelegate;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public class CPPFieldInstance extends CPPInstance implements ICPPField {
|
||||
public class CPPFieldSpecialization extends CPPSpecialization implements ICPPField {
|
||||
private IType type = null;
|
||||
/**
|
||||
* @param orig
|
||||
* @param args
|
||||
* @param args
|
||||
*/
|
||||
public CPPFieldInstance(ICPPScope scope, IBinding orig, ObjectMap argMap, IType[] args ) {
|
||||
super(scope, orig, argMap, args);
|
||||
public CPPFieldSpecialization( IBinding orig, ICPPScope scope, ObjectMap argMap ) {
|
||||
super(orig, scope, argMap);
|
||||
}
|
||||
|
||||
private ICPPField getField() {
|
||||
return (ICPPField) getSpecializedBinding();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPMember#getVisibility()
|
||||
*/
|
||||
public int getVisibility() throws DOMException {
|
||||
return ((ICPPField)getOriginalBinding()).getVisibility();
|
||||
return getField().getVisibility();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -48,7 +53,7 @@ public class CPPFieldInstance extends CPPInstance implements ICPPField {
|
|||
*/
|
||||
public IType getType() throws DOMException {
|
||||
if( type == null ){
|
||||
type = CPPTemplates.instantiateType( ((ICPPField)getOriginalBinding()).getType(), getArgumentMap() );
|
||||
type = CPPTemplates.instantiateType( getField().getType(), argumentMap );
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
@ -57,66 +62,39 @@ public class CPPFieldInstance extends CPPInstance implements ICPPField {
|
|||
* @see org.eclipse.cdt.core.dom.ast.IVariable#isStatic()
|
||||
*/
|
||||
public boolean isStatic() throws DOMException {
|
||||
return ((ICPPField)getOriginalBinding()).isStatic();
|
||||
return getField().isStatic();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedName()
|
||||
*/
|
||||
public String[] getQualifiedName() {
|
||||
return CPPVisitor.getQualifiedName( this );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedNameCharArray()
|
||||
*/
|
||||
public char[][] getQualifiedNameCharArray() {
|
||||
return CPPVisitor.getQualifiedNameCharArray( this );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#isGloballyQualified()
|
||||
*/
|
||||
public boolean isGloballyQualified() throws DOMException {
|
||||
IScope scope = getScope();
|
||||
while( scope != null ){
|
||||
if( scope instanceof ICPPBlockScope ||
|
||||
scope.getScopeName() == null ||
|
||||
scope.getScopeName().toCharArray().length == 0 )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
scope = scope.getParent();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IVariable#isExtern()
|
||||
*/
|
||||
public boolean isExtern() throws DOMException {
|
||||
return ((ICPPField)getOriginalBinding()).isExtern();
|
||||
return getField().isExtern();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IVariable#isAuto()
|
||||
*/
|
||||
public boolean isAuto() throws DOMException {
|
||||
return ((ICPPField)getOriginalBinding()).isAuto();
|
||||
return getField().isAuto();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IVariable#isRegister()
|
||||
*/
|
||||
public boolean isRegister() throws DOMException {
|
||||
return ((ICPPField)getOriginalBinding()).isRegister();
|
||||
return getField().isRegister();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable#isMutable()
|
||||
*/
|
||||
public boolean isMutable() throws DOMException {
|
||||
return ((ICPPField)getOriginalBinding()).isMutable();
|
||||
return getField().isMutable();
|
||||
}
|
||||
|
||||
public ICPPDelegate createDelegate(IASTName name) {
|
||||
return new CPPFieldDelegate( name, this );
|
||||
}
|
||||
|
||||
}
|
|
@ -17,7 +17,6 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
|
@ -138,7 +137,6 @@ public class CPPFunction implements ICPPFunction, ICPPInternalFunction {
|
|||
|
||||
private static final int FULLY_RESOLVED = 1;
|
||||
private static final int RESOLUTION_IN_PROGRESS = 1 << 1;
|
||||
private static final int IS_STATIC = 3 << 2;
|
||||
private int bits = 0;
|
||||
|
||||
public CPPFunction( ICPPASTFunctionDeclarator declarator ){
|
||||
|
@ -418,36 +416,39 @@ public class CPPFunction implements ICPPFunction, ICPPInternalFunction {
|
|||
if( resolveAll && (bits & FULLY_RESOLVED) == 0 ){
|
||||
resolveAllDeclarations();
|
||||
}
|
||||
|
||||
//2 state bits, most significant = whether or not we've figure this out yet
|
||||
//least significant = whether or not we are static
|
||||
int state = ( bits & IS_STATIC ) >> 2;
|
||||
if( state > 1 ) return (state % 2 != 0);
|
||||
|
||||
IASTDeclSpecifier declSpec = null;
|
||||
IASTFunctionDeclarator dtor = (IASTFunctionDeclarator) getDefinition();
|
||||
if( dtor != null ){
|
||||
declSpec = ((IASTFunctionDefinition)dtor.getParent()).getDeclSpecifier();
|
||||
if( declSpec.getStorageClass() == IASTDeclSpecifier.sc_static ){
|
||||
bits |= 3 << 2;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
IASTFunctionDeclarator[] dtors = (IASTFunctionDeclarator[]) getDeclarations();
|
||||
if( dtors != null ) {
|
||||
for( int i = 0; i < dtors.length; i++ ){
|
||||
IASTNode parent = dtors[i].getParent();
|
||||
declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
|
||||
if( declSpec.getStorageClass() == IASTDeclSpecifier.sc_static ){
|
||||
bits |= 3 << 2;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
bits |= 2 << 2;
|
||||
return false;
|
||||
return hasStorageClass( this, IASTDeclSpecifier.sc_static );
|
||||
}
|
||||
// }
|
||||
// static public boolean isStatic
|
||||
// //2 state bits, most significant = whether or not we've figure this out yet
|
||||
// //least significant = whether or not we are static
|
||||
// int state = ( bits & IS_STATIC ) >> 2;
|
||||
// if( state > 1 ) return (state % 2 != 0);
|
||||
//
|
||||
// IASTDeclSpecifier declSpec = null;
|
||||
// IASTFunctionDeclarator dtor = (IASTFunctionDeclarator) getDefinition();
|
||||
// if( dtor != null ){
|
||||
// declSpec = ((IASTFunctionDefinition)dtor.getParent()).getDeclSpecifier();
|
||||
// if( declSpec.getStorageClass() == IASTDeclSpecifier.sc_static ){
|
||||
// bits |= 3 << 2;
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// IASTFunctionDeclarator[] dtors = (IASTFunctionDeclarator[]) getDeclarations();
|
||||
// if( dtors != null ) {
|
||||
// for( int i = 0; i < dtors.length; i++ ){
|
||||
// IASTNode parent = dtors[i].getParent();
|
||||
// declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
|
||||
// if( declSpec.getStorageClass() == IASTDeclSpecifier.sc_static ){
|
||||
// bits |= 3 << 2;
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// bits |= 2 << 2;
|
||||
// return false;
|
||||
// }
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedName()
|
||||
|
@ -483,9 +484,9 @@ public class CPPFunction implements ICPPFunction, ICPPInternalFunction {
|
|||
return new CPPFunctionDelegate( name, this );
|
||||
}
|
||||
|
||||
public boolean hasStorageClass( int storage ){
|
||||
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) getDefinition();
|
||||
ICPPASTFunctionDeclarator[] ds = (ICPPASTFunctionDeclarator[]) getDeclarations();
|
||||
static public boolean hasStorageClass( ICPPInternalFunction function, int storage ){
|
||||
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) function.getDefinition();
|
||||
ICPPASTFunctionDeclarator[] ds = (ICPPASTFunctionDeclarator[]) function.getDeclarations();
|
||||
int i = -1;
|
||||
do{
|
||||
if( dtor != null ){
|
||||
|
@ -550,21 +551,21 @@ public class CPPFunction implements ICPPFunction, ICPPInternalFunction {
|
|||
* @see org.eclipse.cdt.core.dom.ast.IFunction#isExtern()
|
||||
*/
|
||||
public boolean isExtern() {
|
||||
return hasStorageClass( IASTDeclSpecifier.sc_extern );
|
||||
return hasStorageClass( this, IASTDeclSpecifier.sc_extern );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IFunction#isAuto()
|
||||
*/
|
||||
public boolean isAuto() {
|
||||
return hasStorageClass( IASTDeclSpecifier.sc_auto );
|
||||
return hasStorageClass( this, IASTDeclSpecifier.sc_auto );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IFunction#isRegister()
|
||||
*/
|
||||
public boolean isRegister() {
|
||||
return hasStorageClass( IASTDeclSpecifier.sc_register );
|
||||
return hasStorageClass( this, IASTDeclSpecifier.sc_register );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
|
|
@ -15,7 +15,6 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
|||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunctionType;
|
||||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
|
@ -23,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.IScope;
|
|||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
|
||||
|
@ -40,23 +40,6 @@ public class CPPFunctionInstance extends CPPInstance implements ICPPFunction, IC
|
|||
*/
|
||||
public CPPFunctionInstance(ICPPScope scope, IBinding orig, ObjectMap argMap, IType[] args) {
|
||||
super(scope, orig, argMap, args);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDeclarations()
|
||||
*/
|
||||
public IASTNode[] getDeclarations() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDefinition()
|
||||
*/
|
||||
public IASTNode getDefinition() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -71,10 +54,10 @@ public class CPPFunctionInstance extends CPPInstance implements ICPPFunction, IC
|
|||
*/
|
||||
public IParameter[] getParameters() throws DOMException {
|
||||
if( parameters == null ){
|
||||
IParameter [] params = ((ICPPFunction)getOriginalBinding()).getParameters();
|
||||
IParameter [] params = ((ICPPFunction)getTemplateDefinition()).getParameters();
|
||||
parameters = new IParameter[ params.length ];
|
||||
for (int i = 0; i < params.length; i++) {
|
||||
parameters[i] = new CPPParameterInstance( null, params[i], getArgumentMap(), getArguments() );
|
||||
parameters[i] = new CPPParameterSpecialization( (ICPPParameter)params[i], null, getArgumentMap() );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -94,7 +77,7 @@ public class CPPFunctionInstance extends CPPInstance implements ICPPFunction, IC
|
|||
*/
|
||||
public IFunctionType getType() throws DOMException {
|
||||
if( type == null ){
|
||||
type = (IFunctionType) CPPTemplates.instantiateType( ((ICPPFunction)getOriginalBinding()).getType(), getArgumentMap() );
|
||||
type = (IFunctionType) CPPTemplates.instantiateType( ((ICPPFunction)getTemplateDefinition()).getType(), getArgumentMap() );
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
@ -103,79 +86,55 @@ public class CPPFunctionInstance extends CPPInstance implements ICPPFunction, IC
|
|||
* @see org.eclipse.cdt.core.dom.ast.IFunction#isStatic()
|
||||
*/
|
||||
public boolean isStatic() throws DOMException {
|
||||
return ((ICPPFunction)getOriginalBinding()).isStatic();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedName()
|
||||
*/
|
||||
public String[] getQualifiedName() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedNameCharArray()
|
||||
*/
|
||||
public char[][] getQualifiedNameCharArray() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#isGloballyQualified()
|
||||
*/
|
||||
public boolean isGloballyQualified() {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
return ((ICPPFunction)getTemplateDefinition()).isStatic();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction#isMutable()
|
||||
*/
|
||||
public boolean isMutable() throws DOMException {
|
||||
return ((ICPPFunction)getOriginalBinding()).isMutable();
|
||||
return ((ICPPFunction)getTemplateDefinition()).isMutable();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction#isInline()
|
||||
*/
|
||||
public boolean isInline() throws DOMException {
|
||||
return ((ICPPFunction)getOriginalBinding()).isInline();
|
||||
return ((ICPPFunction)getTemplateDefinition()).isInline();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IFunction#isExtern()
|
||||
*/
|
||||
public boolean isExtern() throws DOMException {
|
||||
return ((ICPPFunction)getOriginalBinding()).isExtern();
|
||||
return ((ICPPFunction)getTemplateDefinition()).isExtern();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IFunction#isAuto()
|
||||
*/
|
||||
public boolean isAuto() throws DOMException {
|
||||
return ((ICPPFunction)getOriginalBinding()).isAuto();
|
||||
return ((ICPPFunction)getTemplateDefinition()).isAuto();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IFunction#isRegister()
|
||||
*/
|
||||
public boolean isRegister() throws DOMException {
|
||||
return ((ICPPFunction)getOriginalBinding()).isRegister();
|
||||
return ((ICPPFunction)getTemplateDefinition()).isRegister();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IFunction#takesVarArgs()
|
||||
*/
|
||||
public boolean takesVarArgs() throws DOMException {
|
||||
return ((ICPPFunction)getOriginalBinding()).takesVarArgs();
|
||||
return ((ICPPFunction)getTemplateDefinition()).takesVarArgs();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction#isStatic(boolean)
|
||||
*/
|
||||
public boolean isStatic( boolean resolveAll ) {
|
||||
return ((ICPPInternalFunction)getOriginalBinding()).isStatic( resolveAll );
|
||||
return ((ICPPInternalFunction)getTemplateDefinition()).isStatic( resolveAll );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,144 @@
|
|||
/**********************************************************************
|
||||
* Copyright (c) 2005 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/cpl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
**********************************************************************/
|
||||
/*
|
||||
* Created on Apr 22, 2005
|
||||
*/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunctionType;
|
||||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFunction.CPPFunctionDelegate;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public class CPPFunctionSpecialization extends CPPSpecialization implements ICPPFunction, ICPPInternalFunction {
|
||||
private IFunctionType type = null;
|
||||
private IParameter [] specializedParams = null;
|
||||
|
||||
public CPPFunctionSpecialization(IBinding orig, ICPPScope scope, ObjectMap argMap ) {
|
||||
super(orig, scope, argMap);
|
||||
}
|
||||
|
||||
private ICPPFunction getFunction(){
|
||||
return (ICPPFunction) getSpecializedBinding();
|
||||
}
|
||||
|
||||
public IParameter[] getParameters() throws DOMException {
|
||||
if( specializedParams == null ){
|
||||
ICPPFunction function = (ICPPFunction) getSpecializedBinding();
|
||||
IParameter [] params = function.getParameters();
|
||||
specializedParams = new IParameter[ params.length];
|
||||
for( int i = 0; i < params.length; i++ ){
|
||||
specializedParams[i] = new CPPParameterSpecialization( (ICPPParameter)params[i], (ICPPScope) getScope(), argumentMap );
|
||||
}
|
||||
}
|
||||
return specializedParams;
|
||||
}
|
||||
|
||||
public IScope getFunctionScope() {
|
||||
// resolveAllDeclarations();
|
||||
// if( definition != null ){
|
||||
// return definition.getFunctionScope();
|
||||
// }
|
||||
//
|
||||
// return declarations[0].getFunctionScope();
|
||||
return null;
|
||||
}
|
||||
|
||||
public IFunctionType getType() throws DOMException {
|
||||
if( type == null ){
|
||||
ICPPFunction function = (ICPPFunction) getSpecializedBinding();
|
||||
type = function.getType();
|
||||
type = (IFunctionType) CPPTemplates.instantiateType( type, argumentMap );
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
public boolean isMutable() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isInline() throws DOMException {
|
||||
if( getDefinition() != null ){
|
||||
IASTNode def = getDefinition();
|
||||
while( !(def instanceof IASTFunctionDefinition) )
|
||||
def = def.getParent();
|
||||
return ((IASTFunctionDefinition)def).getDeclSpecifier().isInline();
|
||||
}
|
||||
return getFunction().isInline();
|
||||
}
|
||||
public boolean isStatic() {
|
||||
return isStatic( true );
|
||||
}
|
||||
public boolean isStatic(boolean resolveAll) {
|
||||
//TODO resolveAll
|
||||
ICPPInternalFunction f = (ICPPInternalFunction) getSpecializedBinding();
|
||||
if( f != null )
|
||||
return f.isStatic( resolveAll );
|
||||
return CPPFunction.hasStorageClass( this, IASTDeclSpecifier.sc_static );
|
||||
}
|
||||
|
||||
public boolean isExtern() throws DOMException {
|
||||
ICPPFunction f = (ICPPFunction) getSpecializedBinding();
|
||||
if( f != null )
|
||||
return f.isExtern();
|
||||
return CPPFunction.hasStorageClass( this, IASTDeclSpecifier.sc_extern );
|
||||
}
|
||||
|
||||
public boolean isAuto() throws DOMException {
|
||||
ICPPFunction f = (ICPPFunction) getSpecializedBinding();
|
||||
if( f != null )
|
||||
return f.isAuto();
|
||||
return CPPFunction.hasStorageClass( this, IASTDeclSpecifier.sc_auto );
|
||||
}
|
||||
|
||||
public boolean isRegister() throws DOMException {
|
||||
ICPPFunction f = (ICPPFunction) getSpecializedBinding();
|
||||
if( f != null )
|
||||
return f.isRegister();
|
||||
return CPPFunction.hasStorageClass( this, IASTDeclSpecifier.sc_register );
|
||||
}
|
||||
|
||||
public boolean takesVarArgs() throws DOMException {
|
||||
ICPPFunction f = (ICPPFunction) getSpecializedBinding();
|
||||
if( f != null )
|
||||
return f.takesVarArgs();
|
||||
|
||||
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) getDefinition();
|
||||
if( dtor != null ){
|
||||
return dtor.takesVarArgs();
|
||||
}
|
||||
ICPPASTFunctionDeclarator [] ds = (ICPPASTFunctionDeclarator[]) getDeclarations();
|
||||
if( ds != null && ds.length > 0 ){
|
||||
return ds[0].takesVarArgs();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public ICPPDelegate createDelegate(IASTName name) {
|
||||
return new CPPFunctionDelegate( name, this );
|
||||
}
|
||||
}
|
|
@ -31,11 +31,11 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTParameterDeclaration;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateSpecialization;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
|
||||
|
||||
/**
|
||||
|
@ -49,7 +49,7 @@ public class CPPFunctionTemplate extends CPPTemplateDefinition implements ICPPFu
|
|||
public ICPPTemplateParameter[] getTemplateParameters() throws DOMException {
|
||||
throw new DOMException( this );
|
||||
}
|
||||
public ICPPTemplateSpecialization[] getTemplateSpecializations() throws DOMException {
|
||||
public ICPPClassTemplatePartialSpecialization[] getTemplateSpecializations() throws DOMException {
|
||||
throw new DOMException( this );
|
||||
}
|
||||
public String[] getQualifiedName() throws DOMException {
|
||||
|
@ -267,7 +267,7 @@ public class CPPFunctionTemplate extends CPPTemplateDefinition implements ICPPFu
|
|||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateDefinition#deferredInstance(org.eclipse.cdt.core.dom.ast.IType[])
|
||||
*/
|
||||
public ICPPTemplateInstance deferredInstance(IType[] arguments) {
|
||||
public ICPPSpecialization deferredInstance(IType[] arguments) {
|
||||
return new CPPDeferredFunctionInstance( this, arguments );
|
||||
}
|
||||
/* (non-Javadoc)
|
||||
|
|
|
@ -1,58 +1,90 @@
|
|||
/*************************************************************************
|
||||
* Copyright (c) 2005 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/cpl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
*/
|
||||
/*
|
||||
* Created on Apr 29, 2005
|
||||
*/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateSpecialization;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
|
||||
public class CPPFunctionTemplateSpecialization extends CPPFunction implements
|
||||
ICPPTemplateSpecialization {
|
||||
/**
|
||||
* @author aniefer
|
||||
*
|
||||
*/
|
||||
public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization implements
|
||||
ICPPFunctionTemplate, ICPPFunction, ICPPInternalTemplate {
|
||||
|
||||
private IASTName name = null;
|
||||
private IType [] argumentTypes = null;
|
||||
private ICPPFunctionTemplate primaryTemplate = null;
|
||||
private ObjectMap instances = null;
|
||||
|
||||
public CPPFunctionTemplateSpecialization(ICPPASTFunctionDeclarator declarator, ICPPFunctionTemplate primaryTemplate ) {
|
||||
super(declarator);
|
||||
this.primaryTemplate = primaryTemplate;
|
||||
IASTName n = declarator.getName();
|
||||
if( n instanceof ICPPASTQualifiedName ){
|
||||
IASTName [] ns = ((ICPPASTQualifiedName)n).getNames();
|
||||
n = ns[ ns.length - 1 ];
|
||||
}
|
||||
this.name = n;
|
||||
public CPPFunctionTemplateSpecialization(IBinding specialized, ICPPScope scope, ObjectMap argumentMap) {
|
||||
super(specialized, scope, argumentMap);
|
||||
}
|
||||
|
||||
public ICPPTemplateParameter[] getTemplateParameters() throws DOMException {
|
||||
ICPPFunctionTemplate template = (ICPPFunctionTemplate) getSpecializedBinding();
|
||||
return template.getTemplateParameters();
|
||||
}
|
||||
|
||||
public ICPPDelegate createDelegate(IASTName name) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addSpecialization(IType[] arguments, ICPPSpecialization specialization) {
|
||||
if( instances == null )
|
||||
instances = new ObjectMap(2);
|
||||
instances.put( arguments, specialization );
|
||||
}
|
||||
|
||||
public IType [] getArguments() throws DOMException{
|
||||
if( argumentTypes == null ){
|
||||
IASTNode [] specArgs = ( name instanceof ICPPASTTemplateId ) ? ((ICPPASTTemplateId)name).getTemplateArguments()
|
||||
: IASTNode.EMPTY_NODE_ARRAY;
|
||||
argumentTypes = CPPTemplates.deduceTemplateFunctionArguments( this, specArgs );
|
||||
public ICPPSpecialization getInstance( IType [] arguments ) {
|
||||
if( instances == null )
|
||||
return null;
|
||||
|
||||
int found = -1;
|
||||
for( int i = 0; i < instances.size(); i++ ){
|
||||
IType [] args = (IType[]) instances.keyAt( i );
|
||||
if( args.length == arguments.length ){
|
||||
int j = 0;
|
||||
for(; j < args.length; j++) {
|
||||
if( !( args[j].isSameType( arguments[j] ) ) )
|
||||
break;
|
||||
}
|
||||
if( j == args.length ){
|
||||
found = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return argumentTypes;
|
||||
if( found != -1 ){
|
||||
return (ICPPSpecialization) instances.getAt(found);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public IBinding instantiate(IType[] arguments) {
|
||||
return CPPTemplates.instantiateTemplate( this, arguments, argumentMap );
|
||||
}
|
||||
|
||||
public boolean isPartialSpecialization() {
|
||||
return false;
|
||||
public ICPPSpecialization deferredInstance(IType[] arguments) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
public ICPPTemplateDefinition getPrimaryTemplateDefinition() {
|
||||
return primaryTemplate;
|
||||
}
|
||||
|
||||
public ICPPTemplateParameter[] getTemplateParameters() {
|
||||
return ICPPTemplateParameter.EMPTY_TEMPLATE_PARAMETER_ARRAY;
|
||||
}
|
||||
|
||||
public ICPPTemplateSpecialization[] getTemplateSpecializations() {
|
||||
return ICPPTemplateSpecialization.EMPTY_TEMPLATE_SPECIALIZATION_ARRAY;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -13,9 +13,7 @@
|
|||
*/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
||||
|
@ -25,79 +23,28 @@ import org.eclipse.cdt.core.parser.util.ObjectMap;
|
|||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public class CPPInstance implements ICPPTemplateInstance {
|
||||
private IBinding binding;
|
||||
public abstract class CPPInstance extends CPPSpecialization implements ICPPTemplateInstance {
|
||||
private IType [] arguments;
|
||||
private ObjectMap argMap;
|
||||
private ICPPScope scope;
|
||||
|
||||
public CPPInstance( ICPPScope scope, IBinding orig, ObjectMap argMap, IType [] arguments ){
|
||||
this.binding = orig;
|
||||
this.argMap = argMap;
|
||||
this.scope = scope;
|
||||
super( orig, scope, argMap );
|
||||
this.arguments = arguments;
|
||||
}
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPInstance#getOriginalBinding()
|
||||
*/
|
||||
public IBinding getOriginalBinding() {
|
||||
return binding;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPInstance#getTemplate()
|
||||
*/
|
||||
public ICPPTemplateDefinition getTemplate() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
public ICPPTemplateDefinition getTemplateDefinition() {
|
||||
return (ICPPTemplateDefinition) getSpecializedBinding();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getName()
|
||||
*/
|
||||
public String getName() {
|
||||
return binding.getName();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getNameCharArray()
|
||||
*/
|
||||
public char[] getNameCharArray() {
|
||||
return binding.getNameCharArray();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
|
||||
*/
|
||||
public IScope getScope() {
|
||||
return scope;
|
||||
}
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPInstance#getArgumentMap()
|
||||
*/
|
||||
public ObjectMap getArgumentMap() {
|
||||
return argMap;
|
||||
return argumentMap;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDefinition(org.eclipse.cdt.core.dom.ast.IASTNode)
|
||||
*/
|
||||
public void addDefinition(IASTNode node) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDeclaration(org.eclipse.cdt.core.dom.ast.IASTNode)
|
||||
*/
|
||||
public void addDeclaration(IASTNode node) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
public void removeDeclaration(IASTNode node) {
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance#getArguments()
|
||||
*/
|
||||
|
|
|
@ -19,13 +19,12 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.ILabel;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public class CPPLabel implements ILabel, ICPPInternalBinding, ICPPBinding {
|
||||
public class CPPLabel implements ILabel, ICPPInternalBinding {
|
||||
private IASTName statement;
|
||||
/**
|
||||
* @param gotoStatement
|
||||
|
|
|
@ -219,6 +219,6 @@ public class CPPMethod extends CPPFunction implements ICPPMethod {
|
|||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction#isMutable()
|
||||
*/
|
||||
public boolean isMutable() {
|
||||
return hasStorageClass( ICPPASTDeclSpecifier.sc_mutable );
|
||||
return hasStorageClass( this, ICPPASTDeclSpecifier.sc_mutable );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,8 +23,7 @@ import org.eclipse.cdt.core.parser.util.ObjectMap;
|
|||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public class CPPMethodInstance extends CPPFunctionInstance implements
|
||||
ICPPMethod {
|
||||
public class CPPMethodInstance extends CPPFunctionInstance implements ICPPMethod {
|
||||
|
||||
/**
|
||||
* @param scope
|
||||
|
@ -34,7 +33,6 @@ public class CPPMethodInstance extends CPPFunctionInstance implements
|
|||
*/
|
||||
public CPPMethodInstance(ICPPScope scope, IBinding orig, ObjectMap argMap, IType[] args) {
|
||||
super(scope, orig, argMap, args);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -49,7 +47,7 @@ public class CPPMethodInstance extends CPPFunctionInstance implements
|
|||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod#isVirtual()
|
||||
*/
|
||||
public boolean isVirtual() throws DOMException {
|
||||
return ((ICPPMethod)getOriginalBinding()).isVirtual();
|
||||
return ((ICPPMethod)getTemplateDefinition()).isVirtual();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,74 @@
|
|||
/*************************************************************************
|
||||
* Copyright (c) 2005 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/cpl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
*/
|
||||
/*
|
||||
* Created on Apr 29, 2005
|
||||
*/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*
|
||||
*/
|
||||
public class CPPMethodSpecialization extends CPPFunctionSpecialization
|
||||
implements ICPPMethod {
|
||||
|
||||
public CPPMethodSpecialization(IBinding orig, ICPPScope scope, ObjectMap argMap ) {
|
||||
super(orig, scope, argMap );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod#isVirtual()
|
||||
*/
|
||||
public boolean isVirtual() throws DOMException {
|
||||
ICPPMethod f = (ICPPMethod) getSpecializedBinding();
|
||||
if( f != null )
|
||||
return f.isVirtual();
|
||||
IASTNode definition = getDefinition();
|
||||
if( definition != null ){
|
||||
IASTNode node = definition.getParent();
|
||||
while( node instanceof IASTDeclarator )
|
||||
node = node.getParent();
|
||||
|
||||
ICPPASTDeclSpecifier declSpec = null;
|
||||
if( node instanceof IASTSimpleDeclaration )
|
||||
declSpec = (ICPPASTDeclSpecifier) ((IASTSimpleDeclaration)node).getDeclSpecifier();
|
||||
else if( node instanceof IASTFunctionDefinition )
|
||||
declSpec = (ICPPASTDeclSpecifier) ((IASTFunctionDefinition)node).getDeclSpecifier();
|
||||
|
||||
if( declSpec != null ){
|
||||
return declSpec.isVirtual();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPMember#getVisibility()
|
||||
*/
|
||||
public int getVisibility() throws DOMException {
|
||||
ICPPMethod f = (ICPPMethod) getSpecializedBinding();
|
||||
if( f != null )
|
||||
return f.getVisibility();
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
/*************************************************************************
|
||||
* Copyright (c) 2005 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/cpl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
*/
|
||||
/*
|
||||
* Created on Apr 29, 2005
|
||||
*/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*
|
||||
*/
|
||||
public class CPPMethodTemplateSpecialization extends
|
||||
CPPFunctionTemplateSpecialization implements ICPPMethod {
|
||||
|
||||
/**
|
||||
* @param specialized
|
||||
* @param scope
|
||||
* @param argumentMap
|
||||
*/
|
||||
public CPPMethodTemplateSpecialization(IBinding specialized,
|
||||
ICPPScope scope, ObjectMap argumentMap) {
|
||||
super(specialized, scope, argumentMap);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod#isVirtual()
|
||||
*/
|
||||
public boolean isVirtual() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPMember#getVisibility()
|
||||
*/
|
||||
public int getVisibility() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
|
@ -16,20 +16,17 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
|||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPParameter.CPPParameterDelegate;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public class CPPParameterInstance extends CPPInstance implements ICPPParameter, ICPPInternalBinding {
|
||||
|
||||
public class CPPParameterSpecialization extends CPPSpecialization implements ICPPParameter {
|
||||
private IType type = null;
|
||||
|
||||
/**
|
||||
|
@ -37,32 +34,12 @@ public class CPPParameterInstance extends CPPInstance implements ICPPParameter,
|
|||
* @param orig
|
||||
* @param argMap
|
||||
*/
|
||||
public CPPParameterInstance(ICPPScope scope, IBinding orig, ObjectMap argMap, IType [] args ) {
|
||||
super(scope, orig, argMap, args);
|
||||
public CPPParameterSpecialization(ICPPParameter orig, ICPPScope scope, ObjectMap argMap) {
|
||||
super( orig, scope, argMap );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDeclarations()
|
||||
*/
|
||||
public IASTNode[] getDeclarations() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDefinition()
|
||||
*/
|
||||
public IASTNode getDefinition() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#createDelegate(org.eclipse.cdt.core.dom.ast.IASTName)
|
||||
*/
|
||||
public ICPPDelegate createDelegate(IASTName name) {
|
||||
if( name == null ) {}
|
||||
return null;
|
||||
private ICPPParameter getParameter(){
|
||||
return (ICPPParameter) getSpecializedBinding();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -70,7 +47,7 @@ public class CPPParameterInstance extends CPPInstance implements ICPPParameter,
|
|||
*/
|
||||
public IType getType() throws DOMException {
|
||||
if( type == null ){
|
||||
type = CPPTemplates.instantiateType( ((IParameter)getOriginalBinding()).getType(), getArgumentMap() );
|
||||
type = CPPTemplates.instantiateType( getParameter().getType(), argumentMap );
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
@ -82,27 +59,6 @@ public class CPPParameterInstance extends CPPInstance implements ICPPParameter,
|
|||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedName()
|
||||
*/
|
||||
public String[] getQualifiedName() {
|
||||
return CPPVisitor.getQualifiedName( this );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedNameCharArray()
|
||||
*/
|
||||
public char[][] getQualifiedNameCharArray() {
|
||||
return CPPVisitor.getQualifiedNameCharArray( this );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#isGloballyQualified()
|
||||
*/
|
||||
public boolean isGloballyQualified() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IVariable#isExtern()
|
||||
*/
|
||||
|
@ -114,14 +70,14 @@ public class CPPParameterInstance extends CPPInstance implements ICPPParameter,
|
|||
* @see org.eclipse.cdt.core.dom.ast.IVariable#isAuto()
|
||||
*/
|
||||
public boolean isAuto() throws DOMException {
|
||||
return ((IParameter)getOriginalBinding()).isAuto();
|
||||
return getParameter().isAuto();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IVariable#isRegister()
|
||||
*/
|
||||
public boolean isRegister() throws DOMException {
|
||||
return ((IParameter)getOriginalBinding()).isRegister();
|
||||
return getParameter().isRegister();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -132,7 +88,10 @@ public class CPPParameterInstance extends CPPInstance implements ICPPParameter,
|
|||
}
|
||||
|
||||
public IASTInitializer getDefaultValue() {
|
||||
return ((ICPPParameter)getOriginalBinding()).getDefaultValue();
|
||||
return getParameter().getDefaultValue();
|
||||
}
|
||||
|
||||
public ICPPDelegate createDelegate(IASTName name) {
|
||||
return new CPPParameterDelegate( name, this );
|
||||
}
|
||||
}
|
|
@ -83,6 +83,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
|
@ -97,10 +98,9 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition;
|
||||
|
@ -1554,8 +1554,8 @@ public class CPPSemantics {
|
|||
if( node.getPropertyInParent() == STRING_LOOKUP_PROPERTY ) return true;
|
||||
|
||||
ASTNode nd = null;
|
||||
if( obj instanceof ICPPTemplateInstance ){
|
||||
obj = ((ICPPTemplateInstance)obj).getOriginalBinding();
|
||||
if( obj instanceof ICPPSpecialization ){
|
||||
obj = ((ICPPSpecialization)obj).getSpecializedBinding();
|
||||
}
|
||||
|
||||
if( obj instanceof ICPPInternalBinding ){
|
||||
|
@ -1650,8 +1650,8 @@ public class CPPSemantics {
|
|||
(type instanceof ICPPDelegate && ((ICPPDelegate)type).getBinding() == temp) )
|
||||
{
|
||||
//ok, delegates are synonyms
|
||||
} else if( type instanceof ICPPClassTemplate && temp instanceof ICPPTemplateSpecialization &&
|
||||
((ICPPTemplateSpecialization)temp).getPrimaryTemplateDefinition() == type )
|
||||
} else if( type instanceof ICPPClassTemplate && temp instanceof ICPPClassTemplatePartialSpecialization &&
|
||||
((ICPPClassTemplatePartialSpecialization)temp).getPrimaryClassTemplate() == type )
|
||||
{
|
||||
//ok, stay with the template, the specialization, if applicable, will come out during instantiation
|
||||
} else if( type != temp ) {
|
||||
|
@ -2035,14 +2035,14 @@ public class CPPSemantics {
|
|||
|
||||
if( !hasWorse ){
|
||||
//if they are both template functions, we can order them that way
|
||||
boolean bestIsTemplate = (bestFn instanceof ICPPTemplateInstance &&
|
||||
((ICPPTemplateInstance)bestFn).getOriginalBinding() instanceof ICPPFunctionTemplate);
|
||||
boolean currIsTemplate = (currFn instanceof ICPPTemplateInstance &&
|
||||
((ICPPTemplateInstance)currFn).getOriginalBinding() instanceof ICPPFunctionTemplate);
|
||||
boolean bestIsTemplate = (bestFn instanceof ICPPSpecialization &&
|
||||
((ICPPSpecialization)bestFn).getSpecializedBinding() instanceof ICPPFunctionTemplate);
|
||||
boolean currIsTemplate = (currFn instanceof ICPPSpecialization &&
|
||||
((ICPPSpecialization)currFn).getSpecializedBinding() instanceof ICPPFunctionTemplate);
|
||||
if( bestIsTemplate && currIsTemplate )
|
||||
{
|
||||
ICPPFunctionTemplate t1 = (ICPPFunctionTemplate) ((ICPPTemplateInstance)bestFn).getOriginalBinding();
|
||||
ICPPFunctionTemplate t2 = (ICPPFunctionTemplate) ((ICPPTemplateInstance)currFn).getOriginalBinding();
|
||||
ICPPFunctionTemplate t1 = (ICPPFunctionTemplate) ((ICPPSpecialization)bestFn).getSpecializedBinding();
|
||||
ICPPFunctionTemplate t2 = (ICPPFunctionTemplate) ((ICPPSpecialization)currFn).getSpecializedBinding();
|
||||
int order = CPPTemplates.orderTemplateFunctions( t1, t2);
|
||||
if ( order < 0 ){
|
||||
hasBetter = true;
|
||||
|
|
|
@ -0,0 +1,121 @@
|
|||
/*************************************************************************
|
||||
* Copyright (c) 2005 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/cpl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
*/
|
||||
/*
|
||||
* Created on Apr 29, 2005
|
||||
*/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*
|
||||
*/
|
||||
public abstract class CPPSpecialization implements ICPPSpecialization, ICPPInternalBinding {
|
||||
private IBinding specialized;
|
||||
private ICPPScope scope;
|
||||
protected ObjectMap argumentMap;
|
||||
|
||||
private IASTNode definition = null;
|
||||
private IASTNode [] declarations = null;
|
||||
|
||||
public CPPSpecialization( IBinding specialized, ICPPScope scope, ObjectMap argumentMap ){
|
||||
this.specialized = specialized;
|
||||
this.scope = scope;
|
||||
this.argumentMap = argumentMap;
|
||||
|
||||
if( specialized instanceof ICPPInternalBinding ){
|
||||
definition = ((ICPPInternalBinding)specialized).getDefinition();
|
||||
IASTNode [] decls = ((ICPPInternalBinding)specialized).getDeclarations();
|
||||
if( decls != null && decls.length > 0 )
|
||||
declarations = new IASTNode[]{ decls[0] };
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization#getSpecializedBinding()
|
||||
*/
|
||||
public IBinding getSpecializedBinding() {
|
||||
return specialized;
|
||||
}
|
||||
public IASTNode[] getDeclarations() {
|
||||
return declarations;
|
||||
}
|
||||
public IASTNode getDefinition() {
|
||||
return definition;
|
||||
}
|
||||
|
||||
public void addDefinition(IASTNode node) {
|
||||
definition = node;
|
||||
}
|
||||
public void addDeclaration(IASTNode node) {
|
||||
if( declarations == null )
|
||||
declarations = new IASTNode[] { node };
|
||||
else {
|
||||
//keep the lowest offset declaration in [0]
|
||||
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
||||
declarations = (IASTNode[]) ArrayUtil.prepend( IASTNode.class, declarations, node );
|
||||
} else {
|
||||
declarations = (IASTNode[]) ArrayUtil.append( IASTNode.class, declarations, node );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void removeDeclaration(IASTNode node) {
|
||||
if( node == definition ){
|
||||
definition = null;
|
||||
return;
|
||||
}
|
||||
if( declarations != null ) {
|
||||
for (int i = 0; i < declarations.length; i++) {
|
||||
if( node == declarations[i] ) {
|
||||
if( i == declarations.length - 1 )
|
||||
declarations[i] = null;
|
||||
else
|
||||
System.arraycopy( declarations, i + 1, declarations, i, declarations.length - 1 - i );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
public char[] getNameCharArray() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
public IScope getScope() {
|
||||
return scope;
|
||||
}
|
||||
public String[] getQualifiedName() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
public char[][] getQualifiedNameCharArray() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
public boolean isGloballyQualified() throws DOMException {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
|
@ -22,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTParameterDeclaration;
|
||||
|
@ -30,15 +31,12 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplatedTypeTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
|
||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
||||
|
@ -47,7 +45,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
|
|||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public abstract class CPPTemplateDefinition implements ICPPTemplateDefinition, ICPPInternalBinding {
|
||||
public abstract class CPPTemplateDefinition implements ICPPTemplateDefinition, ICPPInternalTemplate {
|
||||
public static final class CPPTemplateProblem extends ProblemBinding implements ICPPTemplateDefinition {
|
||||
public CPPTemplateProblem(IASTNode node, int id, char[] arg) {
|
||||
super(node, id, arg);
|
||||
|
@ -55,7 +53,7 @@ public abstract class CPPTemplateDefinition implements ICPPTemplateDefinition, I
|
|||
public ICPPTemplateParameter[] getTemplateParameters() throws DOMException {
|
||||
throw new DOMException( this );
|
||||
}
|
||||
public ICPPTemplateSpecialization[] getTemplateSpecializations() throws DOMException {
|
||||
public ICPPClassTemplatePartialSpecialization[] getTemplateSpecializations() throws DOMException {
|
||||
throw new DOMException( this );
|
||||
}
|
||||
public String[] getQualifiedName() throws DOMException {
|
||||
|
@ -73,7 +71,6 @@ public abstract class CPPTemplateDefinition implements ICPPTemplateDefinition, I
|
|||
protected IASTName definition = null;
|
||||
|
||||
private ICPPTemplateParameter [] templateParameters = null;
|
||||
private ICPPTemplateSpecialization [] specializations = null;
|
||||
private ObjectMap instances = null;
|
||||
|
||||
public CPPTemplateDefinition( IASTName name ) {
|
||||
|
@ -95,7 +92,7 @@ public abstract class CPPTemplateDefinition implements ICPPTemplateDefinition, I
|
|||
}
|
||||
}
|
||||
|
||||
public abstract ICPPTemplateInstance deferredInstance( IType [] arguments );
|
||||
public abstract ICPPSpecialization deferredInstance( IType [] arguments );
|
||||
|
||||
public IBinding instantiate(ICPPASTTemplateId templateId ) {//IASTNode[] arguments) {
|
||||
IASTNode [] args = templateId.getTemplateArguments();
|
||||
|
@ -104,104 +101,25 @@ public abstract class CPPTemplateDefinition implements ICPPTemplateDefinition, I
|
|||
}
|
||||
|
||||
public IBinding instantiate( IType [] arguments ){
|
||||
ICPPTemplateDefinition template;
|
||||
try {
|
||||
template = CPPTemplates.matchTemplatePartialSpecialization( this, arguments );
|
||||
} catch (DOMException e) {
|
||||
return e.getProblem();
|
||||
ICPPTemplateDefinition template = null;
|
||||
if( this instanceof ICPPClassTemplate ){
|
||||
try {
|
||||
template = CPPTemplates.matchTemplatePartialSpecialization( (ICPPClassTemplate) this, arguments );
|
||||
} catch (DOMException e) {
|
||||
return e.getProblem();
|
||||
}
|
||||
}
|
||||
|
||||
if( template != null && template instanceof ICPPTemplateSpecialization ){
|
||||
if( template instanceof IProblemBinding )
|
||||
return template;
|
||||
if( template != null && template instanceof ICPPClassTemplatePartialSpecialization ){
|
||||
return ((CPPTemplateDefinition)template).instantiate( arguments );
|
||||
}
|
||||
|
||||
if( template == null ){
|
||||
template = this;
|
||||
}
|
||||
|
||||
ICPPTemplateParameter[] parameters = null;
|
||||
try {
|
||||
parameters = template.getTemplateParameters();
|
||||
} catch (DOMException e1) {
|
||||
return e1.getProblem();
|
||||
}
|
||||
|
||||
int numParams = ( parameters != null ) ? parameters.length : 0;
|
||||
int numArgs = arguments.length;
|
||||
|
||||
if( numParams == 0 ){
|
||||
return null;
|
||||
}
|
||||
|
||||
ObjectMap map = new ObjectMap( numParams );
|
||||
ICPPTemplateParameter param = null;
|
||||
IType arg = null;
|
||||
IType[] actualArgs = new IType[ numParams ];
|
||||
|
||||
for( int i = 0; i < numParams; i++ ){
|
||||
arg = null;
|
||||
param = parameters[i];
|
||||
|
||||
if( i < numArgs ){
|
||||
arg = arguments[i];
|
||||
//If the argument is a template parameter, we can't instantiate yet, defer for later
|
||||
if( arg instanceof ICPPTemplateParameter ){
|
||||
return deferredInstance( arguments );
|
||||
}
|
||||
} else {
|
||||
IType defaultType = null;
|
||||
try {
|
||||
if( param instanceof ICPPTemplateTypeParameter )
|
||||
defaultType = ((ICPPTemplateTypeParameter)param).getDefault();
|
||||
else if( param instanceof ICPPTemplateTemplateParameter )
|
||||
defaultType = ((ICPPTemplateTemplateParameter)param).getDefault();
|
||||
else if( param instanceof ICPPTemplateNonTypeParameter )
|
||||
defaultType = CPPVisitor.getExpressionType( ((ICPPTemplateNonTypeParameter)param).getDefault() );
|
||||
} catch (DOMException e) {
|
||||
defaultType = e.getProblem();
|
||||
}
|
||||
if( defaultType != null ){
|
||||
if( defaultType instanceof ICPPTemplateParameter ){
|
||||
if( map.containsKey( defaultType ) ){
|
||||
arg = (IType) map.get( defaultType );
|
||||
}
|
||||
} else {
|
||||
arg = defaultType;
|
||||
}
|
||||
} else {
|
||||
//TODO problem
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
if( CPPTemplates.matchTemplateParameterAndArgument( param, arg ) ){
|
||||
map.put( param, arg );
|
||||
actualArgs[i] = arg;
|
||||
} else {
|
||||
//TODO problem
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
ICPPTemplateInstance instance = getInstance( actualArgs );
|
||||
if( instance != null ){
|
||||
return instance;
|
||||
}
|
||||
|
||||
instance = (ICPPTemplateInstance) CPPTemplates.createInstance( (ICPPScope) getScope(), this, map, arguments );
|
||||
addInstance( arguments, instance );
|
||||
|
||||
return instance;
|
||||
return CPPTemplates.instantiateTemplate( this, arguments, null );
|
||||
}
|
||||
|
||||
public ICPPTemplateSpecialization [] getTemplateSpecializations() {
|
||||
return (ICPPTemplateSpecialization[]) ArrayUtil.trim( ICPPTemplateSpecialization.class, specializations );
|
||||
}
|
||||
public void addSpecialization( ICPPTemplateSpecialization spec ){
|
||||
specializations = (ICPPTemplateSpecialization[]) ArrayUtil.append( ICPPTemplateSpecialization.class, specializations, spec );
|
||||
|
||||
}
|
||||
public ICPPTemplateInstance getInstance( IType [] arguments ) {
|
||||
public ICPPSpecialization getInstance( IType [] arguments ) {
|
||||
if( instances == null )
|
||||
return null;
|
||||
|
||||
|
@ -221,15 +139,15 @@ public abstract class CPPTemplateDefinition implements ICPPTemplateDefinition, I
|
|||
}
|
||||
}
|
||||
if( found != -1 ){
|
||||
return (ICPPTemplateInstance) instances.getAt(found);
|
||||
return (ICPPSpecialization) instances.getAt(found);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addInstance( IType [] types, ICPPTemplateInstance instance ){
|
||||
public void addSpecialization( IType [] types, ICPPSpecialization spec ){
|
||||
if( instances == null )
|
||||
instances = new ObjectMap( 2 );
|
||||
instances.put( types, instance );
|
||||
instances.put( types, spec );
|
||||
}
|
||||
|
||||
public IBinding resolveTemplateParameter(ICPPASTTemplateParameter templateParameter) {
|
||||
|
|
|
@ -31,8 +31,9 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
|
||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
|
||||
|
@ -40,7 +41,7 @@ import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
|||
* @author aniefer
|
||||
*/
|
||||
public class CPPTemplateTemplateParameter extends CPPTemplateParameter implements
|
||||
ICPPTemplateTemplateParameter, ICPPClassType {
|
||||
ICPPTemplateTemplateParameter, ICPPClassType, ICPPInternalTemplate {
|
||||
|
||||
private ICPPTemplateParameter [] templateParameters = null;
|
||||
|
||||
|
@ -103,8 +104,8 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
|
|||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition#getTemplateSpecializations()
|
||||
*/
|
||||
public ICPPTemplateSpecialization[] getTemplateSpecializations() throws DOMException {
|
||||
return ICPPTemplateSpecialization.EMPTY_TEMPLATE_SPECIALIZATION_ARRAY;
|
||||
public ICPPClassTemplatePartialSpecialization[] getTemplateSpecializations() throws DOMException {
|
||||
return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -237,4 +238,24 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
|
|||
return ((ITypedef)type).isSameType( this );
|
||||
return false;
|
||||
}
|
||||
|
||||
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException {
|
||||
return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY;
|
||||
}
|
||||
|
||||
public void addSpecialization(IType[] arguments, ICPPSpecialization specialization) {
|
||||
}
|
||||
|
||||
public IBinding instantiate(IType[] arguments) {
|
||||
return deferredInstance( arguments );
|
||||
}
|
||||
|
||||
public ICPPSpecialization deferredInstance(IType[] arguments) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
public ICPPSpecialization getInstance(IType[] arguments) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,9 +14,11 @@
|
|||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
|
||||
|
@ -47,6 +49,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplatedTypeTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||
|
@ -58,12 +61,13 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
|
||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
|
@ -196,7 +200,7 @@ public class CPPTemplates {
|
|||
}
|
||||
|
||||
if( parent instanceof ICPPASTCompositeTypeSpecifier && segment == 1 ){
|
||||
return createClassPartialSpecialization( (ICPPASTCompositeTypeSpecifier) parent );
|
||||
return createClassSpecialization( (ICPPASTCompositeTypeSpecifier) parent );
|
||||
} else if( parent instanceof ICPPASTFunctionDeclarator && segment != 0 ){
|
||||
return createFunctionSpecialization( id );
|
||||
}
|
||||
|
@ -207,35 +211,35 @@ public class CPPTemplates {
|
|||
//class template
|
||||
IASTName templateName = id.getTemplateName();
|
||||
template = templateName.resolveBinding();
|
||||
if( template instanceof ICPPTemplateSpecialization ){
|
||||
if( template instanceof ICPPClassTemplatePartialSpecialization ){
|
||||
//specializations are selected during the instantiation, start with the primary template
|
||||
try {
|
||||
template = ((ICPPTemplateSpecialization)template).getPrimaryTemplateDefinition();
|
||||
template = ((ICPPClassTemplatePartialSpecialization)template).getPrimaryClassTemplate();
|
||||
} catch (DOMException e) {
|
||||
return e.getProblem();
|
||||
}
|
||||
} else if( template instanceof ICPPSpecialization && !(template instanceof ICPPTemplateDefinition) ){
|
||||
template = ((ICPPSpecialization)template).getSpecializedBinding();
|
||||
}
|
||||
|
||||
if( template != null && template instanceof ICPPTemplateDefinition ){
|
||||
if( template instanceof CPPTemplateDefinition )
|
||||
if( template instanceof ICPPTemplateTemplateParameter ){
|
||||
return template;//todo
|
||||
} else if( template instanceof CPPTemplateDefinition )
|
||||
return ((CPPTemplateDefinition)template).instantiate( id );
|
||||
if( template != null && template instanceof ICPPInternalTemplate ){
|
||||
IASTNode [] args = id.getTemplateArguments();
|
||||
IType [] types = CPPTemplates.createTypeArray( args );
|
||||
return ((ICPPInternalTemplate)template).instantiate( types );
|
||||
}
|
||||
} else {
|
||||
//functions are instatiated as part of the resolution process
|
||||
template = CPPVisitor.createBinding( id );
|
||||
if( template instanceof ICPPTemplateInstance ){
|
||||
IASTName templateName = id.getTemplateName();
|
||||
templateName.setBinding( ((ICPPTemplateInstance)template).getOriginalBinding() );
|
||||
templateName.setBinding( ((ICPPTemplateInstance)template).getTemplateDefinition() );
|
||||
}
|
||||
}
|
||||
|
||||
return template;
|
||||
}
|
||||
|
||||
protected static IBinding createClassPartialSpecialization( ICPPASTCompositeTypeSpecifier compSpec ){
|
||||
protected static IBinding createClassSpecialization( ICPPASTCompositeTypeSpecifier compSpec ){
|
||||
IASTName name = compSpec.getName();
|
||||
if( name instanceof ICPPASTQualifiedName ){
|
||||
IASTName [] ns = ((ICPPASTQualifiedName)name).getNames();
|
||||
|
@ -247,13 +251,52 @@ public class CPPTemplates {
|
|||
if( !(binding instanceof ICPPClassTemplate) )
|
||||
return null; //TODO: problem?
|
||||
|
||||
CPPClassTemplate template = (CPPClassTemplate) binding;
|
||||
ICPPTemplateSpecialization [] specializations = template.getTemplateSpecializations();
|
||||
ICPPTemplateSpecialization spec = null;
|
||||
for (int i = 0; i < specializations.length; i++) {
|
||||
if( isSameTemplate( specializations[i], id ) ){
|
||||
spec = specializations[i];
|
||||
break;
|
||||
ICPPClassTemplate template = (ICPPClassTemplate) binding;
|
||||
|
||||
IBinding spec = null;
|
||||
ICPPASTTemplateDeclaration templateDecl = getTemplateDeclaration( id );
|
||||
if( templateDecl instanceof ICPPASTTemplateSpecialization ){
|
||||
//specialization
|
||||
ICPPTemplateParameter [] templateParams = null;
|
||||
try {
|
||||
templateParams = template.getTemplateParameters();
|
||||
} catch (DOMException e) {
|
||||
return e.getProblem();
|
||||
}
|
||||
IType [] args = createTypeArray( id.getTemplateArguments() );
|
||||
ObjectMap argMap = new ObjectMap( templateParams.length );
|
||||
if( templateParams.length != args.length ){
|
||||
return null; //TODO problem
|
||||
}
|
||||
for (int i = 0; i < templateParams.length; i++) {
|
||||
argMap.put( templateParams[i], args[i] );
|
||||
}
|
||||
|
||||
ICPPScope scope = (ICPPScope) CPPVisitor.getContainingScope( id );
|
||||
spec = new CPPClassSpecialization(binding, scope, argMap );
|
||||
((ICPPInternalTemplate)template).addSpecialization( args, (ICPPSpecialization) spec );
|
||||
IASTNode parent = id.getParent();
|
||||
while( !(parent instanceof IASTDeclSpecifier ) )
|
||||
parent = parent.getParent();
|
||||
if( parent instanceof IASTElaboratedTypeSpecifier )
|
||||
((ICPPInternalBinding)spec).addDeclaration( id );
|
||||
else if( parent instanceof IASTCompositeTypeSpecifier )
|
||||
((ICPPInternalBinding)spec).addDefinition( id );
|
||||
return spec;
|
||||
}
|
||||
//else partial specialization
|
||||
//CPPClassTemplate template = (CPPClassTemplate) binding;
|
||||
ICPPClassTemplatePartialSpecialization [] specializations = null;
|
||||
try {
|
||||
specializations = template.getPartialSpecializations();
|
||||
} catch (DOMException e) {
|
||||
}
|
||||
if( specializations != null ) {
|
||||
for (int i = 0; i < specializations.length; i++) {
|
||||
if( isSameTemplate( specializations[i], id ) ){
|
||||
spec = specializations[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -262,8 +305,8 @@ public class CPPTemplates {
|
|||
return spec;
|
||||
}
|
||||
|
||||
spec = new CPPClassTemplateSpecialization( id );
|
||||
template.addSpecialization( spec );
|
||||
spec = new CPPClassTemplatePartialSpecialization( id );
|
||||
((CPPClassTemplate)template).addPartialSpecialization( (ICPPClassTemplatePartialSpecialization) spec );
|
||||
return spec;
|
||||
}
|
||||
|
||||
|
@ -296,9 +339,30 @@ public class CPPTemplates {
|
|||
while( parent instanceof IASTName )
|
||||
parent = parent.getParent();
|
||||
|
||||
ICPPTemplateSpecialization spec = new CPPFunctionTemplateSpecialization( (ICPPASTFunctionDeclarator)parent, function );
|
||||
((CPPTemplateDefinition)function).addSpecialization( spec );
|
||||
return spec;
|
||||
IASTParameterDeclaration [] ps = ((ICPPASTFunctionDeclarator)parent).getParameters();
|
||||
Object [] map_types;
|
||||
try {
|
||||
map_types = deduceTemplateFunctionArguments( function, ps, data.templateArguments );
|
||||
} catch (DOMException e) {
|
||||
return e.getProblem();
|
||||
}
|
||||
if( map_types != null ){
|
||||
ICPPSpecialization spec = null;
|
||||
if( function instanceof ICPPMethod )
|
||||
spec = new CPPMethodSpecialization( function, (ICPPScope) scope, (ObjectMap) map_types[0] );
|
||||
else
|
||||
spec = new CPPFunctionSpecialization( function, (ICPPScope) scope, (ObjectMap) map_types[0] );
|
||||
((ICPPInternalTemplate)function).addSpecialization( (IType[]) map_types[1], spec );
|
||||
while( !(parent instanceof IASTDeclaration ) )
|
||||
parent = parent.getParent();
|
||||
if( parent instanceof IASTSimpleDeclaration )
|
||||
((ICPPInternalBinding)spec).addDeclaration( name );
|
||||
else if( parent instanceof IASTFunctionDefinition )
|
||||
((ICPPInternalBinding)spec).addDefinition( name );
|
||||
return spec;
|
||||
}
|
||||
//TODO problem?
|
||||
return null;
|
||||
}
|
||||
|
||||
static protected ICPPFunctionTemplate resolveTemplateFunctions( Object [] items, IASTName name ) {
|
||||
|
@ -319,7 +383,7 @@ public class CPPTemplates {
|
|||
continue;
|
||||
|
||||
if( temp instanceof ICPPTemplateInstance )
|
||||
temp = ((ICPPTemplateInstance)temp).getOriginalBinding();
|
||||
temp = ((ICPPTemplateInstance)temp).getTemplateDefinition();
|
||||
if( temp instanceof ICPPFunctionTemplate )
|
||||
templates = (ICPPFunctionTemplate[]) ArrayUtil.append( ICPPFunctionTemplate.class, templates, temp );
|
||||
}
|
||||
|
@ -387,43 +451,54 @@ public class CPPTemplates {
|
|||
return result;
|
||||
}
|
||||
|
||||
static protected IType[] deduceTemplateFunctionArguments( ICPPTemplateSpecialization specialization, IASTNode [] specArgs ) throws DOMException
|
||||
/**
|
||||
* return Object[] of { ObjectMap, IType[] }
|
||||
* @param primaryTemplate
|
||||
* @param ps
|
||||
* @param specArgs
|
||||
* @return
|
||||
* @throws DOMException
|
||||
*/
|
||||
static protected Object[] deduceTemplateFunctionArguments( ICPPFunctionTemplate primaryTemplate, IASTParameterDeclaration [] ps, IASTNode [] specArgs ) throws DOMException
|
||||
{
|
||||
if( !(specialization instanceof ICPPFunction ) )
|
||||
return null;
|
||||
|
||||
ICPPFunctionTemplate primaryTemplate = (ICPPFunctionTemplate) specialization.getPrimaryTemplateDefinition();
|
||||
ICPPTemplateParameter [] templateParameters = primaryTemplate.getTemplateParameters();
|
||||
IType [] arguments = createTypeArray( specArgs );
|
||||
|
||||
IType [] result = new IType[ templateParameters.length ];
|
||||
|
||||
ObjectMap map = null;
|
||||
|
||||
for( int i = 0; i < templateParameters.length; i++ ){
|
||||
ICPPTemplateParameter param = templateParameters[i];
|
||||
IType arg = null;
|
||||
if( i < arguments.length ){
|
||||
arg = arguments[i];
|
||||
} else {
|
||||
if( map == null ){
|
||||
IParameter [] functionParameters = ((ICPPFunction)specialization).getParameters();
|
||||
IType [] paramTypes = createTypeArray( functionParameters );
|
||||
map = deduceTemplateArguments( primaryTemplate, paramTypes );
|
||||
if(map == null )
|
||||
return null;
|
||||
}
|
||||
if( map.containsKey( param ) ){
|
||||
if( arguments.length == result.length ){
|
||||
map = new ObjectMap( result.length );
|
||||
for (int i = 0; i < templateParameters.length; i++) {
|
||||
result[i] = arguments[i];
|
||||
map.put( templateParameters, arguments[i] );
|
||||
}
|
||||
return new Object[] { map, result };
|
||||
}
|
||||
|
||||
//else need to deduce some arguments
|
||||
IType [] paramTypes = createTypeArray( ps );
|
||||
map = deduceTemplateArguments( primaryTemplate, paramTypes );
|
||||
if( map != null ){
|
||||
for( int i = 0; i < templateParameters.length; i++ ){
|
||||
ICPPTemplateParameter param = templateParameters[i];
|
||||
IType arg = null;
|
||||
if( i < arguments.length ){
|
||||
arg = arguments[i];
|
||||
map.put( param, arg );
|
||||
} else if( map.containsKey( param ) ){
|
||||
arg = (IType) map.get( param );
|
||||
}
|
||||
|
||||
if( arg == null || !matchTemplateParameterAndArgument( param, arg ) )
|
||||
return null;
|
||||
|
||||
result[i] = arg;
|
||||
}
|
||||
|
||||
if( arg == null || !matchTemplateParameterAndArgument( param, arg ) )
|
||||
return null;
|
||||
|
||||
result[i] = arg;
|
||||
return new Object[] { map, result };
|
||||
}
|
||||
|
||||
return result;
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* @param scope
|
||||
|
@ -443,8 +518,6 @@ public class CPPTemplates {
|
|||
ICPPTemplateInstance instance = null;
|
||||
if( decl instanceof ICPPClassType ){
|
||||
instance = new CPPClassInstance( scope, decl, argMap, args );
|
||||
} else if( decl instanceof ICPPField ){
|
||||
instance = new CPPFieldInstance( scope, decl, argMap, args );
|
||||
} else if( decl instanceof ICPPMethod ) {
|
||||
instance = new CPPMethodInstance( scope, decl, argMap, args );
|
||||
} else if( decl instanceof ICPPFunction ) {
|
||||
|
@ -453,6 +526,25 @@ public class CPPTemplates {
|
|||
return instance;
|
||||
}
|
||||
|
||||
public static ICPPSpecialization createSpecialization( ICPPScope scope, IBinding decl, ObjectMap argMap ){
|
||||
ICPPSpecialization spec = null;
|
||||
if( decl instanceof ICPPClassTemplate ){
|
||||
spec = new CPPClassTemplateSpecialization( decl, scope, argMap );
|
||||
} else if( decl instanceof ICPPClassType ){
|
||||
spec = new CPPClassSpecialization( decl, scope, argMap );
|
||||
} else if( decl instanceof ICPPField ){
|
||||
spec = new CPPFieldSpecialization( decl, scope, argMap );
|
||||
} else if( decl instanceof ICPPFunctionTemplate && decl instanceof ICPPMethod ){
|
||||
spec = new CPPMethodTemplateSpecialization( decl, scope, argMap );
|
||||
} else if( decl instanceof ICPPFunctionTemplate ){
|
||||
spec = new CPPFunctionTemplateSpecialization( decl, scope, argMap );
|
||||
}else if( decl instanceof ICPPMethod ) {
|
||||
spec = new CPPMethodSpecialization( decl, scope, argMap );
|
||||
} else if( decl instanceof ICPPFunction ) {
|
||||
spec = new CPPFunctionSpecialization( decl, scope, argMap );
|
||||
}
|
||||
return spec;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param type
|
||||
|
@ -504,6 +596,12 @@ public class CPPTemplates {
|
|||
public static ICPPASTTemplateDeclaration getTemplateDeclaration( IASTName name ){
|
||||
if( name == null ) return null;
|
||||
|
||||
// if( name.getPropertyInParent() == ICPPASTTemplateId.TEMPLATE_NAME )
|
||||
// name = (IASTName) name.getParent();
|
||||
//
|
||||
// if( !(name instanceof ICPPASTTemplateId) )
|
||||
// return null;
|
||||
|
||||
IASTNode parent = name.getParent();
|
||||
while( parent != null && !(parent instanceof ICPPASTTemplateDeclaration) &&
|
||||
!(parent instanceof ICPPASTTemplatedTypeTemplateParameter) )
|
||||
|
@ -527,10 +625,10 @@ public class CPPTemplates {
|
|||
|
||||
if( name.getParent() instanceof ICPPASTQualifiedName ){
|
||||
int idx = templates.length;
|
||||
int i = 0;
|
||||
int i = -1;
|
||||
IASTName [] ns = ((ICPPASTQualifiedName) name.getParent()).getNames();
|
||||
for (int j = 0; j < ns.length; j++) {
|
||||
if( ns[j] instanceof ICPPASTTemplateId ){
|
||||
if( ns[j] instanceof ICPPASTTemplateId || j + 1 == ns.length){
|
||||
++i;
|
||||
}
|
||||
if( ns[j] == name ){
|
||||
|
@ -620,8 +718,8 @@ public class CPPTemplates {
|
|||
}
|
||||
} else if( parent instanceof IASTDeclSpecifier ){
|
||||
if( name instanceof ICPPASTTemplateId ){
|
||||
if( definition instanceof ICPPTemplateSpecialization ){
|
||||
ICPPTemplateSpecialization spec = (ICPPTemplateSpecialization) definition;
|
||||
if( definition instanceof ICPPClassTemplatePartialSpecialization ){
|
||||
ICPPClassTemplatePartialSpecialization spec = (ICPPClassTemplatePartialSpecialization) definition;
|
||||
IASTNode [] args = ((ICPPASTTemplateId)name).getTemplateArguments();
|
||||
IType [] specArgs = null;
|
||||
try {
|
||||
|
@ -655,6 +753,9 @@ public class CPPTemplates {
|
|||
}
|
||||
|
||||
static public IType [] createTypeArray( Object [] params ){
|
||||
if( params == null )
|
||||
return IType.EMPTY_TYPE_ARRAY;
|
||||
|
||||
if( params instanceof IType[] )
|
||||
return (IType[]) params;
|
||||
|
||||
|
@ -662,6 +763,12 @@ public class CPPTemplates {
|
|||
for( int i = 0; i < params.length; i++ ) {
|
||||
if( params[i] instanceof IASTNode ){
|
||||
result[i] = CPPVisitor.createType( (IASTNode) params[ i ] );
|
||||
} else if( params[i] instanceof IParameter ){
|
||||
try {
|
||||
result[i] = ((IParameter)params[i]).getType();
|
||||
} catch (DOMException e) {
|
||||
result[i] = e.getProblem();
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
@ -685,7 +792,7 @@ public class CPPTemplates {
|
|||
IType [] fnArgs = createTypeArray( functionArguments );
|
||||
|
||||
outer: for( int idx = 0; idx < size; idx++ ){
|
||||
CPPFunctionTemplate template = (CPPFunctionTemplate) templates.keyAt( idx );
|
||||
ICPPFunctionTemplate template = (ICPPFunctionTemplate) templates.keyAt( idx );
|
||||
|
||||
ObjectMap map = null;
|
||||
try {
|
||||
|
@ -696,7 +803,12 @@ public class CPPTemplates {
|
|||
if( map == null )
|
||||
continue;
|
||||
|
||||
ICPPTemplateParameter [] templateParams = template.getTemplateParameters();
|
||||
ICPPTemplateParameter [] templateParams = null;
|
||||
try {
|
||||
templateParams = template.getTemplateParameters();
|
||||
} catch (DOMException e1) {
|
||||
continue outer;
|
||||
}
|
||||
int numTemplateParams = templateParams.length;
|
||||
|
||||
IType [] instanceArgs = null;
|
||||
|
@ -737,7 +849,7 @@ public class CPPTemplates {
|
|||
instanceArgs = (IType[]) ArrayUtil.append( IType.class, instanceArgs, (arg != null) ? arg : mapped );
|
||||
}
|
||||
instanceArgs = (IType[]) ArrayUtil.trim( IType.class, instanceArgs );
|
||||
ICPPTemplateInstance temp = (ICPPTemplateInstance) template.instantiate( instanceArgs );
|
||||
ICPPSpecialization temp = (ICPPSpecialization) ((ICPPInternalTemplate)template).instantiate( instanceArgs );
|
||||
if( temp != null )
|
||||
instances = (IFunction[]) ArrayUtil.append( IFunction.class, instances, temp );
|
||||
}
|
||||
|
@ -961,12 +1073,12 @@ public class CPPTemplates {
|
|||
//Using the transformed parameter list, perform argument deduction against the other
|
||||
//function template
|
||||
IType [] args = createArgsForFunctionTemplateOrdering( f1 );
|
||||
ICPPFunction function = (ICPPFunction) ((CPPTemplateDefinition)f1).instantiate( args );
|
||||
ICPPFunction function = (ICPPFunction) ((ICPPInternalTemplate)f1).instantiate( args );
|
||||
|
||||
ObjectMap m1 = deduceTemplateArguments( f2, function.getType().getParameterTypes() );
|
||||
|
||||
args = createArgsForFunctionTemplateOrdering( f2 );
|
||||
function = (ICPPFunction) ((CPPTemplateDefinition)f2).instantiate( args );
|
||||
function = (ICPPFunction) ((ICPPInternalTemplate)f2).instantiate( args );
|
||||
|
||||
ObjectMap m2 = deduceTemplateArguments( f1, function.getType().getParameterTypes() );
|
||||
|
||||
|
@ -985,18 +1097,18 @@ public class CPPTemplates {
|
|||
return -1;
|
||||
}
|
||||
|
||||
static protected ICPPTemplateDefinition matchTemplatePartialSpecialization( ICPPTemplateDefinition template, IType[] args ) throws DOMException{
|
||||
static protected ICPPTemplateDefinition matchTemplatePartialSpecialization( ICPPClassTemplate template, IType[] args ) throws DOMException{
|
||||
if( template == null ){
|
||||
return null;
|
||||
}
|
||||
|
||||
ICPPTemplateSpecialization[] specializations = template.getTemplateSpecializations();
|
||||
ICPPClassTemplatePartialSpecialization[] specializations = template.getPartialSpecializations();
|
||||
int size = ( specializations != null ) ? specializations.length : 0;
|
||||
if( size == 0 ){
|
||||
return template;
|
||||
}
|
||||
|
||||
ICPPTemplateSpecialization bestMatch = null, spec = null;
|
||||
ICPPClassTemplatePartialSpecialization bestMatch = null, spec = null;
|
||||
boolean bestMatchIsBest = true;
|
||||
IType[] specArgs = null;
|
||||
for( int i = 0; i < size; i++ ){
|
||||
|
@ -1049,7 +1161,7 @@ public class CPPTemplates {
|
|||
* @return
|
||||
* @throws DOMException
|
||||
*/
|
||||
static private int orderSpecializations( ICPPTemplateSpecialization spec1, ICPPTemplateSpecialization spec2 ) throws DOMException {
|
||||
static private int orderSpecializations( ICPPClassTemplatePartialSpecialization spec1, ICPPClassTemplatePartialSpecialization spec2 ) throws DOMException {
|
||||
if( spec1 == null ){
|
||||
return -1;
|
||||
}
|
||||
|
@ -1104,7 +1216,7 @@ public class CPPTemplates {
|
|||
* has a single function parameter whose type is a class template specialization with the template
|
||||
* arguments of the partial specialization
|
||||
*/
|
||||
static private ICPPFunctionTemplate classTemplateSpecializationToFunctionTemplate( ICPPTemplateSpecialization specialization ) {
|
||||
static private ICPPFunctionTemplate classTemplateSpecializationToFunctionTemplate( ICPPClassTemplatePartialSpecialization specialization ) {
|
||||
if( !(specialization instanceof ICPPClassType) )
|
||||
return null;
|
||||
|
||||
|
@ -1116,7 +1228,7 @@ public class CPPTemplates {
|
|||
return null;
|
||||
}
|
||||
|
||||
IType paramType = (IType) ((CPPTemplateDefinition)template).instantiate( args );
|
||||
IType paramType = (IType) ((ICPPInternalTemplate)template).instantiate( args );
|
||||
IParameter [] functionParameters = new IParameter[] { new CPPParameter( paramType ) };
|
||||
|
||||
try {
|
||||
|
@ -1181,8 +1293,8 @@ public class CPPTemplates {
|
|||
|
||||
public static IBinding instantiateWithinClassTemplate( ICPPClassTemplate template ) throws DOMException {
|
||||
IType [] args = null;
|
||||
if( template instanceof ICPPTemplateSpecialization ){
|
||||
args = ((ICPPTemplateSpecialization)template).getArguments();
|
||||
if( template instanceof ICPPClassTemplatePartialSpecialization ){
|
||||
args = ((ICPPClassTemplatePartialSpecialization)template).getArguments();
|
||||
} else {
|
||||
ICPPTemplateParameter [] templateParameters = template.getTemplateParameters();
|
||||
args = new IType [ templateParameters.length ];
|
||||
|
@ -1200,4 +1312,96 @@ public class CPPTemplates {
|
|||
}
|
||||
return template;
|
||||
}
|
||||
|
||||
public static IBinding instantiateTemplate( ICPPTemplateDefinition template, IType [] arguments, ObjectMap specializedArgs ){
|
||||
if( template == null ){
|
||||
template = null;
|
||||
}
|
||||
|
||||
ICPPTemplateParameter[] parameters = null;
|
||||
try {
|
||||
parameters = template.getTemplateParameters();
|
||||
} catch (DOMException e1) {
|
||||
return e1.getProblem();
|
||||
}
|
||||
|
||||
int numParams = ( parameters != null ) ? parameters.length : 0;
|
||||
int numArgs = arguments.length;
|
||||
|
||||
if( numParams == 0 ){
|
||||
return null;
|
||||
}
|
||||
|
||||
ObjectMap map = new ObjectMap( numParams );
|
||||
ICPPTemplateParameter param = null;
|
||||
IType arg = null;
|
||||
IType[] actualArgs = new IType[ numParams ];
|
||||
|
||||
for( int i = 0; i < numParams; i++ ){
|
||||
arg = null;
|
||||
param = parameters[i];
|
||||
|
||||
if( i < numArgs ){
|
||||
arg = arguments[i];
|
||||
//If the argument is a template parameter, we can't instantiate yet, defer for later
|
||||
if( arg instanceof ICPPTemplateParameter ){
|
||||
return ((ICPPInternalTemplate)template).deferredInstance( arguments );
|
||||
}
|
||||
} else {
|
||||
IType defaultType = null;
|
||||
try {
|
||||
if( param instanceof ICPPTemplateTypeParameter )
|
||||
defaultType = ((ICPPTemplateTypeParameter)param).getDefault();
|
||||
else if( param instanceof ICPPTemplateTemplateParameter )
|
||||
defaultType = ((ICPPTemplateTemplateParameter)param).getDefault();
|
||||
else if( param instanceof ICPPTemplateNonTypeParameter )
|
||||
defaultType = CPPVisitor.getExpressionType( ((ICPPTemplateNonTypeParameter)param).getDefault() );
|
||||
} catch (DOMException e) {
|
||||
defaultType = e.getProblem();
|
||||
}
|
||||
if( defaultType != null ){
|
||||
if( defaultType instanceof ICPPTemplateParameter ){
|
||||
if( map.containsKey( defaultType ) ){
|
||||
arg = (IType) map.get( defaultType );
|
||||
}
|
||||
} else {
|
||||
arg = defaultType;
|
||||
}
|
||||
} else {
|
||||
//TODO problem
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
if( CPPTemplates.matchTemplateParameterAndArgument( param, arg ) ){
|
||||
map.put( param, arg );
|
||||
actualArgs[i] = arg;
|
||||
} else {
|
||||
//TODO problem
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
ICPPSpecialization instance = ((ICPPInternalTemplate)template).getInstance( actualArgs );
|
||||
if( instance != null ){
|
||||
return instance;
|
||||
}
|
||||
|
||||
if( specializedArgs != null ){
|
||||
for( int i = 0; i < specializedArgs.size(); i++ ){
|
||||
map.put( specializedArgs.keyAt(i), specializedArgs.getAt(i) );
|
||||
}
|
||||
}
|
||||
|
||||
ICPPScope scope = null;
|
||||
try {
|
||||
scope = (ICPPScope) template.getScope();
|
||||
} catch (DOMException e) {
|
||||
return e.getProblem();
|
||||
}
|
||||
instance = (ICPPTemplateInstance) CPPTemplates.createInstance( scope, template, map, arguments );
|
||||
((ICPPInternalTemplate)template).addSpecialization( arguments, instance );
|
||||
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,6 @@ import org.eclipse.cdt.core.dom.ast.IASTNode;
|
|||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
|
@ -30,7 +29,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
|
|||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public class CPPTypedef implements ITypedef, ITypeContainer, ICPPInternalBinding, ICPPBinding {
|
||||
public class CPPTypedef implements ITypedef, ITypeContainer, ICPPInternalBinding {
|
||||
public static class CPPTypedefDelegate extends CPPDelegate implements ITypedef {
|
||||
public CPPTypedefDelegate( IASTName name, ITypedef binding ) {
|
||||
super( name, binding );
|
||||
|
|
|
@ -360,7 +360,7 @@ public class CPPVisitor {
|
|||
}
|
||||
IBinding binding;
|
||||
if( name instanceof ICPPASTTemplateId ){
|
||||
return CPPTemplates.createClassPartialSpecialization( compType );
|
||||
return CPPTemplates.createClassSpecialization( compType );
|
||||
}
|
||||
try {
|
||||
binding = (scope != null ) ? scope.getBinding( name, false ) : null;
|
||||
|
|
|
@ -16,13 +16,13 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
|||
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public interface ICPPInternalBinding extends IBinding {
|
||||
public interface ICPPInternalBinding extends ICPPBinding {
|
||||
//methods required by the CPPVisitor but not meant for the public interface
|
||||
|
||||
//implementors should keep the node with the lowest offset in declarations[0]
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
/*************************************************************************
|
||||
* Copyright (c) 2005 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/cpl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
*/
|
||||
/*
|
||||
* Created on Apr 29, 2005
|
||||
*/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*
|
||||
*/
|
||||
public interface ICPPInternalTemplate extends ICPPInternalBinding {
|
||||
|
||||
public void addSpecialization( IType [] arguments, ICPPSpecialization specialization );
|
||||
|
||||
public IBinding instantiate( IType [] arguments );
|
||||
|
||||
public ICPPSpecialization deferredInstance( IType [] arguments );
|
||||
|
||||
public ICPPSpecialization getInstance( IType [] arguments );
|
||||
}
|
|
@ -276,8 +276,8 @@ public class DOMSearchUtil {
|
|||
// fix for 92632
|
||||
IBinding binding = searchName.resolveBinding();
|
||||
if (binding instanceof ICPPTemplateInstance) {
|
||||
if (((ICPPTemplateInstance)binding).getOriginalBinding() != null)
|
||||
binding = ((ICPPTemplateInstance)binding).getOriginalBinding();
|
||||
if (((ICPPTemplateInstance)binding).getTemplateDefinition() != null)
|
||||
binding = ((ICPPTemplateInstance)binding).getTemplateDefinition();
|
||||
}
|
||||
|
||||
if (limitTo == ICSearchConstants.DECLARATIONS) {
|
||||
|
|
Loading…
Add table
Reference in a new issue