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 {