mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 22:52:11 +02:00
FIXED - bug 266726: Generate Getters and Setters could be prettier if it shared more code with JDT
https://bugs.eclipse.org/bugs/show_bug.cgi?id=266726
This commit is contained in:
parent
63fbea0b0b
commit
3f794a608f
7 changed files with 252 additions and 82 deletions
|
@ -543,26 +543,26 @@ public:
|
|||
const int socSecNo;
|
||||
|
||||
Person myFriend;
|
||||
int getSystemId() const
|
||||
{
|
||||
return systemId;
|
||||
}
|
||||
|
||||
void setSystemId(int systemId)
|
||||
{
|
||||
this->systemId = systemId;
|
||||
}
|
||||
|
||||
char *getName() const
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
int getSystemId() const
|
||||
{
|
||||
return systemId;
|
||||
}
|
||||
|
||||
void setName(char *name)
|
||||
{
|
||||
this->name = name;
|
||||
}
|
||||
|
||||
void setSystemId(int systemId)
|
||||
{
|
||||
this->systemId = systemId;
|
||||
}
|
||||
|
||||
Person(int socSecNo); // contructor
|
||||
|
||||
~Person(); // destructor
|
||||
|
@ -624,26 +624,26 @@ public:
|
|||
virtual ~GaS();
|
||||
bool isOk;
|
||||
void methode2();
|
||||
bool getIsOk() const
|
||||
{
|
||||
return isOk;
|
||||
}
|
||||
|
||||
void setIsOk(bool isOk)
|
||||
{
|
||||
this->isOk = isOk;
|
||||
}
|
||||
|
||||
int getI() const
|
||||
{
|
||||
return i;
|
||||
}
|
||||
|
||||
bool getIsOk() const
|
||||
{
|
||||
return isOk;
|
||||
}
|
||||
|
||||
void setI(int i)
|
||||
{
|
||||
this->i = i;
|
||||
}
|
||||
|
||||
void setIsOk(bool isOk)
|
||||
{
|
||||
this->isOk = isOk;
|
||||
}
|
||||
|
||||
private:
|
||||
int i;
|
||||
};
|
||||
|
|
|
@ -11,23 +11,30 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
|
||||
import org.eclipse.jface.viewers.CheckStateChangedEvent;
|
||||
import org.eclipse.jface.viewers.ICheckStateListener;
|
||||
import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.events.SelectionAdapter;
|
||||
import org.eclipse.swt.events.SelectionEvent;
|
||||
import org.eclipse.swt.layout.FillLayout;
|
||||
import org.eclipse.swt.layout.GridData;
|
||||
import org.eclipse.swt.layout.GridLayout;
|
||||
import org.eclipse.swt.widgets.Button;
|
||||
import org.eclipse.swt.widgets.Composite;
|
||||
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterAndSetterContext.FieldWrapper;
|
||||
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterSetterInsertEditProvider.Type;
|
||||
|
||||
public class GenerateGettersAndSettersInputPage extends UserInputWizardPage {
|
||||
|
||||
private GetterAndSetterContext context;
|
||||
private ContainerCheckedTreeViewer variableSelectionView;
|
||||
private GetterSetterLabelProvider labelProvider;
|
||||
|
||||
public GenerateGettersAndSettersInputPage(GetterAndSetterContext context) {
|
||||
super(Messages.GettersAndSetters_Name);
|
||||
|
@ -36,55 +43,140 @@ public class GenerateGettersAndSettersInputPage extends UserInputWizardPage {
|
|||
|
||||
public void createControl(Composite parent) {
|
||||
Composite comp = new Composite(parent, SWT.NONE );
|
||||
comp.setLayout(new FillLayout());
|
||||
|
||||
setTitle(Messages.GettersAndSetters_Name);
|
||||
setMessage(Messages.GenerateGettersAndSettersInputPage_header);
|
||||
|
||||
comp.setLayout(new GridLayout(2, false));
|
||||
createTree(comp);
|
||||
GridData gd = new GridData(GridData.FILL_BOTH);
|
||||
variableSelectionView.getTree().setLayoutData(gd);
|
||||
|
||||
Composite btComp = createButtonComposite(comp);
|
||||
gd = new GridData();
|
||||
gd.verticalAlignment = SWT.TOP;
|
||||
btComp.setLayoutData(gd);
|
||||
|
||||
setControl(comp);
|
||||
}
|
||||
|
||||
private void createTree(Composite comp) {
|
||||
final ContainerCheckedTreeViewer variableSelectionView = new ContainerCheckedTreeViewer(comp, SWT.BORDER);
|
||||
for(IASTSimpleDeclaration currentField : context.existingFields){
|
||||
if(currentField.getDeclarators().length == 0){
|
||||
continue;
|
||||
}
|
||||
|
||||
variableSelectionView.setContentProvider(context);
|
||||
variableSelectionView.setAutoExpandLevel(3);
|
||||
variableSelectionView.setInput(""); //$NON-NLS-1$
|
||||
if(context.selectedName != null) {
|
||||
String rawSignature = context.selectedName.getRawSignature();
|
||||
for(Object obj : variableSelectionView.getVisibleExpandedElements()) {
|
||||
if (obj instanceof FieldWrapper){
|
||||
|
||||
if(obj.toString().contains(rawSignature)){
|
||||
variableSelectionView.setSubtreeChecked(obj, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ArrayList<GetterSetterInsertEditProvider> checkedFunctions = new ArrayList<GetterSetterInsertEditProvider>();
|
||||
for(Object currentElement : variableSelectionView.getCheckedElements()){
|
||||
if (currentElement instanceof GetterSetterInsertEditProvider) {
|
||||
GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement;
|
||||
checkedFunctions.add(editProvider);
|
||||
}
|
||||
}
|
||||
context.selectedFunctions = checkedFunctions;
|
||||
|
||||
variableSelectionView.addCheckStateListener(new ICheckStateListener(){
|
||||
|
||||
public void checkStateChanged(CheckStateChangedEvent event) {
|
||||
ArrayList<GetterSetterInsertEditProvider> checkedFunctions = new ArrayList<GetterSetterInsertEditProvider>();
|
||||
for(Object currentElement : variableSelectionView.getCheckedElements()){
|
||||
private Composite createButtonComposite(Composite comp) {
|
||||
Composite btComp = new Composite(comp, SWT.NONE);
|
||||
FillLayout layout = new FillLayout(SWT.VERTICAL);
|
||||
layout.spacing = 4;
|
||||
btComp.setLayout(layout);
|
||||
|
||||
Button selectAll = new Button(btComp, SWT.PUSH);
|
||||
selectAll.setText(Messages.GenerateGettersAndSettersInputPage_SelectAll);
|
||||
selectAll.addSelectionListener(new SelectionAdapter(){
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
Object[] items = context.getElements(null);
|
||||
SortedSet<GetterSetterInsertEditProvider> checkedFunctions = context.selectedFunctions;
|
||||
for (Object treeItem : items) {
|
||||
variableSelectionView.setChecked(treeItem, true);
|
||||
Object[] childs = context.getChildren(treeItem);
|
||||
for(Object currentElement : childs){
|
||||
if (currentElement instanceof GetterSetterInsertEditProvider) {
|
||||
GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement;
|
||||
checkedFunctions.add(editProvider);
|
||||
}
|
||||
}
|
||||
context.selectedFunctions = checkedFunctions;
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
Button deselectAll = new Button(btComp, SWT.PUSH);
|
||||
deselectAll.setText(Messages.GenerateGettersAndSettersInputPage_DeselectAll);
|
||||
deselectAll.addSelectionListener(new SelectionAdapter(){
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
Object[] items = context.getElements(null);
|
||||
for (Object treeItem : items) {
|
||||
variableSelectionView.setChecked(treeItem, false);
|
||||
}
|
||||
context.selectedFunctions.clear();
|
||||
}
|
||||
});
|
||||
|
||||
Button selectGetter = new Button(btComp, SWT.PUSH);
|
||||
selectGetter.setText(Messages.GenerateGettersAndSettersInputPage_SelectGetters);
|
||||
selectGetter.addSelectionListener(new SelectionAdapter(){
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
selectMethods(Type.getter);
|
||||
}
|
||||
});
|
||||
|
||||
Button selectSetter = new Button(btComp, SWT.PUSH);
|
||||
selectSetter.setText(Messages.GenerateGettersAndSettersInputPage_SelectSetters);
|
||||
selectSetter.addSelectionListener(new SelectionAdapter(){
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
selectMethods(Type.setter);
|
||||
}
|
||||
});
|
||||
|
||||
return btComp;
|
||||
}
|
||||
|
||||
private void selectMethods(Type type) {
|
||||
Object[] items = context.getElements(null);
|
||||
Set<GetterSetterInsertEditProvider> checked = context.selectedFunctions;
|
||||
for (Object treeItem : items) {
|
||||
if (treeItem instanceof FieldWrapper) {
|
||||
FieldWrapper field = (FieldWrapper) treeItem;
|
||||
Object[] funtions = context.getChildren(field);
|
||||
for (Object funct : funtions) {
|
||||
if (funct instanceof GetterSetterInsertEditProvider) {
|
||||
GetterSetterInsertEditProvider getSet = (GetterSetterInsertEditProvider) funct;
|
||||
if(getSet.getType() == type) {
|
||||
checked.add(getSet);
|
||||
variableSelectionView.setChecked(getSet, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void createTree(Composite comp) {
|
||||
variableSelectionView = new ContainerCheckedTreeViewer(comp, SWT.BORDER);
|
||||
labelProvider = new GetterSetterLabelProvider();
|
||||
variableSelectionView.setContentProvider(context);
|
||||
variableSelectionView.setLabelProvider(labelProvider);
|
||||
|
||||
variableSelectionView.setAutoExpandLevel(3);
|
||||
variableSelectionView.setInput(""); //$NON-NLS-1$
|
||||
if (context.selectedName != null) {
|
||||
String rawSignature = context.selectedName.getRawSignature();
|
||||
for (Object obj : variableSelectionView.getVisibleExpandedElements()) {
|
||||
if (obj instanceof FieldWrapper) {
|
||||
if (obj.toString().contains(rawSignature)) {
|
||||
variableSelectionView.setSubtreeChecked(obj, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Set<GetterSetterInsertEditProvider> checkedFunctions = context.selectedFunctions;
|
||||
for (Object currentElement : variableSelectionView.getCheckedElements()) {
|
||||
if (currentElement instanceof GetterSetterInsertEditProvider) {
|
||||
GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement;
|
||||
checkedFunctions.add(editProvider);
|
||||
}
|
||||
}
|
||||
variableSelectionView.addCheckStateListener(new ICheckStateListener() {
|
||||
|
||||
public void checkStateChanged(CheckStateChangedEvent event) {
|
||||
Set<GetterSetterInsertEditProvider> checkedFunctions = context.selectedFunctions;
|
||||
for (Object currentElement : variableSelectionView.getCheckedElements()) {
|
||||
if (currentElement instanceof GetterSetterInsertEditProvider) {
|
||||
GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement;
|
||||
checkedFunctions.add(editProvider);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import org.eclipse.jface.viewers.ITreeContentProvider;
|
||||
import org.eclipse.jface.viewers.Viewer;
|
||||
|
@ -21,6 +23,7 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterSetterInsertEditProvider.Type;
|
||||
import org.eclipse.cdt.internal.ui.refactoring.utils.NameHelper;
|
||||
|
||||
public class GetterAndSetterContext implements ITreeContentProvider{
|
||||
|
@ -28,23 +31,26 @@ public class GetterAndSetterContext implements ITreeContentProvider{
|
|||
public ArrayList<IASTSimpleDeclaration> existingFields = new ArrayList<IASTSimpleDeclaration>();
|
||||
public ArrayList<IASTFunctionDefinition> existingFunctionDefinitions = new ArrayList<IASTFunctionDefinition>();
|
||||
public ArrayList<IASTSimpleDeclaration> existingFunctionDeclarations = new ArrayList<IASTSimpleDeclaration>();
|
||||
public ArrayList<GetterSetterInsertEditProvider> selectedFunctions = new ArrayList<GetterSetterInsertEditProvider>();
|
||||
public SortedSet<GetterSetterInsertEditProvider> selectedFunctions = new TreeSet<GetterSetterInsertEditProvider>();
|
||||
private IASTTranslationUnit unit;
|
||||
public IASTName selectedName;
|
||||
private ArrayList<FieldWrapper> wrappedFields;
|
||||
|
||||
public Object[] getChildren(Object parentElement) {
|
||||
|
||||
ArrayList<GetterSetterInsertEditProvider> children = new ArrayList<GetterSetterInsertEditProvider>();
|
||||
if (parentElement instanceof FieldWrapper) {
|
||||
FieldWrapper wrapper = (FieldWrapper) parentElement;
|
||||
|
||||
if(!wrapper.getter.exists()){
|
||||
children.add(createGetterInserter(wrapper.field));
|
||||
}
|
||||
if(!wrapper.setter.exists() && !wrapper.field.getDeclSpecifier().isConst()){
|
||||
|
||||
children.add(createSetterInserter(wrapper.field));
|
||||
|
||||
if(wrapper.getChildNodes().isEmpty()) {
|
||||
if(!wrapper.getter.exists()){
|
||||
wrapper.childNodes.add(createGetterInserter(wrapper.field));
|
||||
}
|
||||
if(!wrapper.setter.exists() && !wrapper.field.getDeclSpecifier().isConst()){
|
||||
wrapper.childNodes.add(createSetterInserter(wrapper.field));
|
||||
}
|
||||
}
|
||||
children = wrapper.getChildNodes();
|
||||
}
|
||||
return children.toArray();
|
||||
}
|
||||
|
@ -53,14 +59,14 @@ public class GetterAndSetterContext implements ITreeContentProvider{
|
|||
String varName = simpleDeclaration.getDeclarators()[0].getName().toString();
|
||||
IASTFunctionDefinition getter = FunctionFactory.createGetter(varName, simpleDeclaration);
|
||||
getter.setParent(unit);
|
||||
return new GetterSetterInsertEditProvider(getter);
|
||||
return new GetterSetterInsertEditProvider(getter, Type.getter);
|
||||
}
|
||||
|
||||
public GetterSetterInsertEditProvider createSetterInserter(IASTSimpleDeclaration simpleDeclaration) {
|
||||
String varName = simpleDeclaration.getDeclarators()[0].getName().toString();
|
||||
IASTFunctionDefinition setter = FunctionFactory.createSetter(varName, simpleDeclaration);
|
||||
setter.setParent(unit);
|
||||
return new GetterSetterInsertEditProvider(setter);
|
||||
return new GetterSetterInsertEditProvider(setter, Type.setter);
|
||||
}
|
||||
|
||||
public Object getParent(Object element) {
|
||||
|
@ -95,14 +101,16 @@ public class GetterAndSetterContext implements ITreeContentProvider{
|
|||
}
|
||||
|
||||
private ArrayList<FieldWrapper> getWrappedFields() {
|
||||
ArrayList<FieldWrapper> wrappedFields = new ArrayList<FieldWrapper>();
|
||||
for(IASTSimpleDeclaration currentField : existingFields){
|
||||
FieldWrapper wrapper = new FieldWrapper();
|
||||
wrapper.field = currentField;
|
||||
wrapper.getter = getGetterForField(currentField);
|
||||
wrapper.setter = getSetterForField(currentField);
|
||||
if(wrapper.missingGetterOrSetter()){
|
||||
wrappedFields.add(wrapper);
|
||||
if(wrappedFields == null) {
|
||||
wrappedFields = new ArrayList<FieldWrapper>();
|
||||
for(IASTSimpleDeclaration currentField : existingFields){
|
||||
FieldWrapper wrapper = new FieldWrapper();
|
||||
wrapper.field = currentField;
|
||||
wrapper.getter = getGetterForField(currentField);
|
||||
wrapper.setter = getSetterForField(currentField);
|
||||
if(wrapper.missingGetterOrSetter()){
|
||||
wrappedFields.add(wrapper);
|
||||
}
|
||||
}
|
||||
}
|
||||
return wrappedFields;
|
||||
|
@ -146,12 +154,17 @@ public class GetterAndSetterContext implements ITreeContentProvider{
|
|||
protected IASTSimpleDeclaration field;
|
||||
protected FunctionWrapper getter;
|
||||
protected FunctionWrapper setter;
|
||||
protected ArrayList<GetterSetterInsertEditProvider> childNodes = new ArrayList<GetterSetterInsertEditProvider>(2);
|
||||
|
||||
@Override
|
||||
public String toString(){
|
||||
return field.getDeclarators()[0].getName().toString();
|
||||
}
|
||||
|
||||
public ArrayList<GetterSetterInsertEditProvider> getChildNodes() {
|
||||
return childNodes;
|
||||
}
|
||||
|
||||
public boolean missingGetterOrSetter() {
|
||||
return !getter.exists() || !setter.exists();
|
||||
}
|
||||
|
|
|
@ -14,12 +14,21 @@ package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
||||
|
||||
|
||||
public class GetterSetterInsertEditProvider {
|
||||
public class GetterSetterInsertEditProvider implements Comparable<GetterSetterInsertEditProvider>{
|
||||
public enum Type{
|
||||
getter,
|
||||
setter;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private IASTFunctionDefinition function;
|
||||
private Type type;
|
||||
|
||||
public GetterSetterInsertEditProvider(IASTFunctionDefinition function){
|
||||
|
||||
public GetterSetterInsertEditProvider(IASTFunctionDefinition function, Type type){
|
||||
this.function = function;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -30,4 +39,14 @@ public class GetterSetterInsertEditProvider {
|
|||
public IASTFunctionDefinition getFunction() {
|
||||
return function;
|
||||
}
|
||||
|
||||
public Type getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public int compareTo(GetterSetterInsertEditProvider o) {
|
||||
return toString().compareTo(o.toString());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2009 Institute for Software, HSR Hochschule fuer Technik
|
||||
* Rapperswil, University of applied sciences and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* Institute for Software (IFS)- initial API and implementation
|
||||
******************************************************************************/
|
||||
package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
|
||||
|
||||
import org.eclipse.jface.viewers.LabelProvider;
|
||||
import org.eclipse.swt.graphics.Image;
|
||||
|
||||
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.viewsupport.CElementImageProvider;
|
||||
|
||||
/**
|
||||
* @author Emanuel Graf IFS
|
||||
*
|
||||
*/
|
||||
public class GetterSetterLabelProvider extends LabelProvider {
|
||||
|
||||
@Override
|
||||
public Image getImage(Object element) {
|
||||
if(element != null) {
|
||||
if (element instanceof GetterSetterInsertEditProvider) {
|
||||
return CElementImageProvider.getMethodImageDescriptor(ASTAccessVisibility.PUBLIC).createImage();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -21,6 +21,11 @@ public final class Messages extends NLS {
|
|||
// Do not instantiate
|
||||
}
|
||||
|
||||
public static String GenerateGettersAndSettersInputPage_DeselectAll;
|
||||
public static String GenerateGettersAndSettersInputPage_header;
|
||||
public static String GenerateGettersAndSettersInputPage_SelectAll;
|
||||
public static String GenerateGettersAndSettersInputPage_SelectGetters;
|
||||
public static String GenerateGettersAndSettersInputPage_SelectSetters;
|
||||
public static String GenerateGettersAndSettersRefactoring_NoCassDefFound;
|
||||
public static String GenerateGettersAndSettersRefactoring_NoFields;
|
||||
public static String GettersAndSetters_Name;
|
||||
|
|
|
@ -9,6 +9,11 @@
|
|||
# Contributors:
|
||||
# Institute for Software - initial API and implementation
|
||||
###############################################################################
|
||||
GettersAndSetters_Name=Generate Getters and Setters
|
||||
GettersAndSetters_Name=Generate getters and setters
|
||||
GenerateGettersAndSettersInputPage_DeselectAll=Deselect All
|
||||
GenerateGettersAndSettersInputPage_header=Select getters and setters to create:
|
||||
GenerateGettersAndSettersInputPage_SelectAll=Select All
|
||||
GenerateGettersAndSettersInputPage_SelectGetters=Select Getters
|
||||
GenerateGettersAndSettersInputPage_SelectSetters=Select Setters
|
||||
GenerateGettersAndSettersRefactoring_NoCassDefFound=No class definition found
|
||||
GenerateGettersAndSettersRefactoring_NoFields=The class does not contain any fields.
|
||||
|
|
Loading…
Add table
Reference in a new issue