K2JS: get kotlin js module name from Kotlin-JS-Module-Name attribute in manifest

This commit is contained in:
Michael Nedzelsky
2014-11-19 14:10:48 +03:00
parent 83ec20508a
commit 61e9cbec66
3 changed files with 50 additions and 14 deletions
@@ -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);
}
@@ -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<JetFile> jetFiles = new ArrayList<JetFile>();
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;
@@ -39,7 +39,7 @@ import java.util.List;
public class LibrarySourcesConfigWithCaching extends LibrarySourcesConfig {
public static final List<String> JS_STDLIB =
Arrays.asList("@" + STDLIB_JS_MODULE_NAME, PathUtil.getKotlinPathsForDistDirectory().getJsLibJarPath().getAbsolutePath());
Arrays.asList(PathUtil.getKotlinPathsForDistDirectory().getJsLibJarPath().getAbsolutePath());
private static List<JetFile> jsLibFiles;
private static AnalysisResult result;