diff options
author | Marc-Andre Laperle | 2011-03-12 20:03:04 +0000 |
---|---|---|
committer | Marc-Andre Laperle | 2011-03-12 20:03:04 +0000 |
commit | ef5c018b2752bfe5f6b060652cf2ba8c05756f3a (patch) | |
tree | c2a629fff4c2b844d2cbb626531231aa69b73860 /core/org.eclipse.cdt.core/parser/org | |
parent | 2c1d3433ab55f88d1b9cc91a9cf776281742b1e4 (diff) | |
download | org.eclipse.cdt-ef5c018b2752bfe5f6b060652cf2ba8c05756f3a.tar.gz org.eclipse.cdt-ef5c018b2752bfe5f6b060652cf2ba8c05756f3a.tar.xz org.eclipse.cdt-ef5c018b2752bfe5f6b060652cf2ba8c05756f3a.zip |
Bug 335122 - DeclarationGenerator asserts for templated types with namespace. Restored assert in CPPASTTemplateId
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org')
2 files changed, 36 insertions, 9 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java index f5fd10662b7..a6b05cc27ef 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java @@ -76,7 +76,7 @@ public class CPPASTTemplateId extends CPPASTNameBase implements ICPPASTTemplateI public void setTemplateName(IASTName name) { assertNotFrozen(); - assert !(name instanceof ICPPASTTemplateId); + assert !(name instanceof ICPPASTQualifiedName) && !(name instanceof ICPPASTTemplateId); templateName = name; if (name != null) { name.setParent(this); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/DeclarationGeneratorImpl.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/DeclarationGeneratorImpl.java index 0762fb7d60b..3b249519953 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/DeclarationGeneratorImpl.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/DeclarationGeneratorImpl.java @@ -303,19 +303,46 @@ public class DeclarationGeneratorImpl extends DeclarationGenerator { private IASTDeclSpecifier getDeclSpecForTemplate(ICPPTemplateInstance type) { IASTName name = getName(type); if (factory instanceof ICPPNodeFactory) { - ICPPNodeFactory cppFactory = (ICPPNodeFactory) factory; - ICPPASTTemplateId tempId = cppFactory.newTemplateId(name); - for (ICPPTemplateArgument arg : type.getTemplateArguments()) { - IASTDeclSpecifier argDeclSpec = createDeclSpecFromType(arg.isTypeValue() ? arg - .getTypeValue() : arg.getTypeOfNonTypeValue()); - IASTTypeId typeId = cppFactory.newTypeId(argDeclSpec, null); - tempId.addTemplateArgument(typeId); + + if (name instanceof ICPPASTQualifiedName) { + ICPPASTQualifiedName fullQualifiedName = (ICPPASTQualifiedName) name; + IASTName templateName = fullQualifiedName.getLastName(); + ICPPASTTemplateId tempId = getTemplateId(type, templateName); + + ICPPASTQualifiedName newQualifiedName = ((ICPPNodeFactory) factory) + .newQualifiedName(); + int nbQualifiedNames = fullQualifiedName.getNames().length; + if (nbQualifiedNames > 1) { + for (int i = 0; i < nbQualifiedNames - 1; i++) { + newQualifiedName.addName(fullQualifiedName.getNames()[i].copy()); + } + } + newQualifiedName.addName(tempId); + + return factory.newTypedefNameSpecifier(newQualifiedName); + + } else { + IASTName templateName = getName(type); + ICPPASTTemplateId tempId = getTemplateId(type, templateName); + return factory.newTypedefNameSpecifier(tempId); } - return factory.newTypedefNameSpecifier(tempId); } + return factory.newTypedefNameSpecifier(name); } + private ICPPASTTemplateId getTemplateId(ICPPTemplateInstance type, IASTName templateName) { + ICPPNodeFactory cppFactory = (ICPPNodeFactory) factory; + ICPPASTTemplateId tempId = cppFactory.newTemplateId(templateName.copy()); + for (ICPPTemplateArgument arg : type.getTemplateArguments()) { + IASTDeclSpecifier argDeclSpec = createDeclSpecFromType(arg.isTypeValue() ? arg + .getTypeValue() : arg.getTypeOfNonTypeValue()); + IASTTypeId typeId = cppFactory.newTypeId(argDeclSpec, null); + tempId.addTemplateArgument(typeId); + } + return tempId; + } + private IASTNamedTypeSpecifier getDeclSpecForBinding(IBinding binding) { IASTName name = getName(binding); return factory.newTypedefNameSpecifier(name); |