From ed262a2a2a1ed7b3f129de242e5efb1661629ff2 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Thu, 11 Jun 2015 22:19:49 +0300 Subject: [PATCH] fix KT-8032 Mixed platform library in JVM module causes JS warning about unsupported format #KT-8032 Fixed --- .../versions/KotlinRuntimeLibraryUtil.java | 75 +++++++++++++++---- ...edAbiVersionNotificationPanelProvider.java | 21 +++--- 2 files changed, 72 insertions(+), 24 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.java b/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.java index 563ce004d96..b0991412312 100644 --- a/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.java +++ b/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.java @@ -16,8 +16,6 @@ package org.jetbrains.kotlin.idea.versions; -import com.google.common.base.Predicate; -import com.google.common.collect.Collections2; import com.google.common.collect.Sets; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; @@ -32,11 +30,15 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.ProjectScope; +import com.intellij.util.CommonProcessors; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.indexing.FileBasedIndex; import com.intellij.util.indexing.ID; import com.intellij.util.indexing.ScalarIndexExtension; +import kotlin.KotlinPackage; +import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.idea.JetPluginUtil; @@ -45,30 +47,58 @@ import org.jetbrains.kotlin.idea.configuration.KotlinJavaModuleConfigurator; import org.jetbrains.kotlin.idea.framework.JSLibraryStdPresentationProvider; import org.jetbrains.kotlin.idea.framework.JavaRuntimePresentationProvider; import org.jetbrains.kotlin.idea.framework.LibraryPresentationProviderUtil; +import org.jetbrains.kotlin.idea.project.ProjectStructureUtil; import org.jetbrains.kotlin.load.java.AbiVersionUtil; +import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils; import org.jetbrains.kotlin.utils.KotlinPaths; import org.jetbrains.kotlin.utils.PathUtil; import java.io.File; import java.io.IOException; -import java.util.Collection; -import java.util.Set; +import java.util.*; import static com.intellij.util.PathUtil.getLocalFile; import static com.intellij.util.PathUtil.getLocalPath; import static org.jetbrains.kotlin.idea.versions.OutdatedKotlinRuntimeNotification.showRuntimeJarNotFoundDialog; public class KotlinRuntimeLibraryUtil { - private KotlinRuntimeLibraryUtil() {} + private KotlinRuntimeLibraryUtil() { + } @NotNull public static Collection getLibraryRootsWithAbiIncompatibleKotlinClasses(@NotNull Project project) { - return getLibraryRootsWithAbiIncompatibleVersion(project, KotlinAbiVersionIndex.INSTANCE$); + return getLibraryRootsWithAbiIncompatibleVersion( + project, KotlinAbiVersionIndex.INSTANCE$, + new Function1() { + @Override + public Boolean invoke(@Nullable Module module) { + return module != null && ProjectStructureUtil.isJavaKotlinModule(module); + } + }, + new Function1() { + @Override + public Boolean invoke(Integer abiVersion) { + return !AbiVersionUtil.isAbiVersionCompatible(abiVersion); + } + }); } @NotNull public static Collection getLibraryRootsWithAbiIncompatibleForKotlinJs(@NotNull Project project) { - return getLibraryRootsWithAbiIncompatibleVersion(project, KotlinJavaScriptAbiVersionIndex.INSTANCE$); + return getLibraryRootsWithAbiIncompatibleVersion( + project, KotlinJavaScriptAbiVersionIndex.INSTANCE$, + new Function1() { + @Override + public Boolean invoke(@Nullable Module module) { + return module != null && ProjectStructureUtil.isJsKotlinModule(module); + } + }, + new Function1() { + @Override + public Boolean invoke(Integer abiVersion) { + return !KotlinJavascriptMetadataUtils.isAbiVersionCompatible(abiVersion); + } + }); } @@ -287,16 +317,19 @@ public class KotlinRuntimeLibraryUtil { @NotNull private static Collection getLibraryRootsWithAbiIncompatibleVersion( @NotNull Project project, - @NotNull ScalarIndexExtension index + @NotNull ScalarIndexExtension index, + @NotNull Function1 checkModule, + @NotNull Function1 checkAbiVersion ) { ID id = index.getName(); - Collection abiVersions = FileBasedIndex.getInstance().getAllKeys(id, project); - Set badAbiVersions = Sets.newHashSet(Collections2.filter(abiVersions, new Predicate() { - @Override - public boolean apply(Integer abiVersion) { - return !AbiVersionUtil.isAbiVersionCompatible(abiVersion); - } - })); + + Module[] modules = ModuleManager.getInstance(project).getModules(); + + List modulesToCheck = KotlinPackage.filter(modules, checkModule); + if (modulesToCheck.isEmpty()) return Collections.emptyList(); + + Collection abiVersions = collectAllKeys(id, modulesToCheck); + Set badAbiVersions = Sets.newHashSet(KotlinPackage.filter(abiVersions, checkAbiVersion)); Set badRoots = Sets.newHashSet(); ProjectFileIndex fileIndex = ProjectFileIndex.SERVICE.getInstance(project); @@ -315,4 +348,16 @@ public class KotlinRuntimeLibraryUtil { return badRoots; } + + @NotNull + private static Collection collectAllKeys(@NotNull ID id, @NotNull List modules) { + Set allKeys = new HashSet(); + + for (Module module : modules) { + GlobalSearchScope scope = GlobalSearchScope.moduleWithLibrariesScope(module); + FileBasedIndex.getInstance().processAllKeys(id, new CommonProcessors.CollectProcessor(allKeys), scope, null); + } + + return allKeys; + } } diff --git a/idea/src/org/jetbrains/kotlin/idea/versions/UnsupportedAbiVersionNotificationPanelProvider.java b/idea/src/org/jetbrains/kotlin/idea/versions/UnsupportedAbiVersionNotificationPanelProvider.java index 018bc27744c..93a13aefe32 100644 --- a/idea/src/org/jetbrains/kotlin/idea/versions/UnsupportedAbiVersionNotificationPanelProvider.java +++ b/idea/src/org/jetbrains/kotlin/idea/versions/UnsupportedAbiVersionNotificationPanelProvider.java @@ -49,8 +49,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.idea.JetFileType; import org.jetbrains.kotlin.idea.configuration.ConfigureKotlinInProjectUtils; -import org.jetbrains.kotlin.idea.configuration.KotlinJavaModuleConfigurator; -import org.jetbrains.kotlin.idea.configuration.KotlinProjectConfigurator; import org.jetbrains.kotlin.idea.framework.JSLibraryStdPresentationProvider; import org.jetbrains.kotlin.idea.framework.JavaRuntimePresentationProvider; @@ -58,6 +56,8 @@ import javax.swing.*; import java.awt.*; import java.text.MessageFormat; import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; public class UnsupportedAbiVersionNotificationPanelProvider extends EditorNotifications.Provider { private static final Key KEY = Key.create("unsupported.abi.version"); @@ -196,11 +196,7 @@ public class UnsupportedAbiVersionNotificationPanelProvider extends EditorNotifi Module module = ModuleUtilCore.findModuleForFile(file, project); if (module == null) return null; - KotlinProjectConfigurator configurator = ConfigureKotlinInProjectUtils.getConfiguratorByName(KotlinJavaModuleConfigurator.NAME); - assert configurator != null : "Configurator should exists " + KotlinJavaModuleConfigurator.NAME; - if (!configurator.isConfigured(module)) { - return null; - } + if (!ConfigureKotlinInProjectUtils.isModuleConfigured(module)) return null; return checkAndCreate(project); } @@ -275,8 +271,15 @@ public class UnsupportedAbiVersionNotificationPanelProvider extends EditorNotifi @NotNull private static Collection collectBadRoots(@NotNull Project project) { - Collection badRoots = KotlinRuntimeLibraryUtil.getLibraryRootsWithAbiIncompatibleKotlinClasses(project); - badRoots.addAll(KotlinRuntimeLibraryUtil.getLibraryRootsWithAbiIncompatibleForKotlinJs(project)); + Collection badJVMRoots = KotlinRuntimeLibraryUtil.getLibraryRootsWithAbiIncompatibleKotlinClasses(project); + Collection badJSRoots = KotlinRuntimeLibraryUtil.getLibraryRootsWithAbiIncompatibleForKotlinJs(project); + + if (badJVMRoots.isEmpty() && badJSRoots.isEmpty()) return Collections.emptyList(); + + Collection badRoots = new HashSet(); + badRoots.addAll(badJVMRoots); + badRoots.addAll(badJSRoots); + return badRoots; } }