CapturingCleanerInspection: get back description, renaming

This commit is contained in:
Roman Ivanov
2018-01-25 18:38:05 +07:00
parent c2484042bc
commit e0d98aa700
3 changed files with 20 additions and 16 deletions
@@ -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<PsiElement> getElementLambdaCapturingThis(@NotNull PsiElement lambdaBody, @NotNull PsiClass containingClass) {
private static Optional<PsiElement> getLambdaElementCapturingThis(@NotNull PsiElement lambdaBody, @NotNull PsiClass containingClass) {
return StreamEx.ofTree(lambdaBody, el -> StreamEx.of(el.getChildren()))
.findAny(element -> isThisCapturingElement(containingClass, element));
}
@@ -5,7 +5,7 @@ class Anonymous {
static void free(int descriptor) {}
Cleaner.Cleanable cleanable = Cleaner.create().register(this, <warning descr="Cleaner capture object reference">new Runnable() {
Cleaner.Cleanable cleanable = Cleaner.create().register(this, <warning descr="Runnable passed to Cleaner.register() captures 'this' reference">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 <warning descr="Cleaner capture object reference">MyRunnable</warning>());
Cleaner.Cleanable cleanable = Cleaner.create().register(this, new <warning descr="Runnable passed to Cleaner.register() captures 'this' reference">MyRunnable</warning>());
private class MyRunnable implements Runnable {
@Override
@@ -33,7 +33,7 @@ class InstanceMethodReference {
static void free(int descriptor) {}
Cleaner.Cleanable cleanable = Cleaner.create().register(this, <warning descr="Cleaner capture object reference">this</warning>::run);
Cleaner.Cleanable cleanable = Cleaner.create().register(this, <warning descr="Runnable passed to Cleaner.register() captures 'this' reference">this</warning>::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, () -> <warning descr="Cleaner capture object reference">run</warning>());
Cleaner.Cleanable cleanable = Cleaner.create().register(this, () -> <warning descr="Runnable passed to Cleaner.register() captures 'this' reference">run</warning>());
private void run() {
System.out.println("adsad");
@@ -59,7 +59,7 @@ class LambdaInstanceField {
Cleaner.Cleanable cleanable = Cleaner.create().register(this, () -> {
System.out.println("adsad");
<warning descr="Cleaner capture object reference">fileDescriptor</warning> = 0;
<warning descr="Runnable passed to Cleaner.register() captures 'this' reference">fileDescriptor</warning> = 0;
});
}
@@ -70,7 +70,7 @@ class LambdaInstanceMethod {
Cleaner.Cleanable cleanable = Cleaner.create().register(this, () -> {
System.out.println("adsad");
free(<warning descr="Cleaner capture object reference">fileDescriptor</warning>);
free(<warning descr="Runnable passed to Cleaner.register() captures 'this' reference">fileDescriptor</warning>);
});
}
@@ -81,7 +81,7 @@ class Base {
class LambdaInstanceSuperField extends Base {
Cleaner.Cleanable cleanable = Cleaner.create().register(this, () -> {
System.out.println("adsad");
<warning descr="Cleaner capture object reference">fileDescriptor</warning> = 0;
<warning descr="Runnable passed to Cleaner.register() captures 'this' reference">fileDescriptor</warning> = 0;
});
}
@@ -91,7 +91,7 @@ class LambdaThis {
static void free(int descriptor) {}
Cleaner.Cleanable cleanable = Cleaner.create().register(this, () -> {
LambdaThis o = <warning descr="Cleaner capture object reference">this</warning>;
LambdaThis o = <warning descr="Runnable passed to Cleaner.register() captures 'this' reference">this</warning>;
});
}
@@ -139,7 +139,7 @@ class StaticMethodFactory {
static ResourceHolder create() {
ResourceHolder holder = new ResourceHolder();
cleaner.register(holder, <warning descr="Cleaner capture object reference">holder</warning>::free);
cleaner.register(holder, <warning descr="Runnable passed to Cleaner.register() captures 'holder' reference">holder</warning>::free);
return holder;
}
}
@@ -154,7 +154,7 @@ class ConstructorDelegatesToStaticMethod {
}
static void register(ConstructorDelegatesToStaticMethod holder) {
cleaner.register(holder, () -> free(<warning descr="Cleaner capture object reference">holder</warning>.resource));
cleaner.register(holder, () -> free(<warning descr="Runnable passed to Cleaner.register() captures 'holder' reference">holder</warning>.resource));
}
static void free(int resource){}
@@ -168,7 +168,7 @@ class InnerAccesInstanceOuterMembers {
Cleaner cleaner = Cleaner.create();
public Inner() {
cleaner.register(this, () -> <warning descr="Cleaner capture object reference">resource</warning> = -1);
cleaner.register(this, () -> <warning descr="Runnable passed to Cleaner.register() captures 'this' reference">resource</warning> = -1);
}
}
}
@@ -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
inspection.capturing.cleaner=Runnable passed to Cleaner.register() captures ''{0}'' reference
inspection.capturing.cleaner.description=Cleaner captures object reference