mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
add a dev kit inspection: try to write stateless EP;
on IDEA-CR-6432
This commit is contained in:
@@ -129,7 +129,7 @@
|
||||
<localInspection language="JAVA" shortName="UnsafeReturnStatementVisitor" displayName="Unsafe return statements visitor"
|
||||
groupKey="inspections.group.name" enabledByDefault="true" level="WARNING"
|
||||
implementationClass="org.jetbrains.idea.devkit.inspections.internal.UnsafeReturnStatementVisitorInspection" />
|
||||
<localInspection language="JAVA" shortName="StatefulEp" displayName="Stateful EP"
|
||||
<localInspection language="JAVA" shortName="StatefulEp" displayName="Stateful Extension"
|
||||
groupKey="inspections.group.name"
|
||||
enabledByDefault="true" level="WARNING"
|
||||
implementationClass="org.jetbrains.idea.devkit.inspections.StatefulEpInspection"/>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<html>
|
||||
<body>
|
||||
Are you sure about holding heavy objects in Extension Point implementation?
|
||||
Potential memory leak detected. Please don't hold heavy objects in extensions if you're not a 100% sure.
|
||||
In the ideal world, extensions should be stateless.
|
||||
</body>
|
||||
</html>
|
||||
@@ -40,23 +40,15 @@ public class StatefulEpInspection extends DevKitInspectionBase {
|
||||
if (isQuickFix || shouldCheck(psiClass)) {
|
||||
List<ProblemDescriptor> result = ContainerUtil.newArrayList();
|
||||
for (final PsiField field : fields) {
|
||||
Checker projectChecker = new Checker(Project.class) {
|
||||
@Override
|
||||
boolean predicate() {
|
||||
return !field.hasModifierProperty(PsiModifier.FINAL);
|
||||
for (Class c : new Class[]{PsiElement.class, PsiReference.class, Project.class}) {
|
||||
if (c == Project.class && field.hasModifierProperty(PsiModifier.FINAL)) continue;
|
||||
String message = c == PsiElement.class
|
||||
? "Potential memory leak: don't hold PsiElement, use SmartPsiElementPointer instead" +
|
||||
(isQuickFix ? "; also see LocalQuickFixOnPsiElement" : "")
|
||||
: "Don't use " + c.getSimpleName() + " as a field in extension";
|
||||
if (InheritanceUtil.isInheritor(field.getType(), c.getCanonicalName())) {
|
||||
result.add(manager.createProblemDescriptor(field, message, true, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, isOnTheFly));
|
||||
}
|
||||
};
|
||||
Checker psiChecker = new Checker(PsiElement.class) {
|
||||
@NotNull
|
||||
@Override
|
||||
String getMessage() {
|
||||
return "Potential memory leak: don't hold PsiElement, use SmartPsiElementPointer instead of" +
|
||||
(isQuickFix ? "; also see LocalQuickFixOnPsiElement" : "");
|
||||
}
|
||||
};
|
||||
Checker refChecker = new Checker(PsiReference.class);
|
||||
for (Checker checker : new Checker[]{projectChecker, psiChecker, refChecker}) {
|
||||
checker.check(field, manager, isOnTheFly, result);
|
||||
}
|
||||
}
|
||||
return result.toArray(new ProblemDescriptor[result.size()]);
|
||||
@@ -70,29 +62,4 @@ public class StatefulEpInspection extends DevKitInspectionBase {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static class Checker {
|
||||
@NotNull Class myClass;
|
||||
|
||||
private Checker(@NotNull Class psiClass) {
|
||||
myClass = psiClass;
|
||||
}
|
||||
|
||||
private void check(@NotNull PsiField field, @NotNull InspectionManager manager, boolean isOnTheFly, @NotNull List<ProblemDescriptor> result) {
|
||||
if (predicate() && InheritanceUtil.isInheritor(field.getType(), myClass.getCanonicalName())) {
|
||||
String message = getMessage();
|
||||
String actual = message.isEmpty() ? "Don't use " + myClass.getSimpleName() + " as a field in extension points" : message;
|
||||
result.add(manager.createProblemDescriptor(field, actual, true, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, isOnTheFly));
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
String getMessage() {
|
||||
return "";
|
||||
}
|
||||
|
||||
boolean predicate() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user