void (@NotNull PyClass pyClass) { if (isAbstract(pyClass) || PyProtocolsKt.isProtocol(pyClass, myTypeEvalContext)) { return; } /* Do not report problem if class contains only methods that raise NotImplementedError without any abc.* decorators but keep ability to implement them via quickfix (see PY-38680) */ final List<PyFunction> toImplement = ContainerUtil .filter(PyPsiRefactoringUtil.getAllSuperAbstractMethods(pyClass, myTypeEvalContext), function -> PyKnownDecoratorUtil.hasAbstractDecorator(function, myTypeEvalContext)); final ASTNode nameNode = pyClass.getNameNode(); if (!toImplement.isEmpty() && nameNode != null) { final SmartList<LocalQuickFix> quickFixes = new SmartList<>(); LocalQuickFix qf = PythonUiService.getInstance().createPyImplementMethodsQuickFix(pyClass, toImplement); if (qf != null) { quickFixes.add(qf); } quickFixes.add(new SetABCMetaAsMetaclassQuickFix()); if (LanguageLevel.forElement(pyClass).isPy3K()) { quickFixes.add(new AddABCToSuperclassesQuickFix()); } registerProblem(nameNode.getPsi(), PyPsiBundle.message("INSP.abstract.class.class.must.implement.all.abstract.methods", pyClass.getName()), quickFixes.toArray(LocalQuickFix.EMPTY_ARRAY)); } }