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