Skip to content

Commit d7ef06e

Browse files
committed
Replacing QuickFixFactory.createRemoveModifierFix() with builder. More replacements of HighlightInfo with Builder. Localizing.
1 parent 9b49945 commit d7ef06e

13 files changed

Lines changed: 411 additions & 381 deletions

File tree

java-analysis-api/src/main/java/com/intellij/java/analysis/codeInsight/intention/QuickFixFactory.java

Lines changed: 92 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import com.intellij.java.language.LanguageLevel;
1919
import com.intellij.java.language.psi.*;
2020
import com.intellij.java.language.psi.util.PropertyMemberType;
21+
import consulo.annotation.DeprecationInfo;
22+
import consulo.annotation.access.RequiredReadAction;
2123
import consulo.annotation.component.ComponentScope;
2224
import consulo.annotation.component.ServiceAPI;
2325
import consulo.ide.ServiceManager;
@@ -30,9 +32,9 @@
3032
import consulo.language.psi.PsiElement;
3133
import consulo.language.psi.PsiNamedElement;
3234
import consulo.language.psi.PsiReference;
35+
import consulo.localize.LocalizeValue;
3336
import consulo.module.Module;
3437
import consulo.project.Project;
35-
import org.jetbrains.annotations.Nls;
3638

3739
import jakarta.annotation.Nonnull;
3840
import jakarta.annotation.Nullable;
@@ -46,57 +48,66 @@
4648
*/
4749
@ServiceAPI(ComponentScope.APPLICATION)
4850
public abstract class QuickFixFactory {
49-
public static QuickFixFactory getInstance() {
50-
return ServiceManager.getService(QuickFixFactory.class);
51+
public abstract class ModifierFixBuilder {
52+
protected final PsiModifierList myModifierList;
53+
protected final PsiModifierListOwner myOwner;
54+
protected @PsiModifier.ModifierConstant String myModifier = null;
55+
protected boolean myShouldHave;
56+
protected boolean myShowContainingClass;
57+
58+
public ModifierFixBuilder(@Nonnull PsiModifierListOwner owner) {
59+
myModifierList = null;
60+
myOwner = owner;
61+
}
62+
63+
public ModifierFixBuilder(@Nonnull PsiModifierList modifierList) {
64+
myModifierList = modifierList;
65+
myOwner = null;
66+
}
67+
68+
public ModifierFixBuilder add(@PsiModifier.ModifierConstant String modifier) {
69+
return toggle(modifier, true);
70+
}
71+
72+
public ModifierFixBuilder remove(@PsiModifier.ModifierConstant String modifier) {
73+
return toggle(modifier, false);
74+
}
75+
76+
public ModifierFixBuilder toggle(@PsiModifier.ModifierConstant String modifier, boolean shouldHave) {
77+
if (myModifier != null) {
78+
throw new IllegalStateException();
79+
}
80+
myModifier = modifier;
81+
myShouldHave = shouldHave;
82+
return this;
83+
}
84+
85+
public ModifierFixBuilder showContainingClass(boolean showContainingClass) {
86+
if (showContainingClass) {
87+
return showContainingClass();
88+
}
89+
return this;
90+
}
91+
92+
public ModifierFixBuilder showContainingClass() {
93+
if (myShowContainingClass) {
94+
throw new IllegalStateException();
95+
}
96+
myShowContainingClass = true;
97+
return this;
98+
}
99+
100+
@RequiredReadAction
101+
public abstract LocalQuickFixAndIntentionActionOnPsiElement create();
51102
}
52103

53-
@Nonnull
54-
public abstract LocalQuickFixAndIntentionActionOnPsiElement createModifierListFix(
55-
@Nonnull PsiModifierList modifierList,
56-
@PsiModifier.ModifierConstant @Nonnull String modifier,
57-
boolean shouldHave,
58-
final boolean showContainingClass
59-
);
60-
61-
@Nonnull
62-
public LocalQuickFixAndIntentionActionOnPsiElement createAddModifierFix(
63-
@Nonnull PsiModifierList modifierList,
64-
@PsiModifier.ModifierConstant @Nonnull String modifier
65-
) {
66-
return createModifierListFix(modifierList, modifier, true, false);
104+
public static QuickFixFactory getInstance() {
105+
return ServiceManager.getService(QuickFixFactory.class);
67106
}
68107

69-
@Nonnull
70-
public LocalQuickFixAndIntentionActionOnPsiElement createRemoveModifierFix(
71-
@Nonnull PsiModifierList modifierList,
72-
@PsiModifier.ModifierConstant @Nonnull String modifier
73-
) {
74-
return createModifierListFix(modifierList, modifier, false, false);
75-
}
108+
public abstract ModifierFixBuilder fixModifiers(@Nonnull PsiModifierList modifierList);
76109

77-
@Nonnull
78-
public abstract LocalQuickFixAndIntentionActionOnPsiElement createModifierListFix(
79-
@Nonnull PsiModifierListOwner owner,
80-
@PsiModifier.ModifierConstant @Nonnull String modifier,
81-
boolean shouldHave,
82-
final boolean showContainingClass
83-
);
84-
85-
@Nonnull
86-
public LocalQuickFixAndIntentionActionOnPsiElement createAddModifierFix(
87-
@Nonnull PsiModifierListOwner owner,
88-
@PsiModifier.ModifierConstant @Nonnull String modifier
89-
) {
90-
return createModifierListFix(owner, modifier, true, false);
91-
}
92-
93-
@Nonnull
94-
public LocalQuickFixAndIntentionActionOnPsiElement createRemoveModifierFix(
95-
@Nonnull PsiModifierListOwner owner,
96-
@PsiModifier.ModifierConstant @Nonnull String modifier
97-
) {
98-
return createModifierListFix(owner, modifier, false, false);
99-
}
110+
public abstract ModifierFixBuilder fixModifiers(@Nonnull PsiModifierListOwner owner);
100111

101112
@Nonnull
102113
public abstract LocalQuickFixAndIntentionActionOnPsiElement createMethodReturnFix(
@@ -472,7 +483,7 @@ public abstract IntentionAction createAddToDependencyInjectionAnnotationsFix(
472483
public abstract LocalQuickFixAndIntentionActionOnPsiElement createDeleteFix(@Nonnull PsiElement element);
473484

474485
@Nonnull
475-
public abstract LocalQuickFixAndIntentionActionOnPsiElement createDeleteFix(@Nonnull PsiElement element, @Nonnull @Nls String text);
486+
public abstract LocalQuickFixAndIntentionActionOnPsiElement createDeleteFix(@Nonnull PsiElement element, @Nonnull LocalizeValue text);
476487

477488
@Nonnull
478489
public abstract IntentionAction createDeleteSideEffectAwareFix(@Nonnull PsiExpressionStatement statement);
@@ -538,4 +549,37 @@ public abstract LocalQuickFixAndIntentionActionOnPsiElement createAccessStaticVi
538549
@Nonnull
539550
public abstract IntentionAction createWrapSwitchRuleStatementsIntoBlockFix(PsiSwitchLabeledRuleStatement rule);
540551

552+
@Deprecated
553+
@DeprecationInfo("Use #fixModifiers()...#build()")
554+
@Nonnull
555+
@RequiredReadAction
556+
public LocalQuickFixAndIntentionActionOnPsiElement createModifierListFix(
557+
@Nonnull PsiModifierList modifierList,
558+
@PsiModifier.ModifierConstant @Nonnull String modifier,
559+
boolean shouldHave,
560+
boolean showContainingClass
561+
) {
562+
ModifierFixBuilder builder = fixModifiers(modifierList).toggle(modifier, shouldHave);
563+
if (showContainingClass) {
564+
builder.showContainingClass();
565+
}
566+
return builder.create();
567+
}
568+
569+
@Deprecated
570+
@DeprecationInfo("Use #fixModifiers()...#build()")
571+
@Nonnull
572+
@RequiredReadAction
573+
public LocalQuickFixAndIntentionActionOnPsiElement createModifierListFix(
574+
@Nonnull PsiModifierListOwner owner,
575+
@PsiModifier.ModifierConstant @Nonnull String modifier,
576+
boolean shouldHave,
577+
boolean showContainingClass
578+
) {
579+
ModifierFixBuilder builder = fixModifiers(owner).toggle(modifier, shouldHave);
580+
if (showContainingClass) {
581+
builder.showContainingClass();
582+
}
583+
return builder.create();
584+
}
541585
}

java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ private static boolean isAnnotationRepeatedTwice(@Nonnull PsiAnnotationOwner own
329329

330330
@Nullable
331331
@RequiredReadAction
332-
public static HighlightInfo checkMissingAttributes(PsiAnnotation annotation) {
332+
public static HighlightInfo.Builder checkMissingAttributes(PsiAnnotation annotation) {
333333
PsiJavaCodeReferenceElement nameRef = annotation.getNameReferenceElement();
334334
if (nameRef == null) {
335335
return null;
@@ -371,8 +371,7 @@ public static HighlightInfo checkMissingAttributes(PsiAnnotation annotation) {
371371
.descriptionAndTooltip(JavaErrorLocalize.annotationMissingAttribute(buff))
372372
.registerFix(
373373
QuickFixFactory.getInstance().createAddMissingRequiredAnnotationParametersFix(annotation, annotationMethods, missed)
374-
)
375-
.create();
374+
);
376375
}
377376
}
378377

@@ -396,14 +395,13 @@ public static HighlightInfo.Builder checkConstantExpression(PsiExpression expres
396395

397396
@Nullable
398397
@RequiredReadAction
399-
public static HighlightInfo checkValidAnnotationType(PsiType type, PsiTypeElement typeElement) {
398+
public static HighlightInfo.Builder checkValidAnnotationType(PsiType type, PsiTypeElement typeElement) {
400399
if (type != null && type.accept(AnnotationReturnTypeVisitor.INSTANCE)) {
401400
return null;
402401
}
403402
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
404403
.range(typeElement)
405-
.descriptionAndTooltip(JavaErrorLocalize.annotationInvalidAnnotationMemberType(type != null ? type.getPresentableText() : "?"))
406-
.create();
404+
.descriptionAndTooltip(JavaErrorLocalize.annotationInvalidAnnotationMemberType(type != null ? type.getPresentableText() : "?"));
407405
}
408406

409407
private static final ElementPattern<PsiElement> ANY_ANNOTATION_ALLOWED = psiElement().andOr(
@@ -465,8 +463,7 @@ public static HighlightInfo.Builder checkApplicability(
465463
else if (owner instanceof PsiModifierList modifierList) {
466464
PsiElement nextElement =
467465
PsiTreeUtil.skipSiblingsForward(modifierList, PsiComment.class, PsiWhiteSpace.class, PsiTypeParameterList.class);
468-
if (nextElement instanceof PsiTypeElement) {
469-
PsiTypeElement typeElement = (PsiTypeElement)nextElement;
466+
if (nextElement instanceof PsiTypeElement typeElement) {
470467
PsiType type = typeElement.getType();
471468
if (PsiType.VOID.equals(type)) {
472469
return annotationError(annotation, JavaErrorLocalize.annotationNotAllowedVoid());
@@ -526,37 +523,34 @@ private static PsiJavaCodeReferenceElement getOutermostReferenceElement(@Nullabl
526523
return null;
527524
}
528525

529-
PsiElement qualifier;
530-
while ((qualifier = ref.getQualifier()) instanceof PsiJavaCodeReferenceElement) {
531-
ref = (PsiJavaCodeReferenceElement)qualifier;
526+
while (ref.getQualifier() instanceof PsiJavaCodeReferenceElement javaCodeRef) {
527+
ref = javaCodeRef;
532528
}
533529
return ref;
534530
}
535531

536532
@Nullable
537533
@RequiredReadAction
538-
public static HighlightInfo checkAnnotationType(PsiAnnotation annotation) {
534+
public static HighlightInfo.Builder checkAnnotationType(PsiAnnotation annotation) {
539535
PsiJavaCodeReferenceElement nameRefElem = annotation.getNameReferenceElement();
540536
if (nameRefElem != null && (!(nameRefElem.resolve() instanceof PsiClass annotationClass) || !annotationClass.isAnnotationType())) {
541537
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
542538
.range(nameRefElem)
543-
.descriptionAndTooltip(JavaErrorLocalize.annotationAnnotationTypeExpected())
544-
.create();
539+
.descriptionAndTooltip(JavaErrorLocalize.annotationAnnotationTypeExpected());
545540
}
546541
return null;
547542
}
548543

549544
@Nullable
550545
@RequiredReadAction
551-
public static HighlightInfo checkCyclicMemberType(PsiTypeElement typeElement, PsiClass aClass) {
546+
public static HighlightInfo.Builder checkCyclicMemberType(PsiTypeElement typeElement, PsiClass aClass) {
552547
LOG.assertTrue(aClass.isAnnotationType());
553548
PsiType type = typeElement.getType();
554549
Set<PsiClass> checked = new HashSet<>();
555550
if (cyclicDependencies(aClass, type, checked, aClass.getManager())) {
556551
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
557552
.range(typeElement)
558-
.descriptionAndTooltip(JavaErrorLocalize.annotationCyclicElementType())
559-
.create();
553+
.descriptionAndTooltip(JavaErrorLocalize.annotationCyclicElementType());
560554
}
561555
return null;
562556
}
@@ -580,8 +574,9 @@ private static boolean cyclicDependencies(PsiClass aClass, PsiType type, @Nonnul
580574
return false;
581575
}
582576

577+
@Nullable
583578
@RequiredReadAction
584-
public static HighlightInfo checkClashesWithSuperMethods(@Nonnull PsiAnnotationMethod psiMethod) {
579+
public static HighlightInfo.Builder checkClashesWithSuperMethods(@Nonnull PsiAnnotationMethod psiMethod) {
585580
PsiIdentifier nameIdentifier = psiMethod.getNameIdentifier();
586581
if (nameIdentifier != null) {
587582
PsiMethod[] methods = psiMethod.findDeepestSuperMethods();
@@ -596,8 +591,7 @@ public static HighlightInfo checkClashesWithSuperMethods(@Nonnull PsiAnnotationM
596591
.descriptionAndTooltip(
597592
"@interface member clashes with '" + JavaHighlightUtil.formatMethod(method) +
598593
"' in " + HighlightUtil.formatClass(containingClass)
599-
)
600-
.create();
594+
);
601595
}
602596
}
603597
}
@@ -643,7 +637,7 @@ public static HighlightInfo checkPackageAnnotationContainingFile(PsiPackageState
643637

644638
@Nullable
645639
@RequiredReadAction
646-
public static HighlightInfo checkTargetAnnotationDuplicates(PsiAnnotation annotation) {
640+
public static HighlightInfo.Builder checkTargetAnnotationDuplicates(PsiAnnotation annotation) {
647641
PsiJavaCodeReferenceElement nameRef = annotation.getNameReferenceElement();
648642
if (nameRef == null) {
649643
return null;
@@ -671,8 +665,7 @@ public static HighlightInfo checkTargetAnnotationDuplicates(PsiAnnotation annota
671665
if (targets.contains(target)) {
672666
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
673667
.range(initializer)
674-
.descriptionAndTooltip(JavaErrorLocalize.repeatedAnnotationTarget())
675-
.create();
668+
.descriptionAndTooltip(JavaErrorLocalize.repeatedAnnotationTarget());
676669
}
677670
targets.add(target);
678671
}
@@ -683,7 +676,7 @@ public static HighlightInfo checkTargetAnnotationDuplicates(PsiAnnotation annota
683676

684677
@Nullable
685678
@RequiredReadAction
686-
public static HighlightInfo checkFunctionalInterface(@Nonnull PsiAnnotation annotation, @Nonnull LanguageLevel languageLevel) {
679+
public static HighlightInfo.Builder checkFunctionalInterface(@Nonnull PsiAnnotation annotation, @Nonnull LanguageLevel languageLevel) {
687680
if (languageLevel.isAtLeast(LanguageLevel.JDK_1_8)
688681
&& Comparing.strEqual(annotation.getQualifiedName(), JavaClassNames.JAVA_LANG_FUNCTIONAL_INTERFACE)) {
689682
PsiAnnotationOwner owner = annotation.getOwner();
@@ -696,8 +689,7 @@ public static HighlightInfo checkFunctionalInterface(@Nonnull PsiAnnotation anno
696689
if (errorMessage != null) {
697690
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
698691
.range(annotation)
699-
.descriptionAndTooltip(errorMessage)
700-
.create();
692+
.descriptionAndTooltip(errorMessage);
701693
}
702694
}
703695
}
@@ -706,7 +698,7 @@ public static HighlightInfo checkFunctionalInterface(@Nonnull PsiAnnotation anno
706698

707699
@Nullable
708700
@RequiredReadAction
709-
public static HighlightInfo checkRepeatableAnnotation(PsiAnnotation annotation) {
701+
public static HighlightInfo.Builder checkRepeatableAnnotation(PsiAnnotation annotation) {
710702
String qualifiedName = annotation.getQualifiedName();
711703
if (!JavaClassNames.JAVA_LANG_ANNOTATION_REPEATABLE.equals(qualifiedName)) {
712704
return null;
@@ -718,8 +710,7 @@ public static HighlightInfo checkRepeatableAnnotation(PsiAnnotation annotation)
718710
if (containerRef != null) {
719711
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
720712
.range(containerRef)
721-
.descriptionAndTooltip(description)
722-
.create();
713+
.descriptionAndTooltip(description);
723714
}
724715
}
725716

0 commit comments

Comments
 (0)