diff --git a/java/java-impl/src/com/intellij/codeInspection/CapturingCleanerInspection.java b/java/java-impl/src/com/intellij/codeInspection/CapturingCleanerInspection.java index da1419bfbd92..43735954c63d 100644 --- a/java/java-impl/src/com/intellij/codeInspection/CapturingCleanerInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/CapturingCleanerInspection.java @@ -70,7 +70,9 @@ public class CapturingCleanerInspection extends AbstractBaseJavaLocalInspectionT } - private PsiElement getElementCapturingThis(PsiExpression runnableExpr, PsiClass trackedClass) { + @Nullable + private PsiElement getElementCapturingThis(@NotNull PsiExpression runnableExpr, + @NotNull PsiClass trackedClass) { if (runnableExpr instanceof PsiMethodReferenceExpression) { PsiMethodReferenceExpression methodReference = (PsiMethodReferenceExpression)runnableExpr; if (PsiMethodReferenceUtil.isStaticallyReferenced(methodReference)) return null; @@ -116,6 +118,9 @@ public class CapturingCleanerInspection extends AbstractBaseJavaLocalInspectionT return PsiUtil.resolveClassInType(((PsiThisExpression)element).getType()) == containingClass; } else if (element instanceof PsiReferenceExpression) { + PsiReferenceExpression qualifierReference = + tryCast(((PsiReferenceExpression)element).getQualifierExpression(), PsiReferenceExpression.class); + if (qualifierReference != null) return false; PsiMember member = tryCast(((PsiReferenceExpression)element).resolve(), PsiMember.class); return memberBringsThisRef(containingClass, member); } diff --git a/java/java-tests/testData/inspection/cleanerCapturingThis/CapturingCleaner.java b/java/java-tests/testData/inspection/cleanerCapturingThis/CapturingCleaner.java index 5f3824133a8e..171bdfafab00 100644 --- a/java/java-tests/testData/inspection/cleanerCapturingThis/CapturingCleaner.java +++ b/java/java-tests/testData/inspection/cleanerCapturingThis/CapturingCleaner.java @@ -171,4 +171,17 @@ class InnerAccesInstanceOuterMembers { cleaner.register(this, () -> resource = -1); } } +} + +class LambdaUsingAnotherInstanceMember { + int fileDescriptor; + + static Cleaner cleaner = Cleaner.create(); + + void register() { + LambdaUsingAnotherInstanceMember another = new LambdaUsingAnotherInstanceMember(); + cleaner.register(this, () -> { + another.fileDescriptor = 12; + }); + } } \ No newline at end of file