mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
extract light method object: filter inaccessible variables
This commit is contained in:
+18
-3
@@ -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<PsiVariable> variables = ControlFlowUtil.getUsedVariables(controlFlow,
|
||||
controlFlow.getStartOffset(elementsCopy[0]),
|
||||
controlFlow.getEndOffset(elementsCopy[elementsCopy.length - 1]));
|
||||
List<PsiVariable> variables = ControlFlowUtil.getUsedVariables(controlFlow,
|
||||
controlFlow.getStartOffset(elementsCopy[0]),
|
||||
controlFlow.getEndOffset(elementsCopy[elementsCopy.length - 1]));
|
||||
|
||||
variables = ContainerUtil.filter(variables, new Condition<PsiVariable>() {
|
||||
@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<PsiVariable, String>() {
|
||||
@Override
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
interface I {
|
||||
void foo(int i) {}
|
||||
}
|
||||
class Sample {
|
||||
void foo() {
|
||||
System.out.println("hello <caret>world");
|
||||
}
|
||||
}
|
||||
+14
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user