From 665894b44b2d3c0b0fe2a6e72b867346b0b8e3d9 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 22 Oct 2012 15:56:59 +0200 Subject: [PATCH] method refs: allow unchecked conversions in default constructors (IDEA-93346) --- .../src/com/intellij/psi/LambdaUtil.java | 2 +- .../methodRef/ConstructorAssignability.java | 44 +++++++++++++++++++ .../lambda/MethodRefHighlightingTest.java | 4 ++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorAssignability.java diff --git a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java index 66abdd1a1ad2..64d437f108ae 100644 --- a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java @@ -637,7 +637,7 @@ public class LambdaUtil { if (interfaceReturnType != null) { if (interfaceReturnType == PsiType.VOID) return true; final PsiClassType classType = JavaPsiFacade.getElementFactory(methodReferenceExpression.getProject()).createType((PsiClass)resolve, result.getSubstitutor()); - if (TypeConversionUtil.isAssignable(interfaceReturnType, classType, false)) { + if (TypeConversionUtil.isAssignable(interfaceReturnType, classType, !((PsiClass)resolve).hasTypeParameters())) { final PsiParameter[] parameters = method.getParameterList().getParameters(); if (parameters.length == 0) return true; if (parameters.length == 1) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorAssignability.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorAssignability.java new file mode 100644 index 000000000000..bce0661cfb27 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorAssignability.java @@ -0,0 +1,44 @@ +class Foo { + public interface Factory { + U make(); + } + + interface ASink> { + public void combine(K other); + } + + static > R reduce(Factory factory) { + return null; + } + + public void foo() { + reduce(Moo::new); + reduce(AMoo::new); + reduce(AAMoo::new); + reduce(AAAMoo::new); + } + + private class Moo implements ASink { + @Override + public void combine(Moo other) { + } + } + + private class AMoo { + } + + private class AAMoo implements ASink { + @Override + public void combine(AAMoo other) { + } + } + + private class AAAMoo implements ASink { + private AAAMoo() { + } + + @Override + public void combine(AAAMoo other) { + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MethodRefHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MethodRefHighlightingTest.java index e4e8e8b2cae1..166e5a18ce47 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MethodRefHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MethodRefHighlightingTest.java @@ -129,6 +129,10 @@ public class MethodRefHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testConstructorAssignability() throws Exception { + doTest(); + } + public void testInferenceFromReturnType() throws Exception { doTest(true); }