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:
Anna Kozlova
2014-09-11 16:05:20 +04:00
parent 0fe4b24828
commit 7e68549078
3 changed files with 64 additions and 11 deletions
@@ -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);
@@ -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 {
}
@@ -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() {