diff options
-rw-r--r-- | kotlin-analysis-api/src/test/kotlin/com/google/devtools/ksp/impl/test/AbstractKSPAATest.kt | 49 | ||||
-rw-r--r-- | test-utils/src/main/kotlin/com/google/devtools/ksp/testutils/AbstractKSPTest.kt | 2 |
2 files changed, 50 insertions, 1 deletions
diff --git a/kotlin-analysis-api/src/test/kotlin/com/google/devtools/ksp/impl/test/AbstractKSPAATest.kt b/kotlin-analysis-api/src/test/kotlin/com/google/devtools/ksp/impl/test/AbstractKSPAATest.kt index e2d622ce..7a98d817 100644 --- a/kotlin-analysis-api/src/test/kotlin/com/google/devtools/ksp/impl/test/AbstractKSPAATest.kt +++ b/kotlin-analysis-api/src/test/kotlin/com/google/devtools/ksp/impl/test/AbstractKSPAATest.kt @@ -25,15 +25,24 @@ import com.google.devtools.ksp.testutils.AbstractKSPTest import org.jetbrains.kotlin.analysis.api.standalone.buildStandaloneAnalysisAPISession import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoot import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots +import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoot import org.jetbrains.kotlin.config.CommonConfigurationKeys +import org.jetbrains.kotlin.test.compileJavaFiles +import org.jetbrains.kotlin.test.kotlinPathsForDistDirectoryForTests import org.jetbrains.kotlin.test.model.FrontendKinds import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.JUnit5Assertions import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.compilerConfigurationProvider import org.jetbrains.kotlin.test.services.isKtFile import org.jetbrains.kotlin.test.services.javaFiles +import org.jetbrains.kotlin.test.util.KtTestUtil +import org.jetbrains.kotlin.utils.PathUtil +import java.io.ByteArrayOutputStream import java.io.File +import java.io.PrintStream +import java.net.URLClassLoader import java.nio.file.Files abstract class AbstractKSPAATest : AbstractKSPTest(FrontendKinds.FIR) { @@ -50,6 +59,46 @@ abstract class AbstractKSPAATest : AbstractKSPTest(FrontendKinds.FIR) { } } + private fun compileKotlin(sourcesPath: String, outDir: File) { + val classpath = mutableListOf<String>() + if (File(sourcesPath).isDirectory) { + classpath += sourcesPath + } + classpath += PathUtil.kotlinPathsForDistDirectoryForTests.stdlibPath.path + + val args = mutableListOf( + sourcesPath, + "-d", outDir.absolutePath, + "-no-stdlib", + "-classpath", classpath.joinToString(File.pathSeparator) + ) + runJvmCompiler(args) + } + + private fun runJvmCompiler(args: List<String>) { + val outStream = ByteArrayOutputStream() + val compilerClass = URLClassLoader(arrayOf(), javaClass.classLoader).loadClass(K2JVMCompiler::class.java.name) + val compiler = compilerClass.newInstance() + val execMethod = compilerClass.getMethod("exec", PrintStream::class.java, Array<String>::class.java) + execMethod.invoke(compiler, PrintStream(outStream), args.toTypedArray()) + } + + override fun compileModule(module: TestModule, testServices: TestServices) { + module.writeKtFiles() + val javaFiles = module.writeJavaFiles() + compileKotlin(module.kotlinSrc.path, module.outDir) + val dependencies = module.allDependencies.map { outDirForModule(it.moduleName) } + val classpath = (dependencies + KtTestUtil.getAnnotationsJar() + module.outDir) + .joinToString(File.pathSeparator) { it.absolutePath } + val options = listOf( + "-classpath", classpath, + "-d", module.outDir.path + ) + if (javaFiles.isNotEmpty()) { + compileJavaFiles(javaFiles, options, assertions = JUnit5Assertions) + } + } + override fun runTest( testServices: TestServices, mainModule: TestModule, diff --git a/test-utils/src/main/kotlin/com/google/devtools/ksp/testutils/AbstractKSPTest.kt b/test-utils/src/main/kotlin/com/google/devtools/ksp/testutils/AbstractKSPTest.kt index 1c455f74..b2d89bfb 100644 --- a/test-utils/src/main/kotlin/com/google/devtools/ksp/testutils/AbstractKSPTest.kt +++ b/test-utils/src/main/kotlin/com/google/devtools/ksp/testutils/AbstractKSPTest.kt @@ -160,7 +160,7 @@ abstract class AbstractKSPTest(frontend: FrontendKind<*>) : DisposableTest() { // dist/kotlinc/lib/* // // No, sourceFileProvider doesn't group files by module unfortunately. Let's do it by ourselves. - fun compileModule(module: TestModule, testServices: TestServices) { + open fun compileModule(module: TestModule, testServices: TestServices) { val javaFiles = module.writeJavaFiles() val compilerConfiguration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module) val dependencies = module.allDependencies.map { outDirForModule(it.moduleName) } |