From 909cfb406b964cd24598223d9fc7cc7b654e8ccc Mon Sep 17 00:00:00 2001 From: Gregory Shrago Date: Fri, 13 Nov 2009 22:08:14 +0300 Subject: [PATCH] IDEADEV-41351 Add annotations.jar automatically whan 'Inject Language' intention is used --- .../daemon/impl/quickfix/OrderEntryFix.java | 18 ++++++++++++++++++ .../intellij/codeInsight/AnnotationUtil.java | 2 ++ .../java/JavaLanguageInjectionSupport.java | 9 ++++++--- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/OrderEntryFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/OrderEntryFix.java index 707c019b0797..dd8cb3900b95 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/OrderEntryFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/OrderEntryFix.java @@ -325,4 +325,22 @@ public abstract class OrderEntryFix implements IntentionAction, LocalQuickFix { } }); } + + public static void ensureAnnotationsJarInPath(final Module module, String annotationName) { + if (module == null) return; + final PsiClass psiClass = JavaPsiFacade.getInstance(module.getProject()) + .findClass(annotationName, GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module)); + if (psiClass != null) return; + final LocateLibraryDialog dialog = new LocateLibraryDialog( + module, PathManager.getLibPath(), "annotations.jar", + QuickFixBundle.message("add.library.annotations.description")); + dialog.show(); + if (dialog.isOK()) { + new WriteCommandAction(module.getProject()) { + protected void run(final Result result) throws Throwable { + addJarToRoots(dialog.getResultingLibraryPath(), module, null); + } + }.execute(); + } + } } diff --git a/java/openapi/src/com/intellij/codeInsight/AnnotationUtil.java b/java/openapi/src/com/intellij/codeInsight/AnnotationUtil.java index 7e731b1e8fac..4038ba353f47 100644 --- a/java/openapi/src/com/intellij/codeInsight/AnnotationUtil.java +++ b/java/openapi/src/com/intellij/codeInsight/AnnotationUtil.java @@ -59,6 +59,8 @@ public class AnnotationUtil { public static final String TEST_ONLY = "org.jetbrains.annotations.TestOnly"; @NonNls public static final String TEST_ONLY_SIMPLE_NAME = "TestOnly"; + public static final String LANGUAGE = "org.intellij.lang.annotations.Language"; + public static final Set ALL_ANNOTATIONS; @NonNls private static final String[] SIMPLE_NAMES = diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/java/JavaLanguageInjectionSupport.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/java/JavaLanguageInjectionSupport.java index 4aade019045e..41d940aff0a2 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/java/JavaLanguageInjectionSupport.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/java/JavaLanguageInjectionSupport.java @@ -16,11 +16,14 @@ package org.intellij.plugins.intelliLang.inject.java; +import com.intellij.codeInsight.AnnotationUtil; +import com.intellij.codeInsight.daemon.impl.quickfix.OrderEntryFix; import com.intellij.lang.Language; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogBuilder; @@ -200,14 +203,14 @@ public class JavaLanguageInjectionSupport extends AbstractLanguageInjectionSuppo static boolean doAddLanguageAnnotation(final Project project, final PsiModifierListOwner modifierListOwner, final String languageId) { if (modifierListOwner.getModifierList() == null || !PsiUtil.getLanguageLevel(modifierListOwner).hasEnumKeywordAndAutoboxing()) return false; + OrderEntryFix.ensureAnnotationsJarInPath(ModuleUtil.findModuleForPsiElement(modifierListOwner), AnnotationUtil.LANGUAGE); new WriteCommandAction(project, modifierListOwner.getContainingFile()) { protected void run(final Result result) throws Throwable { - final String annotationName = org.intellij.lang.annotations.Language.class.getName(); final PsiAnnotation annotation = JavaPsiFacade.getInstance(project).getElementFactory() - .createAnnotationFromText("@" + annotationName + "(\"" + languageId + "\")", modifierListOwner); + .createAnnotationFromText("@" + AnnotationUtil.LANGUAGE + "(\"" + languageId + "\")", modifierListOwner); final PsiModifierList list = modifierListOwner.getModifierList(); assert list != null; - final PsiAnnotation existingAnnotation = list.findAnnotation(annotationName); + final PsiAnnotation existingAnnotation = list.findAnnotation(AnnotationUtil.LANGUAGE); if (existingAnnotation != null) { existingAnnotation.replace(annotation); }