mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-01 21:35:40 +02:00
Bug 335122 - DeclarationGenerator asserts for templated types with namespace. Restored assert in CPPASTTemplateId
This commit is contained in:
parent
2c1d3433ab
commit
ef5c018b27
3 changed files with 46 additions and 10 deletions
|
@ -76,7 +76,7 @@ public class CPPASTTemplateId extends CPPASTNameBase implements ICPPASTTemplateI
|
||||||
|
|
||||||
public void setTemplateName(IASTName name) {
|
public void setTemplateName(IASTName name) {
|
||||||
assertNotFrozen();
|
assertNotFrozen();
|
||||||
assert !(name instanceof ICPPASTTemplateId);
|
assert !(name instanceof ICPPASTQualifiedName) && !(name instanceof ICPPASTTemplateId);
|
||||||
templateName = name;
|
templateName = name;
|
||||||
if (name != null) {
|
if (name != null) {
|
||||||
name.setParent(this);
|
name.setParent(this);
|
||||||
|
|
|
@ -303,17 +303,44 @@ public class DeclarationGeneratorImpl extends DeclarationGenerator {
|
||||||
private IASTDeclSpecifier getDeclSpecForTemplate(ICPPTemplateInstance type) {
|
private IASTDeclSpecifier getDeclSpecForTemplate(ICPPTemplateInstance type) {
|
||||||
IASTName name = getName(type);
|
IASTName name = getName(type);
|
||||||
if (factory instanceof ICPPNodeFactory) {
|
if (factory instanceof ICPPNodeFactory) {
|
||||||
|
|
||||||
|
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(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ICPPASTTemplateId getTemplateId(ICPPTemplateInstance type, IASTName templateName) {
|
||||||
ICPPNodeFactory cppFactory = (ICPPNodeFactory) factory;
|
ICPPNodeFactory cppFactory = (ICPPNodeFactory) factory;
|
||||||
ICPPASTTemplateId tempId = cppFactory.newTemplateId(name);
|
ICPPASTTemplateId tempId = cppFactory.newTemplateId(templateName.copy());
|
||||||
for (ICPPTemplateArgument arg : type.getTemplateArguments()) {
|
for (ICPPTemplateArgument arg : type.getTemplateArguments()) {
|
||||||
IASTDeclSpecifier argDeclSpec = createDeclSpecFromType(arg.isTypeValue() ? arg
|
IASTDeclSpecifier argDeclSpec = createDeclSpecFromType(arg.isTypeValue() ? arg
|
||||||
.getTypeValue() : arg.getTypeOfNonTypeValue());
|
.getTypeValue() : arg.getTypeOfNonTypeValue());
|
||||||
IASTTypeId typeId = cppFactory.newTypeId(argDeclSpec, null);
|
IASTTypeId typeId = cppFactory.newTypeId(argDeclSpec, null);
|
||||||
tempId.addTemplateArgument(typeId);
|
tempId.addTemplateArgument(typeId);
|
||||||
}
|
}
|
||||||
return factory.newTypedefNameSpecifier(tempId);
|
return tempId;
|
||||||
}
|
|
||||||
return factory.newTypedefNameSpecifier(name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private IASTNamedTypeSpecifier getDeclSpecForBinding(IBinding binding) {
|
private IASTNamedTypeSpecifier getDeclSpecForBinding(IBinding binding) {
|
||||||
|
|
|
@ -207,7 +207,16 @@ public abstract class CRefactoring extends Refactoring {
|
||||||
public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
|
public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
|
||||||
ModificationCollector collector = new ModificationCollector();
|
ModificationCollector collector = new ModificationCollector();
|
||||||
collectModifications(pm, collector);
|
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()));
|
finalChange.setDescription(new RefactoringChangeDescriptor(getRefactoringDescriptor()));
|
||||||
return finalChange;
|
return finalChange;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue