JsLibraryStdDetectionUtil: J2K
This commit is contained in:
+33
-38
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user