1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

FIXED - bug 246058: [Refactoring] issues generating getters setters with 2 classes

https://bugs.eclipse.org/bugs/show_bug.cgi?id=246058
This commit is contained in:
Emanuel Graf 2008-09-05 09:41:08 +00:00
parent 4cdb7e40c9
commit 507c732870
4 changed files with 71 additions and 10 deletions

View file

@ -52,13 +52,15 @@ public class GenerateGettersAndSettersInputPage extends UserInputWizardPage {
variableSelectionView.setContentProvider(context); variableSelectionView.setContentProvider(context);
variableSelectionView.setAutoExpandLevel(3); variableSelectionView.setAutoExpandLevel(3);
variableSelectionView.setInput(""); //$NON-NLS-1$ variableSelectionView.setInput(""); //$NON-NLS-1$
if(context.selectedName != null) {
for(Object obj : variableSelectionView.getVisibleExpandedElements()) { String rawSignature = context.selectedName.getRawSignature();
System.out.println(); for(Object obj : variableSelectionView.getVisibleExpandedElements()) {
if (obj instanceof FieldWrapper){ if (obj instanceof FieldWrapper){
if(obj.toString().contains(context.selectedName.getRawSignature())){
variableSelectionView.setSubtreeChecked(obj, true); if(obj.toString().contains(rawSignature)){
} variableSelectionView.setSubtreeChecked(obj, true);
}
}
} }
} }
ArrayList<GetterSetterInsertEditProvider> checkedFunctions = new ArrayList<GetterSetterInsertEditProvider>(); ArrayList<GetterSetterInsertEditProvider> checkedFunctions = new ArrayList<GetterSetterInsertEditProvider>();

View file

@ -23,8 +23,12 @@ import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; 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.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator; 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.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTName; 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.AddDeclarationNodeToClassChange;
import org.eclipse.cdt.internal.ui.refactoring.CRefactoring; 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.ModificationCollector;
import org.eclipse.cdt.internal.ui.refactoring.utils.SelectionHelper; import org.eclipse.cdt.internal.ui.refactoring.utils.SelectionHelper;
import org.eclipse.cdt.internal.ui.refactoring.utils.VisibilityEnum; 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 { 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 static final String MEMBER_DECLARATION = "MEMBER_DECLARATION"; //$NON-NLS-1$
private final GetterAndSetterContext context = new GetterAndSetterContext(); private final GetterAndSetterContext context = new GetterAndSetterContext();
@ -72,9 +104,34 @@ public class GenerateGettersAndSettersRefactoring extends CRefactoring {
loadTranslationUnit(initStatus, pm); loadTranslationUnit(initStatus, pm);
context.setUnit(unit); context.setUnit(unit);
context.selectedName = getSelectedName(); 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() { private IASTName getSelectedName() {
ArrayList<IASTName> names = findAllMarkedNames(); ArrayList<IASTName> names = findAllMarkedNames();
if (names.size() < 1) { if (names.size() < 1) {
@ -83,9 +140,9 @@ public class GenerateGettersAndSettersRefactoring extends CRefactoring {
return names.get(names.size()-1); return names.get(names.size()-1);
} }
protected void findDeclarations() { protected void findDeclarations(IASTCompositeTypeSpecifier compositeTypeSpecifier) {
unit.accept(new CPPASTVisitor() { compositeTypeSpecifier.accept(new CPPASTVisitor() {
{ {
shouldVisitDeclarations = true; shouldVisitDeclarations = true;

View file

@ -21,6 +21,7 @@ public final class Messages extends NLS {
// Do not instantiate // Do not instantiate
} }
public static String GenerateGettersAndSettersRefactoring_NoCassDefFound;
public static String GenerateGettersAndSettersRefactoring_NoFields; public static String GenerateGettersAndSettersRefactoring_NoFields;
public static String GettersAndSetters_Name; public static String GettersAndSetters_Name;

View file

@ -10,4 +10,5 @@
# Institute for Software - initial API and implementation # Institute for Software - initial API and implementation
############################################################################### ###############################################################################
GettersAndSetters_Name=Generate Getters and Setters GettersAndSetters_Name=Generate Getters and Setters
GenerateGettersAndSettersRefactoring_NoCassDefFound=No class definition found
GenerateGettersAndSettersRefactoring_NoFields=The class does not contain any fields. GenerateGettersAndSettersRefactoring_NoFields=The class does not contain any fields.