From 92518cf5c974702a6818fa850fcb6b0a1a3e4fc5 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 9 Sep 2014 15:42:34 +0400 Subject: [PATCH] extract light method object: filter inaccessible variables --- .../ExtractLightMethodObjectHandler.java | 21 ++++++++++++++++--- .../AnonymousClassParams.java | 8 +++++++ .../ExtractMethodObject4DebuggerTest.java | 14 +++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractMethodObject4Debugger/AnonymousClassParams.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java index 3ed6d102713c..5833daaae396 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java @@ -22,18 +22,23 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.controlFlow.*; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.extractMethod.AbstractExtractDialog; +import com.intellij.refactoring.extractMethod.ControlFlowWrapper; import com.intellij.refactoring.extractMethod.InputVariables; import com.intellij.refactoring.extractMethod.PrepareFailedException; +import com.intellij.refactoring.introduceField.ElementToWorkOn; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.VariableData; import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -105,9 +110,19 @@ public class ExtractLightMethodObjectHandler { return null; } - final List variables = ControlFlowUtil.getUsedVariables(controlFlow, - controlFlow.getStartOffset(elementsCopy[0]), - controlFlow.getEndOffset(elementsCopy[elementsCopy.length - 1])); + List variables = ControlFlowUtil.getUsedVariables(controlFlow, + controlFlow.getStartOffset(elementsCopy[0]), + controlFlow.getEndOffset(elementsCopy[elementsCopy.length - 1])); + + variables = ContainerUtil.filter(variables, new Condition() { + @Override + public boolean value(PsiVariable variable) { + final PsiElement variableScope = variable instanceof PsiParameter ? ((PsiParameter)variable).getDeclarationScope() + : PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class, PsiForStatement.class); + return variableScope != null && PsiTreeUtil.isAncestor(variableScope, elementsCopy[elementsCopy.length - 1], false); + } + }); + final String outputVariables = StringUtil.join(variables, new Function() { @Override diff --git a/java/java-tests/testData/refactoring/extractMethodObject4Debugger/AnonymousClassParams.java b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/AnonymousClassParams.java new file mode 100644 index 000000000000..3a722d36aeea --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/AnonymousClassParams.java @@ -0,0 +1,8 @@ +interface I { + void foo(int i) {} +} +class Sample { + void foo() { + System.out.println("hello world"); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java index e8ba1657602e..ea22976efee0 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java @@ -98,6 +98,20 @@ public class ExtractMethodObject4DebuggerTest extends LightRefactoringTestCase { " }"); } + public void testAnonymousClassParams() throws Exception { + doTest("new I() {public void foo(int i) {i++;}};", "new Test().invoke();", + + "public class Test {\n" + + " public void invoke() {\n" + + " new I() {\n" + + " public void foo(int i) {\n" + + " i++;\n" + + " }\n" + + " };\n" + + " }\n" + + " }"); + } + @Override protected Sdk getProjectJDK() { return IdeaTestUtil.getMockJdk18();