update kotlin javascript stdlib if needed

This commit is contained in:
Michael Nedzelsky
2014-10-24 15:45:08 +04:00
parent 85a38e17de
commit 103307432e
16 changed files with 92 additions and 38 deletions
@@ -215,7 +215,7 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
List<String> libraryFiles = new SmartList<String>();
if (!arguments.noStdlib) {
libraryFiles.add(0, PathUtil.getKotlinPathsForCompiler().getJsLibJarPath().getAbsolutePath());
libraryFiles.add(0, PathUtil.getKotlinPathsForCompiler().getJsStdLibJarPath().getAbsolutePath());
}
if (arguments.libraryFiles != null) {
@@ -40,5 +40,8 @@ public interface KotlinPaths {
File getAndroidSdkAnnotationsPath();
@NotNull
File getJsLibJarPath();
File getJsStdLibJarPath();
@NotNull
File getJsStdLibSrcJarPath();
}
@@ -66,10 +66,16 @@ public class KotlinPathsFromHomeDir implements KotlinPaths {
@Override
@NotNull
public File getJsLibJarPath() {
public File getJsStdLibJarPath() {
return getLibraryFile(PathUtil.JS_LIB_JAR_NAME);
}
@Override
@NotNull
public File getJsStdLibSrcJarPath() {
return getLibraryFile(PathUtil.JS_LIB_SRC_JAR_NAME);
}
@NotNull
private File getLibraryFile(@NotNull String fileName) {
return new File(getLibPath(), fileName);
@@ -17,6 +17,7 @@
package org.jetbrains.jet.utils;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -24,6 +25,7 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
@@ -147,4 +149,14 @@ public class LibraryUtils {
public static boolean isJvmRuntimeLibrary(@NotNull File library) {
return checkImplTitle(library, TITLE_KOTLIN_JVM_RUNTIME_AND_STDLIB);
}
public static VirtualFile getJarFile(@NotNull List<VirtualFile> classesRoots, @NotNull String jarName) {
for (VirtualFile root : classesRoots) {
if (root.getName().equals(jarName)) {
return root;
}
}
return null;
}
}
@@ -21,6 +21,7 @@ import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.utils.LibraryUtils;
import org.jetbrains.jet.utils.PathUtil;
import java.util.List;
@@ -38,16 +39,6 @@ public class JavaRuntimeDetectionUtil {
@Nullable
public static VirtualFile getRuntimeJar(@NotNull List<VirtualFile> classesRoots) {
return getJarFile(classesRoots, PathUtil.KOTLIN_JAVA_RUNTIME_JAR);
}
static VirtualFile getJarFile(@NotNull List<VirtualFile> classesRoots, @NotNull String jarName) {
for (VirtualFile root : classesRoots) {
if (root.getName().equals(jarName)) {
return root;
}
}
return null;
return LibraryUtils.getJarFile(classesRoots, PathUtil.KOTLIN_JAVA_RUNTIME_JAR);
}
}
@@ -21,6 +21,7 @@ import com.intellij.openapi.vfs.StandardFileSystems;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.utils.LibraryUtils;
import java.io.File;
@@ -34,6 +35,16 @@ public class JsLibraryStdDetectionUtil {
return null;
}
VirtualFile jar = getJsStdLibJar(classesRoots);
if (jar == null) return null;
assert JsHeaderLibraryDetectionUtil.isJsHeaderLibraryDetected(classesRoots) : "StdLib should also be detected as headers library";
return JarUtil.getJarAttribute(VfsUtilCore.virtualToIoFile(jar), Attributes.Name.IMPLEMENTATION_VERSION);
}
@Nullable
public static VirtualFile getJsStdLibJar(@NotNull List<VirtualFile> classesRoots) {
for (VirtualFile root : classesRoots) {
if (root.getFileSystem().getProtocol() != StandardFileSystems.JAR_PROTOCOL) continue;
@@ -41,13 +52,10 @@ public class JsLibraryStdDetectionUtil {
assert jar != null;
if (LibraryUtils.isKotlinJavascriptStdLibrary(new File(jar.getPath()))) {
assert JsHeaderLibraryDetectionUtil.isJsHeaderLibraryDetected(classesRoots) : "StdLib should also be detected as headers library";
return JarUtil.getJarAttribute(VfsUtilCore.virtualToIoFile(root), Attributes.Name.IMPLEMENTATION_VERSION);
return jar;
}
}
return null;
}
}
@@ -78,12 +78,12 @@ public class KotlinJsModuleConfigurator extends KotlinWithLibraryConfigurator {
@NotNull
@Override
public File getExistedJarFile() {
return assertFileExists(PathUtil.getKotlinPathsForIdeaPlugin().getJsLibJarPath());
return assertFileExists(PathUtil.getKotlinPathsForIdeaPlugin().getJsStdLibJarPath());
}
@Override
public File getExistedSourcesJarFile() {
return getExistedJarFile();
return assertFileExists(PathUtil.getKotlinPathsForIdeaPlugin().getJsStdLibSrcJarPath());
}
@Override
@@ -87,6 +87,6 @@ public class JSLibraryStdDescription extends CustomLibraryDescriptorWithDefferCo
KotlinJsModuleConfigurator configurator = (KotlinJsModuleConfigurator) getConfiguratorByName(NAME);
assert configurator != null : "Cannot find configurator with name " + NAME;
return createConfiguration(configurator.getExistedJarFile(), configurator.getExistedJarFile());
return createConfiguration(configurator.getExistedJarFile(), configurator.getExistedSourcesJarFile());
}
}
@@ -24,9 +24,11 @@ import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.plugin.JetIcons;
import org.jetbrains.jet.utils.LibraryUtils;
import org.jetbrains.jet.utils.PathUtil;
import javax.swing.*;
import java.util.Arrays;
import java.util.List;
public class JSLibraryStdPresentationProvider extends LibraryPresentationProvider<LibraryVersionProperties> {
@@ -65,4 +67,14 @@ public class JSLibraryStdPresentationProvider extends LibraryPresentationProvide
return false;
}
@Nullable
public static VirtualFile getJsStdLibJar(@NotNull Library library) {
return JsLibraryStdDetectionUtil.getJsStdLibJar(Arrays.asList(library.getFiles(OrderRootType.CLASSES)));
}
@Nullable
public static VirtualFile getJsStdLibSrcJar(@NotNull Library library) {
return LibraryUtils.getJarFile(Arrays.asList(library.getFiles(OrderRootType.SOURCES)), PathUtil.JS_LIB_SRC_JAR_NAME);
}
}
@@ -24,6 +24,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.plugin.JetIcons;
import org.jetbrains.jet.utils.LibraryUtils;
import org.jetbrains.jet.utils.PathUtil;
import javax.swing.*;
@@ -54,7 +55,7 @@ public class JavaRuntimePresentationProvider extends LibraryPresentationProvider
@Nullable
public static VirtualFile getRuntimeSrcJar(@NotNull List<VirtualFile> classesRoots) {
return JavaRuntimeDetectionUtil.getJarFile(classesRoots, PathUtil.KOTLIN_JAVA_RUNTIME_SRC_JAR);
return LibraryUtils.getJarFile(classesRoots, PathUtil.KOTLIN_JAVA_RUNTIME_SRC_JAR);
}
@Nullable
@@ -41,7 +41,9 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.java.AbiVersionUtil;
import org.jetbrains.jet.plugin.configuration.ConfigureKotlinInProjectUtils;
import org.jetbrains.jet.plugin.configuration.KotlinJavaModuleConfigurator;
import org.jetbrains.jet.plugin.framework.JSLibraryStdPresentationProvider;
import org.jetbrains.jet.plugin.framework.JavaRuntimePresentationProvider;
import org.jetbrains.jet.plugin.framework.LibraryPresentationProviderUtil;
import org.jetbrains.jet.utils.KotlinPaths;
import org.jetbrains.jet.utils.PathUtil;
@@ -153,20 +155,30 @@ public class KotlinRuntimeLibraryUtil {
assert configurator != null : "Configurator with given name doesn't exists: " + KotlinJavaModuleConfigurator.NAME;
for (Library library : libraries) {
updateJar(project, JavaRuntimePresentationProvider.getRuntimeJar(library), LibraryJarDescriptor.RUNTIME_JAR);
if (LibraryPresentationProviderUtil.isDetected(JavaRuntimePresentationProvider.getInstance(), library)) {
updateJar(project, JavaRuntimePresentationProvider.getRuntimeJar(library), LibraryJarDescriptor.RUNTIME_JAR);
if (configurator.changeOldSourcesPathIfNeeded(library)) {
configurator.copySourcesToPathFromLibrary(library);
if (configurator.changeOldSourcesPathIfNeeded(library)) {
configurator.copySourcesToPathFromLibrary(library);
}
else {
updateJar(project, JavaRuntimePresentationProvider.getRuntimeSrcJar(library), LibraryJarDescriptor.RUNTIME_SRC_JAR);
}
}
else {
updateJar(project, JavaRuntimePresentationProvider.getRuntimeSrcJar(library), LibraryJarDescriptor.RUNTIME_SRC_JAR);
else if (LibraryPresentationProviderUtil.isDetected(JSLibraryStdPresentationProvider.getInstance(), library)) {
updateJar(project, JSLibraryStdPresentationProvider.getJsStdLibJar(library), LibraryJarDescriptor.JS_STDLIB_JAR);
updateJar(project, JSLibraryStdPresentationProvider.getJsStdLibSrcJar(library), LibraryJarDescriptor.JS_STDLIB_SRC_JAR);
}
}
}
});
}
private static void updateJar(@NotNull Project project, @Nullable VirtualFile fileToReplace, @NotNull LibraryJarDescriptor libraryJarDescriptor) {
private static void updateJar(
@NotNull Project project,
@Nullable VirtualFile fileToReplace,
@NotNull LibraryJarDescriptor libraryJarDescriptor
) {
if (fileToReplace == null && !libraryJarDescriptor.shouldExists) {
return;
}
@@ -176,6 +188,8 @@ public class KotlinRuntimeLibraryUtil {
switch (libraryJarDescriptor) {
case RUNTIME_JAR: runtimePath = paths.getRuntimePath(); break;
case RUNTIME_SRC_JAR: runtimePath = paths.getRuntimeSourcesPath(); break;
case JS_STDLIB_JAR: runtimePath = paths.getJsStdLibJarPath(); break;
case JS_STDLIB_SRC_JAR: runtimePath = paths.getJsStdLibSrcJarPath(); break;
}
if (!runtimePath.exists()) {
@@ -217,7 +231,9 @@ public class KotlinRuntimeLibraryUtil {
private enum LibraryJarDescriptor {
RUNTIME_JAR(PathUtil.KOTLIN_JAVA_RUNTIME_JAR, true),
RUNTIME_SRC_JAR(PathUtil.KOTLIN_JAVA_RUNTIME_SRC_JAR, false);
RUNTIME_SRC_JAR(PathUtil.KOTLIN_JAVA_RUNTIME_SRC_JAR, false),
JS_STDLIB_JAR(PathUtil.JS_LIB_JAR_NAME, true),
JS_STDLIB_SRC_JAR(PathUtil.JS_LIB_SRC_JAR_NAME, false);
@NotNull public final String jarName;
private final boolean shouldExists;
@@ -51,7 +51,8 @@ class KotlinUpdatePluginComponent : ApplicationComponent {
requestFullJarUpdate(ideaPluginPaths.getRuntimePath())
requestFullJarUpdate(ideaPluginPaths.getRuntimeSourcesPath())
requestFullJarUpdate(ideaPluginPaths.getJsLibJarPath())
requestFullJarUpdate(ideaPluginPaths.getJsStdLibJarPath())
requestFullJarUpdate(ideaPluginPaths.getJsStdLibSrcJarPath())
requestFullJarUpdate(ideaPluginPaths.getJdkAnnotationsPath())
requestFullJarUpdate(ideaPluginPaths.getAndroidSdkAnnotationsPath())
@@ -24,7 +24,6 @@ import com.intellij.notification.Notification;
import com.intellij.notification.NotificationListener;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.AbstractProjectComponent;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.libraries.Library;
@@ -37,6 +36,7 @@ import com.intellij.util.text.VersionComparatorUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.plugin.JetPluginUtil;
import org.jetbrains.jet.plugin.framework.JSLibraryStdPresentationProvider;
import org.jetbrains.jet.plugin.framework.JavaRuntimePresentationProvider;
import org.jetbrains.jet.plugin.framework.LibraryPresentationProviderUtil;
@@ -155,12 +155,16 @@ public class OutdatedKotlinRuntimeNotification extends AbstractProjectComponent
List<VersionedLibrary> outdatedLibraries = Lists.newArrayList();
for (Library library : KotlinRuntimeLibraryUtil.findKotlinLibraries(project)) {
LibraryVersionProperties javaRuntimeProperties =
LibraryVersionProperties libraryVersionProperties =
LibraryPresentationProviderUtil.getLibraryProperties(JavaRuntimePresentationProvider.getInstance(), library);
if (javaRuntimeProperties == null) {
if (libraryVersionProperties == null) {
libraryVersionProperties =
LibraryPresentationProviderUtil.getLibraryProperties(JSLibraryStdPresentationProvider.getInstance(), library);
}
if (libraryVersionProperties == null) {
continue;
}
String libraryVersion = javaRuntimeProperties.getVersionString();
String libraryVersion = libraryVersionProperties.getVersionString();
boolean isOutdated = "snapshot".equals(libraryVersion)
|| libraryVersion == null
@@ -264,7 +264,7 @@ public class ConfigureKotlinTest extends PlatformTestCase {
}
private static String getPathToExistentJsJar() {
return PathUtil.getKotlinPathsForDistDirectory().getJsLibJarPath().getParent();
return PathUtil.getKotlinPathsForDistDirectory().getJsStdLibJarPath().getParent();
}
@Override
@@ -39,7 +39,7 @@ import java.util.List;
public class LibrarySourcesConfigWithCaching extends LibrarySourcesConfig {
public static final List<String> JS_STDLIB =
Arrays.asList(PathUtil.getKotlinPathsForDistDirectory().getJsLibJarPath().getAbsolutePath());
Arrays.asList(PathUtil.getKotlinPathsForDistDirectory().getJsStdLibJarPath().getAbsolutePath());
private static List<JetFile> jsLibFiles;
private static AnalysisResult result;
@@ -138,8 +138,8 @@ class NoInternalVisibilityInStdLibTest {
val configuration = CompilerConfiguration()
val environment = JetCoreEnvironment.createForProduction(it, configuration, EnvironmentConfigFiles.JS_CONFIG_FILES)
val project = environment.getProject()
val pathToJsStdlibJar = KOTLIN_ROOT_PATH + PathUtil.getKotlinPathsForDistDirectory().getJsLibJarPath().path
val config = LibrarySourcesConfig(project, "testModule", listOf("@", pathToJsStdlibJar), EcmaVersion.defaultVersion(), false, false)
val pathToJsStdlibJar = KOTLIN_ROOT_PATH + PathUtil.getKotlinPathsForDistDirectory().getJsStdLibJarPath().path
val config = LibrarySourcesConfig(project, "testModule", listOf(pathToJsStdlibJar), EcmaVersion.defaultVersion(), false, false)
TopDownAnalyzerFacadeForJS.analyzeFiles(listOf(), { true }, config).moduleDescriptor
}