Link Here
|
8 |
* Contributors: |
8 |
* Contributors: |
9 |
* IBM Corporation - initial API and implementation |
9 |
* IBM Corporation - initial API and implementation |
10 |
* Benjamin Muskalla <bmuskalla@eclipsesource.com> - [extract method] Does not replace similar code in parent class of anonymous class - https://bugs.eclipse.org/bugs/show_bug.cgi?id=160853 |
10 |
* Benjamin Muskalla <bmuskalla@eclipsesource.com> - [extract method] Does not replace similar code in parent class of anonymous class - https://bugs.eclipse.org/bugs/show_bug.cgi?id=160853 |
|
|
11 |
* Benjamin Muskalla <bmuskalla@eclipsesource.com> - [extract method] creates un-needed code - https://bugs.eclipse.org/bugs/show_bug.cgi?id=64245 |
11 |
*******************************************************************************/ |
12 |
*******************************************************************************/ |
12 |
package org.eclipse.jdt.internal.corext.refactoring.code; |
13 |
package org.eclipse.jdt.internal.corext.refactoring.code; |
13 |
|
14 |
|
Link Here
|
906 |
Block result= fAST.newBlock(); |
907 |
Block result= fAST.newBlock(); |
907 |
ListRewrite statements= fRewriter.getListRewrite(result, Block.STATEMENTS_PROPERTY); |
908 |
ListRewrite statements= fRewriter.getListRewrite(result, Block.STATEMENTS_PROPERTY); |
908 |
|
909 |
|
909 |
// Locals that are not passed as an arguments since the extracted method only |
|
|
910 |
// writes to them |
911 |
IVariableBinding[] methodLocals= fAnalyzer.getMethodLocals(); |
912 |
for (int i= 0; i < methodLocals.length; i++) { |
913 |
if (methodLocals[i] != null) { |
914 |
result.statements().add(createDeclaration(methodLocals[i], null)); |
915 |
} |
916 |
} |
917 |
|
918 |
for (Iterator iter= fParameterInfos.iterator(); iter.hasNext();) { |
910 |
for (Iterator iter= fParameterInfos.iterator(); iter.hasNext();) { |
919 |
ParameterInfo parameter= (ParameterInfo)iter.next(); |
911 |
ParameterInfo parameter= (ParameterInfo)iter.next(); |
920 |
if (parameter.isRenamed()) { |
912 |
if (parameter.isRenamed()) { |
Link Here
|
935 |
} else { |
927 |
} else { |
936 |
replacementNode= fRewriter.createGroupNode(callNodes); |
928 |
replacementNode= fRewriter.createGroupNode(callNodes); |
937 |
} |
929 |
} |
|
|
930 |
IVariableBinding skipMethodLocal= null; |
931 |
final ASTNode selectedNode= selectedNodes[0]; |
932 |
IVariableBinding returnValue= fAnalyzer.getReturnValue(); |
938 |
if (extractsExpression) { |
933 |
if (extractsExpression) { |
939 |
// if we have an expression then only one node is selected. |
934 |
// if we have an expression then only one node is selected. |
940 |
ITypeBinding binding= fAnalyzer.getExpressionBinding(); |
935 |
ITypeBinding binding= fAnalyzer.getExpressionBinding(); |
941 |
if (binding != null && (!binding.isPrimitive() || !"void".equals(binding.getName()))) { //$NON-NLS-1$ |
936 |
if (binding != null && (!binding.isPrimitive() || !"void".equals(binding.getName()))) { //$NON-NLS-1$ |
942 |
ReturnStatement rs= fAST.newReturnStatement(); |
937 |
ReturnStatement rs= fAST.newReturnStatement(); |
943 |
rs.setExpression((Expression)fRewriter.createMoveTarget(selectedNodes[0])); |
938 |
rs.setExpression((Expression)fRewriter.createMoveTarget(selectedNode)); |
944 |
statements.insertLast(rs, null); |
939 |
statements.insertLast(rs, null); |
945 |
} else { |
940 |
} else { |
946 |
ExpressionStatement st= fAST.newExpressionStatement((Expression)fRewriter.createMoveTarget(selectedNodes[0])); |
941 |
ExpressionStatement st= fAST.newExpressionStatement((Expression)fRewriter.createMoveTarget(selectedNode)); |
947 |
statements.insertLast(st, null); |
942 |
statements.insertLast(st, null); |
948 |
} |
943 |
} |
949 |
fRewriter.replace(selectedNodes[0], replacementNode, substitute); |
944 |
fRewriter.replace(selectedNode, replacementNode, substitute); |
950 |
} else { |
945 |
} else { |
|
|
946 |
Expression returnExpression= null; |
951 |
if (selectedNodes.length == 1) { |
947 |
if (selectedNodes.length == 1) { |
952 |
statements.insertLast(fRewriter.createMoveTarget(selectedNodes[0]), substitute); |
948 |
boolean isExpressionStatement= selectedNode.getNodeType() == ASTNode.EXPRESSION_STATEMENT; |
953 |
fRewriter.replace(selectedNodes[0], replacementNode, substitute); |
949 |
if (isExpressionStatement |
|
|
950 |
&& returnValue != null |
951 |
&& ((ExpressionStatement)selectedNode).getExpression().getNodeType() == ASTNode.ASSIGNMENT |
952 |
&& Arrays.asList(fAnalyzer.getMethodLocals()).contains(Bindings.getAssignedVariable((Assignment)((ExpressionStatement)selectedNode).getExpression()))) { |
953 |
Assignment assignment= (Assignment)((ExpressionStatement)selectedNode).getExpression(); |
954 |
returnExpression= (Expression)fRewriter.createMoveTarget(assignment.getRightHandSide()); |
955 |
skipMethodLocal= Bindings.getAssignedVariable(assignment); |
956 |
} else { |
957 |
statements.insertLast(fRewriter.createMoveTarget(selectedNode), substitute); |
958 |
} |
959 |
fRewriter.replace(selectedNode, replacementNode, substitute); |
954 |
} else { |
960 |
} else { |
955 |
ListRewrite source= fRewriter.getListRewrite( |
961 |
ListRewrite source= fRewriter.getListRewrite( |
956 |
selectedNodes[0].getParent(), |
962 |
selectedNode.getParent(), |
957 |
(ChildListPropertyDescriptor)selectedNodes[0].getLocationInParent()); |
963 |
(ChildListPropertyDescriptor)selectedNode.getLocationInParent()); |
958 |
ASTNode toMove= source.createMoveTarget( |
964 |
ASTNode toMove= source.createMoveTarget( |
959 |
selectedNodes[0], selectedNodes[selectedNodes.length - 1], |
965 |
selectedNode, selectedNodes[selectedNodes.length - 1], |
960 |
replacementNode, substitute); |
966 |
replacementNode, substitute); |
961 |
statements.insertLast(toMove, substitute); |
967 |
statements.insertLast(toMove, substitute); |
962 |
} |
968 |
} |
963 |
IVariableBinding returnValue= fAnalyzer.getReturnValue(); |
|
|
964 |
if (returnValue != null) { |
969 |
if (returnValue != null) { |
965 |
ReturnStatement rs= fAST.newReturnStatement(); |
970 |
ReturnStatement rs= fAST.newReturnStatement(); |
966 |
rs.setExpression(fAST.newSimpleName(getName(returnValue))); |
971 |
if (returnExpression == null) { |
|
|
972 |
returnExpression= fAST.newSimpleName(getName(returnValue)); |
973 |
} |
974 |
rs.setExpression(returnExpression); |
967 |
statements.insertLast(rs, null); |
975 |
statements.insertLast(rs, null); |
968 |
} |
976 |
} |
969 |
} |
977 |
} |
|
|
978 |
// Locals that are not passed as an arguments since the extracted method only |
979 |
// writes to them |
980 |
IVariableBinding[] methodLocals= fAnalyzer.getMethodLocals(); |
981 |
for (int i= methodLocals.length-1; i >= 0; i--) { |
982 |
boolean skip= false; |
983 |
if(skipMethodLocal != null) { |
984 |
skip= methodLocals[i].isEqualTo(skipMethodLocal); |
985 |
} |
986 |
if (methodLocals[i] != null && !skip) { |
987 |
statements.insertFirst(createDeclaration(methodLocals[i], null), substitute); |
988 |
} |
989 |
} |
970 |
return result; |
990 |
return result; |
971 |
} |
991 |
} |
972 |
|
992 |
|