fix KT-8032 Mixed platform library in JVM module causes JS warning about unsupported format

#KT-8032 Fixed
This commit is contained in:
Michael Nedzelsky
2015-06-11 22:19:49 +03:00
parent 366a2be8a7
commit ed262a2a2a
2 changed files with 72 additions and 24 deletions
@@ -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<VirtualFile> getLibraryRootsWithAbiIncompatibleKotlinClasses(@NotNull Project project) {
return getLibraryRootsWithAbiIncompatibleVersion(project, KotlinAbiVersionIndex.INSTANCE$);
return getLibraryRootsWithAbiIncompatibleVersion(
project, KotlinAbiVersionIndex.INSTANCE$,
new Function1<Module, Boolean>() {
@Override
public Boolean invoke(@Nullable Module module) {
return module != null && ProjectStructureUtil.isJavaKotlinModule(module);
}
},
new Function1<Integer, Boolean>() {
@Override
public Boolean invoke(Integer abiVersion) {
return !AbiVersionUtil.isAbiVersionCompatible(abiVersion);
}
});
}
@NotNull
public static Collection<VirtualFile> getLibraryRootsWithAbiIncompatibleForKotlinJs(@NotNull Project project) {
return getLibraryRootsWithAbiIncompatibleVersion(project, KotlinJavaScriptAbiVersionIndex.INSTANCE$);
return getLibraryRootsWithAbiIncompatibleVersion(
project, KotlinJavaScriptAbiVersionIndex.INSTANCE$,
new Function1<Module, Boolean>() {
@Override
public Boolean invoke(@Nullable Module module) {
return module != null && ProjectStructureUtil.isJsKotlinModule(module);
}
},
new Function1<Integer, Boolean>() {
@Override
public Boolean invoke(Integer abiVersion) {
return !KotlinJavascriptMetadataUtils.isAbiVersionCompatible(abiVersion);
}
});
}
@@ -287,16 +317,19 @@ public class KotlinRuntimeLibraryUtil {
@NotNull
private static Collection<VirtualFile> getLibraryRootsWithAbiIncompatibleVersion(
@NotNull Project project,
@NotNull ScalarIndexExtension<Integer> index
@NotNull ScalarIndexExtension<Integer> index,
@NotNull Function1<Module, Boolean> checkModule,
@NotNull Function1<Integer, Boolean> checkAbiVersion
) {
ID<Integer, Void> id = index.getName();
Collection<Integer> abiVersions = FileBasedIndex.getInstance().getAllKeys(id, project);
Set<Integer> badAbiVersions = Sets.newHashSet(Collections2.filter(abiVersions, new Predicate<Integer>() {
@Override
public boolean apply(Integer abiVersion) {
return !AbiVersionUtil.isAbiVersionCompatible(abiVersion);
}
}));
Module[] modules = ModuleManager.getInstance(project).getModules();
List<Module> modulesToCheck = KotlinPackage.filter(modules, checkModule);
if (modulesToCheck.isEmpty()) return Collections.emptyList();
Collection<Integer> abiVersions = collectAllKeys(id, modulesToCheck);
Set<Integer> badAbiVersions = Sets.newHashSet(KotlinPackage.filter(abiVersions, checkAbiVersion));
Set<VirtualFile> badRoots = Sets.newHashSet();
ProjectFileIndex fileIndex = ProjectFileIndex.SERVICE.getInstance(project);
@@ -315,4 +348,16 @@ public class KotlinRuntimeLibraryUtil {
return badRoots;
}
@NotNull
private static Collection<Integer> collectAllKeys(@NotNull ID<Integer, Void> id, @NotNull List<Module> modules) {
Set<Integer> allKeys = new HashSet<Integer>();
for (Module module : modules) {
GlobalSearchScope scope = GlobalSearchScope.moduleWithLibrariesScope(module);
FileBasedIndex.getInstance().processAllKeys(id, new CommonProcessors.CollectProcessor<Integer>(allKeys), scope, null);
}
return allKeys;
}
}
@@ -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<EditorNotificationPanel> {
private static final Key<EditorNotificationPanel> 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<VirtualFile> collectBadRoots(@NotNull Project project) {
Collection<VirtualFile> badRoots = KotlinRuntimeLibraryUtil.getLibraryRootsWithAbiIncompatibleKotlinClasses(project);
badRoots.addAll(KotlinRuntimeLibraryUtil.getLibraryRootsWithAbiIncompatibleForKotlinJs(project));
Collection<VirtualFile> badJVMRoots = KotlinRuntimeLibraryUtil.getLibraryRootsWithAbiIncompatibleKotlinClasses(project);
Collection<VirtualFile> badJSRoots = KotlinRuntimeLibraryUtil.getLibraryRootsWithAbiIncompatibleForKotlinJs(project);
if (badJVMRoots.isEmpty() && badJSRoots.isEmpty()) return Collections.emptyList();
Collection<VirtualFile> badRoots = new HashSet<VirtualFile>();
badRoots.addAll(badJVMRoots);
badRoots.addAll(badJSRoots);
return badRoots;
}
}