CapturingCleaner: fix local variable calls threated as this calls

This commit is contained in:
Roman Ivanov
2018-01-25 18:38:05 +07:00
parent e0d98aa700
commit 31f6abe161
2 changed files with 19 additions and 1 deletions
@@ -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);
}
@@ -171,4 +171,17 @@ class InnerAccesInstanceOuterMembers {
cleaner.register(this, () -> <warning descr="Runnable passed to Cleaner.register() captures 'this' reference">resource</warning> = -1);
}
}
}
class LambdaUsingAnotherInstanceMember {
int fileDescriptor;
static Cleaner cleaner = Cleaner.create();
void register() {
LambdaUsingAnotherInstanceMember another = new LambdaUsingAnotherInstanceMember();
cleaner.register(this, () -> {
another.fileDescriptor = 12;
});
}
}