import com.intellij.psi.*;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiTreeUtil;
+import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
+import java.util.Set;
/**
* @author Dmitry Batkovich
method.getParameterList().getParametersCount() == 0 &&
!method.hasModifierProperty(PsiModifier.ABSTRACT)) {
final PsiClass aClass = method.getContainingClass();
- if (InheritanceUtil.isInheritor(aClass, QuickFix.class.getName()) && doesMethodViolate(method)) {
+ if (InheritanceUtil.isInheritor(aClass, QuickFix.class.getName()) && doesMethodViolate(method, new THashSet<>())) {
final PsiIdentifier identifier = method.getNameIdentifier();
LOG.assertTrue(identifier != null);
return new ProblemDescriptor[]{
return null;
}
- private static boolean doesMethodViolate(final PsiMethod method) {
- if (method.hasModifierProperty(PsiModifier.STATIC)) return false;
+ private static boolean doesMethodViolate(final PsiMethod method, final Set<PsiMethod> processed) {
+ if (!processed.add(method) || method.hasModifierProperty(PsiModifier.STATIC)) return false;
final PsiCodeBlock body = method.getBody();
if (body == null) return false;
final Collection<PsiJavaCodeReferenceElement> referenceIterator =
methodContainingClass != null &&
(methodContainingClass == resolvedContainingClass ||
methodContainingClass.isInheritor(resolvedContainingClass, true))) {
- if (doesMethodViolate((PsiMethod)resolved)) {
+ if (doesMethodViolate((PsiMethod)resolved, processed)) {
return true;
}
}