fix detection Kotlin Javascript stdlib

This commit is contained in:
Michael Nedzelsky
2014-12-11 03:31:12 +03:00
parent 2a680f4d8b
commit a49bcc8d39
3 changed files with 18 additions and 12 deletions
@@ -16,6 +16,8 @@
package org.jetbrains.jet.plugin.framework; package org.jetbrains.jet.plugin.framework;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.util.io.JarUtil; import com.intellij.openapi.util.io.JarUtil;
import com.intellij.openapi.vfs.StandardFileSystems; import com.intellij.openapi.vfs.StandardFileSystems;
import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VfsUtilCore;
@@ -23,19 +25,31 @@ import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.utils.LibraryUtils; import org.jetbrains.jet.utils.LibraryUtils;
import org.jetbrains.jet.utils.PathUtil;
import java.io.File; import java.io.File;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.jar.Attributes; import java.util.jar.Attributes;
public class JsLibraryStdDetectionUtil { public class JsLibraryStdDetectionUtil {
public static String getJsLibraryStdVersion(@NotNull List<VirtualFile> classesRoots) { public static String getJsLibraryStdVersion(@NotNull List<VirtualFile> classesRoots) {
return getJsLibraryStdVersion(classesRoots, true);
}
public static boolean hasJsStdlibJar(@NotNull Library library) {
List<VirtualFile> classes = Arrays.asList(library.getFiles(OrderRootType.CLASSES));
return getJsLibraryStdVersion(classes, false) != null;
}
private static String getJsLibraryStdVersion(@NotNull List<VirtualFile> classesRoots, boolean fixedJarName) {
if (JavaRuntimeDetectionUtil.getJavaRuntimeVersion(classesRoots) != null) { if (JavaRuntimeDetectionUtil.getJavaRuntimeVersion(classesRoots) != null) {
// Prevent clashing with java runtime, in case when library collects all roots. // Prevent clashing with java runtime, in case when library collects all roots.
return null; return null;
} }
VirtualFile jar = getJsStdLibJar(classesRoots); VirtualFile jar = fixedJarName ? LibraryUtils.getJarFile(classesRoots, PathUtil.JS_LIB_JAR_NAME) : getJsStdLibJar(classesRoots);
if (jar == null) return null; if (jar == null) return null;
assert JsHeaderLibraryDetectionUtil.isJsHeaderLibraryDetected(classesRoots) : "StdLib should also be detected as headers library"; assert JsHeaderLibraryDetectionUtil.isJsHeaderLibraryDetected(classesRoots) : "StdLib should also be detected as headers library";
@@ -44,7 +58,7 @@ public class JsLibraryStdDetectionUtil {
} }
@Nullable @Nullable
public static VirtualFile getJsStdLibJar(@NotNull List<VirtualFile> classesRoots) { private static VirtualFile getJsStdLibJar(@NotNull List<VirtualFile> classesRoots) {
for (VirtualFile root : classesRoots) { for (VirtualFile root : classesRoots) {
if (root.getFileSystem().getProtocol() != StandardFileSystems.JAR_PROTOCOL) continue; if (root.getFileSystem().getProtocol() != StandardFileSystems.JAR_PROTOCOL) continue;
@@ -22,13 +22,11 @@ import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.ProjectRootModificationTracker; import com.intellij.openapi.roots.ProjectRootModificationTracker;
import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.search.FileTypeIndex; import com.intellij.psi.search.FileTypeIndex;
import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValue;
@@ -42,9 +40,7 @@ import org.jetbrains.jet.plugin.JetFileType;
import org.jetbrains.jet.plugin.framework.JsLibraryStdDetectionUtil; import org.jetbrains.jet.plugin.framework.JsLibraryStdDetectionUtil;
import org.jetbrains.jet.plugin.versions.KotlinRuntimeLibraryCoreUtil; import org.jetbrains.jet.plugin.versions.KotlinRuntimeLibraryCoreUtil;
import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
public class ProjectStructureUtil { public class ProjectStructureUtil {
@@ -146,11 +142,7 @@ public class ProjectStructureUtil {
ModuleRootManager.getInstance(module).orderEntries().librariesOnly().forEachLibrary(new Processor<Library>() { ModuleRootManager.getInstance(module).orderEntries().librariesOnly().forEachLibrary(new Processor<Library>() {
@Override @Override
public boolean process(Library library) { public boolean process(Library library) {
List<VirtualFile> classes = Arrays.asList(library.getFiles(OrderRootType.CLASSES)); if (JsLibraryStdDetectionUtil.hasJsStdlibJar(library)) {
boolean detected = JsLibraryStdDetectionUtil.getJsLibraryStdVersion(classes) != null;
if (detected) {
jsLibrary.set(library); jsLibrary.set(library);
return false; return false;
} }
@@ -70,7 +70,7 @@ public class JSLibraryStdPresentationProvider extends LibraryPresentationProvide
@Nullable @Nullable
public static VirtualFile getJsStdLibJar(@NotNull Library library) { public static VirtualFile getJsStdLibJar(@NotNull Library library) {
return JsLibraryStdDetectionUtil.getJsStdLibJar(Arrays.asList(library.getFiles(OrderRootType.CLASSES))); return LibraryUtils.getJarFile(Arrays.asList(library.getFiles(OrderRootType.CLASSES)), PathUtil.JS_LIB_JAR_NAME);
} }
@Nullable @Nullable