From 31f6abe161ff035b854a58235437afada01a84ce Mon Sep 17 00:00:00 2001 From: Roman Ivanov Date: Thu, 11 Jan 2018 15:51:35 +0700 Subject: [PATCH] CapturingCleaner: fix local variable calls threated as this calls --- .../codeInspection/CapturingCleanerInspection.java | 7 ++++++- .../cleanerCapturingThis/CapturingCleaner.java | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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