From fe400fc988f9c720d37c97814c2a16585f42afb6 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 2 Jul 2015 17:44:48 +0300 Subject: [PATCH] method refs: infer 'diamond' if constructor ref type is raw (IDEA-142142) --- .../PsiMethodReferenceCompatibilityConstraint.java | 13 +++++++++++++ .../RawClassTypeOnConstructorReference.java | 6 ++++++ .../daemon/lambda/NewMethodRefHighlightingTest.java | 4 ++++ 3 files changed, 23 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/RawClassTypeOnConstructorReference.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java index de0aaf4d912f..4609b7844a7c 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java @@ -227,6 +227,19 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm psiSubstitutor = TypeConversionUtil.getClassSubstitutor(qContainingClass, paramClass, resolveResult.getSubstitutor()); LOG.assertTrue(psiSubstitutor != null); } + else if (member instanceof PsiMethod && ((PsiMethod)member).isConstructor() || member instanceof PsiClass) { + //15.13.1 + //If ClassType is a raw type, but is not a non-static member type of a raw type, + //the candidate notional member methods are those specified in ยง15.9.3 for a class instance creation expression that uses <> + //to elide the type arguments to a class. + final PsiResolveHelper helper = JavaPsiFacade.getInstance(myExpression.getProject()).getResolveHelper(); + final PsiType[] paramTypes = + member instanceof PsiMethod ? ((PsiMethod)member).getSignature(PsiSubstitutor.EMPTY).getParameterTypes() : PsiType.EMPTY_ARRAY; + psiSubstitutor = helper.inferTypeArguments(qContainingClass.getTypeParameters(), + paramTypes, + signature.getParameterTypes(), + PsiUtil.getLanguageLevel(myExpression)); + } else { psiSubstitutor = PsiSubstitutor.EMPTY; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/RawClassTypeOnConstructorReference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/RawClassTypeOnConstructorReference.java new file mode 100644 index 000000000000..f72da3d1aaa2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/RawClassTypeOnConstructorReference.java @@ -0,0 +1,6 @@ +import java.util.*; +class Test { + public Optional> foo(Optional> args) { + return args.map(HashSet::new).map(Collections::unmodifiableSet); + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java index 94d0a6427790..05e475a286a7 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java @@ -414,6 +414,10 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testRawClassTypeOnConstructorReference() throws Exception { + doTest(); + } + private void doTest() { doTest(false); }