Registered annotations provider as a service instead of static class to avoid problems with projects disposal.

This commit is contained in:
Evgeny Gerashchenko
2012-07-02 23:21:22 +04:00
parent 23a1c85c44
commit fa3e3ee104
8 changed files with 29 additions and 45 deletions
@@ -208,7 +208,7 @@ public class K2JVMCompiler extends CLICompiler<K2JVMCompilerArguments, K2JVMComp
if (arguments.annotations != null) { if (arguments.annotations != null) {
for (String root : Splitter.on(File.pathSeparatorChar).split(arguments.annotations)) { for (String root : Splitter.on(File.pathSeparatorChar).split(arguments.annotations)) {
JetCoreEnvironment.addExternalAnnotationsRoot(PathUtil.jarFileOrDirectoryToVirtualFile(new File(root))); configuration.getEnvironment().addExternalAnnotationsRoot(PathUtil.jarFileOrDirectoryToVirtualFile(new File(root)));
} }
} }
} }
@@ -49,6 +49,7 @@ import java.util.List;
*/ */
public class JetCoreEnvironment extends JavaCoreEnvironment { public class JetCoreEnvironment extends JavaCoreEnvironment {
private final List<JetFile> sourceFiles = new ArrayList<JetFile>(); private final List<JetFile> sourceFiles = new ArrayList<JetFile>();
private final CoreAnnotationsProvider annotationsProvider;
@NotNull @NotNull
public static JetCoreEnvironment createCoreEnvironmentForJS(Disposable disposable) { public static JetCoreEnvironment createCoreEnvironmentForJS(Disposable disposable) {
@@ -88,13 +89,14 @@ public class JetCoreEnvironment extends JavaCoreEnvironment {
addToClasspath(compilerDependencies.getJdkJar()); addToClasspath(compilerDependencies.getJdkJar());
} }
annotationsProvider = new CoreAnnotationsProvider();
if (compilerSpecialMode.includeJdkHeaders()) { if (compilerSpecialMode.includeJdkHeaders()) {
for (VirtualFile root : compilerDependencies.getJdkHeaderRoots()) { for (VirtualFile root : compilerDependencies.getJdkHeaderRoots()) {
addLibraryRoot(root); addLibraryRoot(root);
} }
} }
ExternalAnnotationsProvider.setInstance(new CoreAnnotationsProvider()); myProject.registerService(ExternalAnnotationsProvider.class, annotationsProvider);
if (compilerSpecialMode.includeKotlinRuntime()) { if (compilerSpecialMode.includeKotlinRuntime()) {
addToClasspath(compilerDependencies.getRuntimeJar()); addToClasspath(compilerDependencies.getRuntimeJar());
@@ -103,8 +105,8 @@ public class JetCoreEnvironment extends JavaCoreEnvironment {
JetStandardLibrary.initialize(getProject()); JetStandardLibrary.initialize(getProject());
} }
public static void addExternalAnnotationsRoot(@NotNull VirtualFile root) { public void addExternalAnnotationsRoot(VirtualFile root) {
((CoreAnnotationsProvider) ExternalAnnotationsProvider.getInstance()).addExternalAnnotationsRoot(root); annotationsProvider.addExternalAnnotationsRoot(root);
} }
public MockApplication getApplication() { public MockApplication getApplication() {
@@ -81,7 +81,7 @@ public class KotlinToJVMBytecodeCompiler {
} }
for (String annotationsRoot : moduleBuilder.getAnnotationsRoots()) { for (String annotationsRoot : moduleBuilder.getAnnotationsRoots()) {
JetCoreEnvironment.addExternalAnnotationsRoot(PathUtil.jarFileOrDirectoryToVirtualFile(new File(annotationsRoot))); configuration.getEnvironment().addExternalAnnotationsRoot(PathUtil.jarFileOrDirectoryToVirtualFile(new File(annotationsRoot)));
} }
GenerationState generationState = analyzeAndGenerate(configuration); GenerationState generationState = analyzeAndGenerate(configuration);
@@ -1617,7 +1617,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
result.addAll(Arrays.asList(list.getAnnotations())); 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) { if (externalAnnotations != null) {
result.addAll(Arrays.asList(externalAnnotations)); 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);
} }
} }
@@ -105,13 +105,13 @@ public class CoreAnnotationsProvider extends ExternalAnnotationsProvider {
@Override @Override
@Nullable @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); return collectExternalAnnotations(listOwner).get(annotationFQN);
} }
@Override @Override
@Nullable @Nullable
public PsiAnnotation[] findExternalAnnotations(@NotNull Project project, @NotNull final PsiModifierListOwner listOwner) { public PsiAnnotation[] findExternalAnnotations(@NotNull final PsiModifierListOwner listOwner) {
final Map<String, PsiAnnotation> result = collectExternalAnnotations(listOwner); final Map<String, PsiAnnotation> result = collectExternalAnnotations(listOwner);
return result.isEmpty() ? null : result.values().toArray(new PsiAnnotation[result.size()]); return result.isEmpty() ? null : result.values().toArray(new PsiAnnotation[result.size()]);
} }
@@ -16,6 +16,7 @@
package org.jetbrains.jet.lang.resolve.java.extAnnotations; package org.jetbrains.jet.lang.resolve.java.extAnnotations;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiModifierListOwner; import com.intellij.psi.PsiModifierListOwner;
@@ -29,20 +30,13 @@ import org.jetbrains.annotations.Nullable;
*/ */
@Deprecated @Deprecated
public abstract class ExternalAnnotationsProvider { public abstract class ExternalAnnotationsProvider {
private static ExternalAnnotationsProvider instance; @Nullable
public abstract PsiAnnotation findExternalAnnotation(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN);
@Nullable @Nullable
public abstract PsiAnnotation findExternalAnnotation(@NotNull Project project, @NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN); public abstract PsiAnnotation[] findExternalAnnotations(@NotNull PsiModifierListOwner listOwner);
@Nullable public static ExternalAnnotationsProvider getInstance(@NotNull Project project) {
public abstract PsiAnnotation[] findExternalAnnotations(@NotNull Project project, @NotNull PsiModifierListOwner listOwner); return ServiceManager.getService(project, ExternalAnnotationsProvider.class);
@NotNull
public static ExternalAnnotationsProvider getInstance() {
return instance;
}
public static void setInstance(@NotNull ExternalAnnotationsProvider instance) {
ExternalAnnotationsProvider.instance = instance;
} }
} }
+3 -6
View File
@@ -8,12 +8,6 @@
<depends optional="true">JUnit</depends> <depends optional="true">JUnit</depends>
<application-components>
<component>
<implementation-class>org.jetbrains.jet.plugin.extAnnotations.IdeaExternalAnnotationsProvider</implementation-class>
</component>
</application-components>
<project-components> <project-components>
<component> <component>
<implementation-class>org.jetbrains.jet.plugin.JetStandardLibraryInitializer</implementation-class> <implementation-class>org.jetbrains.jet.plugin.JetStandardLibraryInitializer</implementation-class>
@@ -77,6 +71,9 @@
<projectService serviceInterface="org.jetbrains.jet.lang.resolve.java.JetFilesProvider" <projectService serviceInterface="org.jetbrains.jet.lang.resolve.java.JetFilesProvider"
serviceImplementation="org.jetbrains.jet.plugin.project.PluginJetFilesProvider"/> serviceImplementation="org.jetbrains.jet.plugin.project.PluginJetFilesProvider"/>
<projectService serviceInterface="org.jetbrains.jet.lang.resolve.java.extAnnotations.ExternalAnnotationsProvider"
serviceImplementation="org.jetbrains.jet.plugin.extAnnotations.IdeaExternalAnnotationsProvider"/>
<errorHandler implementation="org.jetbrains.jet.plugin.reporter.KotlinReportSubmitter"/> <errorHandler implementation="org.jetbrains.jet.plugin.reporter.KotlinReportSubmitter"/>
<internalFileTemplate name="Kotlin File"/> <internalFileTemplate name="Kotlin File"/>
@@ -31,29 +31,20 @@ import org.jetbrains.jet.lang.resolve.java.extAnnotations.ExternalAnnotationsPro
* @since 6/26/12 * @since 6/26/12
*/ */
@Deprecated @Deprecated
public class IdeaExternalAnnotationsProvider extends ExternalAnnotationsProvider implements ApplicationComponent { public class IdeaExternalAnnotationsProvider extends ExternalAnnotationsProvider {
@Override private final ExternalAnnotationsManager externalAnnotationsManager;
public PsiAnnotation findExternalAnnotation(@NotNull Project project, @NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN) {
return ExternalAnnotationsManager.getInstance(project).findExternalAnnotation(listOwner, annotationFQN); public IdeaExternalAnnotationsProvider(ExternalAnnotationsManager externalAnnotationsManager) {
this.externalAnnotationsManager = externalAnnotationsManager;
} }
@Override @Override
public PsiAnnotation[] findExternalAnnotations(@NotNull Project project, @NotNull PsiModifierListOwner listOwner) { public synchronized PsiAnnotation findExternalAnnotation(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN) {
return ExternalAnnotationsManager.getInstance(project).findExternalAnnotations(listOwner); return externalAnnotationsManager.findExternalAnnotation(listOwner, annotationFQN);
} }
@Override @Override
public void initComponent() { public synchronized PsiAnnotation[] findExternalAnnotations(@NotNull PsiModifierListOwner listOwner) {
ExternalAnnotationsProvider.setInstance(this); return externalAnnotationsManager.findExternalAnnotations(listOwner);
}
@Override
public void disposeComponent() {
}
@NotNull
@Override
public String getComponentName() {
return getClass().getName();
} }
} }