Skip to content

Commit c0fa0f9

Browse files
authored
Merge pull request #160 from unv-unv/ep-name-general-refactoring-10
Refactoring and localizing users of EP_NAME (part 10)
2 parents c490f94 + ccb73bb commit c0fa0f9

13 files changed

Lines changed: 420 additions & 385 deletions

File tree

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

Lines changed: 54 additions & 46 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,58 +48,31 @@
4648
*/
4749
@ServiceAPI(ComponentScope.APPLICATION)
4850
public abstract class QuickFixFactory {
49-
public static QuickFixFactory getInstance() {
50-
return ServiceManager.getService(QuickFixFactory.class);
51-
}
51+
public interface ModifierFixBuilder {
52+
default ModifierFixBuilder add(@PsiModifier.ModifierConstant String modifier) {
53+
return toggle(modifier, true);
54+
}
5255

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);
67-
}
56+
default ModifierFixBuilder remove(@PsiModifier.ModifierConstant String modifier) {
57+
return toggle(modifier, false);
58+
}
6859

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-
}
60+
ModifierFixBuilder toggle(@PsiModifier.ModifierConstant String modifier, boolean shouldHave);
7661

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-
);
62+
ModifierFixBuilder showContainingClass();
8463

85-
@Nonnull
86-
public LocalQuickFixAndIntentionActionOnPsiElement createAddModifierFix(
87-
@Nonnull PsiModifierListOwner owner,
88-
@PsiModifier.ModifierConstant @Nonnull String modifier
89-
) {
90-
return createModifierListFix(owner, modifier, true, false);
64+
@RequiredReadAction
65+
public abstract LocalQuickFixAndIntentionActionOnPsiElement create();
9166
}
9267

93-
@Nonnull
94-
public LocalQuickFixAndIntentionActionOnPsiElement createRemoveModifierFix(
95-
@Nonnull PsiModifierListOwner owner,
96-
@PsiModifier.ModifierConstant @Nonnull String modifier
97-
) {
98-
return createModifierListFix(owner, modifier, false, false);
68+
public static QuickFixFactory getInstance() {
69+
return ServiceManager.getService(QuickFixFactory.class);
9970
}
10071

72+
public abstract ModifierFixBuilder createModifierFixBuilder(@Nonnull PsiModifierList modifierList);
73+
74+
public abstract ModifierFixBuilder createModifierFixBuilder(@Nonnull PsiModifierListOwner owner);
75+
10176
@Nonnull
10277
public abstract LocalQuickFixAndIntentionActionOnPsiElement createMethodReturnFix(
10378
@Nonnull PsiMethod method,
@@ -472,7 +447,7 @@ public abstract IntentionAction createAddToDependencyInjectionAnnotationsFix(
472447
public abstract LocalQuickFixAndIntentionActionOnPsiElement createDeleteFix(@Nonnull PsiElement element);
473448

474449
@Nonnull
475-
public abstract LocalQuickFixAndIntentionActionOnPsiElement createDeleteFix(@Nonnull PsiElement element, @Nonnull @Nls String text);
450+
public abstract LocalQuickFixAndIntentionActionOnPsiElement createDeleteFix(@Nonnull PsiElement element, @Nonnull LocalizeValue text);
476451

477452
@Nonnull
478453
public abstract IntentionAction createDeleteSideEffectAwareFix(@Nonnull PsiExpressionStatement statement);
@@ -538,4 +513,37 @@ public abstract LocalQuickFixAndIntentionActionOnPsiElement createAccessStaticVi
538513
@Nonnull
539514
public abstract IntentionAction createWrapSwitchRuleStatementsIntoBlockFix(PsiSwitchLabeledRuleStatement rule);
540515

516+
@Deprecated
517+
@DeprecationInfo("Use #fixModifiers()...#build()")
518+
@Nonnull
519+
@RequiredReadAction
520+
public LocalQuickFixAndIntentionActionOnPsiElement createModifierListFix(
521+
@Nonnull PsiModifierList modifierList,
522+
@PsiModifier.ModifierConstant @Nonnull String modifier,
523+
boolean shouldHave,
524+
boolean showContainingClass
525+
) {
526+
ModifierFixBuilder builder = createModifierFixBuilder(modifierList).toggle(modifier, shouldHave);
527+
if (showContainingClass) {
528+
builder.showContainingClass();
529+
}
530+
return builder.create();
531+
}
532+
533+
@Deprecated
534+
@DeprecationInfo("Use #fixModifiers()...#build()")
535+
@Nonnull
536+
@RequiredReadAction
537+
public LocalQuickFixAndIntentionActionOnPsiElement createModifierListFix(
538+
@Nonnull PsiModifierListOwner owner,
539+
@PsiModifier.ModifierConstant @Nonnull String modifier,
540+
boolean shouldHave,
541+
boolean showContainingClass
542+
) {
543+
ModifierFixBuilder builder = createModifierFixBuilder(owner).toggle(modifier, shouldHave);
544+
if (showContainingClass) {
545+
builder.showContainingClass();
546+
}
547+
return builder.create();
548+
}
541549
}

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)