diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 6f64749d0241..bb2efcd1d0e1 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -1332,6 +1332,8 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh myHolder.add(checkFeature(expression, Feature.METHOD_REFERENCES)); final PsiElement parent = PsiUtil.skipParenthesizedExprUp(expression.getParent()); if (toReportFunctionalExpressionProblemOnParent(parent)) return; + PsiType functionalInterfaceType = expression.getFunctionalInterfaceType(); + if (functionalInterfaceType != null && !PsiTypesUtil.allTypeParametersResolved(expression, functionalInterfaceType)) return; final JavaResolveResult result; final JavaResolveResult[] results; @@ -1385,7 +1387,6 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh } } - PsiType functionalInterfaceType = expression.getFunctionalInterfaceType(); if (functionalInterfaceType != null) { if (!myHolder.hasErrorResults()) { boolean isFunctional = LambdaUtil.isFunctionalType(functionalInterfaceType); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/IntersectionWithSameInterfaceButDifferentTypeArgument.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/IntersectionWithSameInterfaceButDifferentTypeArgument.java index 682d01c548b5..12d4129a1dcc 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/IntersectionWithSameInterfaceButDifferentTypeArgument.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/IntersectionWithSameInterfaceButDifferentTypeArgument.java @@ -10,7 +10,7 @@ class MyTest { public void from(Collection elements) { } public void foo(final Stream artifactStream) { - from(artifactStream.collect(Collectors.toCollection(TreeSet::new))); + from(artifactStream.collect(Collectors.toCollection(TreeSet::new))); } interface Page extends Iterable {} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorAssignability.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorAssignability.java index abd157921e25..4cf47dfb4b20 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorAssignability.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorAssignability.java @@ -13,7 +13,7 @@ class Foo { public void foo() { reduce(Moo::new); - reduce(AMoo::new); + reduce(AMoo::new); reduce(AAMoo::new); reduce(AAAMoo::new); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/CapturedTypesOfImplicitParameterTypes.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/CapturedTypesOfImplicitParameterTypes.java index 0da62b3506da..bd7eea4b192e 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/CapturedTypesOfImplicitParameterTypes.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/CapturedTypesOfImplicitParameterTypes.java @@ -7,7 +7,7 @@ interface B { class Test { public static void test() { - method1(Test::method2); + method1(Test::method2); } static void method1(B> arg) { } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/ErrorMessageOnTopCallWhenFunctionalInterfaceIsNotInferred.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/ErrorMessageOnTopCallWhenFunctionalInterfaceIsNotInferred.java new file mode 100644 index 000000000000..ef4b905d04c8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/ErrorMessageOnTopCallWhenFunctionalInterfaceIsNotInferred.java @@ -0,0 +1,23 @@ +class Logger {} +class Test { + public static void main(String[] args) { + User user = new User(); + Logger logger = null; + + foo(user, logger, User::getId); + } + + private static void foo(T val, java.util.logging.Logger logger, java.util.function.Function idFunction) { } +} + +class User { + private String Id; + + public String getId() { + return Id; + } + + public void setId(String id) { + this.Id = id; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java index 0a4ef3b1b7d8..4422186196c6 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java @@ -194,6 +194,7 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase { public void testPreferErrorOnTopLevelToFailedSubstitutorOnNestedLevel() { doTest(); } public void testDontIgnoreIncompatibilitiesDuringFirstApplicabilityCheck() { doTest(); } public void testCaptureOnDedicatedParameterOfSecondSearch() { doTest(); } + public void testErrorMessageOnTopCallWhenFunctionalInterfaceIsNotInferred() { doTest(); } private void doTest() { doTest(false);