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 4b3f63a84932..cb699482ecc2 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java @@ -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); diff --git a/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OffsetsAtCallSite.java b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OffsetsAtCallSite.java new file mode 100644 index 000000000000..353564c51240 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OffsetsAtCallSite.java @@ -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 map = new HashMap(); + map.put(1, 2); + //evaluate here map.entrySet().stream().filter((a) -> (a.getKey()>0)); + 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 map; + + public Inner(Map 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 { +} \ 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 9283fbf2cf51..9321cf9a6695 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java @@ -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> result = new Test(map).invoke();", + "public class Test {\n" + + " private Map map;\n" + + "\n" + + " public Test(Map map) {\n" + + " this.map = map;\n" + + " }\n" + + "\n" + + " public Stream> invoke() {\n" + + " return map.entrySet().stream().filter((a) -> (a.getKey() > 0));\n" + + " }\n" + + " }"); + } @Override protected Sdk getProjectJDK() {