From 9735aac8a128d262e3737b3675d9db003311e56b Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 16 Jul 2015 22:21:38 +0300 Subject: [PATCH] fix goto implementation for method refs based on RefType::identifier (IDEA-142490) --- .../JavaTargetElementEvaluator.java | 5 ++++- .../GotoImplementationHandlerTest.java | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/JavaTargetElementEvaluator.java b/java/java-impl/src/com/intellij/codeInsight/JavaTargetElementEvaluator.java index 859f1909fe99..0ae4c3c50af6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/JavaTargetElementEvaluator.java +++ b/java/java-impl/src/com/intellij/codeInsight/JavaTargetElementEvaluator.java @@ -272,7 +272,10 @@ public class JavaTargetElementEvaluator extends TargetElementEvaluatorEx2 implem PsiClass containingClass = ((PsiMember)element).getContainingClass(); final PsiExpression expression = ((PsiReferenceExpression)reference).getQualifierExpression(); PsiClass psiClass; - if (expression != null) { + if (reference instanceof PsiMethodReferenceExpression) { + psiClass = PsiMethodReferenceUtil.getQualifierResolveResult((PsiMethodReferenceExpression)reference).getContainingClass(); + } + else if (expression != null) { psiClass = PsiUtil.resolveClassInType(expression.getType()); } else { if (element instanceof PsiClass) { diff --git a/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationHandlerTest.java b/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationHandlerTest.java index 3d41cdc77d6e..edf6b1c47ced 100644 --- a/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationHandlerTest.java +++ b/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationHandlerTest.java @@ -215,4 +215,22 @@ public class GotoImplementationHandlerTest extends JavaCodeInsightFixtureTestCas assertNotNull(aClass); assertEquals(aClass.getName(), "PsiPackageBase"); } + + public void testMethodReferences() throws Throwable { + PsiFile file = myFixture.addFileToProject("Foo.java", "interface I {void f();}\n" + + "class A implements I { public void f(){}}\n" + + "class B implements I { public void f(){}}\n" + + "class C {\n" + + " void foo(java.util.List l) {l.stream().forEach(I::f);}" + + "}"); + myFixture.configureFromExistingVirtualFile(file.getVirtualFile()); + + final PsiElement[] impls = new GotoImplementationHandler().getSourceAndTargetElements(myFixture.getEditor(), file).targets; + assertEquals(2, impls.length); + final PsiElement meth = impls[0]; + assertTrue(meth instanceof PsiMethod); + final PsiClass aClass = ((PsiMethod)meth).getContainingClass(); + assertNotNull(aClass); + assertEquals(aClass.getName(), "A"); + } } \ No newline at end of file