From ef5c018b2752bfe5f6b060652cf2ba8c05756f3a Mon Sep 17 00:00:00 2001 From: Marc-Andre Laperle Date: Sat, 12 Mar 2011 20:03:04 +0000 Subject: [PATCH] Bug 335122 - DeclarationGenerator asserts for templated types with namespace. Restored assert in CPPASTTemplateId --- .../core/dom/parser/cpp/CPPASTTemplateId.java | 2 +- .../dom/rewrite/DeclarationGeneratorImpl.java | 43 +++++++++++++++---- .../internal/ui/refactoring/CRefactoring.java | 11 ++++- 3 files changed, 46 insertions(+), 10 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); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoring.java index 2e4fc73eac2..a4f4c4c5fa5 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/CRefactoring.java @@ -207,7 +207,16 @@ public abstract class CRefactoring extends Refactoring { public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { ModificationCollector collector = new ModificationCollector(); collectModifications(pm, collector); - CCompositeChange finalChange = collector.createFinalChange(); + CCompositeChange finalChange = null; + try { + lockIndex(); + finalChange = collector.createFinalChange(); + } catch (InterruptedException e) { + throw new OperationCanceledException(); + } finally { + unlockIndex(); + } + finalChange.setDescription(new RefactoringChangeDescriptor(getRefactoringDescriptor())); return finalChange; }