void (AnnotationHolder holder, GrTypeDefinition typeDefinition) { GrModifierList modifiersList = typeDefinition.getModifierList(); if (modifiersList == null) return; checkAccessModifiers(holder, modifiersList, typeDefinition); checkDuplicateModifiers(holder, modifiersList, typeDefinition); PsiClassType[] extendsListTypes = typeDefinition.getExtendsListTypes(); for (PsiClassType classType : extendsListTypes) { PsiClass psiClass = classType.resolve(); if (psiClass != null && psiClass.hasModifierProperty(PsiModifier.FINAL)) { PsiElement identifierGroovy = typeDefinition.getNameIdentifierGroovy(); String message = GroovyBundle.message("final.class.cannot.be.extended"); AnnotationBuilder builder = holder.newAnnotation(HighlightSeverity.ERROR, message) .range(identifierGroovy); builder = registerLocalFix(builder, new GrModifierFix(typeDefinition, PsiModifier.FINAL, false, false, GrModifierFix.MODIFIER_LIST_OWNER), typeDefinition, message, ProblemHighlightType.ERROR, identifierGroovy.getTextRange()); builder.create(); } } if (!typeDefinition.isEnum()) { checkForAbstractAndFinalCombination(holder, typeDefinition, modifiersList); } checkModifierIsNotAllowed(modifiersList, PsiModifier.TRANSIENT, GroovyBundle.message("modifier.transient.not.allowed.here"), holder); checkModifierIsNotAllowed(modifiersList, PsiModifier.VOLATILE, GroovyBundle.message("modifier.volatile.not.allowed.here"), holder); if (typeDefinition.isInterface()) { checkModifierIsNotAllowed(modifiersList, PsiModifier.FINAL, GroovyBundle.message("interface.cannot.have.modifier.final"), holder); } }