diff --git a/idea/src/org/jetbrains/jet/plugin/framework/KotlinFrameworkDetector.java b/idea/src/org/jetbrains/jet/plugin/framework/KotlinFrameworkDetector.java index d01a11aeee7..63485ca4dda 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/KotlinFrameworkDetector.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/KotlinFrameworkDetector.java @@ -1,41 +1,34 @@ package org.jetbrains.jet.plugin.framework; -import com.intellij.ProjectTopics; -import com.intellij.openapi.application.*; +import com.google.common.collect.Lists; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.module.ModuleUtilCore; -import com.intellij.openapi.progress.ProcessCanceledException; -import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.*; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.ProjectRootModificationTracker; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.Ref; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; -import com.intellij.psi.util.PsiModificationTracker; -import com.intellij.ui.EditorNotifications; -import com.intellij.util.Alarm; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.plugin.util.ApplicationUtils; -import org.jetbrains.jet.plugin.versions.KotlinLibrariesNotificationProvider; import org.jetbrains.jet.plugin.versions.KotlinRuntimeLibraryUtil; -import org.jetbrains.jet.utils.KotlinPathsFromHomeDir; import org.jetbrains.jet.utils.PathUtil; +import org.jetbrains.k2js.config.EcmaVersion; -import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; public class KotlinFrameworkDetector { private static final Key> IS_KOTLIN_JS_MODULE = Key.create("IS_KOTLIN_JS_MODULE"); @@ -67,36 +60,13 @@ public class KotlinFrameworkDetector { return result.getValue(); } - private static Boolean checkModuleHasJavaScriptLibrary(final Module module) { - final Ref found = Ref.create(Boolean.FALSE); - - ApplicationManager.getApplication().runReadAction(new Runnable() { - @Override - public void run() { - ModuleRootManager.getInstance(module).orderEntries().librariesOnly().forEachLibrary(new Processor() { - @Override - public boolean process(Library library) { - String libraryName = library.getName(); - if (libraryName != null && libraryName.contains(PathUtil.JS_LIB_JAR_NAME)) { - found.set(Boolean.TRUE); - return false; - } - return true; - } - }); - } - }); - - return found.get(); - } - public static boolean isJsModule(@NotNull final Module module) { CachedValue result = module.getUserData(IS_KOTLIN_JS_MODULE); if (result == null) { result = CachedValuesManager.getManager(module.getProject()).createCachedValue(new CachedValueProvider() { @Override public Result compute() { - return Result.create(checkModuleHasJavaScriptLibrary(module), + return Result.create(getStandardJavaScriptLibrary(module) != null, ProjectRootModificationTracker.getInstance(module.getProject())); } }, false); @@ -107,7 +77,72 @@ public class KotlinFrameworkDetector { return result.getValue(); } + @NotNull + private static Collection getJavaScriptHeadersLibraries(final Module module) { + final Collection headersLibraries = Lists.newArrayList(); + + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + ModuleRootManager.getInstance(module).orderEntries().librariesOnly().forEachLibrary(new Processor() { + @Override + public boolean process(Library library) { + if (KotlinJavaScriptHeadersPresentationProvider.getInstance().detect( + Arrays.asList(library.getFiles(OrderRootType.CLASSES))) != null) { + headersLibraries.add(library); + } + + return true; + } + }); + } + }); + + return headersLibraries; + } + + @Nullable + private static Library getStandardJavaScriptLibrary(final Module module) { + return ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public Library compute() { + for (Library library : getJavaScriptHeadersLibraries(module)) { + String libraryName = library.getName(); + if (libraryName != null && libraryName.contains(PathUtil.JS_LIB_JAR_NAME)) { + return library; + } + } + return null; + } + }); + } + + @NotNull + public static Pair, String> getLibLocationAndTargetForProject(@NotNull Project project) { + Module[] modules = ModuleManager.getInstance(project).getModules(); + for (Module module : modules) { + if (isJsModule(module)) { + return getLibLocationAndTargetForProject(module); + } + } + + return Pair.empty(); + } + public static Pair, String> getLibLocationAndTargetForProject(Module module) { - return Pair., String>create(new ArrayList(), "ecma3"); + Library library = getStandardJavaScriptLibrary(module); + + if (library != null) { + List pathsToJSLib = Lists.newArrayList(); + VirtualFile[] files = library.getRootProvider().getFiles(OrderRootType.SOURCES); + for (VirtualFile file : files) { + pathsToJSLib.add(com.intellij.util.PathUtil.getLocalPath(file)); + } + + return Pair.create(pathsToJSLib, EcmaVersion.defaultVersion().toString()); + } + else { + throw new IllegalStateException("Should be called for JS module only. JS library is expected to be found"); + } } } diff --git a/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaRuntimePresentationProvider.java b/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaRuntimePresentationProvider.java index 14f1851f0f6..cca450a2b5e 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaRuntimePresentationProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaRuntimePresentationProvider.java @@ -17,9 +17,7 @@ package org.jetbrains.jet.plugin.framework; import com.intellij.framework.library.LibraryVersionProperties; -import com.intellij.openapi.roots.libraries.LibraryKind; import com.intellij.openapi.roots.libraries.LibraryPresentationProvider; -import com.intellij.openapi.roots.libraries.LibraryProperties; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -30,6 +28,10 @@ import javax.swing.*; import java.util.List; public class KotlinJavaRuntimePresentationProvider extends LibraryPresentationProvider { + public static KotlinJavaRuntimePresentationProvider getInstance() { + return LibraryPresentationProvider.EP_NAME.findExtension(KotlinJavaRuntimePresentationProvider.class); + } + protected KotlinJavaRuntimePresentationProvider() { super(JetJavaRuntimeLibraryDescription.KOTLIN_JAVA_RUNTIME_KIND); } diff --git a/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaScriptHeadersPresentationProvider.java b/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaScriptHeadersPresentationProvider.java index b9e41314a70..b48badbef20 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaScriptHeadersPresentationProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaScriptHeadersPresentationProvider.java @@ -22,12 +22,15 @@ import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.plugin.JetIcons; -import org.jetbrains.jet.utils.PathUtil; import javax.swing.*; import java.util.List; public class KotlinJavaScriptHeadersPresentationProvider extends LibraryPresentationProvider { + public static KotlinJavaScriptHeadersPresentationProvider getInstance() { + return LibraryPresentationProvider.EP_NAME.findExtension(KotlinJavaScriptHeadersPresentationProvider.class); + } + protected KotlinJavaScriptHeadersPresentationProvider() { super(JetJavaScriptLibraryDescription.KOTLIN_JAVASCRIPT_KIND); } diff --git a/idea/src/org/jetbrains/jet/plugin/project/IDEAConfig.java b/idea/src/org/jetbrains/jet/plugin/project/IDEAConfig.java index 167156417bc..ae52bc41e7f 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/IDEAConfig.java +++ b/idea/src/org/jetbrains/jet/plugin/project/IDEAConfig.java @@ -18,13 +18,12 @@ package org.jetbrains.jet.plugin.project; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.plugin.framework.KotlinFrameworkDetector; import org.jetbrains.k2js.config.EcmaVersion; import org.jetbrains.k2js.config.LibrarySourcesConfig; -import java.util.ArrayList; - public final class IDEAConfig extends LibrarySourcesConfig { public IDEAConfig(@NotNull Project project) { - super(project, "default", new ArrayList(), EcmaVersion.defaultVersion()); + super(project, "default", KotlinFrameworkDetector.getLibLocationAndTargetForProject(project).first, EcmaVersion.defaultVersion()); } }