diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/DefiniteAssignmentUtil.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/DefiniteAssignmentUtil.java index c9dcbbe031be..78f23da72598 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/DefiniteAssignmentUtil.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/DefiniteAssignmentUtil.java @@ -525,6 +525,13 @@ public final class DefiniteAssignmentUtil { final PsiInstanceOfExpression instanceOfExpression = (PsiInstanceOfExpression)expression; checkExpression(instanceOfExpression.getOperand(), definiteAssignment, value); } + else if (expression instanceof PsiLambdaExpression) { + final PsiLambdaExpression lambdaExpression = (PsiLambdaExpression)expression; + final boolean du = definiteAssignment.isDefinitelyUnassigned(); + definiteAssignment.set(definiteAssignment.isDefinitelyAssigned(), false); + checkLambdaExpression(lambdaExpression, definiteAssignment); + definiteAssignment.set(definiteAssignment.isDefinitelyAssigned(), du); + } else if (expression instanceof PsiMethodCallExpression) { final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)expression; checkMethodCallExpression(methodCallExpression, definiteAssignment, value); @@ -653,6 +660,18 @@ public final class DefiniteAssignmentUtil { definiteAssignment.and(resultDa, resultDu); } + private static void checkLambdaExpression(PsiLambdaExpression lambdaExpression, DefiniteAssignment definiteAssignment) { + final PsiElement body = lambdaExpression.getBody(); + if (body instanceof PsiExpression) { + final PsiExpression bodyExpression = (PsiExpression)body; + checkExpression(bodyExpression, definiteAssignment, BooleanExpressionValue.UNDEFINED); + } + else if (body instanceof PsiCodeBlock) { + final PsiCodeBlock codeBlock = (PsiCodeBlock)body; + checkCodeBlock(codeBlock, definiteAssignment); + } + } + private static void checkMethodCallExpression(PsiMethodCallExpression methodCallExpression, DefiniteAssignment definiteAssignment, BooleanExpressionValue value) { diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/field_final/FieldMayBeFinal.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/field_final/FieldMayBeFinal.java index 37176beb5548..467cbd61d17e 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/field_final/FieldMayBeFinal.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/field_final/FieldMayBeFinal.java @@ -923,6 +923,46 @@ class T64 { s=""; } } +class T65 { + private Runnable r; // may not be final + T65() { + r = () -> System.out.println(r); + } +} +class T66 { + private String s; // may be final + T66() { + s = "10"; + Runnable r = () -> System.out.println(s); + } +} +class T67 { + private String s; // may not be final + T67() { + Runnable r = () -> System.out.println(s); + s = "10"; + } +} +class T68 { + private Runnable r; // may be final, compare to T65 + T68() { + r = () -> System.out.println((this).r); + } +} +class T69 { + private String s; // may not be final + T69() { + Runnable r = () -> s = "asdf"; + } +} +class T70 { + private String s; // may not be final + T70() { + Runnable r = () -> s = "asdf"; + s = ""; + } +} + class Foo { public interface Accessor {