diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java index 029db164f0c3..2408bbba5bff 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java @@ -162,7 +162,27 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase LOG.assertTrue(componentType != null, qualifierResolveResult.getSubstitutor()); //15.13.1 A method reference expression of the form ArrayType :: new is always exact. return factory.createMethodFromText("public " + componentType.createArrayType().getCanonicalText() + " __array__(int i) {return null;}", this); - } else { + } + else { + if (getQualifierType() == null) { + //ClassType is raw or is a non-static member type of a raw type. + PsiClass aClass = containingClass; + while (aClass != null) { + if (aClass.hasTypeParameters()) { + return null; + } + + if (aClass.hasModifierProperty(PsiModifier.STATIC)) { + break; + } + + aClass = aClass.getContainingClass(); + + if (PsiTreeUtil.isAncestor(aClass, this, true)) { + break; + } + } + } methods = containingClass.getConstructors(); } } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/PsiPolyExpressionUtilTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/PsiPolyExpressionUtilTest.java index d589910c8be4..e1d315e8f999 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/PsiPolyExpressionUtilTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/PsiPolyExpressionUtilTest.java @@ -150,6 +150,30 @@ public class PsiPolyExpressionUtilTest extends LightCodeInsightFixtureTestCase { assertFalse(InferenceSession.isPertinentToApplicability(psiExpression, meths[0])); } + public void testNotExactMethodReferenceOnRawClassType() throws Exception { + myFixture.configureByText("Foo.java", "class Foo {" + + " class Test{ Test(){}}" + + " {Runnable r = Test::new;}" + + "}"); + final PsiElement elementAtCaret = myFixture.getFile().findElementAt(myFixture.getCaretOffset()); + assertNotNull(elementAtCaret); + final PsiExpression psiExpression = PsiTreeUtil.getParentOfType(elementAtCaret, PsiExpression.class); + assertInstanceOf(psiExpression, PsiMethodReferenceExpression.class); + assertFalse(((PsiMethodReferenceExpression)psiExpression).isExact()); + } + + public void testExactMethodReferenceOnGenericClassType() throws Exception { + myFixture.configureByText("Foo.java", "class Foo {" + + " class Test{ Test(){}}" + + " {Runnable r = Test::new;}" + + "}"); + final PsiElement elementAtCaret = myFixture.getFile().findElementAt(myFixture.getCaretOffset()); + assertNotNull(elementAtCaret); + final PsiExpression psiExpression = PsiTreeUtil.getParentOfType(elementAtCaret, PsiExpression.class); + assertInstanceOf(psiExpression, PsiMethodReferenceExpression.class); + assertTrue(((PsiMethodReferenceExpression)psiExpression).isExact()); + } + private boolean doTestLambdaPertinent(final String barText) { myFixture.configureByText("Foo.java", "import java.util.*;" + "class Foo {" +