Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
import com.intellij.java.language.LanguageLevel;
import com.intellij.java.language.psi.*;
import com.intellij.java.language.psi.util.PropertyMemberType;
import consulo.annotation.DeprecationInfo;
import consulo.annotation.access.RequiredReadAction;
import consulo.annotation.component.ComponentScope;
import consulo.annotation.component.ServiceAPI;
import consulo.ide.ServiceManager;
Expand All @@ -30,9 +32,9 @@
import consulo.language.psi.PsiElement;
import consulo.language.psi.PsiNamedElement;
import consulo.language.psi.PsiReference;
import consulo.localize.LocalizeValue;
import consulo.module.Module;
import consulo.project.Project;
import org.jetbrains.annotations.Nls;

import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
Expand All @@ -46,58 +48,31 @@
*/
@ServiceAPI(ComponentScope.APPLICATION)
public abstract class QuickFixFactory {
public static QuickFixFactory getInstance() {
return ServiceManager.getService(QuickFixFactory.class);
}
public interface ModifierFixBuilder {
default ModifierFixBuilder add(@PsiModifier.ModifierConstant String modifier) {
return toggle(modifier, true);
}

@Nonnull
public abstract LocalQuickFixAndIntentionActionOnPsiElement createModifierListFix(
@Nonnull PsiModifierList modifierList,
@PsiModifier.ModifierConstant @Nonnull String modifier,
boolean shouldHave,
final boolean showContainingClass
);

@Nonnull
public LocalQuickFixAndIntentionActionOnPsiElement createAddModifierFix(
@Nonnull PsiModifierList modifierList,
@PsiModifier.ModifierConstant @Nonnull String modifier
) {
return createModifierListFix(modifierList, modifier, true, false);
}
default ModifierFixBuilder remove(@PsiModifier.ModifierConstant String modifier) {
return toggle(modifier, false);
}

@Nonnull
public LocalQuickFixAndIntentionActionOnPsiElement createRemoveModifierFix(
@Nonnull PsiModifierList modifierList,
@PsiModifier.ModifierConstant @Nonnull String modifier
) {
return createModifierListFix(modifierList, modifier, false, false);
}
ModifierFixBuilder toggle(@PsiModifier.ModifierConstant String modifier, boolean shouldHave);

@Nonnull
public abstract LocalQuickFixAndIntentionActionOnPsiElement createModifierListFix(
@Nonnull PsiModifierListOwner owner,
@PsiModifier.ModifierConstant @Nonnull String modifier,
boolean shouldHave,
final boolean showContainingClass
);
ModifierFixBuilder showContainingClass();

@Nonnull
public LocalQuickFixAndIntentionActionOnPsiElement createAddModifierFix(
@Nonnull PsiModifierListOwner owner,
@PsiModifier.ModifierConstant @Nonnull String modifier
) {
return createModifierListFix(owner, modifier, true, false);
@RequiredReadAction
public abstract LocalQuickFixAndIntentionActionOnPsiElement create();
}

@Nonnull
public LocalQuickFixAndIntentionActionOnPsiElement createRemoveModifierFix(
@Nonnull PsiModifierListOwner owner,
@PsiModifier.ModifierConstant @Nonnull String modifier
) {
return createModifierListFix(owner, modifier, false, false);
public static QuickFixFactory getInstance() {
return ServiceManager.getService(QuickFixFactory.class);
}

public abstract ModifierFixBuilder createModifierFixBuilder(@Nonnull PsiModifierList modifierList);

public abstract ModifierFixBuilder createModifierFixBuilder(@Nonnull PsiModifierListOwner owner);

@Nonnull
public abstract LocalQuickFixAndIntentionActionOnPsiElement createMethodReturnFix(
@Nonnull PsiMethod method,
Expand Down Expand Up @@ -472,7 +447,7 @@ public abstract IntentionAction createAddToDependencyInjectionAnnotationsFix(
public abstract LocalQuickFixAndIntentionActionOnPsiElement createDeleteFix(@Nonnull PsiElement element);

@Nonnull
public abstract LocalQuickFixAndIntentionActionOnPsiElement createDeleteFix(@Nonnull PsiElement element, @Nonnull @Nls String text);
public abstract LocalQuickFixAndIntentionActionOnPsiElement createDeleteFix(@Nonnull PsiElement element, @Nonnull LocalizeValue text);

@Nonnull
public abstract IntentionAction createDeleteSideEffectAwareFix(@Nonnull PsiExpressionStatement statement);
Expand Down Expand Up @@ -538,4 +513,37 @@ public abstract LocalQuickFixAndIntentionActionOnPsiElement createAccessStaticVi
@Nonnull
public abstract IntentionAction createWrapSwitchRuleStatementsIntoBlockFix(PsiSwitchLabeledRuleStatement rule);

@Deprecated
@DeprecationInfo("Use #fixModifiers()...#build()")
@Nonnull
@RequiredReadAction
public LocalQuickFixAndIntentionActionOnPsiElement createModifierListFix(
@Nonnull PsiModifierList modifierList,
@PsiModifier.ModifierConstant @Nonnull String modifier,
boolean shouldHave,
boolean showContainingClass
) {
ModifierFixBuilder builder = createModifierFixBuilder(modifierList).toggle(modifier, shouldHave);
if (showContainingClass) {
builder.showContainingClass();
}
return builder.create();
}

@Deprecated
@DeprecationInfo("Use #fixModifiers()...#build()")
@Nonnull
@RequiredReadAction
public LocalQuickFixAndIntentionActionOnPsiElement createModifierListFix(
@Nonnull PsiModifierListOwner owner,
@PsiModifier.ModifierConstant @Nonnull String modifier,
boolean shouldHave,
boolean showContainingClass
) {
ModifierFixBuilder builder = createModifierFixBuilder(owner).toggle(modifier, shouldHave);
if (showContainingClass) {
builder.showContainingClass();
}
return builder.create();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ private static boolean isAnnotationRepeatedTwice(@Nonnull PsiAnnotationOwner own

@Nullable
@RequiredReadAction
public static HighlightInfo checkMissingAttributes(PsiAnnotation annotation) {
public static HighlightInfo.Builder checkMissingAttributes(PsiAnnotation annotation) {
PsiJavaCodeReferenceElement nameRef = annotation.getNameReferenceElement();
if (nameRef == null) {
return null;
Expand Down Expand Up @@ -371,8 +371,7 @@ public static HighlightInfo checkMissingAttributes(PsiAnnotation annotation) {
.descriptionAndTooltip(JavaErrorLocalize.annotationMissingAttribute(buff))
.registerFix(
QuickFixFactory.getInstance().createAddMissingRequiredAnnotationParametersFix(annotation, annotationMethods, missed)
)
.create();
);
}
}

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

@Nullable
@RequiredReadAction
public static HighlightInfo checkValidAnnotationType(PsiType type, PsiTypeElement typeElement) {
public static HighlightInfo.Builder checkValidAnnotationType(PsiType type, PsiTypeElement typeElement) {
if (type != null && type.accept(AnnotationReturnTypeVisitor.INSTANCE)) {
return null;
}
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
.range(typeElement)
.descriptionAndTooltip(JavaErrorLocalize.annotationInvalidAnnotationMemberType(type != null ? type.getPresentableText() : "?"))
.create();
.descriptionAndTooltip(JavaErrorLocalize.annotationInvalidAnnotationMemberType(type != null ? type.getPresentableText() : "?"));
}

private static final ElementPattern<PsiElement> ANY_ANNOTATION_ALLOWED = psiElement().andOr(
Expand Down Expand Up @@ -465,8 +463,7 @@ public static HighlightInfo.Builder checkApplicability(
else if (owner instanceof PsiModifierList modifierList) {
PsiElement nextElement =
PsiTreeUtil.skipSiblingsForward(modifierList, PsiComment.class, PsiWhiteSpace.class, PsiTypeParameterList.class);
if (nextElement instanceof PsiTypeElement) {
PsiTypeElement typeElement = (PsiTypeElement)nextElement;
if (nextElement instanceof PsiTypeElement typeElement) {
PsiType type = typeElement.getType();
if (PsiType.VOID.equals(type)) {
return annotationError(annotation, JavaErrorLocalize.annotationNotAllowedVoid());
Expand Down Expand Up @@ -526,37 +523,34 @@ private static PsiJavaCodeReferenceElement getOutermostReferenceElement(@Nullabl
return null;
}

PsiElement qualifier;
while ((qualifier = ref.getQualifier()) instanceof PsiJavaCodeReferenceElement) {
ref = (PsiJavaCodeReferenceElement)qualifier;
while (ref.getQualifier() instanceof PsiJavaCodeReferenceElement javaCodeRef) {
ref = javaCodeRef;
}
return ref;
}

@Nullable
@RequiredReadAction
public static HighlightInfo checkAnnotationType(PsiAnnotation annotation) {
public static HighlightInfo.Builder checkAnnotationType(PsiAnnotation annotation) {
PsiJavaCodeReferenceElement nameRefElem = annotation.getNameReferenceElement();
if (nameRefElem != null && (!(nameRefElem.resolve() instanceof PsiClass annotationClass) || !annotationClass.isAnnotationType())) {
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
.range(nameRefElem)
.descriptionAndTooltip(JavaErrorLocalize.annotationAnnotationTypeExpected())
.create();
.descriptionAndTooltip(JavaErrorLocalize.annotationAnnotationTypeExpected());
}
return null;
}

@Nullable
@RequiredReadAction
public static HighlightInfo checkCyclicMemberType(PsiTypeElement typeElement, PsiClass aClass) {
public static HighlightInfo.Builder checkCyclicMemberType(PsiTypeElement typeElement, PsiClass aClass) {
LOG.assertTrue(aClass.isAnnotationType());
PsiType type = typeElement.getType();
Set<PsiClass> checked = new HashSet<>();
if (cyclicDependencies(aClass, type, checked, aClass.getManager())) {
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
.range(typeElement)
.descriptionAndTooltip(JavaErrorLocalize.annotationCyclicElementType())
.create();
.descriptionAndTooltip(JavaErrorLocalize.annotationCyclicElementType());
}
return null;
}
Expand All @@ -580,8 +574,9 @@ private static boolean cyclicDependencies(PsiClass aClass, PsiType type, @Nonnul
return false;
}

@Nullable
@RequiredReadAction
public static HighlightInfo checkClashesWithSuperMethods(@Nonnull PsiAnnotationMethod psiMethod) {
public static HighlightInfo.Builder checkClashesWithSuperMethods(@Nonnull PsiAnnotationMethod psiMethod) {
PsiIdentifier nameIdentifier = psiMethod.getNameIdentifier();
if (nameIdentifier != null) {
PsiMethod[] methods = psiMethod.findDeepestSuperMethods();
Expand All @@ -596,8 +591,7 @@ public static HighlightInfo checkClashesWithSuperMethods(@Nonnull PsiAnnotationM
.descriptionAndTooltip(
"@interface member clashes with '" + JavaHighlightUtil.formatMethod(method) +
"' in " + HighlightUtil.formatClass(containingClass)
)
.create();
);
}
}
}
Expand Down Expand Up @@ -643,7 +637,7 @@ public static HighlightInfo checkPackageAnnotationContainingFile(PsiPackageState

@Nullable
@RequiredReadAction
public static HighlightInfo checkTargetAnnotationDuplicates(PsiAnnotation annotation) {
public static HighlightInfo.Builder checkTargetAnnotationDuplicates(PsiAnnotation annotation) {
PsiJavaCodeReferenceElement nameRef = annotation.getNameReferenceElement();
if (nameRef == null) {
return null;
Expand Down Expand Up @@ -671,8 +665,7 @@ public static HighlightInfo checkTargetAnnotationDuplicates(PsiAnnotation annota
if (targets.contains(target)) {
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
.range(initializer)
.descriptionAndTooltip(JavaErrorLocalize.repeatedAnnotationTarget())
.create();
.descriptionAndTooltip(JavaErrorLocalize.repeatedAnnotationTarget());
}
targets.add(target);
}
Expand All @@ -683,7 +676,7 @@ public static HighlightInfo checkTargetAnnotationDuplicates(PsiAnnotation annota

@Nullable
@RequiredReadAction
public static HighlightInfo checkFunctionalInterface(@Nonnull PsiAnnotation annotation, @Nonnull LanguageLevel languageLevel) {
public static HighlightInfo.Builder checkFunctionalInterface(@Nonnull PsiAnnotation annotation, @Nonnull LanguageLevel languageLevel) {
if (languageLevel.isAtLeast(LanguageLevel.JDK_1_8)
&& Comparing.strEqual(annotation.getQualifiedName(), JavaClassNames.JAVA_LANG_FUNCTIONAL_INTERFACE)) {
PsiAnnotationOwner owner = annotation.getOwner();
Expand All @@ -696,8 +689,7 @@ public static HighlightInfo checkFunctionalInterface(@Nonnull PsiAnnotation anno
if (errorMessage != null) {
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
.range(annotation)
.descriptionAndTooltip(errorMessage)
.create();
.descriptionAndTooltip(errorMessage);
}
}
}
Expand All @@ -706,7 +698,7 @@ public static HighlightInfo checkFunctionalInterface(@Nonnull PsiAnnotation anno

@Nullable
@RequiredReadAction
public static HighlightInfo checkRepeatableAnnotation(PsiAnnotation annotation) {
public static HighlightInfo.Builder checkRepeatableAnnotation(PsiAnnotation annotation) {
String qualifiedName = annotation.getQualifiedName();
if (!JavaClassNames.JAVA_LANG_ANNOTATION_REPEATABLE.equals(qualifiedName)) {
return null;
Expand All @@ -718,8 +710,7 @@ public static HighlightInfo checkRepeatableAnnotation(PsiAnnotation annotation)
if (containerRef != null) {
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
.range(containerRef)
.descriptionAndTooltip(description)
.create();
.descriptionAndTooltip(description);
}
}

Expand Down
Loading
Loading