import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.codeInspection.ProblemHighlightType;
+import com.intellij.openapi.components.ProjectComponent;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.util.InheritanceUtil;
PsiField[] fields = psiClass.getFields();
if (fields.length == 0) return super.checkClass(psiClass, manager, isOnTheFly);
final boolean isQuickFix = InheritanceUtil.isInheritor(psiClass, LocalQuickFix.class.getCanonicalName());
+ final boolean isProjectComponent = InheritanceUtil.isInheritor(psiClass, ProjectComponent.class.getCanonicalName());
if (isQuickFix || ExtensionPointLocator.isImplementedEp(psiClass)) {
List<ProblemDescriptor> result = ContainerUtil.newArrayList();
for (final PsiField field : fields) {
for (Class c : new Class[]{PsiElement.class, PsiReference.class, Project.class}) {
- if (c == Project.class && field.hasModifierProperty(PsiModifier.FINAL)) continue;
+ if (c == Project.class && (field.hasModifierProperty(PsiModifier.FINAL) || isProjectComponent)) continue;
String message = c == PsiElement.class
? "Potential memory leak: don't hold PsiElement, use SmartPsiElementPointer instead" +
(isQuickFix ? "; also see LocalQuickFixOnPsiElement" : "")
--- /dev/null
+public class ProjectComp implements com.intellij.openapi.components.ProjectComponent {
+ <warning descr="Potential memory leak: don't hold PsiElement, use SmartPsiElementPointer instead">final com.intellij.psi.PsiElement pe;</warning>
+ <warning descr="Don't use PsiReference as a field in extension">final com.intellij.psi.PsiReference r;</warning>
+ com.intellij.openapi.project.Project p;
+ final com.intellij.openapi.project.Project pf;
+ public ProjectComp() {
+ super();
+ pe = null;
+ r =null;
+ p = pf = null;
+ }
+}
\ No newline at end of file
myFixture.addClass("package com.intellij.psi; public class PsiElement {}");
myFixture.addClass("package com.intellij.psi; public class PsiReference {}");
myFixture.addClass("package com.intellij.codeInspection; public class LocalQuickFix {}");
+ myFixture.addClass("package com.intellij.openapi.components; public interface ProjectComponent {}");
myFixture.enableInspections(new StatefulEpInspection());
}
setPluginXml("plugin.xml");
myFixture.testHighlighting("Ext.java");
}
+
+ public void testProjectComp() {
+ setPluginXml("plugin.xml");
+ myFixture.testHighlighting("ProjectComp.java");
+ }
}