1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 08:55:25 +02:00

Bug 335122 - DeclarationGenerator asserts for templated types with namespace. Restored assert in CPPASTTemplateId

This commit is contained in:
Marc-Andre Laperle 2011-03-12 20:03:04 +00:00
parent 2c1d3433ab
commit ef5c018b27
3 changed files with 46 additions and 10 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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;
}