From 4ab2588cbd51f8a070aefd0e13c3b6acccea072d Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 15 May 2012 00:16:44 +0400 Subject: [PATCH] Made compiler aware of multiple alt-header paths. --- .../jetbrains/jet/cli/jvm/K2JVMCompiler.java | 28 +++++++++--- .../jet/cli/jvm/K2JVMCompilerArguments.java | 4 +- .../cli/jvm/compiler/JetCoreEnvironment.java | 2 +- .../resolve/java/CompilerDependencies.java | 43 +++++++++++++------ .../resolve/java/PsiClassFinderForJvm.java | 2 +- .../jet/CompileCompilerDependenciesTest.java | 5 ++- .../src/org/jetbrains/jet/utils/PathUtil.java | 3 +- 7 files changed, 62 insertions(+), 25 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java index b7d2a4b8935..0640e7729a2 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java @@ -19,6 +19,10 @@ package org.jetbrains.jet.cli.jvm; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; import com.intellij.openapi.Disposable; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.util.ArrayUtil; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; import jet.modules.Module; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.cli.common.CLICompiler; @@ -36,6 +40,7 @@ import org.jetbrains.jet.utils.PathUtil; import java.io.File; import java.io.PrintStream; import java.util.List; +import java.util.regex.Pattern; import static org.jetbrains.jet.cli.common.ExitCode.*; @@ -55,17 +60,18 @@ public class K2JVMCompiler extends CLICompiler() { + @Override + public File fun(String s) { + return new File(s); + } + }, new File[0]); + } } diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompilerArguments.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompilerArguments.java index 42abc201d44..b739fe9b46c 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompilerArguments.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompilerArguments.java @@ -54,8 +54,8 @@ public class K2JVMCompilerArguments extends CompilerArguments { @Argument(value = "stdlib", description = "Path to the stdlib.jar") public String stdlib; - @Argument(value = "jdkHeaders", description = "Path to the kotlin-jdk-headers.jar") - public String jdkHeaders; + @Argument(value = "altHeaders", description = "Path to the alternative library headers paths") + public String altHeaders; @Argument(value = "mode", description = "Special compiler modes: stubs or jdkHeaders") public String mode; diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java index e9db023eee1..c5f03deebc4 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java @@ -85,7 +85,7 @@ public class JetCoreEnvironment extends JavaCoreEnvironment { } if (compilerSpecialMode.includeJdkHeaders()) { - for (VirtualFile root : compilerDependencies.getJdkHeaderRoots()) { + for (VirtualFile root : compilerDependencies.getAltHeaderRoots()) { addLibraryRoot(root); } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/CompilerDependencies.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/CompilerDependencies.java index 226771fe4b5..29d78529fb4 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/CompilerDependencies.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/CompilerDependencies.java @@ -16,7 +16,11 @@ package org.jetbrains.jet.lang.resolve.java; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.utils.PathUtil; @@ -34,15 +38,15 @@ public class CompilerDependencies { private final CompilerSpecialMode compilerSpecialMode; @Nullable private final File jdkJar; - @Nullable - private final File jdkHeadersJar; + @NotNull + private final File[] altHeadersClasspath; @Nullable private final File runtimeJar; - public CompilerDependencies(@NotNull CompilerSpecialMode compilerSpecialMode, @Nullable File jdkJar, @Nullable File jdkHeadersJar, @Nullable File runtimeJar) { + public CompilerDependencies(@NotNull CompilerSpecialMode compilerSpecialMode, @Nullable File jdkJar, @NotNull File[] altHeadersClasspath, @Nullable File runtimeJar) { this.compilerSpecialMode = compilerSpecialMode; this.jdkJar = jdkJar; - this.jdkHeadersJar = jdkHeadersJar; + this.altHeadersClasspath = altHeadersClasspath; this.runtimeJar = runtimeJar; if (compilerSpecialMode.includeJdk()) { @@ -51,8 +55,8 @@ public class CompilerDependencies { } } if (compilerSpecialMode.includeJdkHeaders()) { - if (jdkHeadersJar == null) { - throw new IllegalArgumentException("jdkHeaders must be included for mode " + compilerSpecialMode); + if (altHeadersClasspath.length == 0) { + throw new IllegalArgumentException("altHeaders must be included for mode " + compilerSpecialMode); } } if (compilerSpecialMode.includeKotlinRuntime()) { @@ -72,9 +76,9 @@ public class CompilerDependencies { return jdkJar; } - @Nullable - public File getJdkHeadersJar() { - return jdkHeadersJar; + @NotNull + public File[] getAltHeadersClassPath() { + return altHeadersClasspath; } @Nullable @@ -83,9 +87,24 @@ public class CompilerDependencies { } @NotNull - public List getJdkHeaderRoots() { + public List getAltHeaderRoots() { if (compilerSpecialMode.includeJdkHeaders()) { - return Collections.singletonList(PathUtil.jarFileToVirtualFile(jdkHeadersJar)); + return ContainerUtil.map2List(altHeadersClasspath, new Function() { + @Override + public VirtualFile fun(File file) { + if (file.exists()) { + if (file.isDirectory()) { + return VirtualFileManager.getInstance().findFileByUrl("file://" + FileUtil.toSystemIndependentName(file.getAbsolutePath())); + } + else { + return PathUtil.jarFileToVirtualFile(file); + } + } + else { + throw new IllegalStateException("Path " + file + " does not exist."); + } + } + }); } else { return Collections.emptyList(); @@ -107,7 +126,7 @@ public class CompilerDependencies { return new CompilerDependencies( compilerSpecialMode, compilerSpecialMode.includeJdk() ? findRtJar() : null, - compilerSpecialMode.includeJdkHeaders() ? PathUtil.getAltHeadersPath() : null, + compilerSpecialMode.includeJdkHeaders() ? new File[]{PathUtil.getAltHeadersPath()} : new File[0], compilerSpecialMode.includeKotlinRuntime() ? PathUtil.getDefaultRuntimePath() : null); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderForJvm.java index 93d038f2f64..56a9a8a8b5e 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassFinderForJvm.java @@ -59,7 +59,7 @@ public class PsiClassFinderForJvm implements PsiClassFinder { @PostConstruct public void initialize() { - this.altClassFinder = new AltClassFinder(project, compilerDependencies.getJdkHeaderRoots()); + this.altClassFinder = new AltClassFinder(project, compilerDependencies.getAltHeaderRoots()); this.javaSearchScope = new DelegatingGlobalSearchScope(GlobalSearchScope.allScope(project)) { @Override public boolean contains(VirtualFile file) { diff --git a/compiler/tests/org/jetbrains/jet/CompileCompilerDependenciesTest.java b/compiler/tests/org/jetbrains/jet/CompileCompilerDependenciesTest.java index c3e084a4c68..be9b0f5ee05 100644 --- a/compiler/tests/org/jetbrains/jet/CompileCompilerDependenciesTest.java +++ b/compiler/tests/org/jetbrains/jet/CompileCompilerDependenciesTest.java @@ -22,9 +22,10 @@ import org.jetbrains.jet.codegen.forTestCompile.ForTestCompileJdkHeaders; import org.jetbrains.jet.codegen.forTestCompile.ForTestCompileRuntime; import org.jetbrains.jet.lang.resolve.java.CompilerDependencies; import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; -import org.jetbrains.jet.utils.PathUtil; import org.junit.Test; +import java.io.File; + /** * @author Stepan Koltsov */ @@ -53,7 +54,7 @@ public class CompileCompilerDependenciesTest { return new CompilerDependencies( compilerSpecialMode, compilerSpecialMode.includeJdk() ? (mockJdk ? JetTestUtils.findMockJdkRtJar() : CompilerDependencies.findRtJar()) : null, - compilerSpecialMode.includeJdkHeaders() ? ForTestCompileJdkHeaders.jdkHeadersForTests() : null, + compilerSpecialMode.includeJdkHeaders() ? new File[]{ForTestCompileJdkHeaders.jdkHeadersForTests()} : new File[0], compilerSpecialMode.includeKotlinRuntime() ? ForTestCompileRuntime.runtimeJarForTests() : null); } } diff --git a/compiler/util/src/org/jetbrains/jet/utils/PathUtil.java b/compiler/util/src/org/jetbrains/jet/utils/PathUtil.java index 362ba0374e4..415ebabbd60 100644 --- a/compiler/util/src/org/jetbrains/jet/utils/PathUtil.java +++ b/compiler/util/src/org/jetbrains/jet/utils/PathUtil.java @@ -20,6 +20,7 @@ package org.jetbrains.jet.utils; import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import org.jetbrains.annotations.NotNull; @@ -106,6 +107,6 @@ public class PathUtil { if (!file.exists() || !file.isFile()) { throw new IllegalStateException("file must exist and be regular to be converted to virtual file: " + file); } - return VirtualFileManager.getInstance().findFileByUrl("jar://" + file.getPath() + "!/"); + return VirtualFileManager.getInstance().findFileByUrl("jar://" + FileUtil.toSystemIndependentName(file.getAbsolutePath()) + "!/"); } }