From 4adc3db92c82327b5f7a86cdce49183fcb4447e9 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 17 Sep 2012 19:35:41 +0200 Subject: [PATCH] lambda: return type compatibility test --- .../src/com/intellij/psi/LambdaUtil.java | 9 +++++- .../ReturnTypeCompatibility1.java | 31 +++++++++++++++++++ .../daemon/lambda/LambdaHighlightingTest.java | 4 +++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/ReturnTypeCompatibility1.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 50b18b84baad..17fd89007daf 100644 --- a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java @@ -306,7 +306,14 @@ public class LambdaUtil { @Nullable private static PsiType getReturnType(PsiClass psiClass, MethodSignature methodSignature) { final PsiMethod method = getMethod(psiClass, methodSignature); - return method != null ? method.getReturnType() : null; + if (method != null) { + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) return null; + return TypeConversionUtil.getSuperClassSubstitutor(containingClass, psiClass, PsiSubstitutor.EMPTY).substitute(method.getReturnType()); + } + else { + return null; + } } @Nullable diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/ReturnTypeCompatibility1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/ReturnTypeCompatibility1.java new file mode 100644 index 000000000000..d34d61ffad42 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/ReturnTypeCompatibility1.java @@ -0,0 +1,31 @@ +class Test { + + interface I { + B f(A a); + } + + interface II extends I { } + + static class Foo { + boolean forAll(final I f) { + return false; + } + + String forAll(final II f) { + return ""; + } + + String forAll2(final II f) { + return ""; + } + } + + void foo(Foo as, final Foo ac) { + boolean b1 = as.forAll(s -> ac.forAll(c -> false)); + String s1 = as.forAll(s -> ac.forAll(c -> "")); + boolean b2 = as.forAll(s -> ac.forAll(c -> "")); + String s2 = as.forAll2(s -> ac.forAll2(c -> false)); + boolean b3 = as.forAll((I)s -> ac.forAll((I)c -> "")); + String s3 = as.forAll((II)s -> ac.forAll((II)c -> false)); + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java index 1899a5c0d118..46646b36afcd 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java @@ -100,6 +100,10 @@ public class LambdaHighlightingTest extends LightDaemonAnalyzerTestCase { public void testLambdaRawOrNot() throws Exception { doTest(); } + + public void testReturnTypeCompatibility1() throws Exception { + doTest(); + } public void testNoInferenceResult() throws Exception { doTest();