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) {
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 {
private final List<JetFile> sourceFiles = new ArrayList<JetFile>();
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() {
@@ -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);
@@ -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);
}
}
@@ -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<String, PsiAnnotation> result = collectExternalAnnotations(listOwner);
return result.isEmpty() ? null : result.values().toArray(new PsiAnnotation[result.size()]);
}
@@ -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);
}
}
+3 -6
View File
@@ -8,12 +8,6 @@
<depends optional="true">JUnit</depends>
<application-components>
<component>
<implementation-class>org.jetbrains.jet.plugin.extAnnotations.IdeaExternalAnnotationsProvider</implementation-class>
</component>
</application-components>
<project-components>
<component>
<implementation-class>org.jetbrains.jet.plugin.JetStandardLibraryInitializer</implementation-class>
@@ -77,6 +71,9 @@
<projectService serviceInterface="org.jetbrains.jet.lang.resolve.java.JetFilesProvider"
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"/>
<internalFileTemplate name="Kotlin File"/>
@@ -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);
}
}