mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-13 21:55:01 +07:00
extract light method object: calculate offsets related to valid parent so inserted during refactoring import would be taken into account
This commit is contained in:
+5
-11
@@ -16,12 +16,7 @@
|
||||
package com.intellij.refactoring.extractMethodObject;
|
||||
|
||||
import com.intellij.codeInsight.CodeInsightUtil;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.command.CommandProcessor;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.editor.RangeMarker;
|
||||
import com.intellij.openapi.editor.ScrollType;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
@@ -30,15 +25,12 @@ 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.impl.source.PostprocessReformattingAspect;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.refactoring.extractMethod.AbstractExtractDialog;
|
||||
import com.intellij.refactoring.extractMethod.InputVariables;
|
||||
import com.intellij.refactoring.extractMethod.PrepareFailedException;
|
||||
import com.intellij.refactoring.util.CommonRefactoringUtil;
|
||||
import com.intellij.refactoring.util.RefactoringUtil;
|
||||
import com.intellij.refactoring.util.VariableData;
|
||||
import com.intellij.refactoring.util.duplicates.DuplicatesImpl;
|
||||
import com.intellij.usageView.UsageInfo;
|
||||
import com.intellij.util.Function;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
@@ -117,12 +109,13 @@ public class ExtractLightMethodObjectHandler {
|
||||
final String uniqueResultName = JavaCodeStyleManager.getInstance(project).suggestUniqueVariableName("result", elementsCopy[0], true);
|
||||
final String statementText = expressionType.getCanonicalText() + " " + uniqueResultName + " = " + expr.getText() + ";";
|
||||
elementsCopy[elementsCopy.length - 1] = elementsCopy[elementsCopy.length - 1]
|
||||
.replace(elementFactory.createStatementFromText(statementText, elementsCopy[elementsCopy.length -1]));
|
||||
.replace(elementFactory.createStatementFromText(statementText, elementsCopy[elementsCopy.length - 1]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final int start = elementsCopy[0].getTextRange().getStartOffset();
|
||||
LOG.assertTrue(elementsCopy[0].getParent() == container, "element: " + elementsCopy[0].getText() + "; container: " + container.getText());
|
||||
final int startOffsetInContainer = elementsCopy[0].getStartOffsetInParent();
|
||||
|
||||
final ControlFlow controlFlow;
|
||||
try {
|
||||
@@ -186,7 +179,8 @@ public class ExtractLightMethodObjectHandler {
|
||||
return null;
|
||||
}
|
||||
|
||||
final String generatedCall = copy.getText().substring(start, outStatement.getTextOffset());
|
||||
final int startOffset = startOffsetInContainer + container.getTextRange().getStartOffset();
|
||||
final String generatedCall = copy.getText().substring(startOffset, outStatement.getTextOffset());
|
||||
return new ExtractedData(generatedCall,
|
||||
(PsiClass)CodeStyleManager.getInstance(project).reformat(extractMethodObjectProcessor.getInnerClass()),
|
||||
originalAnchor);
|
||||
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
package my;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
class Java8Private {
|
||||
public static void main(String[] args) {
|
||||
new Java8Private().foo();
|
||||
}
|
||||
|
||||
private void foo() {
|
||||
final Map<Integer,Integer> map = new HashMap<Integer,Integer>();
|
||||
map.put(1, 2);
|
||||
//evaluate here map.entrySet().stream().filter((a) -> (a.getKey()>0));
|
||||
<caret>new Inner(map).invoke();
|
||||
map.put(3, 5);
|
||||
}
|
||||
|
||||
private void zoo(int a) {
|
||||
System.out.println("DONE " + a);
|
||||
}
|
||||
|
||||
|
||||
public class Inner extends MagicAccessorBridge {
|
||||
final Map<Integer,Integer> map;
|
||||
|
||||
public Inner(Map<Integer, Integer> map) {
|
||||
this.map = map;
|
||||
}
|
||||
|
||||
void invoke() {
|
||||
map.entrySet().stream().forEach((a) -> accessorZoo(Java8Private.this, a.getValue()));
|
||||
}
|
||||
|
||||
// accessor
|
||||
void accessorZoo(Java8Private obj, int a) {
|
||||
obj.zoo(a);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class MagicAccessorBridge {
|
||||
}
|
||||
+15
@@ -156,6 +156,21 @@ public class ExtractMethodObject4DebuggerTest extends LightRefactoringTestCase {
|
||||
}
|
||||
|
||||
|
||||
public void testOffsetsAtCallSite() throws Exception {
|
||||
doTest("map.entrySet().stream().filter((a) -> (a.getKey()>0));",
|
||||
"java.util.stream.Stream<Map.Entry<Integer,Integer>> result = new Test(map).invoke();",
|
||||
"public class Test {\n" +
|
||||
" private Map<Integer, Integer> map;\n" +
|
||||
"\n" +
|
||||
" public Test(Map<Integer, Integer> map) {\n" +
|
||||
" this.map = map;\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" public Stream<Map.Entry<Integer, Integer>> invoke() {\n" +
|
||||
" return map.entrySet().stream().filter((a) -> (a.getKey() > 0));\n" +
|
||||
" }\n" +
|
||||
" }");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Sdk getProjectJDK() {
|
||||
|
||||
Reference in New Issue
Block a user