diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java index 40672cfcb4df..366c0c27bf72 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java @@ -728,6 +728,19 @@ public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsM return null; } + @Override + public boolean hasAnnotationRootsForFile(@NotNull VirtualFile file) { + if (hasAnyAnnotationsRoots()) { + ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myPsiManager.getProject()).getFileIndex(); + for (OrderEntry entry : fileIndex.getOrderEntriesForFile(file)) { + if (!(entry instanceof ModuleOrderEntry) && AnnotationOrderRootType.getUrls(entry).length > 0) { + return true; + } + } + } + return false; + } + @Override protected void duplicateError(@NotNull PsiFile file, @NotNull String externalName, @NotNull String text) { String message = text + "; for signature: '" + externalName + "' in the file " + file.getVirtualFile().getPresentableUrl(); diff --git a/java/java-impl/src/com/intellij/codeInsight/MakeAnnotationExternal.java b/java/java-impl/src/com/intellij/codeInsight/MakeAnnotationExternal.java index 016d355f5722..a7dc0bef3c53 100644 --- a/java/java-impl/src/com/intellij/codeInsight/MakeAnnotationExternal.java +++ b/java/java-impl/src/com/intellij/codeInsight/MakeAnnotationExternal.java @@ -19,12 +19,14 @@ import com.intellij.codeInsight.intention.impl.BaseIntentionAction; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiModifierListOwner; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -43,11 +45,16 @@ public class MakeAnnotationExternal extends BaseIntentionAction { PsiAnnotation annotation = PsiTreeUtil.getParentOfType(file.findElementAt(editor.getCaretModel().getOffset()), PsiAnnotation.class); if (annotation != null && annotation.getQualifiedName() != null && - annotation.getManager().isInProject(annotation) && - CodeStyleSettingsManager.getSettings(project).USE_EXTERNAL_ANNOTATIONS && - PsiTreeUtil.getParentOfType(annotation, PsiModifierListOwner.class) != null) { - setText("Annotate externally"); - return true; + annotation.getManager().isInProject(annotation)) { + PsiModifierListOwner modifierListOwner = PsiTreeUtil.getParentOfType(annotation, PsiModifierListOwner.class); + if (modifierListOwner != null) { + VirtualFile virtualFile = PsiUtilCore.getVirtualFile(modifierListOwner); + if (CodeStyleSettingsManager.getSettings(project).USE_EXTERNAL_ANNOTATIONS || + virtualFile != null && ExternalAnnotationsManager.getInstance(project).hasAnnotationRootsForFile(virtualFile)) { + setText("Annotate externally"); + return true; + } + } } return false; } diff --git a/java/java-psi-api/src/com/intellij/codeInsight/ExternalAnnotationsManager.java b/java/java-psi-api/src/com/intellij/codeInsight/ExternalAnnotationsManager.java index 17704763e532..66efb2ac3014 100644 --- a/java/java-psi-api/src/com/intellij/codeInsight/ExternalAnnotationsManager.java +++ b/java/java-psi-api/src/com/intellij/codeInsight/ExternalAnnotationsManager.java @@ -18,6 +18,7 @@ package com.intellij.codeInsight; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.NotNullLazyKey; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.util.messages.Topic; import org.jetbrains.annotations.NotNull; @@ -42,6 +43,8 @@ public abstract class ExternalAnnotationsManager { return INSTANCE_KEY.getValue(project); } + public abstract boolean hasAnnotationRootsForFile(@NotNull VirtualFile file); + public abstract boolean isExternalAnnotation(@NotNull PsiAnnotation annotation); @Nullable diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java b/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java index 6039b3f259bc..7b709243ed31 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java @@ -73,6 +73,11 @@ public abstract class BaseExternalAnnotationsManager extends ExternalAnnotations protected abstract boolean hasAnyAnnotationsRoots(); + @Override + public boolean hasAnnotationRootsForFile(@NotNull VirtualFile file) { + return hasAnyAnnotationsRoots(); + } + @Override public boolean isExternalAnnotation(@NotNull PsiAnnotation annotation) { return annotation.getUserData(EXTERNAL_ANNO_MARKER) != null;