From 39154531ec86ad5b68f93bdf1ef92a4e095ada9e Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 6 Oct 2014 10:39:43 +0200 Subject: [PATCH] unchecked warning: do not traverse through lambda bounds (IDEA-130810) --- .../UncheckedWarningLocalInspectionBase.java | 3 +- ...kedWarningInsideLambdaReturnStatement.java | 65 +++++++++++++++++++ .../lambda/GenericsHighlighting8Test.java | 4 ++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/UncheckedWarningInsideLambdaReturnStatement.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspectionBase.java index fa2789880371..b24f152537a5 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspectionBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspectionBase.java @@ -375,8 +375,9 @@ public class UncheckedWarningLocalInspectionBase extends BaseJavaBatchLocalInspe public void visitReturnStatement(PsiReturnStatement statement) { super.visitReturnStatement(statement); if (IGNORE_UNCHECKED_ASSIGNMENT) return; + final PsiLambdaExpression lambdaExpression = PsiTreeUtil.getParentOfType(statement, PsiLambdaExpression.class); final PsiMethod method = PsiTreeUtil.getParentOfType(statement, PsiMethod.class); - if (method != null) { + if (method != null && (lambdaExpression == null || PsiTreeUtil.isAncestor(lambdaExpression, method, true))) { final PsiType returnType = method.getReturnType(); if (returnType != null && returnType != PsiType.VOID) { final PsiExpression returnValue = statement.getReturnValue(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/UncheckedWarningInsideLambdaReturnStatement.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/UncheckedWarningInsideLambdaReturnStatement.java new file mode 100644 index 000000000000..856523a80fb5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/UncheckedWarningInsideLambdaReturnStatement.java @@ -0,0 +1,65 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +class Test { + + private Repository repository = null; + + public Stream test() { + return repository.all() + .flatMap(foo -> { + + class AB { + List a() { + return new ArrayList(); + } + } + + AB ab = new AB(); + System.out.println(ab); + + if (foo != null) { + return repository.update(); + } + return Stream.empty(); + }) + .map(UpdateResult::getPerson); + } + + + public static class Repository { + + public Stream all() { + return Stream.empty(); + } + + public Stream update() { + return Stream.empty(); + } + + } + + public static class Person { + } + + public static class UpdateResult { + + private final Person person; + + private final Object metadata; + + public UpdateResult(Person person, Object metadata) { + this.person = person; + this.metadata = metadata; + } + + public Person getPerson() { + return person; + } + + public Object getMetadata() { + return metadata; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java index a919843a3164..49027135eecf 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java @@ -762,6 +762,10 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { public void testIDEA78402() { doTest(); } + public void testUncheckedWarningInsideLambdaReturnStatement() throws Exception { + doTest(true); + } + private void doTest() { doTest(false); }