JsLibraryStdDetectionUtil: J2K

This commit is contained in:
Dmitry Jemerov
2017-03-09 19:57:31 +01:00
parent dffff77a5d
commit 09b60e3f77
3 changed files with 35 additions and 40 deletions
@@ -14,68 +14,63 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.kotlin.idea.framework; package org.jetbrains.kotlin.idea.framework
import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.impl.libraries.LibraryEx; import com.intellij.openapi.roots.impl.libraries.LibraryEx
import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Key
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
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.utils.LibraryUtils
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.utils.LibraryUtils;
import java.io.File; import java.io.File
import java.util.Arrays; import java.util.Arrays
import java.util.List; import java.util.jar.Attributes
import java.util.jar.Attributes;
public class JsLibraryStdDetectionUtil { object JsLibraryStdDetectionUtil {
private static final Key<Boolean> IS_JS_LIBRARY_STD_LIB = Key.create("IS_JS_LIBRARY_STD_LIB"); private val IS_JS_LIBRARY_STD_LIB = Key.create<Boolean>("IS_JS_LIBRARY_STD_LIB")
public static boolean hasJsStdlibJar(@NotNull Library library) { fun hasJsStdlibJar(library: Library): Boolean {
if (library instanceof LibraryEx && ((LibraryEx) library).isDisposed()) return false; if (library is LibraryEx && library.isDisposed) return false
if (!KotlinJavaScriptLibraryDetectionUtil.isKotlinJavaScriptLibrary(library)) return false; if (!KotlinJavaScriptLibraryDetectionUtil.isKotlinJavaScriptLibrary(library)) return false
List<VirtualFile> classes = Arrays.asList(library.getFiles(OrderRootType.CLASSES)); val classes = Arrays.asList(*library.getFiles(OrderRootType.CLASSES))
return getJsLibraryStdVersion(classes) != null; return getJsLibraryStdVersion(classes) != null
} }
public static String getJsLibraryStdVersion(@NotNull List<VirtualFile> classesRoots) { fun getJsLibraryStdVersion(classesRoots: List<VirtualFile>): String? {
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); val jar = getJsStdLibJar(classesRoots) ?: return null
if (jar == null) return null;
return JarUtil.getJarAttribute(VfsUtilCore.virtualToIoFile(jar), Attributes.Name.IMPLEMENTATION_VERSION); return JarUtil.getJarAttribute(VfsUtilCore.virtualToIoFile(jar), Attributes.Name.IMPLEMENTATION_VERSION)
} }
@Nullable private fun getJsStdLibJar(classesRoots: List<VirtualFile>): VirtualFile? {
private static VirtualFile getJsStdLibJar(@NotNull List<VirtualFile> classesRoots) { for (root in classesRoots) {
for (VirtualFile root : classesRoots) { if (root.fileSystem.protocol !== StandardFileSystems.JAR_PROTOCOL) continue
if (root.getFileSystem().getProtocol() != StandardFileSystems.JAR_PROTOCOL) continue;
VirtualFile jar = VfsUtilCore.getVirtualFileForJar(root); val jar = VfsUtilCore.getVirtualFileForJar(root)
if (jar != null) { if (jar != null) {
Boolean isJSStdLib = jar.getUserData(IS_JS_LIBRARY_STD_LIB); var isJSStdLib = jar.getUserData(IS_JS_LIBRARY_STD_LIB)
if (isJSStdLib == null) { if (isJSStdLib == null) {
isJSStdLib = LibraryUtils.isKotlinJavascriptStdLibrary(new File(jar.getPath())); isJSStdLib = LibraryUtils.isKotlinJavascriptStdLibrary(File(jar.path))
jar.putUserData(IS_JS_LIBRARY_STD_LIB, isJSStdLib); jar.putUserData(IS_JS_LIBRARY_STD_LIB, isJSStdLib)
} }
if (isJSStdLib) { if (isJSStdLib) {
return jar; return jar
} }
} }
} }
return null; return null
} }
} }
@@ -90,7 +90,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) {
if (JsLibraryStdDetectionUtil.hasJsStdlibJar(library)) { if (JsLibraryStdDetectionUtil.INSTANCE.hasJsStdlibJar(library)) {
jsLibrary.set(library); jsLibrary.set(library);
return false; return false;
} }
@@ -44,7 +44,7 @@ public class JSLibraryStdPresentationProvider extends LibraryPresentationProvide
@Nullable @Nullable
@Override @Override
public LibraryVersionProperties detect(@NotNull List<VirtualFile> classesRoots) { public LibraryVersionProperties detect(@NotNull List<VirtualFile> classesRoots) {
String version = JsLibraryStdDetectionUtil.getJsLibraryStdVersion(classesRoots); String version = JsLibraryStdDetectionUtil.INSTANCE.getJsLibraryStdVersion(classesRoots);
return version == null ? null : new LibraryVersionProperties(version); return version == null ? null : new LibraryVersionProperties(version);
} }
} }