blob: a9a52efb938e3586e282b47ffa55605fd5cd2d61 [file] [log] [blame]
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.incremental
import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.incremental.utils.TestCompilationResult
import org.jetbrains.kotlin.incremental.utils.TestICReporter
import org.jetbrains.kotlin.incremental.utils.TestMessageCollector
import org.jetbrains.kotlin.test.KotlinTestUtils
import java.io.ByteArrayOutputStream
import java.io.File
import javax.tools.ToolProvider
abstract class AbstractIncrementalJvmCompilerRunnerTest : AbstractIncrementalCompilerRunnerTestBase<K2JVMCompilerArguments>() {
override fun make(cacheDir: File, sourceRoots: Iterable<File>, args: K2JVMCompilerArguments): TestCompilationResult {
val reporter = TestICReporter()
val messageCollector = TestMessageCollector()
makeIncrementally(cacheDir, sourceRoots, args, reporter = reporter, messageCollector = messageCollector)
val kotlinCompileResult = TestCompilationResult(reporter, messageCollector)
if (kotlinCompileResult.exitCode != ExitCode.OK) return kotlinCompileResult
val (javaExitCode, _, javaErrors) = compileJava(sourceRoots, args.destination!!)
return when (javaExitCode) {
ExitCode.OK -> kotlinCompileResult
else -> kotlinCompileResult.copy(exitCode = javaExitCode, compileErrors = javaErrors)
}
}
private fun compileJava(sourceRoots: Iterable<File>, kotlinClassesPath: String): TestCompilationResult {
val javaSources = arrayListOf<File>()
for (root in sourceRoots) {
javaSources.addAll(root.walk().filter { it.isFile && it.extension == "java" })
}
if (javaSources.isEmpty()) return TestCompilationResult(ExitCode.OK, emptyList(), emptyList())
val javaClasspath = compileClasspath + File.pathSeparator + kotlinClassesPath
val javaDestinationDir = File(workingDir, "java-classes").apply {
if (exists()) {
deleteRecursively()
}
mkdirs()
}
val args = arrayOf("-cp", javaClasspath,
"-d", javaDestinationDir.canonicalPath,
*javaSources.map { it.canonicalPath }.toTypedArray()
)
val err = ByteArrayOutputStream()
val javac = ToolProvider.getSystemJavaCompiler()
val rc = javac.run(null, null, err, *args)
val exitCode = if (rc == 0) ExitCode.OK else ExitCode.COMPILATION_ERROR
val errors = err.toString().split("\n")
return TestCompilationResult(exitCode, javaSources, errors)
}
override fun createCompilerArguments(destinationDir: File, testDir: File): K2JVMCompilerArguments =
K2JVMCompilerArguments().apply {
moduleName = testDir.name
destination = destinationDir.path
classpath = compileClasspath
}
private val compileClasspath =
listOf(
kotlinStdlibJvm,
KotlinTestUtils.getAnnotationsJar()
).joinToString(File.pathSeparator) { it.canonicalPath }
}