diff --git a/java/java-impl/src/com/intellij/codeInspection/CapturingCleanerInspection.java b/java/java-impl/src/com/intellij/codeInspection/CapturingCleanerInspection.java index d27ebe0cc8d7..da1419bfbd92 100644 --- a/java/java-impl/src/com/intellij/codeInspection/CapturingCleanerInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/CapturingCleanerInspection.java @@ -38,6 +38,7 @@ public class CapturingCleanerInspection extends AbstractBaseJavaLocalInspectionT if (trackedObject == null || runnableExpression == null) return; final PsiElement highlightingElement; + final String referenceName; if (trackedObject instanceof PsiThisExpression) { PsiClassType classType = tryCast(trackedObject.getType(), PsiClassType.class); if (classType == null) return; @@ -46,6 +47,7 @@ public class CapturingCleanerInspection extends AbstractBaseJavaLocalInspectionT PsiElement elementCapturingThis = getElementCapturingThis(runnableExpression, trackedClass); if (elementCapturingThis == null) return; highlightingElement = elementCapturingThis; + referenceName = "this"; } else if (trackedObject instanceof PsiReferenceExpression) { PsiVariable variable = tryCast(((PsiReferenceExpression)trackedObject).resolve(), PsiVariable.class); @@ -59,13 +61,15 @@ public class CapturingCleanerInspection extends AbstractBaseJavaLocalInspectionT String variableName = variable.getName(); if (variableName == null) return; highlightingElement = referenceExpression.get(); + referenceName = variableName; } else { return; } - holder.registerProblem(highlightingElement, InspectionsBundle.message("inspection.capturing.cleaner")); + holder.registerProblem(highlightingElement, InspectionsBundle.message("inspection.capturing.cleaner", referenceName)); } + private PsiElement getElementCapturingThis(PsiExpression runnableExpr, PsiClass trackedClass) { if (runnableExpr instanceof PsiMethodReferenceExpression) { PsiMethodReferenceExpression methodReference = (PsiMethodReferenceExpression)runnableExpr; @@ -84,7 +88,7 @@ public class CapturingCleanerInspection extends AbstractBaseJavaLocalInspectionT if (lambda.getParameterList().getParametersCount() != 0) return null; PsiElement lambdaBody = lambda.getBody(); if (lambdaBody == null) return null; - return getElementLambdaCapturingThis(lambdaBody, trackedClass).orElse(null); + return getLambdaElementCapturingThis(lambdaBody, trackedClass).orElse(null); } if (runnableExpr instanceof PsiNewExpression) { PsiNewExpression newExpression = (PsiNewExpression)runnableExpr; @@ -102,7 +106,7 @@ public class CapturingCleanerInspection extends AbstractBaseJavaLocalInspectionT }; } - private static Optional getElementLambdaCapturingThis(@NotNull PsiElement lambdaBody, @NotNull PsiClass containingClass) { + private static Optional getLambdaElementCapturingThis(@NotNull PsiElement lambdaBody, @NotNull PsiClass containingClass) { return StreamEx.ofTree(lambdaBody, el -> StreamEx.of(el.getChildren())) .findAny(element -> isThisCapturingElement(containingClass, element)); } diff --git a/java/java-tests/testData/inspection/cleanerCapturingThis/CapturingCleaner.java b/java/java-tests/testData/inspection/cleanerCapturingThis/CapturingCleaner.java index 6c80dff4d249..5f3824133a8e 100644 --- a/java/java-tests/testData/inspection/cleanerCapturingThis/CapturingCleaner.java +++ b/java/java-tests/testData/inspection/cleanerCapturingThis/CapturingCleaner.java @@ -5,7 +5,7 @@ class Anonymous { static void free(int descriptor) {} - Cleaner.Cleanable cleanable = Cleaner.create().register(this, new Runnable() { + Cleaner.Cleanable cleanable = Cleaner.create().register(this, new Runnable() { @Override public void run() { System.out.println("adsad"); @@ -18,7 +18,7 @@ class Inner { static void free(int descriptor) {} - Cleaner.Cleanable cleanable = Cleaner.create().register(this, new MyRunnable()); + Cleaner.Cleanable cleanable = Cleaner.create().register(this, new MyRunnable()); private class MyRunnable implements Runnable { @Override @@ -33,7 +33,7 @@ class InstanceMethodReference { static void free(int descriptor) {} - Cleaner.Cleanable cleanable = Cleaner.create().register(this, this::run); + Cleaner.Cleanable cleanable = Cleaner.create().register(this, this::run); private void run() { System.out.println("adsad"); @@ -46,7 +46,7 @@ class LambdaExprBodyInstanceMethod { static void free(int descriptor) {} - Cleaner.Cleanable cleanable = Cleaner.create().register(this, () -> run()); + Cleaner.Cleanable cleanable = Cleaner.create().register(this, () -> run()); private void run() { System.out.println("adsad"); @@ -59,7 +59,7 @@ class LambdaInstanceField { Cleaner.Cleanable cleanable = Cleaner.create().register(this, () -> { System.out.println("adsad"); - fileDescriptor = 0; + fileDescriptor = 0; }); } @@ -70,7 +70,7 @@ class LambdaInstanceMethod { Cleaner.Cleanable cleanable = Cleaner.create().register(this, () -> { System.out.println("adsad"); - free(fileDescriptor); + free(fileDescriptor); }); } @@ -81,7 +81,7 @@ class Base { class LambdaInstanceSuperField extends Base { Cleaner.Cleanable cleanable = Cleaner.create().register(this, () -> { System.out.println("adsad"); - fileDescriptor = 0; + fileDescriptor = 0; }); } @@ -91,7 +91,7 @@ class LambdaThis { static void free(int descriptor) {} Cleaner.Cleanable cleanable = Cleaner.create().register(this, () -> { - LambdaThis o = this; + LambdaThis o = this; }); } @@ -139,7 +139,7 @@ class StaticMethodFactory { static ResourceHolder create() { ResourceHolder holder = new ResourceHolder(); - cleaner.register(holder, holder::free); + cleaner.register(holder, holder::free); return holder; } } @@ -154,7 +154,7 @@ class ConstructorDelegatesToStaticMethod { } static void register(ConstructorDelegatesToStaticMethod holder) { - cleaner.register(holder, () -> free(holder.resource)); + cleaner.register(holder, () -> free(holder.resource)); } static void free(int resource){} @@ -168,7 +168,7 @@ class InnerAccesInstanceOuterMembers { Cleaner cleaner = Cleaner.create(); public Inner() { - cleaner.register(this, () -> resource = -1); + cleaner.register(this, () -> resource = -1); } } } \ No newline at end of file diff --git a/platform/platform-resources-en/src/messages/InspectionsBundle.properties b/platform/platform-resources-en/src/messages/InspectionsBundle.properties index 0b4c7bd87506..b671ec765edf 100644 --- a/platform/platform-resources-en/src/messages/InspectionsBundle.properties +++ b/platform/platform-resources-en/src/messages/InspectionsBundle.properties @@ -940,5 +940,5 @@ inspection.conditional.break.in.infinite.loop.description=Conditional break insi inspection.endless.stream.description=Non-short-circuit operation consumes the infinite stream -inspection.capturing.cleaner=Cleaner capture object reference -inspection.capturing.cleaner.description=Cleaner capture object reference \ No newline at end of file +inspection.capturing.cleaner=Runnable passed to Cleaner.register() captures ''{0}'' reference +inspection.capturing.cleaner.description=Cleaner captures object reference \ No newline at end of file