K2JS: get kotlin js module name from Kotlin-JS-Module-Name attribute in manifest
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user