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; 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.google.common.collect.Sets;
import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module; 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.JarFileSystem;
import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.ProjectScope; import com.intellij.psi.search.ProjectScope;
import com.intellij.util.CommonProcessors;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.indexing.FileBasedIndex; import com.intellij.util.indexing.FileBasedIndex;
import com.intellij.util.indexing.ID; import com.intellij.util.indexing.ID;
import com.intellij.util.indexing.ScalarIndexExtension; import com.intellij.util.indexing.ScalarIndexExtension;
import kotlin.KotlinPackage;
import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.idea.JetPluginUtil; 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.JSLibraryStdPresentationProvider;
import org.jetbrains.kotlin.idea.framework.JavaRuntimePresentationProvider; import org.jetbrains.kotlin.idea.framework.JavaRuntimePresentationProvider;
import org.jetbrains.kotlin.idea.framework.LibraryPresentationProviderUtil; 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.load.java.AbiVersionUtil;
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils;
import org.jetbrains.kotlin.utils.KotlinPaths; import org.jetbrains.kotlin.utils.KotlinPaths;
import org.jetbrains.kotlin.utils.PathUtil; import org.jetbrains.kotlin.utils.PathUtil;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.*;
import java.util.Set;
import static com.intellij.util.PathUtil.getLocalFile; import static com.intellij.util.PathUtil.getLocalFile;
import static com.intellij.util.PathUtil.getLocalPath; import static com.intellij.util.PathUtil.getLocalPath;
import static org.jetbrains.kotlin.idea.versions.OutdatedKotlinRuntimeNotification.showRuntimeJarNotFoundDialog; import static org.jetbrains.kotlin.idea.versions.OutdatedKotlinRuntimeNotification.showRuntimeJarNotFoundDialog;
public class KotlinRuntimeLibraryUtil { public class KotlinRuntimeLibraryUtil {
private KotlinRuntimeLibraryUtil() {} private KotlinRuntimeLibraryUtil() {
}
@NotNull @NotNull
public static Collection<VirtualFile> getLibraryRootsWithAbiIncompatibleKotlinClasses(@NotNull Project project) { 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 @NotNull
public static Collection<VirtualFile> getLibraryRootsWithAbiIncompatibleForKotlinJs(@NotNull Project project) { 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 @NotNull
private static Collection<VirtualFile> getLibraryRootsWithAbiIncompatibleVersion( private static Collection<VirtualFile> getLibraryRootsWithAbiIncompatibleVersion(
@NotNull Project project, @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(); 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>() { Module[] modules = ModuleManager.getInstance(project).getModules();
@Override
public boolean apply(Integer abiVersion) { List<Module> modulesToCheck = KotlinPackage.filter(modules, checkModule);
return !AbiVersionUtil.isAbiVersionCompatible(abiVersion); 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(); Set<VirtualFile> badRoots = Sets.newHashSet();
ProjectFileIndex fileIndex = ProjectFileIndex.SERVICE.getInstance(project); ProjectFileIndex fileIndex = ProjectFileIndex.SERVICE.getInstance(project);
@@ -315,4 +348,16 @@ public class KotlinRuntimeLibraryUtil {
return badRoots; 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.annotations.Nullable;
import org.jetbrains.kotlin.idea.JetFileType; import org.jetbrains.kotlin.idea.JetFileType;
import org.jetbrains.kotlin.idea.configuration.ConfigureKotlinInProjectUtils; 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.JSLibraryStdPresentationProvider;
import org.jetbrains.kotlin.idea.framework.JavaRuntimePresentationProvider; import org.jetbrains.kotlin.idea.framework.JavaRuntimePresentationProvider;
@@ -58,6 +56,8 @@ import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
public class UnsupportedAbiVersionNotificationPanelProvider extends EditorNotifications.Provider<EditorNotificationPanel> { public class UnsupportedAbiVersionNotificationPanelProvider extends EditorNotifications.Provider<EditorNotificationPanel> {
private static final Key<EditorNotificationPanel> KEY = Key.create("unsupported.abi.version"); 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); Module module = ModuleUtilCore.findModuleForFile(file, project);
if (module == null) return null; if (module == null) return null;
KotlinProjectConfigurator configurator = ConfigureKotlinInProjectUtils.getConfiguratorByName(KotlinJavaModuleConfigurator.NAME); if (!ConfigureKotlinInProjectUtils.isModuleConfigured(module)) return null;
assert configurator != null : "Configurator should exists " + KotlinJavaModuleConfigurator.NAME;
if (!configurator.isConfigured(module)) {
return null;
}
return checkAndCreate(project); return checkAndCreate(project);
} }
@@ -275,8 +271,15 @@ public class UnsupportedAbiVersionNotificationPanelProvider extends EditorNotifi
@NotNull @NotNull
private static Collection<VirtualFile> collectBadRoots(@NotNull Project project) { private static Collection<VirtualFile> collectBadRoots(@NotNull Project project) {
Collection<VirtualFile> badRoots = KotlinRuntimeLibraryUtil.getLibraryRootsWithAbiIncompatibleKotlinClasses(project); Collection<VirtualFile> badJVMRoots = KotlinRuntimeLibraryUtil.getLibraryRootsWithAbiIncompatibleKotlinClasses(project);
badRoots.addAll(KotlinRuntimeLibraryUtil.getLibraryRootsWithAbiIncompatibleForKotlinJs(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; return badRoots;
} }
} }