Add jdk jars to kotlin classpath
#KT-4214 Fixed
This commit is contained in:
Generated
+13
@@ -0,0 +1,13 @@
|
||||
<component name="libraryTable">
|
||||
<library name="jps-model">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/ideaSDK/jps/jps-model.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://$PROJECT_DIR$/ideaSDK/sources/sources.zip!/jps/model-api/src" />
|
||||
<root url="jar://$PROJECT_DIR$/ideaSDK/sources/sources.zip!/jps/model-impl/src" />
|
||||
<root url="jar://$PROJECT_DIR$/ideaSDK/sources/sources.zip!/jps/model-serialization/src" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
||||
@@ -75,7 +75,7 @@ public class BytecodeCompiler {
|
||||
@NotNull String[] sourceRoots) {
|
||||
KotlinPaths paths = getKotlinPathsForAntTask();
|
||||
CompilerConfiguration configuration = new CompilerConfiguration();
|
||||
configuration.add(CLASSPATH_KEY, PathUtil.findRtJar());
|
||||
configuration.addAll(CLASSPATH_KEY, PathUtil.getJdkClassesRoots());
|
||||
if ((stdlib != null) && (stdlib.trim().length() > 0)) {
|
||||
configuration.add(CLASSPATH_KEY, new File(stdlib));
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
<fileset dir="${dependencies.dir}" includes="jansi.jar"/>
|
||||
<fileset dir="${dependencies.dir}" includes="cli-parser-1.1.1.jar"/>
|
||||
<fileset dir="${basedir}/js/js.translator/lib" includes="*.jar"/>
|
||||
<fileset dir="${basedir}/ideaSDK/jps" includes="jps-model.jar"/>
|
||||
</path>
|
||||
|
||||
<typedef resource="org/jetbrains/jet/buildtools/ant/antlib.xml" classpath="${bootstrap.compiler.home}/lib/kotlin-ant.jar"/>
|
||||
@@ -279,6 +280,7 @@
|
||||
<zipgroupfileset dir="${basedir}/ideaSDK/lib" includes="jna-utils.jar"/>
|
||||
<zipgroupfileset dir="${basedir}/ideaSDK/lib" includes="oromatcher.jar"/>
|
||||
<zipgroupfileset dir="${basedir}/ideaSDK/lib" includes="protobuf-2.5.0.jar"/>
|
||||
<zipgroupfileset dir="${basedir}/ideaSDK/jps" includes="jps-model.jar"/>
|
||||
<zipgroupfileset dir="${basedir}/js/js.translator/lib" includes="*.jar"/>
|
||||
<zipgroupfileset dir="${dependencies.dir}" includes="jline.jar"/>
|
||||
<zipgroupfileset dir="${dependencies.dir}" includes="cli-parser-1.1.1.jar"/>
|
||||
|
||||
@@ -80,6 +80,8 @@ public class SpecialFiles {
|
||||
|
||||
excludedFiles.add("genericBackingFieldSignature.kt"); // Wrong signature after package renaming
|
||||
excludedFiles.add("genericMethodSignature.kt"); // Wrong signature after package renaming
|
||||
|
||||
excludedFiles.add("classpath.kt"); // Some classes are not visible on android
|
||||
}
|
||||
|
||||
private SpecialFiles() {
|
||||
|
||||
@@ -165,7 +165,7 @@ public class K2JVMCompiler extends CLICompiler<K2JVMCompilerArguments> {
|
||||
private static List<File> getClasspath(@NotNull KotlinPaths paths, @NotNull K2JVMCompilerArguments arguments) {
|
||||
List<File> classpath = Lists.newArrayList();
|
||||
if (!arguments.noJdk) {
|
||||
classpath.add(PathUtil.findRtJar());
|
||||
classpath.addAll(PathUtil.getJdkClassesRoots());
|
||||
}
|
||||
if (!arguments.noStdlib) {
|
||||
classpath.add(paths.getRuntimePath());
|
||||
|
||||
@@ -98,7 +98,7 @@ public class CompileEnvironmentUtil {
|
||||
if (runtimePath.exists()) {
|
||||
configuration.add(JVMConfigurationKeys.CLASSPATH_KEY, runtimePath);
|
||||
}
|
||||
configuration.add(JVMConfigurationKeys.CLASSPATH_KEY, PathUtil.findRtJar());
|
||||
configuration.addAll(JVMConfigurationKeys.CLASSPATH_KEY, PathUtil.getJdkClassesRoots());
|
||||
File jdkAnnotationsPath = paths.getJdkAnnotationsPath();
|
||||
if (jdkAnnotationsPath.exists()) {
|
||||
configuration.add(JVMConfigurationKeys.ANNOTATIONS_PATH_KEY, jdkAnnotationsPath);
|
||||
|
||||
@@ -85,6 +85,11 @@ public class AntTaskTest extends KotlinIntegrationTestBase {
|
||||
doJvmAntTest();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void jvmClasspath() throws Exception {
|
||||
doJvmAntTest();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void antTaskJvmManyRoots() throws Exception {
|
||||
doJvmAntTest();
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
OUT:
|
||||
Buildfile: [TestData]/build.xml
|
||||
|
||||
build:
|
||||
[kotlinc] Compiling [[[TestData]/hello.kt]] => [[Temp]/hello.jar]
|
||||
[kotlinc] WARNING: [TestData]/hello.kt: (15, 9) Variable 'result' is never used
|
||||
|
||||
BUILD SUCCESSFUL
|
||||
Total time: [time]
|
||||
|
||||
Return code: 0
|
||||
@@ -0,0 +1,7 @@
|
||||
<project name="Ant Task Test" default="build">
|
||||
<taskdef resource="org/jetbrains/jet/buildtools/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>
|
||||
|
||||
<target name="build">
|
||||
<kotlinc src="${test.data}/hello.kt" output="${temp}/hello.jar"/>
|
||||
</target>
|
||||
</project>
|
||||
@@ -0,0 +1,18 @@
|
||||
package hello
|
||||
|
||||
import sun.nio.cs.SingleByte
|
||||
import sun.net.spi.nameservice.dns.DNSNameService
|
||||
import javax.crypto.Cipher
|
||||
import com.sun.java.browser.plugin2.DOM
|
||||
import com.sun.crypto.provider.AESCipher
|
||||
|
||||
fun main(args : Array<String>) {
|
||||
val a = SingleByte() // charsets.jar
|
||||
val c = DNSNameService() // dnsns.ajr
|
||||
val e : Cipher? = null // jce.jar
|
||||
val f : AESCipher? = null // sunjce_provider.jar
|
||||
val j : DOM? = null // plugin.jar
|
||||
val result = "$a$c$e$f$j"
|
||||
println("OK")
|
||||
}
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
OUT:
|
||||
OK
|
||||
|
||||
Return code: 0
|
||||
@@ -0,0 +1,4 @@
|
||||
-src
|
||||
$TESTDATA_DIR$/classpath.kt
|
||||
-output
|
||||
$TEMP_DIR$
|
||||
@@ -0,0 +1,14 @@
|
||||
import sun.nio.cs.SingleByte
|
||||
import sun.net.spi.nameservice.dns.DNSNameService
|
||||
import javax.crypto.Cipher
|
||||
import com.sun.java.browser.plugin2.DOM
|
||||
import com.sun.crypto.provider.AESCipher
|
||||
|
||||
fun box(): String {
|
||||
val a = SingleByte() // charsets.jar
|
||||
val c = DNSNameService() // dnsns.ajr
|
||||
val e : Cipher? = null // jce.jar
|
||||
val f : AESCipher? = null // sunjce_provider.jar
|
||||
val j : DOM? = null // plugin.jar
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
WARNING: $TESTDATA_DIR$/classpath.kt: (8, 9) Variable 'a' is never used
|
||||
WARNING: $TESTDATA_DIR$/classpath.kt: (9, 9) Variable 'c' is never used
|
||||
WARNING: $TESTDATA_DIR$/classpath.kt: (10, 9) Variable 'e' is never used
|
||||
WARNING: $TESTDATA_DIR$/classpath.kt: (11, 9) Variable 'f' is never used
|
||||
WARNING: $TESTDATA_DIR$/classpath.kt: (12, 9) Variable 'j' is never used
|
||||
OK
|
||||
@@ -0,0 +1,14 @@
|
||||
import sun.nio.cs.SingleByte
|
||||
import sun.net.spi.nameservice.dns.DNSNameService
|
||||
import javax.crypto.Cipher
|
||||
import com.sun.java.browser.plugin2.DOM
|
||||
import com.sun.crypto.provider.AESCipher
|
||||
|
||||
fun box() : String {
|
||||
val a = SingleByte() // charsets.jar
|
||||
val c = DNSNameService() // dnsns.ajr
|
||||
val e : Cipher? = null // jce.jar
|
||||
val f : AESCipher? = null // sunjce_provider.jar
|
||||
val j : DOM? = null // plugin.jar
|
||||
return "OK"
|
||||
}
|
||||
@@ -344,7 +344,12 @@ public class JetTestUtils {
|
||||
@NotNull TestJdkKind jdkKind, @NotNull Collection<File> extraClasspath, @NotNull Collection<File> priorityClasspath) {
|
||||
CompilerConfiguration configuration = new CompilerConfiguration();
|
||||
configuration.addAll(CLASSPATH_KEY, priorityClasspath);
|
||||
configuration.add(CLASSPATH_KEY, jdkKind == TestJdkKind.MOCK_JDK ? findMockJdkRtJar() : PathUtil.findRtJar());
|
||||
if (jdkKind == TestJdkKind.MOCK_JDK) {
|
||||
configuration.add(CLASSPATH_KEY, findMockJdkRtJar());
|
||||
}
|
||||
else {
|
||||
configuration.addAll(CLASSPATH_KEY, PathUtil.getJdkClassesRoots());
|
||||
}
|
||||
if (configurationKind == ALL) {
|
||||
configuration.add(CLASSPATH_KEY, ForTestCompileRuntime.runtimeJarForTests());
|
||||
}
|
||||
|
||||
@@ -39,6 +39,11 @@ public class KotlincExecutableTestGenerated extends AbstractKotlincExecutableTes
|
||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cli/jvm"), Pattern.compile("^(.+)\\.args$"), true);
|
||||
}
|
||||
|
||||
@TestMetadata("classpath.args")
|
||||
public void testClasspath() throws Exception {
|
||||
doJvmTest("compiler/testData/cli/jvm/classpath.args");
|
||||
}
|
||||
|
||||
@TestMetadata("diagnosticsOrder.args")
|
||||
public void testDiagnosticsOrder() throws Exception {
|
||||
doJvmTest("compiler/testData/cli/jvm/diagnosticsOrder.args");
|
||||
|
||||
+5
@@ -480,6 +480,11 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/codegen/boxWithStdlib/fullJdk"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||
}
|
||||
|
||||
@TestMetadata("classpath.kt")
|
||||
public void testClasspath() throws Exception {
|
||||
doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/classpath.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("genericBackingFieldSignature.kt")
|
||||
public void testGenericBackingFieldSignature() throws Exception {
|
||||
doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/fullJdk/genericBackingFieldSignature.kt");
|
||||
|
||||
+14
-3
@@ -113,7 +113,7 @@ public class ResolveDescriptorsFromExternalLibraries {
|
||||
System.out.println("Using file " + jar);
|
||||
}
|
||||
else {
|
||||
jar = PathUtil.findRtJar();
|
||||
jar = findRtJar();
|
||||
System.out.println("Using rt.jar: " + jar);
|
||||
}
|
||||
|
||||
@@ -138,6 +138,17 @@ public class ResolveDescriptorsFromExternalLibraries {
|
||||
return hasErrors;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static File findRtJar() {
|
||||
List<File> roots = PathUtil.getJdkClassesRoots();
|
||||
for (File root : roots) {
|
||||
if (root.getName().equals("rt.jar") || root.getName().equals("classes.jar")) {
|
||||
return root;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("No rt.jar/classes.jar found under " + System.getProperty("java.home"));
|
||||
}
|
||||
|
||||
private boolean parseLibraryFileChunk(File jar, String libDescription, ZipInputStream zip, int classesPerChunk) throws IOException {
|
||||
Disposable junk = new Disposable() {
|
||||
@Override
|
||||
@@ -153,8 +164,8 @@ public class ResolveDescriptorsFromExternalLibraries {
|
||||
CompilerConfiguration configuration =
|
||||
JetTestUtils.compilerConfigurationForTests(ConfigurationKind.JDK_AND_ANNOTATIONS, TestJdkKind.FULL_JDK);
|
||||
jetCoreEnvironment = JetCoreEnvironment.createForTests(junk, configuration);
|
||||
if (!PathUtil.findRtJar().equals(jar)) {
|
||||
throw new RuntimeException("rt.jar mismatch: " + jar + ", " + PathUtil.findRtJar());
|
||||
if (!findRtJar().equals(jar)) {
|
||||
throw new RuntimeException("rt.jar mismatch: " + jar + ", " + findRtJar());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,13 +18,14 @@ package org.jetbrains.jet.utils;
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.PathManager;
|
||||
import com.intellij.openapi.util.SystemInfo;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.VirtualFileManager;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jps.model.java.impl.JavaSdkUtil;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
public class PathUtil {
|
||||
|
||||
@@ -153,26 +154,7 @@ public class PathUtil {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static File findRtJar() {
|
||||
return findRtJar(System.getProperty("java.home"));
|
||||
}
|
||||
|
||||
private static File findRtJar(String javaHome) {
|
||||
if (SystemInfo.isMac && !SystemInfo.isJavaVersionAtLeast("1.7")) {
|
||||
File classesJar = new File(new File(javaHome).getParentFile(), "Classes/classes.jar");
|
||||
if (classesJar.exists()) {
|
||||
return classesJar;
|
||||
}
|
||||
|
||||
throw new IllegalArgumentException("No classes.jar found under " + classesJar.getParent());
|
||||
}
|
||||
else {
|
||||
File rtJar = new File(javaHome, "lib/rt.jar");
|
||||
if (rtJar.exists()) {
|
||||
return rtJar;
|
||||
}
|
||||
|
||||
throw new IllegalArgumentException("No rt.jar found under " + rtJar.getParent());
|
||||
}
|
||||
public static List<File> getJdkClassesRoots() {
|
||||
return JavaSdkUtil.getJdkClassesRoots(new File(System.getProperty("java.home")), true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
<orderEntry type="module" module-name="util.runtime" exported="" />
|
||||
<orderEntry type="module" module-name="Kotlin" exported="" />
|
||||
<orderEntry type="library" exported="" name="kotlin-runtime" level="project" />
|
||||
<orderEntry type="library" name="jps-model" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ public class GenerateJavaToKotlinMethodMap {
|
||||
|
||||
public static CharSequence generateText() throws IOException {
|
||||
CompilerConfiguration configuration = new CompilerConfiguration();
|
||||
configuration.add(CLASSPATH_KEY, PathUtil.findRtJar());
|
||||
configuration.addAll(CLASSPATH_KEY, PathUtil.getJdkClassesRoots());
|
||||
|
||||
Disposable disposable = Disposer.newDisposable();
|
||||
try {
|
||||
|
||||
@@ -47,7 +47,9 @@ public object JavaToKotlinTranslator {
|
||||
fun setUpJavaCoreEnvironment(): JavaCoreProjectEnvironment {
|
||||
val applicationEnvironment = JavaCoreApplicationEnvironment(DISPOSABLE)
|
||||
val javaCoreEnvironment = JavaCoreProjectEnvironment(DISPOSABLE, applicationEnvironment)
|
||||
javaCoreEnvironment.addJarToClassPath(PathUtil.findRtJar())
|
||||
for (root in PathUtil.getJdkClassesRoots()) {
|
||||
javaCoreEnvironment.addJarToClassPath(root)
|
||||
}
|
||||
val annotations: File? = findAnnotations()
|
||||
if (annotations != null && annotations.exists()) {
|
||||
javaCoreEnvironment.addJarToClassPath(annotations)
|
||||
|
||||
@@ -32,7 +32,7 @@ class PsiUtilsTest {
|
||||
System.setProperty("java.awt.headless", "true")
|
||||
|
||||
val configuration = CompilerConfiguration()
|
||||
configuration.add(JVMConfigurationKeys.CLASSPATH_KEY, PathUtil.findRtJar())
|
||||
configuration.addAll(JVMConfigurationKeys.CLASSPATH_KEY, PathUtil.getJdkClassesRoots())
|
||||
environment = JetCoreEnvironment.createForTests(rootDisposable, configuration)
|
||||
}
|
||||
|
||||
|
||||
+70
-95
@@ -21,90 +21,96 @@ class BasicKotlinGradleIT {
|
||||
workingDir.mkdirs()
|
||||
}
|
||||
|
||||
|
||||
After fun tearDown() {
|
||||
deleteRecursively(workingDir)
|
||||
}
|
||||
|
||||
Test fun testCrossCompile() {
|
||||
copyRecursively(File("src/test/resources/testProject/alfa"), workingDir)
|
||||
val projectDir = File(workingDir, "alfa")
|
||||
val project = Project("alfa")
|
||||
|
||||
val pathToKotlinPlugin = "-PpathToKotlinPlugin=" + File("local-repo").getAbsolutePath()
|
||||
|
||||
val cmd = if (SystemInfo.isWindows)
|
||||
listOf("cmd", "/C", "gradlew.bat", "compileDeployKotlin", "build", pathToKotlinPlugin, "--no-daemon", "--debug")
|
||||
else
|
||||
listOf("/bin/bash", "./gradlew", "compileDeployKotlin", "build", pathToKotlinPlugin, "--no-daemon", "--debug")
|
||||
|
||||
val builder = ProcessBuilder(cmd)
|
||||
builder.directory(projectDir)
|
||||
builder.redirectErrorStream(true)
|
||||
val process = builder.start()
|
||||
|
||||
val s = Scanner(process.getInputStream()!!)
|
||||
val text = StringBuilder()
|
||||
while (s.hasNextLine()) {
|
||||
text append s.nextLine()
|
||||
text append "\n"
|
||||
project.build("compileDeployKotlin") {
|
||||
assertSuccessful()
|
||||
assertReportExists()
|
||||
assertContains(":compileKotlin", ":compileTestKotlin", ":compileDeployKotlin")
|
||||
}
|
||||
s.close()
|
||||
|
||||
val result = process.waitFor()
|
||||
val buildOutput = text.toString()
|
||||
|
||||
println(buildOutput)
|
||||
|
||||
assertEquals(result, 0)
|
||||
assertTrue(buildOutput.contains(":compileKotlin"), "Should contain ':compileKotlin'")
|
||||
assertTrue(buildOutput.contains(":compileTestKotlin"), "Should contain ':compileTestKotlin'")
|
||||
assertTrue(buildOutput.contains(":compileDeployKotlin"), "Should contain ':compileDeployKotlin'")
|
||||
assertTrue(File(projectDir, "build/reports/tests/demo.TestSource.html").exists(), "Test report does not exist. Were tests executed?")
|
||||
|
||||
// Run the build second time, assert everything is up-to-date
|
||||
|
||||
val up2dateBuilder = ProcessBuilder(cmd)
|
||||
up2dateBuilder.directory(projectDir)
|
||||
up2dateBuilder.redirectErrorStream(true)
|
||||
val up2dateProcess = up2dateBuilder.start()
|
||||
|
||||
val up2dateProcessScanner = Scanner(up2dateProcess.getInputStream()!!)
|
||||
val up2dateText = StringBuilder()
|
||||
while (up2dateProcessScanner.hasNextLine()) {
|
||||
up2dateText append up2dateProcessScanner.nextLine()
|
||||
up2dateText append "\n"
|
||||
project.build("compileDeployKotlin") {
|
||||
assertSuccessful()
|
||||
assertContains(":compileKotlin UP-TO-DATE", ":compileTestKotlin UP-TO-DATE", ":compileDeployKotlin UP-TO-DATE", ":compileJava UP-TO-DATE")
|
||||
}
|
||||
up2dateProcessScanner.close()
|
||||
|
||||
val up2dateResult = up2dateProcess.waitFor()
|
||||
val up2dateBuildOutput = up2dateText.toString()
|
||||
|
||||
println(up2dateBuildOutput)
|
||||
|
||||
assertEquals(up2dateResult, 0)
|
||||
assertTrue(up2dateBuildOutput.contains(":compileKotlin UP-TO-DATE"), "Should contain ':compileKotlin UP-TO-DATE'")
|
||||
assertTrue(up2dateBuildOutput.contains(":compileTestKotlin UP-TO-DATE"), "Should contain ':compileTestKotlin UP-TO-DATE'")
|
||||
assertTrue(up2dateBuildOutput.contains(":compileDeployKotlin UP-TO-DATE"), "Should contain ':compileDeployKotlin UP-TO-DATE'")
|
||||
assertTrue(up2dateBuildOutput.contains(":compileJava UP-TO-DATE"), "Should contain ':compileJava UP-TO-DATE'")
|
||||
}
|
||||
|
||||
|
||||
Test fun testKotlinOnlyCompile() {
|
||||
copyRecursively(File("src/test/resources/testProject/beta"), workingDir)
|
||||
val projectDir = File(workingDir, "beta")
|
||||
val project = Project("beta")
|
||||
|
||||
project.build("build") {
|
||||
assertSuccessful()
|
||||
assertReportExists()
|
||||
assertContains(":compileKotlin", ":compileTestKotlin")
|
||||
}
|
||||
|
||||
project.build("build") {
|
||||
assertSuccessful()
|
||||
assertContains(":compileKotlin UP-TO-DATE", ":compileTestKotlin UP-TO-DATE")
|
||||
}
|
||||
}
|
||||
|
||||
Test fun testKotlinClasspath() {
|
||||
Project("classpathTest").build("build") {
|
||||
assertSuccessful()
|
||||
assertReportExists()
|
||||
assertContains(":compileKotlin", ":compileTestKotlin")
|
||||
}
|
||||
}
|
||||
|
||||
class Project(val projectName: String)
|
||||
|
||||
class CompiledProject(val project: Project, val output: String, val resultCode: Int)
|
||||
|
||||
fun Project.build(command: String, check: CompiledProject.() -> Unit) {
|
||||
copyRecursively(File("src/test/resources/testProject/$projectName"), workingDir)
|
||||
val projectDir = File(workingDir, projectName)
|
||||
val cmd = createCommand(command)
|
||||
val process = createProcess(cmd, projectDir)
|
||||
|
||||
val (output, resultCode) = readOutput(process)
|
||||
CompiledProject(this, output, resultCode).check()
|
||||
}
|
||||
|
||||
private fun CompiledProject.assertSuccessful(): CompiledProject {
|
||||
assertEquals(resultCode, 0)
|
||||
return this
|
||||
}
|
||||
|
||||
private fun CompiledProject.assertContains(vararg expected: String): CompiledProject {
|
||||
for (str in expected) {
|
||||
assertTrue(output.contains(str), "Should contain '$str', actual output: $output")
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
private fun CompiledProject.assertReportExists(): CompiledProject {
|
||||
assertTrue(File(File(workingDir, project.projectName), "build/reports/tests/demo.TestSource.html").exists(), "Test report does not exist. Were tests executed?")
|
||||
return this
|
||||
}
|
||||
|
||||
private fun createCommand(name: String): List<String> {
|
||||
val pathToKotlinPlugin = "-PpathToKotlinPlugin=" + File("local-repo").getAbsolutePath()
|
||||
|
||||
val cmd = if (SystemInfo.isWindows)
|
||||
listOf("cmd", "/C", "gradlew.bat", "build", pathToKotlinPlugin, "--no-daemon", "--debug")
|
||||
return if (SystemInfo.isWindows)
|
||||
listOf("cmd", "/C", "gradlew.bat", name, "build", pathToKotlinPlugin, "--no-daemon", "--debug")
|
||||
else
|
||||
listOf("/bin/bash", "./gradlew", "build", pathToKotlinPlugin, "--no-daemon", "--debug")
|
||||
listOf("/bin/bash", "./gradlew", name, "build", pathToKotlinPlugin, "--no-daemon", "--debug")
|
||||
}
|
||||
|
||||
private fun createProcess(cmd: List<String>, projectDir: File): Process {
|
||||
val builder = ProcessBuilder(cmd)
|
||||
builder.directory(projectDir)
|
||||
builder.redirectErrorStream(true)
|
||||
val process = builder.start()
|
||||
return builder.start()
|
||||
}
|
||||
|
||||
private fun readOutput(process: Process): Pair<String, Int> {
|
||||
val s = Scanner(process.getInputStream()!!)
|
||||
val text = StringBuilder()
|
||||
while (s.hasNextLine()) {
|
||||
@@ -114,37 +120,7 @@ class BasicKotlinGradleIT {
|
||||
s.close()
|
||||
|
||||
val result = process.waitFor()
|
||||
val buildOutput = text.toString()
|
||||
|
||||
println(buildOutput)
|
||||
assertEquals(result, 0)
|
||||
assertTrue(buildOutput.contains(":compileKotlin"), "Should contain ':compileKotlin'")
|
||||
assertTrue(buildOutput.contains(":compileTestKotlin"), "Should contain ':compileTestKotlin'")
|
||||
assertTrue(File(projectDir, "build/reports/tests/demo.TestSource.html").exists(), "Test report does not exist. Were tests executed?")
|
||||
|
||||
// Run the build second time, assert everything is up-to-date
|
||||
|
||||
val up2dateBuilder = ProcessBuilder(cmd)
|
||||
up2dateBuilder.directory(projectDir)
|
||||
up2dateBuilder.redirectErrorStream(true)
|
||||
val up2dateProcess = up2dateBuilder.start()
|
||||
|
||||
val up2dateProcessScanner = Scanner(up2dateProcess.getInputStream()!!)
|
||||
val up2dateText = StringBuilder()
|
||||
while (up2dateProcessScanner.hasNextLine()) {
|
||||
up2dateText append up2dateProcessScanner.nextLine()
|
||||
up2dateText append "\n"
|
||||
}
|
||||
up2dateProcessScanner.close()
|
||||
|
||||
val up2dateResult = up2dateProcess.waitFor()
|
||||
val up2dateBuildOutput = up2dateText.toString()
|
||||
|
||||
println(up2dateBuildOutput)
|
||||
|
||||
assertEquals(up2dateResult, 0)
|
||||
assertTrue(up2dateBuildOutput.contains(":compileKotlin UP-TO-DATE"), "Should contain ':compileKotlin UP-TO-DATE'")
|
||||
assertTrue(up2dateBuildOutput.contains(":compileTestKotlin UP-TO-DATE"), "Should contain ':compileTestKotlin UP-TO-DATE'")
|
||||
return text.toString() to result
|
||||
}
|
||||
|
||||
fun copyRecursively(source: File, target: File) {
|
||||
@@ -163,7 +139,6 @@ class BasicKotlinGradleIT {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun deleteRecursively(f: File): Unit {
|
||||
if (f.isDirectory()) {
|
||||
val children = f.listFiles()
|
||||
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven {
|
||||
url 'file://' + pathToKotlinPlugin
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:0.1-SNAPSHOT'
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: "kotlin"
|
||||
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
url 'file://' + pathToKotlinPlugin
|
||||
}
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile 'com.google.guava:guava:12.0'
|
||||
testCompile 'org.testng:testng:6.8'
|
||||
testRuntime 'org.jetbrains.kotlin:kotlin-stdlib:0.1-SNAPSHOT'
|
||||
}
|
||||
|
||||
test {
|
||||
useTestNG()
|
||||
}
|
||||
|
||||
task show << {
|
||||
buildscript.configurations.classpath.each { println it }
|
||||
}
|
||||
|
||||
task wrapper(type: Wrapper) {
|
||||
gradleVersion="1.4"
|
||||
}
|
||||
BIN
Binary file not shown.
+6
@@ -0,0 +1,6 @@
|
||||
#Thu Feb 28 14:00:49 MSK 2013
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=http\://services.gradle.org/distributions/gradle-1.4-bin.zip
|
||||
+164
@@ -0,0 +1,164 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn ( ) {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die ( ) {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
esac
|
||||
|
||||
# For Cygwin, ensure paths are in UNIX format before anything is touched.
|
||||
if $cygwin ; then
|
||||
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
|
||||
fi
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >&-
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >&-
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
|
||||
function splitJvmOpts() {
|
||||
JVM_OPTS=("$@")
|
||||
}
|
||||
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
|
||||
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
|
||||
|
||||
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
|
||||
Vendored
+90
@@ -0,0 +1,90 @@
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS=
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windowz variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
if "%@eval[2+2]" == "4" goto 4NT_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
goto execute
|
||||
|
||||
:4NT_args
|
||||
@rem Get arguments from the 4NT Shell from JP Software
|
||||
set CMD_LINE_ARGS=%$
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
package demo
|
||||
|
||||
import sun.nio.cs.SingleByte
|
||||
import sun.net.spi.nameservice.dns.DNSNameService
|
||||
import javax.crypto.Cipher
|
||||
import com.sun.java.browser.plugin2.DOM
|
||||
import com.sun.crypto.provider.AESCipher
|
||||
|
||||
fun box(): String {
|
||||
val a = SingleByte() // charsets.jar
|
||||
val c = DNSNameService() // dnsns.ajr
|
||||
val e : Cipher? = null // jce.jar
|
||||
val f : AESCipher? = null // sunjce_provider.jar
|
||||
val j : DOM? = null // plugin.jar
|
||||
return "OK"
|
||||
}
|
||||
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
package demo
|
||||
|
||||
import org.testng.Assert.*
|
||||
import org.testng.annotations.Test as test
|
||||
|
||||
class TestSource() {
|
||||
test fun f() {
|
||||
assertEquals(box(), "OK")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.jetbrains.kotlin.it</groupId>
|
||||
<artifactId>test-classpath</artifactId>
|
||||
<version>1.0</version>
|
||||
<name>Test Hello World project</name>
|
||||
|
||||
<description>
|
||||
Test the kotlin-maven-plugin:compile goal on test-classpath project.
|
||||
</description>
|
||||
|
||||
<properties>
|
||||
<kotlin.version>0.1-SNAPSHOT</kotlin.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.9</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<pluginManagement>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.3.2</version>
|
||||
<configuration>
|
||||
<source>1.6</source>
|
||||
<target>1.6</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<version>2.1.2</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
|
||||
<!--suppress MavenModelInspection -->
|
||||
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
|
||||
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>kotlin-maven-plugin</artifactId>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<version>${kotlin.version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>compile</id>
|
||||
<phase>process-sources</phase>
|
||||
<goals>
|
||||
<goal>compile</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>test-compile</id>
|
||||
<phase>process-test-sources</phase>
|
||||
<goals>
|
||||
<goal>test-compile</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
package org.jetbrains
|
||||
|
||||
import sun.nio.cs.SingleByte
|
||||
import sun.net.spi.nameservice.dns.DNSNameService
|
||||
import javax.crypto.Cipher
|
||||
import com.sun.java.browser.plugin2.DOM
|
||||
import com.sun.crypto.provider.AESCipher
|
||||
|
||||
fun box(): String {
|
||||
val a = SingleByte() // charsets.jar
|
||||
val c = DNSNameService() // dnsns.ajr
|
||||
val e : Cipher? = null // jce.jar
|
||||
val f : AESCipher? = null // sunjce_provider.jar
|
||||
val j : DOM? = null // plugin.jar
|
||||
return "OK"
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
package org.jetbrains;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
|
||||
public class HelloWorldJavaTest {
|
||||
|
||||
@Test
|
||||
public void testClasspath() {
|
||||
assertEquals("OK", org.jetbrains.JetbrainsPackage.box());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
import java.io.*;
|
||||
|
||||
File file = new File( basedir, "target/test-classpath-1.0.jar" );
|
||||
if (!file.exists() || !file.isFile())
|
||||
{
|
||||
throw new FileNotFoundException( "Could not find generated JAR: " + file );
|
||||
}
|
||||
Reference in New Issue
Block a user