diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriter.java index dc19453bfbc..83dd18fdf43 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriter.java @@ -12,6 +12,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.rewrite.astwriter; +import java.util.List; + import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; @@ -144,6 +146,24 @@ public class ASTWriter { * @return true if the blank line between the nodes is needed. */ public static boolean requireBlankLineInBetween(IASTNode node1, IASTNode node2) { + if (node1 instanceof ContainerNode) { + List nodes = ((ContainerNode) node1).getNodes(); + if (!nodes.isEmpty()) { + node1 = nodes.get(nodes.size() - 1); + } + } + if (node2 instanceof ContainerNode) { + List nodes = ((ContainerNode) node2).getNodes(); + if (!nodes.isEmpty()) { + node2 = nodes.get(0); + } + } + while (node1 instanceof ICPPASTTemplateDeclaration) { + node1 = ((ICPPASTTemplateDeclaration) node1).getDeclaration(); + } + while (node2 instanceof ICPPASTTemplateDeclaration) { + node2 = ((ICPPASTTemplateDeclaration) node2).getDeclaration(); + } if (node1 instanceof ICPPASTVisibilityLabel && node2 instanceof ICPPASTVisibilityLabel) { return true; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriterVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriterVisitor.java index 4ff5321d55a..cd1e5c363d9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriterVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriterVisitor.java @@ -132,6 +132,7 @@ public class ASTWriterVisitor extends ASTVisitor { } public void visit(ASTLiteralNode lit) { + insertBlankLineIfNeeded(lit); scribe.print(lit.getRawSignature()); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGenerator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGenerator.java index cb3d3f9df9f..db3ed821391 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGenerator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGenerator.java @@ -75,7 +75,6 @@ import org.eclipse.jface.text.TextUtilities; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.CompositeChange; import org.eclipse.ltk.core.refactoring.TextFileChange; -import org.eclipse.text.edits.InsertEdit; import org.eclipse.text.edits.MalformedTreeException; import org.eclipse.text.edits.MultiTextEdit; import org.eclipse.text.edits.ReplaceEdit; @@ -559,26 +558,47 @@ public class ChangeGenerator extends ASTVisitor { if (modifications.isEmpty()) return; - ASTWriter synthWriter = new ASTWriter(); - synthWriter.setModificationStore(modificationStore); + IASTNode prevNode = null; + IASTDeclaration[] declarations = tu.getDeclarations(); + if (declarations.length != 0) { + prevNode = declarations[declarations.length - 1]; + } else { + IASTPreprocessorStatement[] preprocessorStatements = tu.getAllPreprocessorStatements(); + if (preprocessorStatements.length != 0) { + prevNode = preprocessorStatements[preprocessorStatements.length - 1]; + } + } + int offset = prevNode != null ? getEndOffsetIncludingComments(prevNode) : 0; + String source = tu.getRawSignature(); + int endOffset = skipTrailingBlankLines(source, offset); - IASTFileLocation targetLocation = tu.getFileLocation(); + ChangeGeneratorWriterVisitor writer = + new ChangeGeneratorWriterVisitor(modificationStore, commentMap); + IASTNode newNode = null; + for (ASTModification modification : modifications) { + boolean first = newNode == null; + newNode = modification.getNewNode(); + if (first) { + if (prevNode != null) { + writer.newLine(); + if (ASTWriter.requireBlankLineInBetween(prevNode, newNode)) { + writer.newLine(); + } + } + } + newNode.accept(writer); + } + if (prevNode != null) { + IASTNode nextNode = getNextSiblingOrPreprocessorNode(prevNode); + if (nextNode != null && ASTWriter.requireBlankLineInBetween(newNode, nextNode)) { + writer.newLine(); + } + } + + String code = writer.toString(); IFile file = FileHelper.getFileFromNode(tu); MultiTextEdit parentEdit = getEdit(tu, file); - - IASTDeclaration[] declarations = tu.getDeclarations(); - - for (ASTModification modification : modifications) { - String code = synthWriter.write(modification.getNewNode(), commentMap); - - if (declarations.length > 0) { - IASTDeclaration lastDecl = declarations[declarations.length - 1]; - targetLocation = lastDecl.getFileLocation(); - } - String lineDelimiter = FileHelper.determineLineDelimiter(tu.getRawSignature()); - parentEdit.addChild(new InsertEdit(endOffset(targetLocation), - lineDelimiter + lineDelimiter + code)); - } + parentEdit.addChild(new ReplaceEdit(offset, endOffset - offset, code)); } /** diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/GenerateGettersAndSetters.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/GenerateGettersAndSetters.rts index faac2f0f1cb..9d55f345d59 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/GenerateGettersAndSetters.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/GenerateGettersAndSetters.rts @@ -1173,7 +1173,6 @@ private: }; #endif /* A_H_ */ - //= #ifndef A_H_ #define A_H_ @@ -1195,9 +1194,7 @@ inline void Person::setId(int id) { this->id = id; } - #endif /* A_H_ */ - //!No Methods Separate Definition //#org.eclipse.cdt.ui.tests.refactoring.gettersandsetters.GenerateGettersAndSettersTest //@.config @@ -1248,7 +1245,6 @@ inline void test::setI(int i) { this->i = i; } - #endif /* TEST_H_ */ //!Bug 323780 "Generate Getters and Setters..." crashes //#org.eclipse.cdt.ui.tests.refactoring.gettersandsetters.GenerateGettersAndSettersTest @@ -1349,7 +1345,6 @@ public: //@Test.cxx //= - int Test::getTestField() const { return testField; } @@ -1390,7 +1385,6 @@ public: //@component_b/implementation/Test.cpp //= - int Test::getTestField() const { return testField; } diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ImplementMethod.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ImplementMethod.rts index df5711bf73b..43703879fe8 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ImplementMethod.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ImplementMethod.rts @@ -17,8 +17,6 @@ public: inline bool X::a(int int1) const { } - - //!Param const and reference and pointer two params //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config @@ -38,8 +36,6 @@ public: inline bool X::xy(int int1, int i) const { } - - //!Test if TemplateMethod stays in header //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config @@ -62,15 +58,13 @@ public: template inline void A::test() { } - - //@A.cpp #include "A.h" //= #include "A.h" -//!class template member functions +//!Class template member functions //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config filename=A.h @@ -102,9 +96,7 @@ A::A() { template inline void A::test() { } - - -//!member class +//!Member class //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config filename=A.h @@ -144,8 +136,6 @@ public: inline void A::test() { } - - //!Method declared in otherwise empty class //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config @@ -165,7 +155,6 @@ public: //@A.cpp //= - void A::test() { } //!Implement in existing namespace @@ -205,7 +194,7 @@ void ClassInNamespace::test2() { } } -//!virtual method in the middle of con/destructor, without parameters and void return value +//!Virtual method in the middle of con/destructor, without parameters and void return value //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config filename=A.h @@ -287,8 +276,6 @@ A::A() { void A::foo() { } - - //!Method at beginning, without parameters, void return value and const //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config @@ -348,8 +335,6 @@ A::A() { int A::foo() { } - - //!Method with two int parameters //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config @@ -379,8 +364,6 @@ A::A() { int A::foo(int param1, int param2) { } - - //!Method defined in header //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config @@ -408,8 +391,6 @@ A::A() { inline void A::test() { } - - //!Implement a function at end of source file //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config @@ -426,7 +407,6 @@ void function_with_impl() { void function() { } - //!Implement with namespace //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config @@ -453,7 +433,6 @@ void Namespace::ClassInNamespace::other_test() { void Namespace::ClassInNamespace::test() { } - //!Implement function within namespace //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config @@ -524,7 +503,7 @@ int test2() { } } -//!class template member functions with multiple templates +//!Class template member functions with multiple templates //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config filename=A.h @@ -538,7 +517,7 @@ public: }; template -A::A() { +A::A() { } //= @@ -550,15 +529,13 @@ public: }; template -A::A() { +A::A() { } template inline void A::test() { } - - -//!with default parameters +//!With default parameters //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config filename=A.h @@ -578,7 +555,7 @@ public: void Class::test(int param1, int param2, int param3) { } -//!static method +//!Static method //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config filename=A.h @@ -672,7 +649,6 @@ class TestClass { inline void nspace::TestClass::testMethod() { } - #endif /* TESTCLASS_H_ */ //!Bug 290110 Source-> Implement Method @@ -736,8 +712,6 @@ A::~A() { void n1::n2::A::B::testmethod2() { } - - //!Bug 337040 - Insert definition in empty implementation file (.cxx) //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config @@ -753,7 +727,6 @@ public: //@A.cxx //= - void TestClass::foo() { } //!Bug 355006 - NPE implementing template function @@ -773,7 +746,6 @@ void func(T&); template inline void func(T&) { } - //!Bug 363111 - Remove explicit in constructor definition //#org.eclipse.cdt.ui.tests.refactoring.implementmethod.ImplementMethodRefactoringTest //@.config @@ -789,6 +761,5 @@ public: //@A.cpp //= - TestClass::TestClass() { } \ No newline at end of file diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleCommentsClassToHeader.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleCommentsClassToHeader.rts index 30546140280..f84ae165492 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleCommentsClassToHeader.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleCommentsClassToHeader.rts @@ -18,7 +18,6 @@ inline void A::member() { // return comment return; } - //!ClassToHeaderTopCommentOrder //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -41,7 +40,6 @@ class A { inline void A::member() { return; } - //!ClassToHeaderCatchComment //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -68,7 +66,6 @@ try { catch (int i) { // catch comment } - //!ClassToHeaderTopComment //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -89,7 +86,6 @@ class A { inline void A::member() { return; } - //!ClassToHeaderTemplateTopComment //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -114,7 +110,6 @@ template inline T A::member() { return T(); } - //!ClassToHeaderTrailingComment //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -133,7 +128,6 @@ class A { inline void A::member() { return; } // Trailing comment - //!ClassToHeaderTrailingCommentWithTryBlock //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleCommentsImplToHeader.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleCommentsImplToHeader.rts index 628d3debd6b..64a295bb055 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleCommentsImplToHeader.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleCommentsImplToHeader.rts @@ -93,7 +93,6 @@ void /*$*/member/*$$*/() { //@A.h //= - void member() { // body comment return; @@ -115,7 +114,6 @@ void /*$*/member/*$$*/() { //@A.h //= - // Top comment void member() { // body comment diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleCtorDtorRefactoring.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleCtorDtorRefactoring.rts index ffef1312d81..f4832deaec6 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleCtorDtorRefactoring.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleCtorDtorRefactoring.rts @@ -34,7 +34,6 @@ public: inline A::A(int x, int y) : a(x), b(y) { } - //!TestConstructorToggleInHeaderToImplementation //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -85,7 +84,6 @@ int main() { A::A(int x, int y) : a(x), b(y) { } - //!TestConstructorToggleInImplementationToClass //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -154,7 +152,6 @@ public: inline A::~A() { } - //!TestDestructorToggleInHeaderToImplementation //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -199,7 +196,6 @@ int main() { A::~A() { } - //!TestDestructorToggleInImplementationToClass //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleDefaultParameterRefactoring.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleDefaultParameterRefactoring.rts index 7a1eeb54057..8c7d3b7c23a 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleDefaultParameterRefactoring.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleDefaultParameterRefactoring.rts @@ -20,7 +20,6 @@ class A { inline void A::member(int a, int b) { return; } - //!TestDefaultParameterInitializerInHeaderToImplementation //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -57,7 +56,6 @@ int main() { void A::member(int a, int b) { return; } - //!TestDefaultParameterInitializerInImplementationToClass //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleFreeFunction.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleFreeFunction.rts index 7000fe3ac22..d17f1fb9365 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleFreeFunction.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleFreeFunction.rts @@ -54,7 +54,6 @@ int main() { int freeFunction(int* a, int& b) { return 42; } - //!TestFreeFunctionToggleFromImplementationToHeaderWithDeclaration //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -172,7 +171,6 @@ try { } catch (std::exception& e) { } - //!TestFreeFunction //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -260,4 +258,3 @@ void freefunction() { } } - diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleNamespaceRefactoring.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleNamespaceRefactoring.rts index e002c3cffde..ec4baa9d2ce 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleNamespaceRefactoring.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleNamespaceRefactoring.rts @@ -1,4 +1,4 @@ -//!TestSimpleNamespaceInClassToInHeader +//!Test simple namespace in class to in header //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -30,7 +30,7 @@ inline void A::foo() { } } -//!TestSimpleNamespaceInHeaderToImplementationWithinNSDefinition +//!Test simple namespace in header to implementation within namespace definition //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -80,8 +80,7 @@ void A::foo() { } } - -//!TestSimpleNamespaceInHeaderToImplementationWithNSDefinitionInImpl +//!Test simple namespace in header to implementation with namespace definition in implementation //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -134,7 +133,7 @@ void A::foo() { } } -//!TestSimpleNamespaceInHeaderToImplementationWithNamespaceQualifiedName +//!Test simple namespace in header to implementation with namespace qualified name //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -184,7 +183,6 @@ void A::foo() { } } - //!TestSimpleNamespaceFromImplementationToInHeader //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleNestedRefactoring.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleNestedRefactoring.rts index 3e53d81da6d..c2e2372d430 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleNestedRefactoring.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleNestedRefactoring.rts @@ -24,7 +24,6 @@ class A { inline void A::B::member(int a, int b) { return; } - //!TestNestedClassInHeaderToImplementation //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -65,7 +64,6 @@ int main() { void A::B::member(int a, int b) { return; } - //!TestNestedClassInImplementationToClass //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleSelection.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleSelection.rts index 8551a6ca67e..0518f02bad3 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleSelection.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleSelection.rts @@ -1,4 +1,4 @@ -//!TestZeroLengthSelection +//!Test zero length selection //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -16,8 +16,7 @@ class A { inline void A::member() { return; } - -//!TestSubstringSelection +//!Test substring selection //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -35,8 +34,7 @@ class A { inline void A::member() { return; } - -//!TestBodySelection +//!Test body selection //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -54,8 +52,7 @@ class A { inline void A::member() { return; } - -//!TestBodySelectionWithConfusingName +//!Test body selection with confusing name //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -75,8 +72,7 @@ inline void A::member() { int abcd = 42; return; } - -//!TestLeftBorderSelection +//!Test left border selection //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -94,8 +90,7 @@ class A { inline void A::member() { return; } - -//!TestRightBorderSelection +//!Test right border selection //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -113,8 +108,7 @@ class A { inline void A::member() { return; } - -//!TestOverlappingSelection +//!Test overlapping selection //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -132,4 +126,3 @@ class A { inline void A::member() { return; } - diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleSimpleFunctionRefactoring.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleSimpleFunctionRefactoring.rts index aaec086264d..b15bc2123c5 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleSimpleFunctionRefactoring.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleSimpleFunctionRefactoring.rts @@ -1,4 +1,4 @@ -//!TestSimpleFunctionInClassToInHeader +//!Test simple function in class to in header //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -28,8 +28,7 @@ private: inline int A::function() { return 0; } - -//!TestSimpleFunctionInHeaderToImplementation +//!Test simple function in header to implementation //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -73,7 +72,6 @@ int main() { int A::function() { return 0; } - //!TestSimpleFunctionInImplementationToInClass //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleTemplateRefactoring.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleTemplateRefactoring.rts index af12e2930d3..b3249535f8d 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleTemplateRefactoring.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleTemplateRefactoring.rts @@ -1,4 +1,4 @@ -//!TestTemplateFunctionInClassToInHeader +//!Test template function in class to in header //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -27,8 +27,7 @@ template inline T A::B::member() { return T(); } - -//!TestTemplateFunctionInHeaderToInClass +//!Test template function in header to in class //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -57,7 +56,7 @@ class A { } }; }; -//!TestTemplateFunctionInHeaderToInClassWithTemplateSelected +//!Test template function in header to in class with template selected //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -78,8 +77,7 @@ template inline T A::foo() { return T(); } - -//!TestComplexTemplateFunctionFromInClassToInheader +//!Test complex template function from in class to in header //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h @@ -105,8 +103,7 @@ template inline void A::foo(const U& u, const V& v) { return; } - -//!TestComplexTemplateFunctionFromInHeaderToInClass +//!Test complex template function from in header to in class //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config filename=A.h diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleTryCatchRefactoring.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleTryCatchRefactoring.rts index d5777071018..1aa25624edb 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleTryCatchRefactoring.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleTryCatchRefactoring.rts @@ -30,7 +30,6 @@ try { catch (std::exception& e1) { return; } - //!TestTryCatchFromInHeaderToImplementation //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -77,7 +76,6 @@ try { catch (std::exception& e1) { return; } - //!TestTryCatchFromInImplementationToClass //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -160,7 +158,6 @@ catch (std::exception& e1) { catch (std::exception& e2) { return; } - //!TestMultipleTryCatchFromInHeaderToImplementation //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -213,7 +210,6 @@ catch (std::exception& e1) { catch (std::exception& e2) { return; } - //!TestMultipleTryCatchFromInImplementationToClass //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config @@ -263,4 +259,4 @@ class A { catch (std::exception& e2) { return; } -}; \ No newline at end of file +}; diff --git a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleVirtualFunction.rts b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleVirtualFunction.rts index a0af0150b1b..5be3a7a7612 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleVirtualFunction.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/ToggleVirtualFunction.rts @@ -18,7 +18,6 @@ class A { inline int A::foo() { return 0; } - //!TestVirtualSpecifierFromInHeaderToImplementation //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //%CPP @@ -52,7 +51,6 @@ int main() { int A::foo() { return 0; } - //!TestVirtualSpecifierFromImplementationToHeader //#org.eclipse.cdt.ui.tests.refactoring.togglefunction.ToggleRefactoringTest //@.config diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFileCreator.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFileCreator.java index 36d091d4cde..0e8480badae 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFileCreator.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFileCreator.java @@ -6,8 +6,8 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * - * Contributors: - * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Contributors: + * Martin Schwab & Thomas Kallenberg - initial API and implementation ******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.togglefunction; @@ -29,7 +29,6 @@ import org.eclipse.cdt.internal.ui.refactoring.Container; import org.eclipse.cdt.internal.ui.refactoring.CreateFileChange; public class ToggleFileCreator { - private static final String EMPTY_STRING = ""; //$NON-NLS-1$ private static final String H = ".h"; //$NON-NLS-1$ private ToggleRefactoringContext context; @@ -71,7 +70,7 @@ public class ToggleFileCreator { CreateFileChange change; String filename = getNewFileName(); try { - change = new CreateFileChange(filename, new Path(getPath()+filename), + change = new CreateFileChange(filename, new Path(getPath() + filename), EMPTY_STRING, context.getSelectionFile().getCharset()); change.perform(new NullProgressMonitor()); } catch (CoreException e) { @@ -85,6 +84,7 @@ public class ToggleFileCreator { } final Container answer = new Container(); Runnable r = new Runnable() { + @Override public void run() { Shell shell = CUIPlugin.getDefault().getWorkbench().getWorkbenchWindows()[0].getShell(); String functionname; @@ -103,7 +103,7 @@ public class ToggleFileCreator { } public String getIncludeStatement() { - return "#include \"" + ToggleNodeHelper.getFilenameWithoutExtension(getNewFileName()) + ".h\""; //$NON-NLS-1$//$NON-NLS-2$ + return "#include \"" + ToggleNodeHelper.getFilenameWithoutExtension(getNewFileName()) + ".h\"\n"; //$NON-NLS-1$//$NON-NLS-2$ } private String getNewFileName() { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromInHeaderToImplementationStrategy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromInHeaderToImplementationStrategy.java index 36eba0e5d17..701396beaaa 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromInHeaderToImplementationStrategy.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/togglefunction/ToggleFromInHeaderToImplementationStrategy.java @@ -7,7 +7,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Martin Schwab & Thomas Kallenberg - initial API and implementation + * Martin Schwab & Thomas Kallenberg - initial API and implementation ******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.togglefunction; @@ -57,7 +57,6 @@ import org.eclipse.cdt.internal.ui.refactoring.Container; import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector; public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefactoringStrategy { - private IASTTranslationUnit impl_unit; private ToggleRefactoringContext context; private TextEditGroup infoText; @@ -68,16 +67,16 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact this.context = context; } + @Override public void run(ModificationCollector collector) { - if(!newFileCheck()) { + if (!newFileCheck()) { return; } // newFileCheck(); ICPPASTFunctionDefinition newDefinition = getNewDefinition(); if (context.getDeclaration() != null) { removeDefinitionFromHeader(collector); - } - else { + } else { replaceDefinitionWithDeclaration(collector); } @@ -97,8 +96,7 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact implRewrite = implRewrite.insertBefore(impl_unit.getTranslationUnit(), null, insertionParent, infoText); } - } - else { + } else { insertionParent = impl_unit.getTranslationUnit(); } @@ -115,25 +113,6 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact private void copyCommentsToNewFile(ICPPASTFunctionDefinition newDefinition, final ASTRewrite newRewriter, final ASTRewrite oldRewriter) { newDefinition.accept(new ASTVisitor(true) { - - private void copy(IASTNode node) { - copyComments(node, newRewriter, oldRewriter, CommentPosition.leading); - copyComments(node, newRewriter, oldRewriter, CommentPosition.trailing); - copyComments(node, newRewriter, oldRewriter, CommentPosition.freestanding); - } - - private void copyComments(IASTNode node, ASTRewrite newRewriter, ASTRewrite oldRewriter, - CommentPosition pos) { - if (node.getNodeLocations().length > 0 && node.getNodeLocations()[0] instanceof IASTCopyLocation) { - IASTCopyLocation copyLoc = (IASTCopyLocation) node.getNodeLocations()[0]; - List comments = oldRewriter.getComments(copyLoc.getOriginalNode(), pos); - for (IASTComment comment : comments) { - newRewriter.addComment(node, comment, pos); - } - } - - } - @Override public int visit(IASTName name) { copy(name); @@ -241,20 +220,36 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact copy(designator); return super.visit(designator); } + + private void copy(IASTNode node) { + copyComments(node, newRewriter, oldRewriter, CommentPosition.leading); + copyComments(node, newRewriter, oldRewriter, CommentPosition.trailing); + copyComments(node, newRewriter, oldRewriter, CommentPosition.freestanding); + } + + private void copyComments(IASTNode node, ASTRewrite newRewriter, ASTRewrite oldRewriter, + CommentPosition pos) { + if (node.getNodeLocations().length > 0 && node.getNodeLocations()[0] instanceof IASTCopyLocation) { + IASTCopyLocation copyLoc = (IASTCopyLocation) node.getNodeLocations()[0]; + List comments = oldRewriter.getComments(copyLoc.getOriginalNode(), pos); + for (IASTComment comment : comments) { + newRewriter.addComment(node, comment, pos); + } + } + } }); - } private boolean newFileCheck() { impl_unit = context.getTUForSiblingFile(); - if (this.impl_unit == null) { + if (impl_unit == null) { ToggleFileCreator filecreator = new ToggleFileCreator(context, ".cpp"); //$NON-NLS-1$ if (filecreator.askUserForFileCreation(context)) { filecreator.createNewFile(); impl_unit = filecreator.loadTranslationUnit(); includenode = new ASTLiteralNode(filecreator.getIncludeStatement()); return true; - }else { + } else { return false; } } @@ -269,8 +264,7 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact return ToggleNodeHelper.getAncestorOfType(toquery, ICPPASTNamespaceDefinition.class); } - private IASTNode findInsertionPoint(IASTNode insertionParent, - IASTTranslationUnit unit) { + private IASTNode findInsertionPoint(IASTNode insertionParent, IASTTranslationUnit unit) { IASTFunctionDeclarator declarator = context.getDeclaration(); if (unit == null) { unit = context.getDefinitionUnit(); @@ -283,34 +277,33 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact return insertion_point; } - private void restoreLeadingComments( - ICPPASTFunctionDefinition newDefinition, ASTRewrite newRewriter, ModificationCollector collector) { + private void restoreLeadingComments(ICPPASTFunctionDefinition newDefinition, + ASTRewrite newRewriter, ModificationCollector collector) { ASTRewrite rw = collector.rewriterForTranslationUnit(context.getDefinitionUnit()); Listcomments = rw.getComments(context.getDefinition(), CommentPosition.leading); - if(comments != null) { + if (comments != null) { for (IASTComment comment : comments) { newRewriter.addComment(newDefinition, comment, CommentPosition.leading); - if(context.getDeclaration() != null) { + if (context.getDeclaration() != null) { rw.remove(comment, infoText); } } } } - private void replaceDefinitionWithDeclaration( - ModificationCollector collector) { - IASTSimpleDeclaration newdeclarator = - ToggleNodeHelper.createDeclarationFromDefinition(context.getDefinition()); + private void replaceDefinitionWithDeclaration(ModificationCollector collector) { + IASTSimpleDeclaration newdeclarator = + ToggleNodeHelper.createDeclarationFromDefinition(context.getDefinition()); ASTRewrite rewrite = collector.rewriterForTranslationUnit(context.getDefinitionUnit()); rewrite.replace(context.getDefinition(), newdeclarator, infoText); } private ICPPASTFunctionDefinition getNewDefinition() { ICPPASTFunctionDefinition newDefinition = - ToggleNodeHelper.createFunctionSignatureWithEmptyBody( - context.getDefinition().getDeclSpecifier().copy(CopyStyle.withLocations), context - .getDefinition().getDeclarator().copy(CopyStyle.withLocations), context - .getDefinition().copy(CopyStyle.withLocations)); + ToggleNodeHelper.createFunctionSignatureWithEmptyBody( + context.getDefinition().getDeclSpecifier().copy(CopyStyle.withLocations), + context.getDefinition().getDeclarator().copy(CopyStyle.withLocations), + context.getDefinition().copy(CopyStyle.withLocations)); newDefinition.getDeclSpecifier().setInline(false); newDefinition.setBody(context.getDefinition().getBody().copy(CopyStyle.withLocations)); if (newDefinition instanceof ICPPASTFunctionWithTryBlock) { @@ -328,8 +321,8 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact if (parent instanceof ICPPASTNamespaceDefinition) { ICPPASTNamespaceDefinition ns = (ICPPASTNamespaceDefinition) parent; if (new_definition.getDeclarator().getName() instanceof ICPPASTQualifiedName) { - ICPPASTQualifiedName qname = - (ICPPASTQualifiedName) new_definition.getDeclarator().getName(); + ICPPASTQualifiedName qname = + (ICPPASTQualifiedName) new_definition.getDeclarator().getName(); ICPPASTQualifiedName qname_new = new CPPASTQualifiedName(); boolean start = false; for(IASTName partname: qname.getNames()) { @@ -346,11 +339,9 @@ public class ToggleFromInHeaderToImplementationStrategy implements IToggleRefact } } - private CPPASTNamespaceDefinition createNamespace( - ICPPASTNamespaceDefinition parent_namespace) { + private CPPASTNamespaceDefinition createNamespace(ICPPASTNamespaceDefinition parent_namespace) { CPPASTNamespaceDefinition insertionParent = new CPPASTNamespaceDefinition( -parent_namespace.getName() - .copy(CopyStyle.withLocations)); + parent_namespace.getName().copy(CopyStyle.withLocations)); insertionParent.setParent(impl_unit); return insertionParent; } @@ -363,19 +354,19 @@ parent_namespace.getName() private IASTNode searchNamespaceInImplementation(final IASTName name) { final Container result = new Container(); - this.impl_unit.accept( -new ASTVisitor() { - { - shouldVisitNamespaces = true; - } - @Override - public int visit(ICPPASTNamespaceDefinition namespaceDefinition) { - if (name.toString().equals(namespaceDefinition.getName().toString())) { - result.setObject(namespaceDefinition); - return PROCESS_ABORT; - } - return super.visit(namespaceDefinition); - } + this.impl_unit.accept(new ASTVisitor() { + { + shouldVisitNamespaces = true; + } + + @Override + public int visit(ICPPASTNamespaceDefinition namespaceDefinition) { + if (name.toString().equals(namespaceDefinition.getName().toString())) { + result.setObject(namespaceDefinition); + return PROCESS_ABORT; + } + return super.visit(namespaceDefinition); + } }); return result.getObject(); }