fix goto implementation for method refs based on RefType::identifier (IDEA-142490)

This commit is contained in:
Anna Kozlova
2015-07-16 22:26:58 +03:00
parent 992c5ac31e
commit 9735aac8a1
2 changed files with 22 additions and 1 deletions
@@ -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) {
@@ -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<I> l) {l.stream().forEach(I::<caret>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");
}
}