From 54165f3720b792f00305519a8e6a091d203b330e Mon Sep 17 00:00:00 2001 From: Emanuel Graf Date: Tue, 4 Jan 2011 09:16:42 +0000 Subject: [PATCH] Bug 331963: Extract local variable doesn't put template type parameters https://bugs.eclipse.org/bugs/show_bug.cgi?id=331963 patch and test cases --- .../dom/rewrite/DeclarationGeneratorImpl.java | 42 +++++++++--- .../refactoring/ExtractLocalVariable.rts | 66 +++++++++++++++++++ 2 files changed, 100 insertions(+), 8 deletions(-) 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 c7ca5eefd5d..0762fb7d60b 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 @@ -28,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.IASTPointer; import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator; +import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IArrayType; import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IBasicType.Kind; @@ -40,9 +41,12 @@ import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPointerToMember; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTReferenceOperator; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNodeFactory; import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.rewrite.DeclarationGenerator; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; @@ -111,6 +115,9 @@ public class DeclarationGeneratorImpl extends DeclarationGenerator { declSpec.setSigned(basicType.isSigned()); declSpec.setUnsigned(basicType.isUnsigned()); returnedDeclSpec = declSpec; + } else if (type instanceof ICPPTemplateInstance) { + returnedDeclSpec = getDeclSpecForTemplate((ICPPTemplateInstance) type); + } else if (type instanceof IBinding) { /* ITypedef, ICompositeType... */ // BTW - we need to distinguish (and fail explicitly) on literal composites like: // struct { } aSingleInstance; @@ -293,24 +300,43 @@ public class DeclarationGeneratorImpl extends DeclarationGenerator { return isPtrOrRefType(type) || type instanceof IArrayType || type instanceof IFunctionType; } - private IASTNamedTypeSpecifier getDeclSpecForBinding(IBinding binding) { + 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); + } + return factory.newTypedefNameSpecifier(tempId); + } + return factory.newTypedefNameSpecifier(name); + } + private IASTNamedTypeSpecifier getDeclSpecForBinding(IBinding binding) { + IASTName name = getName(binding); + return factory.newTypedefNameSpecifier(name); + } + + private IASTName getName(IBinding binding) { char[][] qualifiedNameCharArray = CPPVisitor.getQualifiedNameCharArray(binding); + IASTName name; if (qualifiedNameCharArray.length > 1) { - ICPPASTQualifiedName name = ((ICPPNodeFactory) factory).newQualifiedName(); + name = ((ICPPNodeFactory) factory).newQualifiedName(); for (char[] cs : qualifiedNameCharArray) { - name.addName(factory.newName(cs)); + ((ICPPASTQualifiedName) name).addName(factory.newName(cs)); } - return factory.newTypedefNameSpecifier(name); } else if (qualifiedNameCharArray.length == 1) { - IASTName name = factory.newName(qualifiedNameCharArray[0]); - return factory.newTypedefNameSpecifier(name); + name = factory.newName(qualifiedNameCharArray[0]); } else { - IASTName name = factory.newName(binding.getName().toCharArray()); - return factory.newTypedefNameSpecifier(name); + name = factory.newName(binding.getName().toCharArray()); } + return name; } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ExtractLocalVariable.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ExtractLocalVariable.rts index 44ddf997fac..eb3fedd2b09 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ExtractLocalVariable.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ExtractLocalVariable.rts @@ -480,3 +480,69 @@ void func() { a0; } +//!Bug 331963 Extract local variable doesn't put template type parameters +//#org.eclipse.cdt.ui.tests.refactoring.extractlocalvariable.ExtractLocalVariableRefactoringTest +//@A.cpp + +template +class Foo { +}; + +Foo getFoo(); + +int main() { + + /*$*/getFoo()/*$$*/; + + return 0; +} + +//= + +template +class Foo { +}; + +Foo getFoo(); + +int main() { + Foo getFoo0 = getFoo(); + getFoo0; + + return 0; +} + +//!Bug 331963 Extract local variable doesn't put template type parameters Namespace +//#org.eclipse.cdt.ui.tests.refactoring.extractlocalvariable.ExtractLocalVariableRefactoringTest +//@A.cpp +namespace bar{ +template +class Foo { +}; +} + +bar::Foo getFoo(); + +int main() { + + /*$*/getFoo()/*$$*/; + + return 0; +} + +//= +namespace bar{ +template +class Foo { +}; +} + +bar::Foo getFoo(); + +int main() { + bar::Foo getFoo0 = getFoo(); + getFoo0; + + return 0; +} +