1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

Bug 515453 - Do not have CPPAliasTemplateInstance store its arguments in string form

This ability was only needed by two tests, and stringifying template
arguments is prone to infinite recursion problems.

Change-Id: I485fa09358c0569b48b6847994aed720ba969b1f
This commit is contained in:
Nathan Ridge 2017-04-23 17:27:10 -04:00
parent 87db7de765
commit f451a27846
3 changed files with 23 additions and 12 deletions

View file

@ -7466,9 +7466,14 @@ public class AST2TemplateTests extends AST2TestBase {
ICPPAliasTemplateInstance AliasInt = ICPPAliasTemplateInstance AliasInt =
assertionHelper.assertNonProblem("Alias<int> intAlias;", "Alias<int>", ICPPAliasTemplateInstance.class); assertionHelper.assertNonProblem("Alias<int> intAlias;", "Alias<int>", ICPPAliasTemplateInstance.class);
assertEquals("Alias<int>", AliasInt.getName()); assertEquals("Alias", AliasInt.getName());
assertEquals("NS", AliasInt.getQualifiedName()[0]); assertEquals("NS", AliasInt.getQualifiedName()[0]);
assertEquals("Alias<int>", AliasInt.getQualifiedName()[1]); assertEquals("Alias", AliasInt.getQualifiedName()[1]);
IType aliasedType = AliasInt.getType();
assertInstance(aliasedType, ICPPTemplateInstance.class);
ICPPTemplateArgument[] args = ((ICPPTemplateInstance) aliasedType).getTemplateArguments();
assertEquals(1, args.length);
assertSameType(CommonCPPTypes.int_, args[0].getTypeValue());
ICPPNamespace namespaceNS = assertionHelper.assertNonProblem("using namespace NS;", "NS", ICPPNamespace.class); ICPPNamespace namespaceNS = assertionHelper.assertNonProblem("using namespace NS;", "NS", ICPPNamespace.class);
assertEquals(namespaceNS, AliasInt.getOwner()); assertEquals(namespaceNS, AliasInt.getOwner());

View file

@ -26,6 +26,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
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.ICPPTemplateNonTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
@ -433,7 +434,7 @@ public class CPPClassTemplateTests extends PDOMInlineCodeTestBase {
assertDeclarationCount(pdom, "A", 1); assertDeclarationCount(pdom, "A", 1);
IIndexFragmentBinding[] bindingA= pdom.findBindings(new char[][] {{'A'}}, IndexFilter.ALL_DECLARED, npm()); IIndexFragmentBinding[] bindingA= pdom.findBindings(new char[][] {{'A'}}, IndexFilter.ALL_DECLARED, npm());
assertEquals(1, bindingA.length); assertEquals(1, bindingA.length);
assertTrue(bindingA[0] instanceof ICPPAliasTemplate); assertInstance(bindingA[0], ICPPAliasTemplate.class);
ICPPAliasTemplate aliasA= (ICPPAliasTemplate) bindingA[0]; ICPPAliasTemplate aliasA= (ICPPAliasTemplate) bindingA[0];
ICPPTemplateParameter[] aliasParameters= aliasA.getTemplateParameters(); ICPPTemplateParameter[] aliasParameters= aliasA.getTemplateParameters();
assertEquals(1, aliasParameters.length); assertEquals(1, aliasParameters.length);
@ -443,12 +444,16 @@ public class CPPClassTemplateTests extends PDOMInlineCodeTestBase {
assertDeclarationCount(pdom, "aB", 1); assertDeclarationCount(pdom, "aB", 1);
assertDeclarationCount(pdom, "sB", 1); assertDeclarationCount(pdom, "sB", 1);
IIndexFragmentBinding[] bindingB= pdom.findBindings(new char[][] {{'B'}}, IndexFilter.ALL_DECLARED, npm());
assertEquals(1, bindingB.length);
assertInstance(bindingB[0], ICPPClassType.class);
IIndexFragmentBinding[] bindingVarSB= pdom.findBindings(new char[][] {"sB".toCharArray()}, IndexFilter.ALL, npm()); IIndexFragmentBinding[] bindingVarSB= pdom.findBindings(new char[][] {"sB".toCharArray()}, IndexFilter.ALL, npm());
assertEquals(1, bindingVarSB.length); assertEquals(1, bindingVarSB.length);
assertTrue(bindingVarSB[0] instanceof ICPPVariable); assertInstance(bindingVarSB[0], ICPPVariable.class);
ICPPVariable variableSB = (ICPPVariable) bindingVarSB[0]; ICPPVariable variableSB = (ICPPVariable) bindingVarSB[0];
IType varSBType = variableSB.getType(); IType varSBType = variableSB.getType();
assertTrue(varSBType instanceof ICPPClassSpecialization); assertInstance(varSBType, ICPPClassSpecialization.class);
ICPPClassSpecialization templateInstanceSB = (ICPPClassSpecialization) varSBType; ICPPClassSpecialization templateInstanceSB = (ICPPClassSpecialization) varSBType;
IIndexFragmentBinding[] bindingVarAB= pdom.findBindings(new char[][] {"aB".toCharArray()}, IndexFilter.ALL, npm()); IIndexFragmentBinding[] bindingVarAB= pdom.findBindings(new char[][] {"aB".toCharArray()}, IndexFilter.ALL, npm());
@ -456,11 +461,16 @@ public class CPPClassTemplateTests extends PDOMInlineCodeTestBase {
assertTrue(bindingVarAB[0] instanceof ICPPVariable); assertTrue(bindingVarAB[0] instanceof ICPPVariable);
ICPPVariable variableAB = (ICPPVariable) bindingVarAB[0]; ICPPVariable variableAB = (ICPPVariable) bindingVarAB[0];
IType varABType = variableAB.getType(); IType varABType = variableAB.getType();
assertTrue(varABType instanceof ICPPAliasTemplateInstance); assertInstance(varABType, ICPPAliasTemplateInstance.class);
ICPPAliasTemplateInstance aliasInstanceAB = (ICPPAliasTemplateInstance) varABType; ICPPAliasTemplateInstance aliasInstanceAB = (ICPPAliasTemplateInstance) varABType;
assertTrue(varABType.isSameType(templateInstanceSB)); assertTrue(varABType.isSameType(templateInstanceSB));
assertTrue(aliasInstanceAB.getTemplateDefinition().isSameType(aliasA)); assertTrue(aliasInstanceAB.getTemplateDefinition().isSameType(aliasA));
assertEquals("A<B>", aliasInstanceAB.getName()); assertEquals("A", aliasInstanceAB.getName());
IType aliasedType = aliasInstanceAB.getType();
assertInstance(aliasedType, ICPPTemplateInstance.class);
ICPPTemplateArgument[] args = ((ICPPTemplateInstance) aliasedType).getTemplateArguments();
assertEquals(1, args.length);
assertTrue(((ICPPClassType) bindingB[0]).isSameType(args[0].getTypeValue()));
} }
// template<typename T> class CT { // template<typename T> class CT {

View file

@ -890,11 +890,7 @@ public class CPPTemplates {
IBinding owner, IASTNode point) { IBinding owner, IASTNode point) {
InstantiationContext context = createInstantiationContext(parameterMap, owner, point); InstantiationContext context = createInstantiationContext(parameterMap, owner, point);
IType instantiatedType = instantiateType(aliasedType, context); IType instantiatedType = instantiateType(aliasedType, context);
StringBuilder buf= new StringBuilder(); return new CPPAliasTemplateInstance(aliasTemplate.getNameCharArray(), aliasTemplate, instantiatedType);
buf.append(aliasTemplate.getName()).append(ASTTypeUtil.getArgumentListString(args, false));
char[] name = new char[buf.length()];
buf.getChars(0, buf.length(), name, 0);
return new CPPAliasTemplateInstance(name, aliasTemplate, instantiatedType);
} }
static boolean isClassTemplate(ICPPASTTemplateId id) { static boolean isClassTemplate(ICPPASTTemplateId id) {