From 0cc203b17655bd5ee58c036d7c71cd03e2fc7645 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 1 Feb 2010 18:43:49 +0300 Subject: [PATCH] inline parameter: evaluate this expression (IDEA-40666) --- .../inline/InlineParameterExpressionProcessor.java | 17 +++++++++++++++++ .../refactoring/inline/InlineParameterHandler.java | 4 ---- .../refactoring/inlineParameter/RefOuterThis.java | 14 ++++++++++++++ .../refactoring/inlineParameter/RefQualifiedThis.java | 14 ++++++++++++++ .../inlineParameter/RefQualifiedThis.java.after | 14 ++++++++++++++ .../testData/refactoring/inlineParameter/RefThis.java | 15 +++++++++++++++ .../refactoring/inlineParameter/RefThis.java.after | 15 +++++++++++++++ .../refactoring/inline/InlineParameterTest.java | 17 +++++++++++++++++ 8 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineParameter/RefOuterThis.java create mode 100644 java/java-tests/testData/refactoring/inlineParameter/RefQualifiedThis.java create mode 100644 java/java-tests/testData/refactoring/inlineParameter/RefQualifiedThis.java.after create mode 100644 java/java-tests/testData/refactoring/inlineParameter/RefThis.java create mode 100644 java/java-tests/testData/refactoring/inlineParameter/RefThis.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java index 9b59188f26..10e7b652c0 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java @@ -220,6 +220,23 @@ public class InlineParameterExpressionProcessor { refCannotEvaluate.set(Boolean.TRUE); } } + + @Override + public void visitThisExpression(PsiThisExpression thisExpression) { + super.visitThisExpression(thisExpression); + final PsiJavaCodeReferenceElement qualifier = thisExpression.getQualifier(); + PsiElement containingClass; + if (qualifier != null) { + containingClass = qualifier.resolve(); + } else { + containingClass = PsiTreeUtil.getParentOfType(myMethodCall, PsiClass.class); + } + final PsiClass methodContainingClass = myMethod.getContainingClass(); + LOG.assertTrue(methodContainingClass != null); + if (!PsiTreeUtil.isAncestor(containingClass, methodContainingClass, false)) { + refCannotEvaluate.set(Boolean.TRUE); + } + } }); return refCannotEvaluate.isNull(); } diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java index 603f71bc13..17d2e07c50 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterHandler.java @@ -49,10 +49,6 @@ public class InlineParameterHandler extends JavaInlineActionHandler { public static final String REFACTORING_NAME = RefactoringBundle.message("inline.parameter.refactoring"); public boolean canInlineElement(PsiElement element) { - return false; - } - - public boolean canInlineElementInEditor(PsiElement element) { return element instanceof PsiParameter && element.getParent() instanceof PsiParameterList; } diff --git a/java/java-tests/testData/refactoring/inlineParameter/RefOuterThis.java b/java/java-tests/testData/refactoring/inlineParameter/RefOuterThis.java new file mode 100644 index 0000000000..e3ef672070 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/RefOuterThis.java @@ -0,0 +1,14 @@ +public class Subject { + private int myInt; + + public void withClass(Object o) { + myInt += o.hashCode(); + } +} + +class User { + private void oper() { + Subject subj = new Subject(); + subj.withClass(this); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineParameter/RefQualifiedThis.java b/java/java-tests/testData/refactoring/inlineParameter/RefQualifiedThis.java new file mode 100644 index 0000000000..108aa6a0cc --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/RefQualifiedThis.java @@ -0,0 +1,14 @@ +class Outer { + class User { + public class Subject { + public void withClass(Object o) { + System.out.println(o.toString()); + } + } + + private void oper() { + Subject subj = new Subject(); + subj.withClass(Outer.this); + } + } +} diff --git a/java/java-tests/testData/refactoring/inlineParameter/RefQualifiedThis.java.after b/java/java-tests/testData/refactoring/inlineParameter/RefQualifiedThis.java.after new file mode 100644 index 0000000000..be2095da35 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/RefQualifiedThis.java.after @@ -0,0 +1,14 @@ +class Outer { + class User { + public class Subject { + public void withClass() { + System.out.println(Outer.this.toString()); + } + } + + private void oper() { + Subject subj = new Subject(); + subj.withClass(); + } + } +} diff --git a/java/java-tests/testData/refactoring/inlineParameter/RefThis.java b/java/java-tests/testData/refactoring/inlineParameter/RefThis.java new file mode 100644 index 0000000000..99dcac67b7 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/RefThis.java @@ -0,0 +1,15 @@ +class User { + public class Subject { + private int myInt; + + public void withClass(Object o) { + myInt += o.hashCode(); + } + } + + private void oper() { + Subject subj = new Subject(); + subj.withClass(this); + } +} + diff --git a/java/java-tests/testData/refactoring/inlineParameter/RefThis.java.after b/java/java-tests/testData/refactoring/inlineParameter/RefThis.java.after new file mode 100644 index 0000000000..80e93667d3 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/RefThis.java.after @@ -0,0 +1,15 @@ +class User { + public class Subject { + private int myInt; + + public void withClass() { + myInt += User.this.hashCode(); + } + } + + private void oper() { + Subject subj = new Subject(); + subj.withClass(); + } +} + diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java index 1008d2c974..69545e9ce3 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java @@ -5,6 +5,7 @@ import com.intellij.codeInsight.TargetElementUtilBase; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; import com.intellij.psi.PsiElement; +import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.testFramework.LightCodeInsightTestCase; import org.jetbrains.annotations.NonNls; @@ -77,6 +78,22 @@ public class InlineParameterTest extends LightCodeInsightTestCase { doTest(false); } + public void testRefOuterThis() throws Exception { + try { + doTest(false); + } + catch (CommonRefactoringUtil.RefactoringErrorHintException e) { + assertEquals("Parameter initializer depends on values which are not available inside the method and cannot be inlined", e.getMessage()); + } + } + + public void testRefThis() throws Exception { + doTest(false); + } + + public void testRefQualifiedThis() throws Exception { + doTest(false); + } private void doTest(final boolean createLocal) throws Exception { getProject().putUserData(InlineParameterExpressionProcessor.CREATE_LOCAL_FOR_TESTS,createLocal); -- 2.11.4.GIT