String (@NotNull String modifier, @NotNull PsiModifierList modifierList, @NotNull Map<String, Set<String>> incompatibleModifiersHash) { // modifier is always incompatible with itself int modifierCount = 0; for (PsiElement otherModifier = modifierList.getFirstChild(); otherModifier != null; otherModifier = otherModifier.getNextSibling()) { if (modifier.equals(otherModifier.getText())) modifierCount++; } if (modifierCount > 1) return modifier; Set<String> incompatibles = incompatibleModifiersHash.get(modifier); if (incompatibles == null) return null; PsiElement parent = modifierList.getParent(); boolean level8OrHigher = PsiUtil.isLanguageLevel8OrHigher(modifierList); boolean level9OrHigher = PsiUtil.isLanguageLevel9OrHigher(modifierList); for (@PsiModifier.ModifierConstant String incompatible : incompatibles) { if (level8OrHigher) { if (modifier.equals(PsiModifier.STATIC) && incompatible.equals(PsiModifier.ABSTRACT)) { continue; } } if (parent instanceof PsiMethod) { if (level9OrHigher && modifier.equals(PsiModifier.PRIVATE) && incompatible.equals(PsiModifier.PUBLIC)) { continue; } if (modifier.equals(PsiModifier.STATIC) && incompatible.equals(PsiModifier.FINAL)) { PsiClass containingClass = ((PsiMethod)parent).getContainingClass(); if (containingClass == null || !containingClass.isInterface()) { continue; } } } if (modifierList.hasModifierProperty(incompatible)) { return incompatible; } if (PsiModifier.ABSTRACT.equals(incompatible) && modifierList.hasExplicitModifier(incompatible)) { return incompatible; } } return null; }