Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc-Andre Laperle2011-03-12 20:03:04 +0000
committerMarc-Andre Laperle2011-03-12 20:03:04 +0000
commitef5c018b2752bfe5f6b060652cf2ba8c05756f3a (patch)
treec2a629fff4c2b844d2cbb626531231aa69b73860 /core/org.eclipse.cdt.core/parser/org
parent2c1d3433ab55f88d1b9cc91a9cf776281742b1e4 (diff)
downloadorg.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')
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java2
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/DeclarationGeneratorImpl.java43
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);

Back to the top