From fa3e3ee104f3deb9ea015660e6a0805475e71dc2 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Mon, 2 Jul 2012 23:21:22 +0400 Subject: [PATCH] Registered annotations provider as a service instead of static class to avoid problems with projects disposal. --- .../jetbrains/jet/cli/jvm/K2JVMCompiler.java | 2 +- .../cli/jvm/compiler/JetCoreEnvironment.java | 8 +++--- .../compiler/KotlinToJVMBytecodeCompiler.java | 2 +- .../resolve/java/JavaDescriptorResolver.java | 4 +-- .../CoreAnnotationsProvider.java | 4 +-- .../ExternalAnnotationsProvider.java | 18 +++++-------- idea/src/META-INF/plugin.xml | 9 +++---- .../IdeaExternalAnnotationsProvider.java | 27 +++++++------------ 8 files changed, 29 insertions(+), 45 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java index f1e7cd6495a..021a6a4067a 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java @@ -208,7 +208,7 @@ public class K2JVMCompiler extends CLICompiler sourceFiles = new ArrayList(); + private final CoreAnnotationsProvider annotationsProvider; @NotNull public static JetCoreEnvironment createCoreEnvironmentForJS(Disposable disposable) { @@ -88,13 +89,14 @@ public class JetCoreEnvironment extends JavaCoreEnvironment { addToClasspath(compilerDependencies.getJdkJar()); } + annotationsProvider = new CoreAnnotationsProvider(); if (compilerSpecialMode.includeJdkHeaders()) { for (VirtualFile root : compilerDependencies.getJdkHeaderRoots()) { addLibraryRoot(root); } } - ExternalAnnotationsProvider.setInstance(new CoreAnnotationsProvider()); + myProject.registerService(ExternalAnnotationsProvider.class, annotationsProvider); if (compilerSpecialMode.includeKotlinRuntime()) { addToClasspath(compilerDependencies.getRuntimeJar()); @@ -103,8 +105,8 @@ public class JetCoreEnvironment extends JavaCoreEnvironment { JetStandardLibrary.initialize(getProject()); } - public static void addExternalAnnotationsRoot(@NotNull VirtualFile root) { - ((CoreAnnotationsProvider) ExternalAnnotationsProvider.getInstance()).addExternalAnnotationsRoot(root); + public void addExternalAnnotationsRoot(VirtualFile root) { + annotationsProvider.addExternalAnnotationsRoot(root); } public MockApplication getApplication() { diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java index 3a74b1f7495..5b5d0e34633 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java @@ -81,7 +81,7 @@ public class KotlinToJVMBytecodeCompiler { } for (String annotationsRoot : moduleBuilder.getAnnotationsRoots()) { - JetCoreEnvironment.addExternalAnnotationsRoot(PathUtil.jarFileOrDirectoryToVirtualFile(new File(annotationsRoot))); + configuration.getEnvironment().addExternalAnnotationsRoot(PathUtil.jarFileOrDirectoryToVirtualFile(new File(annotationsRoot))); } GenerationState generationState = analyzeAndGenerate(configuration); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 260cd8259c4..a7bd29bc05e 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1617,7 +1617,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes result.addAll(Arrays.asList(list.getAnnotations())); } - PsiAnnotation[] externalAnnotations = ExternalAnnotationsProvider.getInstance().findExternalAnnotations(owner.getProject(), owner); + PsiAnnotation[] externalAnnotations = ExternalAnnotationsProvider.getInstance(owner.getProject()).findExternalAnnotations(owner); if (externalAnnotations != null) { result.addAll(Arrays.asList(externalAnnotations)); } @@ -1635,6 +1635,6 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes } } - return ExternalAnnotationsProvider.getInstance().findExternalAnnotation(owner.getProject(), owner, fqName); + return ExternalAnnotationsProvider.getInstance(owner.getProject()).findExternalAnnotation(owner, fqName); } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/extAnnotations/CoreAnnotationsProvider.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/extAnnotations/CoreAnnotationsProvider.java index cc608dcf9ee..03d078e4a2a 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/extAnnotations/CoreAnnotationsProvider.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/extAnnotations/CoreAnnotationsProvider.java @@ -105,13 +105,13 @@ public class CoreAnnotationsProvider extends ExternalAnnotationsProvider { @Override @Nullable - public PsiAnnotation findExternalAnnotation(@NotNull Project project, @NotNull final PsiModifierListOwner listOwner, @NotNull final String annotationFQN) { + public PsiAnnotation findExternalAnnotation(@NotNull final PsiModifierListOwner listOwner, @NotNull final String annotationFQN) { return collectExternalAnnotations(listOwner).get(annotationFQN); } @Override @Nullable - public PsiAnnotation[] findExternalAnnotations(@NotNull Project project, @NotNull final PsiModifierListOwner listOwner) { + public PsiAnnotation[] findExternalAnnotations(@NotNull final PsiModifierListOwner listOwner) { final Map result = collectExternalAnnotations(listOwner); return result.isEmpty() ? null : result.values().toArray(new PsiAnnotation[result.size()]); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/extAnnotations/ExternalAnnotationsProvider.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/extAnnotations/ExternalAnnotationsProvider.java index 072c5669343..32d293207e6 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/extAnnotations/ExternalAnnotationsProvider.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/extAnnotations/ExternalAnnotationsProvider.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.resolve.java.extAnnotations; +import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiModifierListOwner; @@ -29,20 +30,13 @@ import org.jetbrains.annotations.Nullable; */ @Deprecated public abstract class ExternalAnnotationsProvider { - private static ExternalAnnotationsProvider instance; + @Nullable + public abstract PsiAnnotation findExternalAnnotation(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN); @Nullable - public abstract PsiAnnotation findExternalAnnotation(@NotNull Project project, @NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN); + public abstract PsiAnnotation[] findExternalAnnotations(@NotNull PsiModifierListOwner listOwner); - @Nullable - public abstract PsiAnnotation[] findExternalAnnotations(@NotNull Project project, @NotNull PsiModifierListOwner listOwner); - - @NotNull - public static ExternalAnnotationsProvider getInstance() { - return instance; - } - - public static void setInstance(@NotNull ExternalAnnotationsProvider instance) { - ExternalAnnotationsProvider.instance = instance; + public static ExternalAnnotationsProvider getInstance(@NotNull Project project) { + return ServiceManager.getService(project, ExternalAnnotationsProvider.class); } } diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 22804b99be2..884a9270bc5 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -8,12 +8,6 @@ JUnit - - - org.jetbrains.jet.plugin.extAnnotations.IdeaExternalAnnotationsProvider - - - org.jetbrains.jet.plugin.JetStandardLibraryInitializer @@ -77,6 +71,9 @@ + + diff --git a/idea/src/org/jetbrains/jet/plugin/extAnnotations/IdeaExternalAnnotationsProvider.java b/idea/src/org/jetbrains/jet/plugin/extAnnotations/IdeaExternalAnnotationsProvider.java index 2463abe4895..cdd5b96f5cf 100644 --- a/idea/src/org/jetbrains/jet/plugin/extAnnotations/IdeaExternalAnnotationsProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/extAnnotations/IdeaExternalAnnotationsProvider.java @@ -31,29 +31,20 @@ import org.jetbrains.jet.lang.resolve.java.extAnnotations.ExternalAnnotationsPro * @since 6/26/12 */ @Deprecated -public class IdeaExternalAnnotationsProvider extends ExternalAnnotationsProvider implements ApplicationComponent { - @Override - public PsiAnnotation findExternalAnnotation(@NotNull Project project, @NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN) { - return ExternalAnnotationsManager.getInstance(project).findExternalAnnotation(listOwner, annotationFQN); +public class IdeaExternalAnnotationsProvider extends ExternalAnnotationsProvider { + private final ExternalAnnotationsManager externalAnnotationsManager; + + public IdeaExternalAnnotationsProvider(ExternalAnnotationsManager externalAnnotationsManager) { + this.externalAnnotationsManager = externalAnnotationsManager; } @Override - public PsiAnnotation[] findExternalAnnotations(@NotNull Project project, @NotNull PsiModifierListOwner listOwner) { - return ExternalAnnotationsManager.getInstance(project).findExternalAnnotations(listOwner); + public synchronized PsiAnnotation findExternalAnnotation(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN) { + return externalAnnotationsManager.findExternalAnnotation(listOwner, annotationFQN); } @Override - public void initComponent() { - ExternalAnnotationsProvider.setInstance(this); - } - - @Override - public void disposeComponent() { - } - - @NotNull - @Override - public String getComponentName() { - return getClass().getName(); + public synchronized PsiAnnotation[] findExternalAnnotations(@NotNull PsiModifierListOwner listOwner) { + return externalAnnotationsManager.findExternalAnnotations(listOwner); } }