diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ASTModificationHelper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ASTModificationHelper.java index e681824313f..568c4c68448 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ASTModificationHelper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ASTModificationHelper.java @@ -76,11 +76,14 @@ public class ASTModificationHelper { break; case INSERT_BEFORE: - T insertedTNode = cast(parentModification.getNewNode(), clazz); - - int targetNodeIndex = modifiedChildren.indexOf(parentModification.getTargetNode()); - if(targetNodeIndex >= 0){ - modifiedChildren.add(targetNodeIndex, insertedTNode); + newNode = parentModification.getNewNode(); + if (newNode instanceof ContainerNode) { + ContainerNode contNode = (ContainerNode) newNode; + for (IASTNode node : contNode.getNodes()) { + insertNode(clazz, modifiedChildren, parentModification, node); + } + } else { + insertNode(clazz, modifiedChildren, parentModification, newNode); } break; @@ -92,6 +95,16 @@ public class ASTModificationHelper { } + private void insertNode(Class clazz, ArrayList modifiedChildren, + ASTModification parentModification, IASTNode newNode) { + T insertedTNode = cast(newNode, clazz); + + int targetNodeIndex = modifiedChildren.indexOf(parentModification.getTargetNode()); + if (targetNodeIndex >= 0) { + modifiedChildren.add(targetNodeIndex, insertedTNode); + } + } + @SuppressWarnings("unchecked") private T[] newArrayInstance(Class clazz, int size) { return (T[]) Array.newInstance(clazz, size); 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 667a6ee77ad..063fca53a50 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/refactoring/GenerateGettersAndSetters.rts +++ b/core/org.eclipse.cdt.ui.tests/resources/refactoring/GenerateGettersAndSetters.rts @@ -1406,3 +1406,72 @@ void test::setI(int i) #endif /* TEST_H_ */ +//!Bug 323780 "Generate Getters and Setters..." crashes +//#org.eclipse.cdt.ui.tests.refactoring.gettersandsetters.GenerateGettersAndSettersTest +//@.config +filename=Test.h +getters=testField +setters=testField + +//@Test.h +#ifndef TEST_H_ +#define TEST_H_ + +namespace foo +{ + class Test + { + int /*$*/testField/*$$*/; + void foo(); + }; +} + +#endif +//= +#ifndef TEST_H_ +#define TEST_H_ + +namespace foo +{ + class Test + { + int testField; + void foo(); + public: + int getTestField() const; + void setTestField(int testField); + }; +} + +#endif +//@Test.cpp +#include "Test.h" + +namespace foo +{ + + void Test::foo() + { + + } +} +//= +#include "Test.h" + +namespace foo +{ + int Test::getTestField() const + { + return testField; + } + + void Test::setTestField(int testField) + { + this->testField = testField; + } + + void Test::foo() + { + + } +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoring.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoring.java index 1454d5d4ba0..db3365d0caa 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoring.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoring.java @@ -257,7 +257,7 @@ public class GenerateGettersAndSettersRefactoring extends CRefactoring { for (IASTFunctionDefinition functionDefinition : definitions) { cont.addNode(functionDefinition); } - rewrite = rewrite.insertBefore(parent, nodeToInsertBefore, cont , null); + rewrite = rewrite.insertBefore(parent, nodeToInsertBefore, cont, null); } public GetterAndSetterContext getContext() {