mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Cosmetics.
This commit is contained in:
parent
41ee60794f
commit
0a9a6d9c7b
2 changed files with 94 additions and 106 deletions
|
@ -56,59 +56,54 @@ import org.eclipse.cdt.internal.ui.refactoring.NodeContainer.NameInformation;
|
||||||
* Handles the extraction of expression nodes, like return type determination.
|
* Handles the extraction of expression nodes, like return type determination.
|
||||||
*
|
*
|
||||||
* @author Mirko Stocker
|
* @author Mirko Stocker
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class ExtractExpression extends ExtractedFunctionConstructionHelper {
|
public class ExtractExpression extends ExtractedFunctionConstructionHelper {
|
||||||
|
final static char[] ZERO= { '0' };
|
||||||
final static char[] ZERO= {'0'};
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void constructMethodBody(IASTCompoundStatement compound,
|
public void constructMethodBody(IASTCompoundStatement compound, List<IASTNode> list,
|
||||||
List<IASTNode> list, ASTRewrite rewrite, TextEditGroup group) {
|
ASTRewrite rewrite, TextEditGroup group) {
|
||||||
|
|
||||||
CPPASTReturnStatement statement = new CPPASTReturnStatement();
|
CPPASTReturnStatement statement = new CPPASTReturnStatement();
|
||||||
IASTExpression nullReturnExp = new CPPASTLiteralExpression(IASTLiteralExpression.lk_integer_constant, ZERO);
|
IASTExpression nullReturnExp = new CPPASTLiteralExpression(IASTLiteralExpression.lk_integer_constant, ZERO);
|
||||||
statement.setReturnValue(nullReturnExp);
|
statement.setReturnValue(nullReturnExp);
|
||||||
ASTRewrite nestedRewrite = rewrite.insertBefore(compound, null, statement, group);
|
ASTRewrite nestedRewrite = rewrite.insertBefore(compound, null, statement, group);
|
||||||
|
|
||||||
nestedRewrite.replace(nullReturnExp, getExpression(list), group);
|
nestedRewrite.replace(nullReturnExp, getExpression(list), group);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private IASTExpression getExpression(List<IASTNode> list) {
|
private IASTExpression getExpression(List<IASTNode> list) {
|
||||||
if(list.size()> 1 ) {
|
if (list.size()> 1) {
|
||||||
CPPASTBinaryExpression bExp = new CPPASTBinaryExpression();
|
CPPASTBinaryExpression bExp = new CPPASTBinaryExpression();
|
||||||
bExp.setParent(list.get(0).getParent());
|
bExp.setParent(list.get(0).getParent());
|
||||||
bExp.setOperand1((IASTExpression) list.get(0).copy(CopyStyle.withLocations));
|
bExp.setOperand1((IASTExpression) list.get(0).copy(CopyStyle.withLocations));
|
||||||
bExp.setOperator(((IASTBinaryExpression)list.get(1).getParent()).getOperator());
|
bExp.setOperator(((IASTBinaryExpression)list.get(1).getParent()).getOperator());
|
||||||
bExp.setOperand2(getExpression(list.subList(1, list.size())));
|
bExp.setOperand2(getExpression(list.subList(1, list.size())));
|
||||||
return bExp;
|
return bExp;
|
||||||
}else {
|
} else {
|
||||||
return (IASTExpression) list.get(0).copy(CopyStyle.withLocations);
|
return (IASTExpression) list.get(0).copy(CopyStyle.withLocations);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IASTDeclSpecifier determineReturnType(IASTNode extractedNode, NameInformation _) {
|
public IASTDeclSpecifier determineReturnType(IASTNode extractedNode, NameInformation _) {
|
||||||
List<ITypedef> typdefs = getTypdefs(extractedNode);
|
List<ITypedef> typedefs = getTypedefs(extractedNode);
|
||||||
if (extractedNode instanceof IASTExpression) {
|
if (extractedNode instanceof IASTExpression) {
|
||||||
IASTExpression exp = (IASTExpression) extractedNode;
|
IASTExpression exp = (IASTExpression) extractedNode;
|
||||||
INodeFactory factory = extractedNode.getTranslationUnit().getASTNodeFactory();
|
INodeFactory factory = extractedNode.getTranslationUnit().getASTNodeFactory();
|
||||||
DeclarationGenerator generator = DeclarationGenerator.create(factory);
|
DeclarationGenerator generator = DeclarationGenerator.create(factory);
|
||||||
IType expressionType = exp.getExpressionType();
|
IType expressionType = exp.getExpressionType();
|
||||||
for (ITypedef typedef : typdefs) {
|
for (ITypedef typedef : typedefs) {
|
||||||
if (typedef.getType().isSameType(expressionType)) {
|
if (typedef.getType().isSameType(expressionType)) {
|
||||||
return generator.createDeclSpecFromType(typedef);
|
return generator.createDeclSpecFromType(typedef);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return generator.createDeclSpecFromType(expressionType);
|
return generator.createDeclSpecFromType(expressionType);
|
||||||
} else {// Fallback
|
} else { // Fallback
|
||||||
return createSimpleDeclSpecifier(Kind.eVoid);
|
return createSimpleDeclSpecifier(Kind.eVoid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<ITypedef> getTypdefs(IASTNode extractedNode) {
|
private List<ITypedef> getTypedefs(IASTNode extractedNode) {
|
||||||
final ArrayList<ITypedef> typeDefs = new ArrayList<ITypedef>();
|
final ArrayList<ITypedef> typeDefs = new ArrayList<ITypedef>();
|
||||||
extractedNode.accept(new ASTVisitor() {
|
extractedNode.accept(new ASTVisitor() {
|
||||||
{
|
{
|
||||||
|
@ -148,10 +143,10 @@ public class ExtractExpression extends ExtractedFunctionConstructionHelper {
|
||||||
IASTExpression functionNameExpression = callExpression.getFunctionNameExpression();
|
IASTExpression functionNameExpression = callExpression.getFunctionNameExpression();
|
||||||
IASTName functionName = null;
|
IASTName functionName = null;
|
||||||
|
|
||||||
if(functionNameExpression instanceof CPPASTIdExpression) {
|
if (functionNameExpression instanceof CPPASTIdExpression) {
|
||||||
CPPASTIdExpression idExpression = (CPPASTIdExpression) functionNameExpression;
|
CPPASTIdExpression idExpression = (CPPASTIdExpression) functionNameExpression;
|
||||||
functionName = idExpression.getName();
|
functionName = idExpression.getName();
|
||||||
} else if(functionNameExpression instanceof CPPASTFieldReference) {
|
} else if (functionNameExpression instanceof CPPASTFieldReference) {
|
||||||
CPPASTFieldReference fieldReference = (CPPASTFieldReference) functionNameExpression;
|
CPPASTFieldReference fieldReference = (CPPASTFieldReference) functionNameExpression;
|
||||||
functionName = fieldReference.getFieldName();
|
functionName = fieldReference.getFieldName();
|
||||||
}
|
}
|
||||||
|
@ -160,28 +155,29 @@ public class ExtractExpression extends ExtractedFunctionConstructionHelper {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isReturnTypeAPointer(IASTNode node) {
|
protected boolean isReturnTypeAPointer(IASTNode node) {
|
||||||
if(node instanceof ICPPASTNewExpression) {
|
if (node instanceof ICPPASTNewExpression) {
|
||||||
return true;
|
return true;
|
||||||
} else if(!(node instanceof IASTFunctionCallExpression)) {
|
} else if (!(node instanceof IASTFunctionCallExpression)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
IASTName functionName = findCalledFunctionName((IASTFunctionCallExpression) node);
|
IASTName functionName = findCalledFunctionName((IASTFunctionCallExpression) node);
|
||||||
if(functionName != null) {
|
if (functionName != null) {
|
||||||
IBinding binding = functionName.resolveBinding();
|
IBinding binding = functionName.resolveBinding();
|
||||||
if (binding instanceof CPPFunction) {
|
if (binding instanceof CPPFunction) {
|
||||||
CPPFunction function = (CPPFunction) binding;
|
CPPFunction function = (CPPFunction) binding;
|
||||||
if(function.getDefinition() != null) {
|
if (function.getDefinition() != null) {
|
||||||
IASTNode parent = function.getDefinition().getParent();
|
IASTNode parent = function.getDefinition().getParent();
|
||||||
if(parent instanceof CPPASTFunctionDefinition) {
|
if (parent instanceof CPPASTFunctionDefinition) {
|
||||||
CPPASTFunctionDefinition definition = (CPPASTFunctionDefinition) parent;
|
CPPASTFunctionDefinition definition = (CPPASTFunctionDefinition) parent;
|
||||||
return definition.getDeclarator().getPointerOperators().length > 0;
|
return definition.getDeclarator().getPointerOperators().length > 0;
|
||||||
}
|
}
|
||||||
} else if(hasDeclaration(function)) {
|
} else if (hasDeclaration(function)) {
|
||||||
IASTNode parent = function.getDeclarations()[0].getParent();
|
IASTNode parent = function.getDeclarations()[0].getParent();
|
||||||
if (parent instanceof CPPASTSimpleDeclaration) {
|
if (parent instanceof CPPASTSimpleDeclaration) {
|
||||||
CPPASTSimpleDeclaration declaration = (CPPASTSimpleDeclaration) parent;
|
CPPASTSimpleDeclaration declaration = (CPPASTSimpleDeclaration) parent;
|
||||||
return declaration.getDeclarators().length > 0 && declaration.getDeclarators()[0].getPointerOperators().length > 0;
|
return declaration.getDeclarators().length > 0 &&
|
||||||
|
declaration.getDeclarators()[0].getPointerOperators().length > 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,13 +30,12 @@ import org.eclipse.cdt.internal.ui.refactoring.NodeContainer;
|
||||||
import org.eclipse.cdt.internal.ui.refactoring.NodeContainer.NameInformation;
|
import org.eclipse.cdt.internal.ui.refactoring.NodeContainer.NameInformation;
|
||||||
|
|
||||||
final class SimilarFinderVisitor extends ASTVisitor {
|
final class SimilarFinderVisitor extends ASTVisitor {
|
||||||
|
|
||||||
private final ExtractFunctionRefactoring refactoring;
|
private final ExtractFunctionRefactoring refactoring;
|
||||||
|
|
||||||
private final Vector<IASTNode> trail;
|
private final Vector<IASTNode> trail;
|
||||||
private final IASTName name;
|
private final IASTName name;
|
||||||
private final List<IASTNode> stmts;
|
private final List<IASTNode> stmts;
|
||||||
private int i = 0;
|
private int i;
|
||||||
private NodeContainer similarContainer;
|
private NodeContainer similarContainer;
|
||||||
private final List<IASTStatement> stmtToReplace = new ArrayList<IASTStatement>();
|
private final List<IASTStatement> stmtToReplace = new ArrayList<IASTStatement>();
|
||||||
|
|
||||||
|
@ -51,59 +50,55 @@ final class SimilarFinderVisitor extends ASTVisitor {
|
||||||
this.stmts = stmts;
|
this.stmts = stmts;
|
||||||
this.collector = collector;
|
this.collector = collector;
|
||||||
this.similarContainer = new NodeContainer();
|
this.similarContainer = new NodeContainer();
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
shouldVisitStatements = true;
|
shouldVisitStatements = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int visit(IASTStatement stmt) {
|
public int visit(IASTStatement stmt) {
|
||||||
|
|
||||||
boolean isAllreadyInMainRefactoring = isInSelection(stmt);
|
boolean isAllreadyInMainRefactoring = isInSelection(stmt);
|
||||||
|
|
||||||
if( (!isAllreadyInMainRefactoring)
|
if ((!isAllreadyInMainRefactoring)
|
||||||
&& this.refactoring.isStatementInTrail(stmt, trail, this.refactoring.getIndex())){
|
&& this.refactoring.isStatementInTrail(stmt, trail, this.refactoring.getIndex())) {
|
||||||
stmtToReplace.add(stmt);
|
stmtToReplace.add(stmt);
|
||||||
similarContainer.add(stmt);
|
similarContainer.add(stmt);
|
||||||
++i;
|
++i;
|
||||||
|
|
||||||
if(i==stmts.size()){
|
if (i == stmts.size()) {
|
||||||
//found similar code
|
// Found similar code
|
||||||
|
|
||||||
boolean similarOnReturnWays = true;
|
boolean similarOnReturnWays = true;
|
||||||
for (NameInformation nameInfo : similarContainer.getAllAfterUsedNames()) {
|
for (NameInformation nameInfo : similarContainer.getAllAfterUsedNames()) {
|
||||||
if(this.refactoring.names.containsKey(nameInfo.getDeclaration().getRawSignature())){
|
if (this.refactoring.names.containsKey(nameInfo.getDeclaration().getRawSignature())) {
|
||||||
Integer nameOrderNumber = this.refactoring.names.get(nameInfo.getDeclaration().getRawSignature());
|
Integer nameOrderNumber = this.refactoring.names.get(nameInfo.getDeclaration().getRawSignature());
|
||||||
if(this.refactoring.nameTrail.containsValue(nameOrderNumber)){
|
if (this.refactoring.nameTrail.containsValue(nameOrderNumber)) {
|
||||||
String orgName = null;
|
String orgName = null;
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
for (Entry<String, Integer> entry : this.refactoring.nameTrail.entrySet()) {
|
for (Entry<String, Integer> entry : this.refactoring.nameTrail.entrySet()) {
|
||||||
if(entry.getValue().equals(nameOrderNumber)){
|
if (entry.getValue().equals(nameOrderNumber)) {
|
||||||
orgName = entry.getKey();
|
orgName = entry.getKey();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(orgName != null){
|
if (orgName != null) {
|
||||||
for (NameInformation orgNameInfo : this.refactoring.container.getAllAfterUsedNamesChoosenByUser()) {
|
for (NameInformation orgNameInfo : this.refactoring.container.getAllAfterUsedNamesChoosenByUser()) {
|
||||||
if( orgName.equals(orgNameInfo.getDeclaration().getRawSignature()) ){
|
if (orgName.equals(orgNameInfo.getDeclaration().getRawSignature())) {
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!found){
|
if (!found) {
|
||||||
similarOnReturnWays = false;
|
similarOnReturnWays = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(similarOnReturnWays){
|
if (similarOnReturnWays) {
|
||||||
IASTNode call = refactoring.getMethodCall(name,
|
IASTNode call = refactoring.getMethodCall(name,
|
||||||
this.refactoring.nameTrail, this.refactoring.names,
|
this.refactoring.nameTrail, this.refactoring.names,
|
||||||
this.refactoring.container, similarContainer);
|
this.refactoring.container, similarContainer);
|
||||||
ASTRewrite rewrite = collector.rewriterForTranslationUnit(stmtToReplace.get(0)
|
ASTRewrite rewrite =
|
||||||
.getTranslationUnit());
|
collector.rewriterForTranslationUnit(stmtToReplace.get(0).getTranslationUnit());
|
||||||
TextEditGroup editGroup = new TextEditGroup(Messages.SimilarFinderVisitor_replaceDuplicateCode);
|
TextEditGroup editGroup = new TextEditGroup(Messages.SimilarFinderVisitor_replaceDuplicateCode);
|
||||||
rewrite.replace(stmtToReplace.get(0), call, editGroup);
|
rewrite.replace(stmtToReplace.get(0), call, editGroup);
|
||||||
if (stmtToReplace.size() > 1) {
|
if (stmtToReplace.size() > 1) {
|
||||||
|
@ -112,22 +107,19 @@ final class SimilarFinderVisitor extends ASTVisitor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
return PROCESS_SKIP;
|
return PROCESS_SKIP;
|
||||||
} else {
|
} else {
|
||||||
clear();
|
clear();
|
||||||
return super.visit(stmt);
|
return super.visit(stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isInSelection(IASTStatement stmt) {
|
private boolean isInSelection(IASTStatement stmt) {
|
||||||
List<IASTNode>nodes = this.refactoring.container.getNodesToWrite();
|
List<IASTNode>nodes = this.refactoring.container.getNodesToWrite();
|
||||||
for (IASTNode node : nodes) {
|
for (IASTNode node : nodes) {
|
||||||
if(node.equals(stmt)) {
|
if (node.equals(stmt)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,4 +134,4 @@ final class SimilarFinderVisitor extends ASTVisitor {
|
||||||
this.refactoring.trailPos.setObject(ExtractFunctionRefactoring.NULL_INTEGER);
|
this.refactoring.trailPos.setObject(ExtractFunctionRefactoring.NULL_INTEGER);
|
||||||
stmtToReplace.clear();
|
stmtToReplace.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue