void (Group group, DomElementAnnotationHolder holder) { final GenericAttributeValue<String> iconAttribute = group.getIcon(); if (DomUtil.hasXml(iconAttribute)) { annotateResolveProblems(holder, iconAttribute); } GenericAttributeValue<PsiClass> clazz = group.getClazz(); if (DomUtil.hasXml(clazz) && !DomUtil.hasXml(group.getId())) { holder.createProblem(group, ProblemHighlightType.WARNING, DevKitBundle.message("inspections.plugin.xml.action.group.id.required"), null, new AddDomElementQuickFix<>(group.getId())); } GenericAttributeValue<ActionOrGroup> useShortcutOfAttribute = group.getUseShortcutOf(); if (!DomUtil.hasXml(useShortcutOfAttribute)) return; if (!DomUtil.hasXml(clazz)) { holder.createProblem(group, DevKitBundle.message("inspections.plugin.xml.action.class.required.with.use.shortcut.of"), new AddDomElementQuickFix<>(group.getClazz())); return; } PsiClass actionGroupClass = clazz.getValue(); if (actionGroupClass == null) return; PsiMethod canBePerformedMethod = new LightMethodBuilder(actionGroupClass.getManager(), "canBePerformed") .setContainingClass(JavaPsiFacade.getInstance(actionGroupClass.getProject()).findClass(ActionGroup.class.getName(), actionGroupClass.getResolveScope())) .setModifiers(PsiModifier.PUBLIC) .setMethodReturnType(PsiTypes.booleanType()) .addParameter("context", DataContext.class.getName()); PsiMethod overriddenCanBePerformedMethod = actionGroupClass.findMethodBySignature(canBePerformedMethod, false); if (overriddenCanBePerformedMethod == null) { String methodPresentation = PsiFormatUtil.formatMethod(canBePerformedMethod, PsiSubstitutor.EMPTY, PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_PARAMETERS | PsiFormatUtilBase.SHOW_CONTAINING_CLASS, PsiFormatUtilBase.SHOW_TYPE); holder.createProblem(clazz, DevKitBundle.message("inspections.plugin.xml.action.must.override.method.with.use.shortcut.of", methodPresentation)); } }