diff --git a/java/java-impl/src/com/intellij/psi/impl/source/tree/JavaTreeCopyHandler.java b/java/java-impl/src/com/intellij/psi/impl/source/tree/JavaTreeCopyHandler.java index a0234777aa86..229d8f926eeb 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/tree/JavaTreeCopyHandler.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/tree/JavaTreeCopyHandler.java @@ -27,6 +27,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl; import com.intellij.psi.impl.source.SourceTreeToPsiMap; import com.intellij.psi.templateLanguages.OuterLanguageElement; +import com.intellij.psi.tree.IElementType; import com.intellij.util.IncorrectOperationException; import java.util.Map; @@ -38,8 +39,10 @@ public class JavaTreeCopyHandler implements TreeCopyHandler { public TreeElement decodeInformation(TreeElement element, final Map decodingState) { boolean shallDecodeEscapedTexts = shallEncodeEscapedTexts(element, decodingState); if (element instanceof CompositeElement) { - if (element.getElementType() == JavaElementType.JAVA_CODE_REFERENCE || - element.getElementType() == JavaElementType.REFERENCE_EXPRESSION) { + final IElementType elementType = element.getElementType(); + if (elementType == JavaElementType.JAVA_CODE_REFERENCE || + elementType == JavaElementType.REFERENCE_EXPRESSION || + elementType == JavaElementType.METHOD_REF_EXPRESSION) { PsiJavaCodeReferenceElement ref = (PsiJavaCodeReferenceElement)SourceTreeToPsiMap.treeElementToPsi(element); final PsiClass refClass = element.getCopyableUserData(JavaTreeGenerator.REFERENCED_CLASS_KEY); if (refClass != null) { @@ -190,7 +193,8 @@ public class JavaTreeCopyHandler implements TreeCopyHandler { final JavaResolveResult resolveResult = javaRefElement.advancedResolve(false); final PsiElement target = resolveResult.getElement(); if (target instanceof PsiClass && - original.getTreeParent().getElementType() == JavaElementType.REFERENCE_EXPRESSION) { + (original.getTreeParent().getElementType() == JavaElementType.REFERENCE_EXPRESSION || + original.getTreeParent().getElementType() == JavaElementType.METHOD_REF_EXPRESSION)) { ref.putCopyableUserData(JavaTreeGenerator.REFERENCED_CLASS_KEY, (PsiClass)target); } else if ((target instanceof PsiMethod || target instanceof PsiField) && diff --git a/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/after/Bar.java b/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/after/Bar.java new file mode 100644 index 000000000000..f2d55676e291 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/after/Bar.java @@ -0,0 +1,9 @@ +import java.util.Map; +import java.util.Set; + +public class Bar { + void bar() { + Function>, Long> getKey = Map.Entry::getKey; + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/after/Foo.java b/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/after/Foo.java new file mode 100644 index 000000000000..d442388bb9e4 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/after/Foo.java @@ -0,0 +1,7 @@ + +import java.util.Map.Entry; +import java.util.Set; +import java.util.function.Function; + +class Foo { +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/before/Bar.java b/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/before/Bar.java new file mode 100644 index 000000000000..5bee25e91716 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/before/Bar.java @@ -0,0 +1,5 @@ +public class Bar { + void bar() { + Foo.foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/before/Foo.java b/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/before/Foo.java new file mode 100644 index 000000000000..57bf0f4f5007 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/multifile/decodeQualifierInMethodReference/before/Foo.java @@ -0,0 +1,12 @@ + +import java.util.Map.Entry; +import java.util.Set; +import java.util.function.Function; + +class Foo { + public static void foo() { + + Function>, Long> getKey = Entry::getKey; + + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodMultifileTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodMultifileTest.java index ded654d4a8d3..2e2b587955ff 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodMultifileTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodMultifileTest.java @@ -46,6 +46,10 @@ public class InlineMethodMultifileTest extends RefactoringTestCase { doTest("Foo", "foo"); } + public void testDecodeQualifierInMethodReference() throws Exception { + doTest("Foo", "foo"); + } + private void doTest(String className, String methodName) throws Exception { String rootBefore = getRoot() + "/before"; PsiTestUtil.removeAllRoots(myModule, IdeaTestUtil.getMockJdk17());