diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ExtractConstant.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ExtractConstant.rts index 5f14a0cd8ae..741b028f6a8 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ExtractConstant.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ExtractConstant.rts @@ -187,7 +187,7 @@ public: virtual ~A(); float foo(); void bar(); - static const float theAnswer = 42.0; + static const float theAnswer = 42.0f; }; #endif /*A_H_*/ @@ -206,13 +206,13 @@ A::~A() float A::foo() { - return /*$*/42.0/*$$*/; + return /*$*/42.0f/*$$*/; } void A::bar() { - float a = 42.0; - float b = 42.0; + float a = 42.0f; + float b = 42.0f; } //= @@ -237,6 +237,85 @@ void A::bar() float b = theAnswer; } +//!ExtractConstantDouble +//#org.eclipse.cdt.ui.tests.refactoring.extractconstant.ExtractConstantRefactoringTest +//@A.h +#ifndef A_H_ +#define A_H_ + +class A +{ +public: + A(); + virtual ~A(); + double foo(); + void bar(); +}; + +#endif /*A_H_*/ + + +//= +#ifndef A_H_ +#define A_H_ + +class A +{ +public: + A(); + virtual ~A(); + double foo(); + void bar(); + static const double theAnswer = 42.0; +}; + +#endif /*A_H_*/ + + +//@A.cpp +#include "A.h" + +A::A() +{ +} + +A::~A() +{ +} + +double A::foo() +{ + return /*$*/42.0/*$$*/; +} + +void A::bar() +{ + double a = 42.0; + double b = 42.0; +} + +//= +#include "A.h" + +A::A() +{ +} + +A::~A() +{ +} + +double A::foo() +{ + return theAnswer; +} + +void A::bar() +{ + double a = theAnswer; + double b = theAnswer; +} + //!ExtractConstantStaticInt //#org.eclipse.cdt.ui.tests.refactoring.extractconstant.ExtractConstantRefactoringTest //@A.h @@ -470,3 +549,71 @@ public: static const int theAnswer = 42; }; +//!ExtractConstantString +//#org.eclipse.cdt.ui.tests.refactoring.extractconstant.ExtractConstantRefactoringTest +//@.config +visibility=private +filename=A.h +//@A.h +class X { + void method() + { + char *a = /*$*/"sometext"/*$$*/; + } + + void method2() + { + const char *b = "sometext"; + } +}; + +//= +class X { + void method() + { + char *a = theAnswer; + } + + void method2() + { + const char *b = theAnswer; + } + + static const char *theAnswer = "sometext"; +}; + +//!ExtractConstantWideString +//#org.eclipse.cdt.ui.tests.refactoring.extractconstant.ExtractConstantRefactoringTest +//@.config +visibility=private +filename=A.h +//@A.h +class X { + void method() + { + wchar_t *a = /*$*/L"sometext"/*$$*/; + } + + void method2() + { + const wchar_t *b = L"sometext"; + const char *c = "sometext"; + } +}; + +//= +class X { + void method() + { + wchar_t *a = theAnswer; + } + + void method2() + { + const wchar_t *b = theAnswer; + const char *c = "sometext"; + } + + static const wchar_t *theAnswer = L"sometext"; +}; + diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoring.java index 8f8ddf15c58..4407915ce15 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractconstant/ExtractConstantRefactoring.java @@ -30,6 +30,7 @@ import org.eclipse.ltk.core.refactoring.RefactoringDescriptor; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.text.edits.TextEditGroup; +import org.eclipse.cdt.core.dom.ast.ASTNodeFactoryFactory; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; @@ -38,27 +39,24 @@ import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.IASTMacroExpansionLocation; -import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; -import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.INodeFactory; +import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNodeFactory; import org.eclipse.cdt.core.dom.rewrite.ASTRewrite; +import org.eclipse.cdt.core.dom.rewrite.DeclarationGenerator; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTDeclarator; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTEqualsInitializer; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTIdExpression; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTLiteralExpression; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTSimpleDeclSpecifier; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTSimpleDeclaration; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPMethod; @@ -360,37 +358,20 @@ public class ExtractConstantRefactoring extends CRefactoring { private IASTSimpleDeclaration getConstNodes(String newName){ - ICPPASTSimpleDeclSpecifier declSpec = new CPPASTSimpleDeclSpecifier(); + ICPPNodeFactory factory = ASTNodeFactoryFactory.getDefaultCPPNodeFactory(); + DeclarationGenerator generator = DeclarationGenerator.create(factory); + + + IType type = target.getExpressionType(); + + IASTDeclSpecifier declSpec = generator.createDeclSpecFromType(type); declSpec.setConst(true); - switch(target.getKind()){ - case IASTLiteralExpression.lk_char_constant: - declSpec.setType(IASTSimpleDeclSpecifier.t_char); - break; - case IASTLiteralExpression.lk_float_constant: - declSpec.setType(IASTSimpleDeclSpecifier.t_float); - break; - case IASTLiteralExpression.lk_integer_constant: - declSpec.setType(IASTSimpleDeclSpecifier.t_int); - break; - case IASTLiteralExpression.lk_string_literal: - declSpec.setType(IASTSimpleDeclSpecifier.t_wchar_t); - break; - case IASTLiteralExpression.lk_false: - //Like lk_true a boolean type - case IASTLiteralExpression.lk_true: - declSpec.setType(IASTSimpleDeclSpecifier.t_bool); - break; - case IASTLiteralExpression.lk_this: - break; - } + IASTDeclarator declarator = generator.createDeclaratorFromType(type, newName.toCharArray()); IASTSimpleDeclaration simple = new CPPASTSimpleDeclaration(); simple.setDeclSpecifier(declSpec); - IASTDeclarator decl = new CPPASTDeclarator(); - IASTName name = new CPPASTName(newName.toCharArray()); - decl.setName(name); IASTEqualsInitializer init = new CPPASTEqualsInitializer(); if (target.getParent() instanceof IASTUnaryExpression) { IASTUnaryExpression unary = (IASTUnaryExpression) target.getParent(); @@ -399,8 +380,8 @@ public class ExtractConstantRefactoring extends CRefactoring { CPPASTLiteralExpression expression = new CPPASTLiteralExpression(target.getKind(), target.getValue()); init.setInitializerClause(expression); } - decl.setInitializer(init); - simple.addDeclarator(decl); + declarator.setInitializer(init); + simple.addDeclarator(declarator); return simple; }