void (@NotNull ActionContext context, @NotNull PsiElement element, @NotNull ModPsiUpdater updater) { if (shouldCorrect(element)) element = updater.getWritable(context.findLeafOnTheLeft()); final PsiReferenceList referenceList = PsiTreeUtil.getParentOfType(element, PsiReferenceList.class); if (referenceList == null) return; final PsiClass psiClass = PsiTreeUtil.getParentOfType(referenceList, PsiClass.class); if (psiClass == null) return; if (psiClass.getExtendsList() != referenceList && psiClass.getImplementsList() != referenceList) return; final PsiJavaCodeReferenceElement topLevelRef = getTopLevelRef(element, referenceList); if (topLevelRef == null) return; final PsiElement target = topLevelRef.resolve(); final PsiClass targetClass = ObjectUtils.tryCast(target, PsiClass.class); if (targetClass == null) return; if (isRemoveDuplicateExtends()) { for (PsiJavaCodeReferenceElement refElement : referenceList.getReferenceElements()) { if (isDuplicate(topLevelRef, refElement, targetClass)) { refElement.delete(); } } return; } final Map<PsiMethod, PsiMethod> implementations = new HashMap<>(); for (PsiMethod psiMethod : targetClass.getAllMethods()) { final PsiMethod implementingMethod = MethodSignatureUtil.findMethodBySuperMethod(psiClass, psiMethod, false); if (implementingMethod != null) { implementations.put(psiMethod, implementingMethod); } } topLevelRef.delete(); if (target == psiClass) return; if (targetClass.hasModifierProperty(PsiModifier.SEALED)) { SealedUtils.removeFromPermitsList(targetClass, psiClass); final PsiModifierList modifiers = psiClass.getModifierList(); if (modifiers != null && modifiers.hasExplicitModifier(PsiModifier.NON_SEALED) && !SealedUtils.hasSealedParent(psiClass)) { modifiers.setModifierProperty(PsiModifier.NON_SEALED, false); } } final Set<PsiMethod> superMethods = new HashSet<>(); for (PsiClass aClass : psiClass.getSupers()) { Collections.addAll(superMethods, aClass.getAllMethods()); } final PsiMethod[] psiMethods = targetClass.getAllMethods(); for (PsiMethod psiMethod : psiMethods) { if (superMethods.contains(psiMethod)) continue; final PsiMethod impl = implementations.get(psiMethod); if (impl != null) impl.delete(); } }