inline parameter: take advantages from inline local (IDEA-135610)

This commit is contained in:
Anna Kozlova
2015-01-28 19:06:42 +03:00
parent 8c63921e02
commit a94175f4f8
5 changed files with 35 additions and 16 deletions
@@ -337,9 +337,9 @@ public class InlineLocalHandler extends JavaInlineActionHandler {
}
@Nullable
private static PsiExpression getDefToInline(final PsiLocalVariable local,
final PsiElement refExpr,
final PsiCodeBlock block) {
static PsiExpression getDefToInline(final PsiVariable local,
final PsiElement refExpr,
final PsiCodeBlock block) {
if (refExpr != null) {
PsiElement def;
if (refExpr instanceof PsiReferenceExpression && PsiUtil.isAccessedForWriting((PsiExpression) refExpr)) {
@@ -16,6 +16,7 @@
package com.intellij.refactoring.inline;
import com.intellij.codeInsight.PsiEquivalenceUtil;
import com.intellij.codeInsight.TargetElementUtilBase;
import com.intellij.codeInspection.sameParameterValue.SameParameterValueInspection;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.openapi.application.ApplicationManager;
@@ -117,8 +118,8 @@ public class InlineParameterHandler extends JavaInlineActionHandler {
return true;
}
});
final int offset = editor.getCaretModel().getOffset();
final PsiElement refExpr = psiElement.getContainingFile().findElementAt(offset);
final PsiReference reference = TargetElementUtilBase.findReference(editor);
final PsiReferenceExpression refExpr = reference instanceof PsiReferenceExpression ? ((PsiReferenceExpression)reference) : null;
final PsiCodeBlock codeBlock = PsiTreeUtil.getParentOfType(refExpr, PsiCodeBlock.class);
if (codeBlock != null) {
final PsiElement[] defs = DefUseUtil.getDefs(codeBlock, psiParameter, refExpr);
@@ -127,19 +128,22 @@ public class InlineParameterHandler extends JavaInlineActionHandler {
if (def instanceof PsiReferenceExpression && PsiUtil.isOnAssignmentLeftHand((PsiExpression)def)) {
final PsiExpression rExpr = ((PsiAssignmentExpression)def.getParent()).getRExpression();
if (rExpr != null) {
final PsiElement[] refs = DefUseUtil.getRefs(codeBlock, psiParameter, refExpr);
PsiExpression toInline = InlineLocalHandler.getDefToInline(psiParameter, refExpr, codeBlock);
if (toInline != null) {
final PsiElement[] refs = DefUseUtil.getRefs(codeBlock, psiParameter, toInline);
if (InlineLocalHandler.checkRefsInAugmentedAssignmentOrUnaryModified(refs, def) == null) {
new WriteCommandAction(project) {
@Override
protected void run(Result result) throws Throwable {
for (final PsiElement ref : refs) {
InlineUtil.inlineVariable(psiParameter, rExpr, (PsiJavaCodeReferenceElement)ref);
if (InlineLocalHandler.checkRefsInAugmentedAssignmentOrUnaryModified(refs, def) == null) {
new WriteCommandAction(project) {
@Override
protected void run(Result result) throws Throwable {
for (final PsiElement ref : refs) {
InlineUtil.inlineVariable(psiParameter, rExpr, (PsiJavaCodeReferenceElement)ref);
}
def.getParent().delete();
}
def.getParent().delete();
}
}.execute();
return;
}.execute();
return;
}
}
}
}
@@ -0,0 +1,6 @@
class Test {
String foo(String content) {
content = content.replace("a", "b");
return con<caret>tent;
}
}
@@ -0,0 +1,5 @@
class Test {
String foo(String content) {
return content.replace("a", "b");
}
}
@@ -122,6 +122,10 @@ public class InlineParameterTest extends LightRefactoringTestCase {
}
}
public void testRightSideAssignment() throws Exception {
doTest(false);
}
public void testRefNewInnerForMethod() throws Exception {
doTest(false);
}