diff --git a/plugins/devkit/resources/META-INF/plugin.xml b/plugins/devkit/resources/META-INF/plugin.xml index 9108d97e3e45..e1918e6fc5fa 100644 --- a/plugins/devkit/resources/META-INF/plugin.xml +++ b/plugins/devkit/resources/META-INF/plugin.xml @@ -129,7 +129,7 @@ - diff --git a/plugins/devkit/resources/inspectionDescriptions/StatefulEp.html b/plugins/devkit/resources/inspectionDescriptions/StatefulEp.html index e54b56826000..254ac913fe47 100644 --- a/plugins/devkit/resources/inspectionDescriptions/StatefulEp.html +++ b/plugins/devkit/resources/inspectionDescriptions/StatefulEp.html @@ -1,5 +1,6 @@ -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. \ No newline at end of file diff --git a/plugins/devkit/src/inspections/StatefulEpInspection.java b/plugins/devkit/src/inspections/StatefulEpInspection.java index 46f266422792..c4015d232d87 100644 --- a/plugins/devkit/src/inspections/StatefulEpInspection.java +++ b/plugins/devkit/src/inspections/StatefulEpInspection.java @@ -40,23 +40,15 @@ public class StatefulEpInspection extends DevKitInspectionBase { if (isQuickFix || shouldCheck(psiClass)) { List 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 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; - } - } } \ No newline at end of file