Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoring.java')
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/gettersandsetters/GenerateGettersAndSettersRefactoring.java63
1 files changed, 60 insertions, 3 deletions
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 eaccaa89caf..908de7bee85 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
@@ -23,8 +23,12 @@ import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
+import org.eclipse.cdt.core.dom.ast.ASTVisitor;
+import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
+import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
+import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTName;
@@ -36,6 +40,7 @@ import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.internal.ui.refactoring.AddDeclarationNodeToClassChange;
import org.eclipse.cdt.internal.ui.refactoring.CRefactoring;
+import org.eclipse.cdt.internal.ui.refactoring.Container;
import org.eclipse.cdt.internal.ui.refactoring.ModificationCollector;
import org.eclipse.cdt.internal.ui.refactoring.utils.SelectionHelper;
import org.eclipse.cdt.internal.ui.refactoring.utils.VisibilityEnum;
@@ -46,6 +51,33 @@ import org.eclipse.cdt.internal.ui.refactoring.utils.VisibilityEnum;
*/
public class GenerateGettersAndSettersRefactoring extends CRefactoring {
+ private final class CompositeTypeSpecFinder extends CPPASTVisitor {
+ private final int start;
+ private final Container<IASTCompositeTypeSpecifier> container;
+ {
+ shouldVisitDeclSpecifiers = true;
+ }
+
+ private CompositeTypeSpecFinder(int start, Container<IASTCompositeTypeSpecifier> container) {
+ this.start = start;
+ this.container = container;
+ }
+
+ @Override
+ public int visit(IASTDeclSpecifier declSpec) {
+
+ if (declSpec instanceof IASTCompositeTypeSpecifier) {
+ IASTFileLocation loc = declSpec.getFileLocation();
+ if(start > loc.getNodeOffset() && start < loc.getNodeOffset()+ loc.getNodeLength()) {
+ container.setObject((IASTCompositeTypeSpecifier) declSpec);
+ return ASTVisitor.PROCESS_ABORT;
+ }
+ }
+
+ return super.visit(declSpec);
+ }
+ }
+
private static final String MEMBER_DECLARATION = "MEMBER_DECLARATION"; //$NON-NLS-1$
private final GetterAndSetterContext context = new GetterAndSetterContext();
@@ -72,9 +104,34 @@ public class GenerateGettersAndSettersRefactoring extends CRefactoring {
loadTranslationUnit(initStatus, pm);
context.setUnit(unit);
context.selectedName = getSelectedName();
- findDeclarations();
+ IASTCompositeTypeSpecifier compositeTypeSpecifier = null;
+ if(context.selectedName != null) {
+ compositeTypeSpecifier = getCompositeTypeSpecifier(context.selectedName);
+ }else {
+ compositeTypeSpecifier = findCurrentCompositeTypeSpecifier();
+ }
+ if(compositeTypeSpecifier != null) {
+ findDeclarations(compositeTypeSpecifier);
+ }else {
+ initStatus.addFatalError(Messages.GenerateGettersAndSettersRefactoring_NoCassDefFound);
+ }
}
+ private IASTCompositeTypeSpecifier findCurrentCompositeTypeSpecifier() {
+ final int start = region.getOffset();
+ Container<IASTCompositeTypeSpecifier> container = new Container<IASTCompositeTypeSpecifier>();
+ unit.accept(new CompositeTypeSpecFinder(start, container));
+ return container.getObject();
+ }
+
+ private IASTCompositeTypeSpecifier getCompositeTypeSpecifier(IASTName selectedName) {
+ IASTNode node = selectedName;
+ while(node != null && !(node instanceof IASTCompositeTypeSpecifier)) {
+ node = node.getParent();
+ }
+ return (IASTCompositeTypeSpecifier) node;
+ }
+
private IASTName getSelectedName() {
ArrayList<IASTName> names = findAllMarkedNames();
if (names.size() < 1) {
@@ -83,9 +140,9 @@ public class GenerateGettersAndSettersRefactoring extends CRefactoring {
return names.get(names.size()-1);
}
- protected void findDeclarations() {
+ protected void findDeclarations(IASTCompositeTypeSpecifier compositeTypeSpecifier) {
- unit.accept(new CPPASTVisitor() {
+ compositeTypeSpecifier.accept(new CPPASTVisitor() {
{
shouldVisitDeclarations = true;

Back to the top