From 61e9cbec66546262975c92b03c16e03fd0365a72 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Wed, 19 Nov 2014 14:10:48 +0300 Subject: [PATCH] K2JS: get kotlin js module name from Kotlin-JS-Module-Name attribute in manifest --- .../org/jetbrains/jet/utils/LibraryUtils.java | 40 +++++++++++++++++-- .../k2js/config/LibrarySourcesConfig.java | 22 +++++----- .../LibrarySourcesConfigWithCaching.java | 2 +- 3 files changed, 50 insertions(+), 14 deletions(-) diff --git a/compiler/util/src/org/jetbrains/jet/utils/LibraryUtils.java b/compiler/util/src/org/jetbrains/jet/utils/LibraryUtils.java index 2a9f1a37b88..d68bd362001 100644 --- a/compiler/util/src/org/jetbrains/jet/utils/LibraryUtils.java +++ b/compiler/util/src/org/jetbrains/jet/utils/LibraryUtils.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; @@ -34,6 +35,8 @@ public class LibraryUtils { public static final String TITLE_KOTLIN_JVM_RUNTIME_AND_STDLIB; public static final String TITLE_KOTLIN_JAVASCRIPT_STDLIB; public static final String TITLE_KOTLIN_JAVASCRIPT_LIB; + private static final String MANIFEST_PATH = "META-INF/MANIFEST.MF"; + private static final Attributes.Name KOTLIN_JS_MODULE_NAME = new Attributes.Name("Kotlin-JS-Module-Name"); static { String jsStdLib = ""; @@ -83,13 +86,36 @@ public class LibraryUtils { } @Nullable - public static Attributes getManifestMainAttributesFromJar(@NotNull File library) { - Manifest manifest = getManifestFromJar(library); + public static Manifest getManifestFromDirectory(@NotNull File library) { + if (!library.canRead() || !library.isDirectory()) return null; + + try { + InputStream inputStream = new FileInputStream(new File(library, MANIFEST_PATH)); + try { + return new Manifest(inputStream); + } + finally { + inputStream.close(); + } + } + catch (IOException ignored) { + LOG.warn("IOException " + ignored); + return null; + } + } + + private static Manifest getManifestFromJarOrDirectory(@NotNull File library) { + return library.isDirectory() ? getManifestFromDirectory(library) : getManifestFromJar(library); + } + + @Nullable + public static Attributes getManifestMainAttributesFromJarOrDirectory(@NotNull File library) { + Manifest manifest = getManifestFromJarOrDirectory(library); return manifest != null ? manifest.getMainAttributes() : null; } private static boolean checkImplTitle(@NotNull File library, String expected) { - Attributes attributes = getManifestMainAttributesFromJar(library); + Attributes attributes = getManifestMainAttributesFromJarOrDirectory(library); if (attributes == null) return false; String title = attributes.getValue(Attributes.Name.IMPLEMENTATION_TITLE); @@ -97,13 +123,19 @@ public class LibraryUtils { } private static boolean checkSpecTitle(@NotNull File library, String expected) { - Attributes attributes = getManifestMainAttributesFromJar(library); + Attributes attributes = getManifestMainAttributesFromJarOrDirectory(library); if (attributes == null) return false; String title = attributes.getValue(Attributes.Name.SPECIFICATION_TITLE); return title != null && title.equals(expected); } + @Nullable + public static String getKotlinJsModuleName(@NotNull File library) { + Attributes attributes = getManifestMainAttributesFromJarOrDirectory(library); + return attributes != null ? attributes.getValue(KOTLIN_JS_MODULE_NAME) : null; + } + public static boolean isKotlinJavascriptLibrary(@NotNull File library) { return checkSpecTitle(library, TITLE_KOTLIN_JAVASCRIPT_LIB); } diff --git a/js/js.frontend/src/org/jetbrains/k2js/config/LibrarySourcesConfig.java b/js/js.frontend/src/org/jetbrains/k2js/config/LibrarySourcesConfig.java index 9e41dba0ba5..bbfb5246d97 100644 --- a/js/js.frontend/src/org/jetbrains/k2js/config/LibrarySourcesConfig.java +++ b/js/js.frontend/src/org/jetbrains/k2js/config/LibrarySourcesConfig.java @@ -28,13 +28,14 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.plugin.JetFileType; import org.jetbrains.k2js.JavaScript; +import org.jetbrains.jet.utils.LibraryUtils; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import static org.jetbrains.jet.utils.LibraryUtils.isKotlinJavascriptStdLibrary; +import static org.jetbrains.jet.utils.LibraryUtils.isKotlinJavascriptLibrary; public class LibrarySourcesConfig extends Config { @NotNull @@ -72,27 +73,22 @@ public class LibrarySourcesConfig extends Config { } List jetFiles = new ArrayList(); - String moduleName = UNKNOWN_EXTERNAL_MODULE_NAME; VirtualFileSystem fileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL); VirtualFileSystem jarFileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.JAR_PROTOCOL); PsiManager psiManager = PsiManager.getInstance(getProject()); + String moduleName = null; for (String path : files) { + VirtualFile file; + String actualModuleName = moduleName; if (path.charAt(0) == '@') { moduleName = path.substring(1); continue; } - VirtualFile file; - String actualModuleName = moduleName; - if (path.endsWith(".jar") || path.endsWith(".zip")) { file = jarFileSystem.findFileByPath(path + URLUtil.JAR_SEPARATOR); - - if (isKotlinJavascriptStdLibrary(new File(path))) { - actualModuleName = STDLIB_JS_MODULE_NAME; - } } else { file = fileSystem.findFileByPath(path); @@ -102,9 +98,17 @@ public class LibrarySourcesConfig extends Config { LOG.error("File '" + path + "' not found.'"); } else { + File filePath = new File(path); + if (isKotlinJavascriptLibrary(filePath)) { + actualModuleName = LibraryUtils.getKotlinJsModuleName(filePath); + } + if (actualModuleName == null) { + LOG.error("Could not find Kotlin-JS-Module-Name for " + filePath); + } JetFileCollector jetFileCollector = new JetFileCollector(jetFiles, actualModuleName, psiManager); VfsUtilCore.visitChildrenRecursively(file, jetFileCollector); } + moduleName = null; } return jetFiles; diff --git a/js/js.frontend/src/org/jetbrains/k2js/config/LibrarySourcesConfigWithCaching.java b/js/js.frontend/src/org/jetbrains/k2js/config/LibrarySourcesConfigWithCaching.java index b286e962a4d..6eed9b5da0c 100644 --- a/js/js.frontend/src/org/jetbrains/k2js/config/LibrarySourcesConfigWithCaching.java +++ b/js/js.frontend/src/org/jetbrains/k2js/config/LibrarySourcesConfigWithCaching.java @@ -39,7 +39,7 @@ import java.util.List; public class LibrarySourcesConfigWithCaching extends LibrarySourcesConfig { public static final List JS_STDLIB = - Arrays.asList("@" + STDLIB_JS_MODULE_NAME, PathUtil.getKotlinPathsForDistDirectory().getJsLibJarPath().getAbsolutePath()); + Arrays.asList(PathUtil.getKotlinPathsForDistDirectory().getJsLibJarPath().getAbsolutePath()); private static List jsLibFiles; private static AnalysisResult result;