PsiMethod (@NotNull PsiClass aClass) { final PsiClass superClass = aClass instanceof PsiAnonymousClass ? PsiUtil.resolveClassInClassTypeOnly(((PsiAnonymousClass)aClass).getBaseClassType()) : aClass.getSuperClass(); if (superClass != null && !superClass.hasModifierProperty(PsiModifier.ABSTRACT) && !superClass.isEnum() && aClass.getImplementsListTypes().length == 0) { return null; } Set<PsiMethod> alreadyImplemented = new HashSet<>(); for (HierarchicalMethodSignature signatureHierarchical : aClass.getVisibleSignatures()) { for (PsiMethod superS : signatureHierarchical.getMethod().findSuperMethods()) { add(superS, alreadyImplemented); } } PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(aClass.getProject()).getResolveHelper(); for (HierarchicalMethodSignature signatureHierarchical : aClass.getVisibleSignatures()) { PsiMethod method = signatureHierarchical.getMethod(); PsiClass containingClass = method.getContainingClass(); // TODO: remove record check when we provide synthetic equals/hashCode/toString for Record classes if (containingClass == null || CommonClassNames.JAVA_LANG_RECORD.equals(containingClass.getQualifiedName())) { continue; } if (!aClass.equals(containingClass) && method.hasModifierProperty(PsiModifier.ABSTRACT) && !method.hasModifierProperty(PsiModifier.STATIC) && !method.hasModifierProperty(PsiModifier.PRIVATE) && !alreadyImplemented.contains(method)) { return method; } final List<HierarchicalMethodSignature> superSignatures = new ArrayList<>(signatureHierarchical.getInaccessibleSuperSignatures()); superSignatures.addAll(signatureHierarchical.getSuperSignatures()); for (HierarchicalMethodSignature superSignatureHierarchical : superSignatures) { final PsiMethod superMethod = superSignatureHierarchical.getMethod(); if (superMethod.hasModifierProperty(PsiModifier.ABSTRACT) && !resolveHelper.isAccessible(superMethod, method, null)) { return superMethod; } } } return null; }