From 0575beb759df491e5307d56980305dc379d7209d Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 2 Nov 2021 13:50:29 +0100 Subject: [PATCH] [java] avoid setup external root in batch mode (IDEA-281098) GitOrigin-RevId: 4d507ed5c599b6372a426710f64b6800c373d6eb --- .../intention/AddAnnotationPsiFix.java | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/intention/AddAnnotationPsiFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/intention/AddAnnotationPsiFix.java index 927184aaa2eb..0e23d2849f0f 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/intention/AddAnnotationPsiFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/intention/AddAnnotationPsiFix.java @@ -9,18 +9,25 @@ import com.intellij.codeInsight.NullableNotNullManager; import com.intellij.codeInsight.daemon.impl.analysis.AnnotationsHighlightUtil; import com.intellij.codeInsight.intention.impl.BaseIntentionAction; import com.intellij.codeInspection.LocalQuickFixOnPsiElement; +import com.intellij.codeInspection.OnTheFlyLocalFix; import com.intellij.codeInspection.util.IntentionName; import com.intellij.java.analysis.JavaAnalysisBundle; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.command.undo.UndoUtil; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.AnnotationOrderRootType; +import com.intellij.openapi.roots.LibraryOrSdkOrderEntry; +import com.intellij.openapi.roots.OrderEntry; +import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.impl.light.LightElement; import com.intellij.psi.util.JavaElementKind; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.ArrayUtil; import com.intellij.util.ArrayUtilRt; import com.intellij.util.IncorrectOperationException; @@ -34,11 +41,12 @@ import org.jetbrains.annotations.Nullable; import java.lang.annotation.RetentionPolicy; import java.util.List; +import java.util.Objects; import static com.intellij.codeInsight.AnnotationUtil.CHECK_EXTERNAL; import static com.intellij.codeInsight.AnnotationUtil.CHECK_TYPE; -public class AddAnnotationPsiFix extends LocalQuickFixOnPsiElement { +public class AddAnnotationPsiFix extends LocalQuickFixOnPsiElement implements OnTheFlyLocalFix { protected final String myAnnotation; final String[] myAnnotationsToRemove; @SafeFieldForPreview @@ -47,6 +55,7 @@ public class AddAnnotationPsiFix extends LocalQuickFixOnPsiElement { private final AnnotationPlace myAnnotationPlace; private final boolean myExistsTypeUseTarget; private final boolean myHasApplicableAnnotations; + private final boolean myAvailableInBatchMode; public AddAnnotationPsiFix(@NotNull String fqn, @NotNull PsiModifierListOwner modifierListOwner, @@ -74,6 +83,7 @@ public class AddAnnotationPsiFix extends LocalQuickFixOnPsiElement { myAnnotationsToRemove = annotationsToRemove; myText = calcText(modifierListOwner, myAnnotation); myAnnotationPlace = place; + myAvailableInBatchMode = place == AnnotationPlace.IN_CODE || place == AnnotationPlace.EXTERNAL && hasExactlyOneAnnotationRoot(modifierListOwner); PsiClass annotationClass = JavaPsiFacade.getInstance(modifierListOwner.getProject()) .findClass(myAnnotation, modifierListOwner.getResolveScope()); @@ -84,6 +94,21 @@ public class AddAnnotationPsiFix extends LocalQuickFixOnPsiElement { target != null && ContainerUtil.exists(target.getApplicableAnnotations(), anno -> anno.hasQualifiedName(myAnnotation)); } + private static boolean hasExactlyOneAnnotationRoot(PsiModifierListOwner owner) { + final List entries = + ProjectRootManager.getInstance(owner.getProject()) + .getFileIndex() + .getOrderEntriesForFile(Objects.requireNonNull(PsiUtilCore.getVirtualFile(owner))); + for (OrderEntry entry : entries) { + if (entry instanceof LibraryOrSdkOrderEntry && + ContainerUtil.filter(AnnotationOrderRootType.getFiles(entry), VirtualFile::isInLocalFileSystem).size() == 1) { + return true; + } + } + + return false; + } + public static @IntentionName String calcText(PsiModifierListOwner modifierListOwner, @Nullable String annotation) { final String shortName = annotation == null ? null : annotation.substring(annotation.lastIndexOf('.') + 1); if (modifierListOwner instanceof PsiNamedElement) { @@ -176,6 +201,11 @@ public class AddAnnotationPsiFix extends LocalQuickFixOnPsiElement { return myAnnotationPlace == AnnotationPlace.IN_CODE; } + @Override + public boolean availableInBatchMode() { + return myAvailableInBatchMode; + } + @Override public void invoke(@NotNull Project project, @NotNull PsiFile file,