From e128056245491de047d14349f985b727bea1a0f5 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Wed, 8 Feb 2012 20:58:00 -0800 Subject: [PATCH] Fixed ExtractFunctionRefactoringTest.testOutputParameterWithMethodCall test. --- .../cdt/codan/core/cxx/CxxAstUtils.java | 9 ++++--- .../replace/WhitespaceHandlingTest.java | 5 ++-- .../cdt/core/dom/ast/IASTNodeLocation.java | 5 ++-- .../cdt/internal/core/dom/parser/ASTNode.java | 26 +++++++++---------- .../dom/parser/c/CASTArrayDeclarator.java | 2 +- .../core/dom/parser/c/CASTCaseStatement.java | 2 +- .../parser/c/CASTDesignatedInitializer.java | 2 +- .../cpp/CPPASTBinaryTypeIdExpression.java | 4 +-- .../dom/parser/cpp/CPPASTIdExpression.java | 2 +- .../cpp/CPPASTRangeBasedForStatement.java | 3 ++- .../core/dom/parser/cpp/CPPNodeFactory.java | 2 -- .../core/dom/rewrite/ASTLiteralNode.java | 2 +- .../dom/rewrite/DeclarationGeneratorImpl.java | 7 ++--- .../parser/scanner/ASTPreprocessorName.java | 4 +-- .../ExtractFunctionRefactoringTest.java | 2 +- ...pression.java => ExpressionExtractor.java} | 7 ++++- .../ExtractFunctionRefactoring.java | 21 +++++++-------- ...tionHelper.java => FunctionExtractor.java} | 10 ++++--- ...Statement.java => StatementExtractor.java} | 7 ++++- .../ui/refactoring/utils/NamespaceHelper.java | 2 +- 20 files changed, 69 insertions(+), 55 deletions(-) rename core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/{ExtractExpression.java => ExpressionExtractor.java} (98%) rename core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/{ExtractedFunctionConstructionHelper.java => FunctionExtractor.java} (96%) rename core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/{ExtractStatement.java => StatementExtractor.java} (95%) diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtils.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtils.java index afe58718799..32b4897795b 100644 --- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtils.java +++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/CxxAstUtils.java @@ -32,6 +32,7 @@ import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTNode.CopyStyle; import org.eclipse.cdt.core.dom.ast.IASTNodeSelector; import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroExpansion; @@ -170,7 +171,7 @@ public final class CxxAstUtils { simpleDeclaration.addDeclarator(declarator); return simpleDeclaration; } else { // Fallback - return a `void` declaration - IASTDeclarator declarator = factory.newDeclarator(astName.copy()); + IASTDeclarator declarator = factory.newDeclarator(astName.copy(CopyStyle.withLocations)); IASTSimpleDeclSpecifier declspec = factory.newSimpleDeclSpecifier(); declspec.setType(Kind.eInt); IASTSimpleDeclaration simpleDeclaration = factory.newSimpleDeclaration(declspec); @@ -273,9 +274,9 @@ public final class CxxAstUtils { if (child instanceof IASTParameterDeclaration) { if (nthParam == targetParameterNum) { IASTParameterDeclaration pd = (IASTParameterDeclaration) child; - IASTDeclSpecifier declspec = pd.getDeclSpecifier().copy(); - IASTDeclarator declarator = pd.getDeclarator().copy(); - setNameInNestedDeclarator(declarator, astName.copy()); + IASTDeclSpecifier declspec = pd.getDeclSpecifier().copy(CopyStyle.withLocations); + IASTDeclarator declarator = pd.getDeclarator().copy(CopyStyle.withLocations); + setNameInNestedDeclarator(declarator, astName.copy(CopyStyle.withLocations)); IASTSimpleDeclaration declaration = factory.newSimpleDeclaration(declspec); declaration.addDeclarator(declarator); return declaration; diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/rewrite/changegenerator/replace/WhitespaceHandlingTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/rewrite/changegenerator/replace/WhitespaceHandlingTest.java index c748adcc8db..52703d639ed 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/rewrite/changegenerator/replace/WhitespaceHandlingTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/rewrite/changegenerator/replace/WhitespaceHandlingTest.java @@ -13,8 +13,9 @@ package org.eclipse.cdt.core.parser.tests.rewrite.changegenerator.replace; import junit.framework.Test; -import org.eclipse.cdt.core.dom.ast.IASTStatement; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.IASTNode.CopyStyle; +import org.eclipse.cdt.core.dom.ast.IASTStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTForStatement; import org.eclipse.cdt.core.parser.tests.rewrite.changegenerator.ChangeGeneratorTest; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory; @@ -60,7 +61,7 @@ public class WhitespaceHandlingTest extends ChangeGeneratorTest { ICPPASTForStatement forStatement = (ICPPASTForStatement) statement; CPPNodeFactory nf = CPPNodeFactory.getDefault(); - ICPPASTForStatement newFor = forStatement.copy(); + ICPPASTForStatement newFor = forStatement.copy(CopyStyle.withLocations); newFor.setBody(nf.newNullStatement()); ASTModification modification = new ASTModification(ASTModification.ModificationKind.REPLACE, forStatement, newFor, null); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNodeLocation.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNodeLocation.java index 5cd0677d9dc..db6bbd5743b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNodeLocation.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNodeLocation.java @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Doug Schaefer (IBM) - Initial API and implementation + * Doug Schaefer (IBM) - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.core.dom.ast; @@ -18,6 +18,8 @@ package org.eclipse.cdt.core.dom.ast; * @noimplement This interface is not intended to be implemented by clients. */ public interface IASTNodeLocation { + /** @since 5.4 */ + public static final IASTNodeLocation[] EMPTY_ARRAY = {}; /** * This is the offset within either the file or a macro-expansion. @@ -33,5 +35,4 @@ public interface IASTNodeLocation { * Return a file location that best maps into this location. */ public IASTFileLocation asFileLocation(); - } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java index 0cf76a44f6c..5aa930983af 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java @@ -8,6 +8,7 @@ * Contributors: * John Camelon - Initial API and implementation * Markus Schorn (Wind River Systems) + * Sergey Prigoin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser; @@ -36,7 +37,6 @@ import org.eclipse.cdt.internal.core.parser.scanner.Token; */ public abstract class ASTNode implements IASTNode { protected static final ICPPFunction UNINITIALIZED_FUNCTION = new CPPFunction(null); - private static final IASTNodeLocation[] EMPTY_LOCATION_ARRAY = {}; private IASTNode parent; private ASTNodeProperty property; @@ -139,18 +139,18 @@ public abstract class ASTNode implements IASTNode { @Override public IASTNodeLocation[] getNodeLocations() { - if (locations != null) - return locations; - if (length == 0) { - locations= EMPTY_LOCATION_ARRAY; - } else { - final IASTTranslationUnit tu= getTranslationUnit(); - if (tu != null) { - ILocationResolver l= (ILocationResolver) tu.getAdapter(ILocationResolver.class); - if (l != null) { - locations= l.getLocations(getOffset(), length); - } - } + if (locations == null) { + if (length != 0) { + final IASTTranslationUnit tu= getTranslationUnit(); + if (tu != null) { + ILocationResolver l= (ILocationResolver) tu.getAdapter(ILocationResolver.class); + if (l != null) { + locations= l.getLocations(getOffset(), length); + } + } + } + if (locations == null) + locations= IASTNodeLocation.EMPTY_ARRAY; } return locations; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayDeclarator.java index 6c45aeb7425..4914bd8e863 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayDeclarator.java @@ -46,7 +46,7 @@ public class CASTArrayDeclarator extends CASTDeclarator implements IASTArrayDecl CASTArrayDeclarator copy = new CASTArrayDeclarator(); copyBaseDeclarator(copy, style); for (IASTArrayModifier modifier : getArrayModifiers()) - copy.addArrayModifier(modifier == null ? null : modifier.copy()); + copy.addArrayModifier(modifier == null ? null : modifier.copy(style)); if (style == CopyStyle.withLocations) { copy.setCopyLocation(this); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTCaseStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTCaseStatement.java index b22164b200c..c18db597193 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTCaseStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTCaseStatement.java @@ -40,7 +40,7 @@ public class CASTCaseStatement extends ASTNode implements IASTCaseStatement, IAS @Override public CASTCaseStatement copy(CopyStyle style) { - CASTCaseStatement copy = new CASTCaseStatement(expression == null ? null : expression.copy()); + CASTCaseStatement copy = new CASTCaseStatement(expression == null ? null : expression.copy(style)); copy.setOffsetAndLength(this); if (style == CopyStyle.withLocations) { copy.setCopyLocation(this); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDesignatedInitializer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDesignatedInitializer.java index 98426ffa7e6..7fa93f34f88 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDesignatedInitializer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDesignatedInitializer.java @@ -100,7 +100,7 @@ public class CASTDesignatedInitializer extends ASTNode implements ICASTDesignate return (IASTInitializer) rhs; } if (rhs instanceof IASTExpression) { - CASTEqualsInitializer init = new CASTEqualsInitializer(((IASTExpression)rhs).copy()); + CASTEqualsInitializer init = new CASTEqualsInitializer(((IASTExpression) rhs).copy()); init.setParent(this); init.setPropertyInParent(OPERAND); return init; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBinaryTypeIdExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBinaryTypeIdExpression.java index ba3230b8fbd..dbc5686e5e3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBinaryTypeIdExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBinaryTypeIdExpression.java @@ -44,8 +44,8 @@ public class CPPASTBinaryTypeIdExpression extends ASTNode implements IASTBinaryT @Override public CPPASTBinaryTypeIdExpression copy(CopyStyle style) { CPPASTBinaryTypeIdExpression copy = new CPPASTBinaryTypeIdExpression(fOperator, - fOperand1 == null ? null : fOperand1.copy(), - fOperand2 == null ? null : fOperand2.copy()); + fOperand1 == null ? null : fOperand1.copy(style), + fOperand2 == null ? null : fOperand2.copy(style)); copy.setOffsetAndLength(this); if (style == CopyStyle.withLocations) { copy.setCopyLocation(this); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIdExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIdExpression.java index 0508e3df4a7..9cec4d5e1c3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIdExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIdExpression.java @@ -69,7 +69,7 @@ public class CPPASTIdExpression extends ASTNode implements IASTIdExpression, ICP @Override public CPPASTIdExpression copy(CopyStyle style) { - CPPASTIdExpression copy = new CPPASTIdExpression(name == null ? null : name.copy()); + CPPASTIdExpression copy = new CPPASTIdExpression(name == null ? null : name.copy(style)); copy.setOffsetAndLength(this); if (style == CopyStyle.withLocations) { copy.setCopyLocation(this); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTRangeBasedForStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTRangeBasedForStatement.java index f7e353d70b2..0a4dc3aacd4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTRangeBasedForStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTRangeBasedForStatement.java @@ -152,7 +152,8 @@ public class CPPASTRangeBasedForStatement extends ASTNode implements ICPPASTRang CPPASTName name = new CPPASTName(CPPVisitor.BEGIN); name.setOffset(position.getOffset()); CPPASTIdExpression fname = new CPPASTIdExpression(name); - IASTExpression expr= new CPPASTFunctionCallExpression(fname, new IASTInitializerClause[] {forInit.copy()}); + IASTExpression expr= new CPPASTFunctionCallExpression(fname, + new IASTInitializerClause[] { forInit.copy() }); expr.setParent(this); expr.setPropertyInParent(ICPPASTRangeBasedForStatement.INITIALIZER); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java index 5e987c39a55..e7a8561d509 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java @@ -113,12 +113,10 @@ import org.eclipse.cdt.core.parser.IScanner; import org.eclipse.cdt.internal.core.dom.parser.NodeFactory; import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor; - /** * Abstract factory implementation that creates C++ AST nodes. */ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { - private static final CPPNodeFactory DEFAULT_INSTANCE = new CPPNodeFactory(); public static CPPNodeFactory getDefault() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/ASTLiteralNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/ASTLiteralNode.java index 642cdb1d414..f4e3bcbb436 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/ASTLiteralNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/ASTLiteralNode.java @@ -61,7 +61,7 @@ public class ASTLiteralNode implements IASTNode { @Override public IASTNodeLocation[] getNodeLocations() { - return null; + return IASTNodeLocation.EMPTY_ARRAY; } @Override 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 4718e1e11ac..49d25e0451a 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 @@ -23,6 +23,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTNode.CopyStyle; import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.IASTPointer; import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; @@ -164,7 +165,7 @@ public class DeclarationGeneratorImpl extends DeclarationGenerator { arrayType = (IArrayType) type; IASTExpression arraySizeExpression = arrayType.getArraySizeExpression(); arrayDeclarator.addArrayModifier(factory.newArrayModifier(arraySizeExpression == null - ? null : arraySizeExpression.copy())); + ? null : arraySizeExpression.copy(CopyStyle.withLocations))); type = arrayType.getType(); } returnedDeclarator = arrayDeclarator; @@ -291,7 +292,7 @@ public class DeclarationGeneratorImpl extends DeclarationGenerator { int nbQualifiedNames = fullQualifiedName.getNames().length; if (nbQualifiedNames > 1) { for (int i = 0; i < nbQualifiedNames - 1; i++) { - newQualifiedName.addName(fullQualifiedName.getNames()[i].copy()); + newQualifiedName.addName(fullQualifiedName.getNames()[i].copy(CopyStyle.withLocations)); } } newQualifiedName.addName(tempId); @@ -309,7 +310,7 @@ public class DeclarationGeneratorImpl extends DeclarationGenerator { private ICPPASTTemplateId getTemplateId(ICPPTemplateInstance type, IASTName templateName) { ICPPNodeFactory cppFactory = (ICPPNodeFactory) factory; - ICPPASTTemplateId tempId = cppFactory.newTemplateId(templateName.copy()); + ICPPASTTemplateId tempId = cppFactory.newTemplateId(templateName.copy(CopyStyle.withLocations)); for (ICPPTemplateArgument arg : type.getTemplateArguments()) { IASTDeclSpecifier argDeclSpec = createDeclSpecFromType(arg.isTypeValue() ? arg.getTypeValue() : arg.getTypeOfNonTypeValue()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorName.java index 704cac07265..79b03c72868 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorName.java @@ -164,9 +164,9 @@ class ASTBuiltinName extends ASTPreprocessorDefinition { @Override public IASTNodeLocation[] getNodeLocations() { if (fFileLocation == null) { - return new IASTNodeLocation[0]; + return IASTNodeLocation.EMPTY_ARRAY; } - return new IASTNodeLocation[]{fFileLocation}; + return new IASTNodeLocation[] { fFileLocation }; } @Override diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/extractfunction/ExtractFunctionRefactoringTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/extractfunction/ExtractFunctionRefactoringTest.java index d03f38e6e06..0654b3fc02c 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/extractfunction/ExtractFunctionRefactoringTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/extractfunction/ExtractFunctionRefactoringTest.java @@ -880,7 +880,7 @@ public class ExtractFunctionRefactoringTest extends RefactoringTestBase { // A a, b; // return extracted(b, &a) + a.const_method(); //} - public void _testOutputParameterWithMethodCall() throws Exception { + public void testOutputParameterWithMethodCall() throws Exception { getPreferenceStore().setValue(PreferenceConstants.FUNCTION_PASS_OUTPUT_PARAMETERS_BY_POINTER, true); assertRefactoringSuccess(); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractExpression.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExpressionExtractor.java similarity index 98% rename from core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractExpression.java rename to core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExpressionExtractor.java index 9409b833d72..3be0b99700a 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractExpression.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExpressionExtractor.java @@ -57,7 +57,12 @@ import org.eclipse.cdt.internal.ui.refactoring.NameInformation; * * @author Mirko Stocker */ -public class ExtractExpression extends ExtractedFunctionConstructionHelper { +public class ExpressionExtractor extends FunctionExtractor { + @Override + public boolean canChooseReturnValue() { + return false; + } + @Override public void constructMethodBody(IASTCompoundStatement compound, List nodes, List parameters, ASTRewrite rewrite, TextEditGroup group) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoring.java index cb72987ec55..50b6dca145e 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractFunctionRefactoring.java @@ -139,7 +139,7 @@ public class ExtractFunctionRefactoring extends CRefactoring { HashMap nameTrail; - private ExtractedFunctionConstructionHelper functionConstructionHelper; + private FunctionExtractor extractor; private INodeFactory nodeFactory; DefaultCodeFormatterOptions formattingOptions; @@ -204,7 +204,9 @@ public class ExtractFunctionRefactoring extends CRefactoring { if (initStatus.hasFatalError()) return initStatus; - if (info.getMandatoryReturnVariable() == null) { + extractor = FunctionExtractor.createFor(container.getNodesToWrite()); + + if (extractor.canChooseReturnValue() && info.getMandatoryReturnVariable() == null) { chooseReturnVariable(); } @@ -214,9 +216,6 @@ public class ExtractFunctionRefactoring extends CRefactoring { PreferenceConstants.getPreferenceScopes(project.getProject())); info.sortParameters(outFirst); - functionConstructionHelper = - ExtractedFunctionConstructionHelper.createFor(container.getNodesToWrite()); - boolean isExtractExpression = container.getNodesToWrite().get(0) instanceof IASTExpression; info.setExtractExpression(isExtractExpression); @@ -639,7 +638,7 @@ public class ExtractFunctionRefactoring extends CRefactoring { func.setDeclSpecifier(returnType); IASTStandardFunctionDeclarator createdFunctionDeclarator = - functionConstructionHelper.createFunctionDeclarator(qname, + extractor.createFunctionDeclarator(qname, info.getDeclarator(), info.getReturnVariable(), container.getNodesToWrite(), info.getParameters(), nodeFactory); func.setDeclarator(createdFunctionDeclarator); @@ -664,7 +663,7 @@ public class ExtractFunctionRefactoring extends CRefactoring { subRewrite = rewrite.insertBefore(parent, insertPoint, func, group); } - functionConstructionHelper.constructMethodBody(compound, container.getNodesToWrite(), + extractor.constructMethodBody(compound, container.getNodesToWrite(), info.getParameters(), subRewrite, group); // Set return value @@ -689,7 +688,7 @@ public class ExtractFunctionRefactoring extends CRefactoring { private IASTDeclSpecifier getReturnType() { IASTNode firstNodeToWrite = container.getNodesToWrite().get(0); NameInformation returnVariable = info.getReturnVariable(); - return functionConstructionHelper.determineReturnType(firstNodeToWrite, + return extractor.determineReturnType(firstNodeToWrite, returnVariable); } @@ -813,13 +812,13 @@ public class ExtractFunctionRefactoring extends CRefactoring { private IASTNode getReturnAssignment(IASTExpressionStatement stmt, IASTExpression callExpression) { IASTNode node = container.getNodesToWrite().get(0); - return functionConstructionHelper.createReturnAssignment(node, stmt, callExpression); + return extractor.createReturnAssignment(node, stmt, callExpression); } private IASTSimpleDeclaration getDeclaration(IASTName name) { IASTSimpleDeclaration simpleDecl = new CPPASTSimpleDeclaration(); IASTStandardFunctionDeclarator declarator = - functionConstructionHelper.createFunctionDeclarator(name, + extractor.createFunctionDeclarator(name, info.getDeclarator(), info.getReturnVariable(), container.getNodesToWrite(), info.getParameters(), nodeFactory); simpleDecl.addDeclarator(declarator); @@ -834,7 +833,7 @@ public class ExtractFunctionRefactoring extends CRefactoring { } simpleDecl.setParent(ast); IASTStandardFunctionDeclarator declarator = - functionConstructionHelper.createFunctionDeclarator(name, + extractor.createFunctionDeclarator(name, info.getDeclarator(), info.getReturnVariable(), container.getNodesToWrite(), info.getParameters(), nodeFactory); simpleDecl.addDeclarator(declarator); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractedFunctionConstructionHelper.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/FunctionExtractor.java similarity index 96% rename from core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractedFunctionConstructionHelper.java rename to core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/FunctionExtractor.java index 0ba32f0e614..37ca4c431c8 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractedFunctionConstructionHelper.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/FunctionExtractor.java @@ -47,15 +47,17 @@ import org.eclipse.cdt.internal.ui.refactoring.NameInformation.Indirection; /** * @author Mirko Stocker */ -public abstract class ExtractedFunctionConstructionHelper { +public abstract class FunctionExtractor { - public static ExtractedFunctionConstructionHelper createFor(List list) { + public static FunctionExtractor createFor(List list) { if (list.get(0) instanceof IASTExpression) { - return new ExtractExpression(); + return new ExpressionExtractor(); } - return new ExtractStatement(); + return new StatementExtractor(); } + public abstract boolean canChooseReturnValue(); + public abstract void constructMethodBody(IASTCompoundStatement compound, List nodes, List parameters, ASTRewrite rewrite, TextEditGroup group); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractStatement.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/StatementExtractor.java similarity index 95% rename from core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractStatement.java rename to core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/StatementExtractor.java index b9af77c0177..b6da4787615 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/ExtractStatement.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/extractfunction/StatementExtractor.java @@ -36,7 +36,12 @@ import org.eclipse.cdt.internal.ui.refactoring.utils.ASTHelper; /** * @author Mirko Stocker */ -public class ExtractStatement extends ExtractedFunctionConstructionHelper { +public class StatementExtractor extends FunctionExtractor { + @Override + public boolean canChooseReturnValue() { + return true; + } + @Override public void constructMethodBody(IASTCompoundStatement compound, List nodes, List parameters, ASTRewrite rewrite, TextEditGroup group) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/NamespaceHelper.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/NamespaceHelper.java index f8ce66ae422..ef1ae37ef84 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/NamespaceHelper.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/utils/NamespaceHelper.java @@ -64,7 +64,7 @@ public class NamespaceHelper { @Override public int visit(ICPPASTNamespaceDefinition namespace) { if (checkFileNameAndLocation(translationUnit.getLocation(), offset, namespace)) { - qualifiedName.addName((namespace).getName().copy()); + qualifiedName.addName((namespace).getName().copy(CopyStyle.withLocations)); } return super.visit(namespace);