mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-14 03:35:37 +02:00
FIXED - bug 239060: const parameters in extracted functions
https://bugs.eclipse.org/bugs/show_bug.cgi?id=239060
This commit is contained in:
parent
4966785528
commit
e4581eabb5
5 changed files with 98 additions and 14 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2008 Institute for Software, HSR Hochschule fuer Technik
|
* Copyright (c) 2008, 2009 Institute for Software, HSR Hochschule fuer Technik
|
||||||
* Rapperswil, University of applied sciences and others
|
* Rapperswil, University of applied sciences and others
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
@ -50,10 +50,14 @@ import org.eclipse.cdt.internal.core.dom.rewrite.astwriter.ASTWriter;
|
||||||
|
|
||||||
public class NodeContainer {
|
public class NodeContainer {
|
||||||
|
|
||||||
|
public final NameInformation NULL_NAME_INFORMATION = new NameInformation(
|
||||||
|
new CPPASTName());
|
||||||
|
|
||||||
private final ArrayList<IASTNode> vec;
|
private final ArrayList<IASTNode> vec;
|
||||||
private final ArrayList<NameInformation> names;
|
private final ArrayList<NameInformation> names;
|
||||||
|
|
||||||
public class NameInformation {
|
public class NameInformation {
|
||||||
|
|
||||||
private IASTName name;
|
private IASTName name;
|
||||||
private IASTName declaration;
|
private IASTName declaration;
|
||||||
private final ArrayList<IASTName> references;
|
private final ArrayList<IASTName> references;
|
||||||
|
@ -61,6 +65,8 @@ public class NodeContainer {
|
||||||
private int lastCachedReferencesHash;
|
private int lastCachedReferencesHash;
|
||||||
private boolean isReference;
|
private boolean isReference;
|
||||||
private boolean isReturnValue;
|
private boolean isReturnValue;
|
||||||
|
private boolean isConst;
|
||||||
|
private boolean isWriteAccess;
|
||||||
|
|
||||||
private boolean userSetIsReference;
|
private boolean userSetIsReference;
|
||||||
private boolean userSetIsReturnValue;
|
private boolean userSetIsReturnValue;
|
||||||
|
@ -103,7 +109,7 @@ public class NodeContainer {
|
||||||
|
|
||||||
public ArrayList<IASTName> getReferencesAfterSelection() {
|
public ArrayList<IASTName> getReferencesAfterSelection() {
|
||||||
if (referencesAfterCached == null
|
if (referencesAfterCached == null
|
||||||
|| lastCachedReferencesHash == references.hashCode()) {
|
|| lastCachedReferencesHash != references.hashCode()) {
|
||||||
|
|
||||||
lastCachedReferencesHash = references.hashCode();
|
lastCachedReferencesHash = references.hashCode();
|
||||||
referencesAfterCached = new ArrayList<IASTName>();
|
referencesAfterCached = new ArrayList<IASTName>();
|
||||||
|
@ -139,14 +145,16 @@ public class NodeContainer {
|
||||||
|
|
||||||
IASTDeclarator declarator;
|
IASTDeclarator declarator;
|
||||||
if (sourceDeclarator instanceof IASTArrayDeclarator) {
|
if (sourceDeclarator instanceof IASTArrayDeclarator) {
|
||||||
IASTArrayDeclarator arrDeclarator = (IASTArrayDeclarator)sourceDeclarator;
|
IASTArrayDeclarator arrDeclarator = (IASTArrayDeclarator) sourceDeclarator;
|
||||||
declarator = new CPPASTArrayDeclarator();
|
declarator = new CPPASTArrayDeclarator();
|
||||||
IASTArrayModifier[] arrayModifiers = arrDeclarator.getArrayModifiers();
|
IASTArrayModifier[] arrayModifiers = arrDeclarator
|
||||||
|
.getArrayModifiers();
|
||||||
for (IASTArrayModifier arrayModifier : arrayModifiers) {
|
for (IASTArrayModifier arrayModifier : arrayModifiers) {
|
||||||
((IASTArrayDeclarator)declarator).addArrayModifier(arrayModifier);
|
((IASTArrayDeclarator) declarator)
|
||||||
|
.addArrayModifier(arrayModifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
}else {
|
} else {
|
||||||
declarator = new CPPASTDeclarator();
|
declarator = new CPPASTDeclarator();
|
||||||
}
|
}
|
||||||
declarator.setName(new CPPASTName(getDeclaration().toCharArray()));
|
declarator.setName(new CPPASTName(getDeclaration().toCharArray()));
|
||||||
|
@ -167,7 +175,7 @@ public class NodeContainer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasReferenceOperartor(IASTDeclarator declarator) {
|
public boolean hasReferenceOperartor(IASTDeclarator declarator) {
|
||||||
for(IASTPointerOperator pOp :declarator.getPointerOperators()) {
|
for (IASTPointerOperator pOp : declarator.getPointerOperators()) {
|
||||||
if (pOp instanceof ICPPASTReferenceOperator) {
|
if (pOp instanceof ICPPASTReferenceOperator) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -206,7 +214,8 @@ public class NodeContainer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return Messages.NodeContainer_Name + name + ' ' + isDeclarationInScope();
|
return Messages.NodeContainer_Name + name + ' '
|
||||||
|
+ isDeclarationInScope();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isReference() {
|
public boolean isReference() {
|
||||||
|
@ -248,6 +257,23 @@ public class NodeContainer {
|
||||||
public void setUserSetName(String userSetName) {
|
public void setUserSetName(String userSetName) {
|
||||||
this.userSetName = userSetName;
|
this.userSetName = userSetName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isConst() {
|
||||||
|
return isConst;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConst(boolean isConst) {
|
||||||
|
this.isConst = isConst;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isWriteAccess() {
|
||||||
|
return isWriteAccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWriteAccess(boolean isWriteAceess) {
|
||||||
|
this.isWriteAccess = isWriteAceess;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public NodeContainer() {
|
public NodeContainer() {
|
||||||
|
@ -371,6 +397,14 @@ public class NodeContainer {
|
||||||
|
|
||||||
declarations.add(nameInf.getDeclaration());
|
declarations.add(nameInf.getDeclaration());
|
||||||
usedAfter.add(nameInf);
|
usedAfter.add(nameInf);
|
||||||
|
} else {
|
||||||
|
for (NameInformation nameInformation : usedAfter) {
|
||||||
|
if (nameInf.isWriteAccess()
|
||||||
|
&& nameInf.getDeclaration() == nameInformation
|
||||||
|
.getDeclaration()) {
|
||||||
|
nameInformation.setWriteAccess(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -493,4 +527,5 @@ public class NodeContainer {
|
||||||
public ArrayList<NameInformation> getNames() {
|
public ArrayList<NameInformation> getNames() {
|
||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2008 Institute for Software, HSR Hochschule fuer Technik
|
* Copyright (c) 2008, 2009 Institute for Software, HSR Hochschule fuer Technik
|
||||||
* Rapperswil, University of applied sciences and others
|
* Rapperswil, University of applied sciences and others
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
@ -30,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
|
||||||
|
|
||||||
import org.eclipse.cdt.internal.ui.refactoring.NodeContainer.NameInformation;
|
import org.eclipse.cdt.internal.ui.refactoring.NodeContainer.NameInformation;
|
||||||
|
|
||||||
|
|
||||||
public class ChooserComposite extends Composite {
|
public class ChooserComposite extends Composite {
|
||||||
|
|
||||||
private static final String COLUMN_RETURN = Messages.ChooserComposite_Return;
|
private static final String COLUMN_RETURN = Messages.ChooserComposite_Return;
|
||||||
|
@ -71,6 +72,7 @@ public class ChooserComposite extends Composite {
|
||||||
addColumnToTable(table, COLUMN_TYPE);
|
addColumnToTable(table, COLUMN_TYPE);
|
||||||
addColumnToTable(table, COLUMN_NAME);
|
addColumnToTable(table, COLUMN_NAME);
|
||||||
addColumnToTable(table, COLUMN_REFERENCE);
|
addColumnToTable(table, COLUMN_REFERENCE);
|
||||||
|
addColumnToTable(table, Messages.ChooserComposite_const);
|
||||||
if(!info.isExtractExpression()) {
|
if(!info.isExtractExpression()) {
|
||||||
addColumnToTable(table, COLUMN_RETURN);
|
addColumnToTable(table, COLUMN_RETURN);
|
||||||
}
|
}
|
||||||
|
@ -119,6 +121,34 @@ public class ChooserComposite extends Composite {
|
||||||
referenceButtons.add(referenceButton);
|
referenceButtons.add(referenceButton);
|
||||||
editor.setEditor(referenceButton, item, columnIndex++);
|
editor.setEditor(referenceButton, item, columnIndex++);
|
||||||
|
|
||||||
|
// Cosnt Button
|
||||||
|
editor = new TableEditor(table);
|
||||||
|
final Button constButton = new Button(table, SWT.CHECK);
|
||||||
|
|
||||||
|
constButton.setSelection(name.isConst());
|
||||||
|
constButton.setEnabled(!name.isWriteAccess());
|
||||||
|
|
||||||
|
constButton.setBackground(table.getBackground());
|
||||||
|
constButton.addSelectionListener(new SelectionListener() {
|
||||||
|
|
||||||
|
public void widgetDefaultSelected(SelectionEvent e) {
|
||||||
|
name.setConst(constButton
|
||||||
|
.getSelection());
|
||||||
|
onVisibilityOrReturnChange(info.getAllUsedNames());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
widgetDefaultSelected(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
constButton.pack();
|
||||||
|
editor.minimumWidth = constButton.getSize().x;
|
||||||
|
editor.horizontalAlignment = SWT.CENTER;
|
||||||
|
// referenceButtons.add(referenceButton);
|
||||||
|
editor.setEditor(constButton, item, columnIndex++);
|
||||||
|
|
||||||
|
|
||||||
if(info.isExtractExpression())
|
if(info.isExtractExpression())
|
||||||
continue; // Skip the return radiobutton
|
continue; // Skip the return radiobutton
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2008 Institute for Software, HSR Hochschule fuer Technik
|
* Copyright (c) 2008, 2009 Institute for Software, HSR Hochschule fuer Technik
|
||||||
* Rapperswil, University of applied sciences and others
|
* Rapperswil, University of applied sciences and others
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
@ -11,6 +11,7 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.ui.refactoring.extractfunction;
|
package org.eclipse.cdt.internal.ui.refactoring.extractfunction;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -91,6 +92,8 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTSimpleDeclSpecifier;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTSimpleDeclaration;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTSimpleDeclaration;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTemplateDeclaration;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTemplateDeclaration;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory;
|
||||||
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVariableReadWriteFlags;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
|
||||||
|
|
||||||
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;
|
||||||
|
@ -155,6 +158,7 @@ public class ExtractFunctionRefactoring extends CRefactoring {
|
||||||
return initStatus;
|
return initStatus;
|
||||||
|
|
||||||
container.findAllNames();
|
container.findAllNames();
|
||||||
|
markWriteAccess();
|
||||||
sm.worked(1);
|
sm.worked(1);
|
||||||
|
|
||||||
if (isProgressMonitorCanceld(sm, initStatus))
|
if (isProgressMonitorCanceld(sm, initStatus))
|
||||||
|
@ -190,6 +194,19 @@ public class ExtractFunctionRefactoring extends CRefactoring {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void markWriteAccess() throws CoreException {
|
||||||
|
ArrayList<NameInformation> paras = container.getNames();
|
||||||
|
|
||||||
|
for (NameInformation name : paras) {
|
||||||
|
int flag = CPPVariableReadWriteFlags.getReadWriteFlags(name
|
||||||
|
.getName());
|
||||||
|
if ((flag & PDOMName.WRITE_ACCESS) != 0) {
|
||||||
|
name.setWriteAccess(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private void checkForNonExtractableStatements(NodeContainer cont,
|
private void checkForNonExtractableStatements(NodeContainer cont,
|
||||||
RefactoringStatus status) {
|
RefactoringStatus status) {
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2008 Institute for Software, HSR Hochschule fuer Technik
|
* Copyright (c) 2008, 2009 Institute for Software, HSR Hochschule fuer Technik
|
||||||
* Rapperswil, University of applied sciences and others
|
* Rapperswil, University of applied sciences and others
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
@ -39,6 +39,7 @@ public final class Messages extends NLS {
|
||||||
public static String ExtractFunctionRefactoring_CreateFunctionCall;
|
public static String ExtractFunctionRefactoring_CreateFunctionCall;
|
||||||
public static String ChooserComposite_Return;
|
public static String ChooserComposite_Return;
|
||||||
public static String ChooserComposite_CallByRef;
|
public static String ChooserComposite_CallByRef;
|
||||||
|
public static String ChooserComposite_const;
|
||||||
public static String ChooserComposite_Name;
|
public static String ChooserComposite_Name;
|
||||||
public static String ChooserComposite_Type;
|
public static String ChooserComposite_Type;
|
||||||
public static String ChooserComposite_NoReturnValue;
|
public static String ChooserComposite_NoReturnValue;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Copyright (c) 2008 Institute for Software, HSR Hochschule fuer Technik
|
# Copyright (c) 2008, 2009 Institute for Software, HSR Hochschule fuer Technik
|
||||||
# Rapperswil, University of applied sciences and others
|
# Rapperswil, University of applied sciences and others
|
||||||
# All rights reserved. This program and the accompanying materials
|
# All rights reserved. This program and the accompanying materials
|
||||||
# are made available under the terms of the Eclipse Public License v1.0
|
# are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
@ -27,6 +27,7 @@ ExtractFunctionRefactoring_CreateMethodCall=Create Method Call
|
||||||
ExtractFunctionRefactoring_CreateFunctionCall=Create Function Call
|
ExtractFunctionRefactoring_CreateFunctionCall=Create Function Call
|
||||||
ChooserComposite_Return=Return
|
ChooserComposite_Return=Return
|
||||||
ChooserComposite_CallByRef=Call by Reference
|
ChooserComposite_CallByRef=Call by Reference
|
||||||
|
ChooserComposite_const=const
|
||||||
ChooserComposite_Name=Name
|
ChooserComposite_Name=Name
|
||||||
ChooserComposite_Type=Type
|
ChooserComposite_Type=Type
|
||||||
ChooserComposite_NoReturnValue=No return-value (void)
|
ChooserComposite_NoReturnValue=No return-value (void)
|
||||||
|
|
Loading…
Add table
Reference in a new issue