From 69ec958aab8a1b547ece466976f64f1de8e82c12 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 31 Oct 2018 12:08:28 +0900 Subject: [PATCH] Kapt: Add tests for the command-line 'kapt' tool --- .../preprocessCommandLineArguments.kt | 7 + generators/build.gradle.kts | 1 + generators/build.gradle.kts.as31 | 1 + generators/build.gradle.kts.as32 | 1 + generators/build.gradle.kts.as33 | 1 + generators/build.gradle.kts.as34 | 1 + .../kotlin/generators/tests/GenerateTests.kt | 12 ++ .../generators/tests/GenerateTests.kt.as31 | 12 ++ .../generators/tests/GenerateTests.kt.as32 | 12 ++ .../generators/tests/GenerateTests.kt.as33 | 12 ++ .../generators/tests/GenerateTests.kt.as34 | 12 ++ plugins/kapt3/kapt3-cli/build.gradle.kts | 6 +- .../cli/test/AbstractArgumentParsingTest.kt | 32 +++++ .../test/AbstractKaptToolIntegrationTest.kt | 122 ++++++++++++++++++ .../test/ArgumentParsingTestGenerated.java | 56 ++++++++ .../KaptToolIntegrationTestGenerated.java | 61 +++++++++ .../jetbrains/kotlin/kapt/cli/test/Section.kt | 68 ++++++++++ .../testData/argumentParsing/errorFlag.txt | 5 + .../argumentParsing/errorKeyValue.txt | 7 + .../testData/argumentParsing/errorValue.txt | 9 ++ .../testData/argumentParsing/kotlincHelp.txt | 7 + .../testData/argumentParsing/simple.txt | 42 ++++++ .../integration/argfile/apKotlincArgs.txt | 3 + .../testData/integration/argfile/build.txt | 30 +++++ .../integration/argfile/javacArgs.txt | 6 + .../testData/integration/argfile/kaptArgs.txt | 8 ++ .../correctErrorTypesOff/build.txt | 50 +++++++ .../integration/correctErrorTypesOn/Test.kt | 14 ++ .../correctErrorTypesOn/ap/Processor.kt | 31 +++++ .../integration/correctErrorTypesOn/build.txt | 35 +++++ .../separateStubAptCompilation/build.txt | 61 +++++++++ .../testData/integration/simple/Test.kt | 19 +++ .../javax.annotation.processing.Processor | 1 + .../integration/simple/ap/Processor.kt | 25 ++++ .../testData/integration/simple/build.txt | 39 ++++++ .../integration/withoutService/build.txt | 44 +++++++ 36 files changed, 852 insertions(+), 1 deletion(-) create mode 100644 plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/AbstractArgumentParsingTest.kt create mode 100644 plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/AbstractKaptToolIntegrationTest.kt create mode 100644 plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/ArgumentParsingTestGenerated.java create mode 100644 plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/KaptToolIntegrationTestGenerated.java create mode 100644 plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/Section.kt create mode 100644 plugins/kapt3/kapt3-cli/testData/argumentParsing/errorFlag.txt create mode 100644 plugins/kapt3/kapt3-cli/testData/argumentParsing/errorKeyValue.txt create mode 100644 plugins/kapt3/kapt3-cli/testData/argumentParsing/errorValue.txt create mode 100644 plugins/kapt3/kapt3-cli/testData/argumentParsing/kotlincHelp.txt create mode 100644 plugins/kapt3/kapt3-cli/testData/argumentParsing/simple.txt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/argfile/apKotlincArgs.txt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/argfile/build.txt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/argfile/javacArgs.txt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/argfile/kaptArgs.txt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOff/build.txt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/Test.kt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/ap/Processor.kt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/build.txt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/separateStubAptCompilation/build.txt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/simple/Test.kt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/simple/ap/META-INF/services/javax.annotation.processing.Processor create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/simple/ap/Processor.kt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/simple/build.txt create mode 100644 plugins/kapt3/kapt3-cli/testData/integration/withoutService/build.txt diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/preprocessCommandLineArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/preprocessCommandLineArguments.kt index 59b83ba0bb7..18d1fa7b6bc 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/preprocessCommandLineArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/preprocessCommandLineArguments.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.cli.common.arguments +import org.jetbrains.annotations.TestOnly import java.io.File import java.io.FileNotFoundException import java.io.IOException @@ -35,6 +36,12 @@ fun preprocessCommandLineArguments(args: List, errors: ArgumentParseErro } } +@TestOnly +fun readArgumentsFromArgFile(content: String): List { + val reader = content.reader() + return generateSequence { reader.parseNextArgument() }.toList() +} + private fun File.expand(errors: ArgumentParseErrors): List { return try { bufferedReader(Charsets.UTF_8).use { diff --git a/generators/build.gradle.kts b/generators/build.gradle.kts index b8893d8b9d4..dc7f3f28578 100644 --- a/generators/build.gradle.kts +++ b/generators/build.gradle.kts @@ -24,6 +24,7 @@ dependencies { compile(projectTests(":plugins:android-extensions-ide")) compile(projectTests(":plugins:android-extensions-jps")) compile(projectTests(":kotlin-annotation-processing")) + compile(projectTests(":kotlin-annotation-processing-cli")) compile(projectTests(":kotlin-allopen-compiler-plugin")) compile(projectTests(":kotlin-noarg-compiler-plugin")) compile(projectTests(":kotlin-sam-with-receiver-compiler-plugin")) diff --git a/generators/build.gradle.kts.as31 b/generators/build.gradle.kts.as31 index f08d1f92262..a71a5602e6b 100644 --- a/generators/build.gradle.kts.as31 +++ b/generators/build.gradle.kts.as31 @@ -24,6 +24,7 @@ dependencies { compile(projectTests(":plugins:android-extensions-ide")) compile(projectTests(":plugins:android-extensions-jps")) compile(projectTests(":kotlin-annotation-processing")) + compile(projectTests(":kotlin-annotation-processing-cli")) compile(projectTests(":kotlin-allopen-compiler-plugin")) compile(projectTests(":kotlin-noarg-compiler-plugin")) compile(projectTests(":kotlin-sam-with-receiver-compiler-plugin")) diff --git a/generators/build.gradle.kts.as32 b/generators/build.gradle.kts.as32 index f8f5c882fb6..8c8551287fd 100644 --- a/generators/build.gradle.kts.as32 +++ b/generators/build.gradle.kts.as32 @@ -24,6 +24,7 @@ dependencies { compile(projectTests(":plugins:android-extensions-ide")) compile(projectTests(":plugins:android-extensions-jps")) compile(projectTests(":kotlin-annotation-processing")) + compile(projectTests(":kotlin-annotation-processing-cli")) compile(projectTests(":kotlin-allopen-compiler-plugin")) compile(projectTests(":kotlin-noarg-compiler-plugin")) compile(projectTests(":kotlin-sam-with-receiver-compiler-plugin")) diff --git a/generators/build.gradle.kts.as33 b/generators/build.gradle.kts.as33 index f8f5c882fb6..8c8551287fd 100644 --- a/generators/build.gradle.kts.as33 +++ b/generators/build.gradle.kts.as33 @@ -24,6 +24,7 @@ dependencies { compile(projectTests(":plugins:android-extensions-ide")) compile(projectTests(":plugins:android-extensions-jps")) compile(projectTests(":kotlin-annotation-processing")) + compile(projectTests(":kotlin-annotation-processing-cli")) compile(projectTests(":kotlin-allopen-compiler-plugin")) compile(projectTests(":kotlin-noarg-compiler-plugin")) compile(projectTests(":kotlin-sam-with-receiver-compiler-plugin")) diff --git a/generators/build.gradle.kts.as34 b/generators/build.gradle.kts.as34 index f8f5c882fb6..8c8551287fd 100644 --- a/generators/build.gradle.kts.as34 +++ b/generators/build.gradle.kts.as34 @@ -24,6 +24,7 @@ dependencies { compile(projectTests(":plugins:android-extensions-ide")) compile(projectTests(":plugins:android-extensions-jps")) compile(projectTests(":kotlin-annotation-processing")) + compile(projectTests(":kotlin-annotation-processing-cli")) compile(projectTests(":kotlin-allopen-compiler-plugin")) compile(projectTests(":kotlin-noarg-compiler-plugin")) compile(projectTests(":kotlin-sam-with-receiver-compiler-plugin")) diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 7073de21eb2..434bba077ac 100755 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -149,6 +149,8 @@ import org.jetbrains.kotlin.jps.build.android.AbstractAndroidJpsTestCase import org.jetbrains.kotlin.jps.build.dependeciestxt.actualizeMppJpsIncTestCaseDirs import org.jetbrains.kotlin.jps.incremental.AbstractJsProtoComparisonTest import org.jetbrains.kotlin.jps.incremental.AbstractJvmProtoComparisonTest +import org.jetbrains.kotlin.kapt.cli.test.AbstractArgumentParsingTest +import org.jetbrains.kotlin.kapt.cli.test.AbstractKaptToolIntegrationTest import org.jetbrains.kotlin.kapt3.test.AbstractClassFileToSourceStubConverterTest import org.jetbrains.kotlin.kapt3.test.AbstractKotlinKaptContextTest import org.jetbrains.kotlin.noarg.AbstractBlackBoxCodegenTestForNoArg @@ -1073,6 +1075,16 @@ fun main(args: Array) { } } + testGroup("plugins/kapt3/kapt3-cli/test", "plugins/kapt3/kapt3-cli/testData") { + testClass { + model("argumentParsing", extension = "txt") + } + + testClass { + model("integration", recursive = false, extension = null) + } + } + testGroup("plugins/allopen/allopen-cli/test", "plugins/allopen/allopen-cli/testData") { testClass { model("bytecodeListing", extension = "kt") diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as31 b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as31 index 1e0b291684f..89d157cdfe9 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as31 +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as31 @@ -148,6 +148,8 @@ import org.jetbrains.kotlin.j2k.AbstractJavaToKotlinConverterSingleFileTest //import org.jetbrains.kotlin.jps.build.android.AbstractAndroidJpsTestCase //import org.jetbrains.kotlin.jps.incremental.AbstractJsProtoComparisonTest //import org.jetbrains.kotlin.jps.incremental.AbstractJvmProtoComparisonTest +import org.jetbrains.kotlin.kapt.cli.test.AbstractArgumentParsingTest +import org.jetbrains.kotlin.kapt.cli.test.AbstractKaptToolIntegrationTest import org.jetbrains.kotlin.kapt3.test.AbstractClassFileToSourceStubConverterTest import org.jetbrains.kotlin.kapt3.test.AbstractKotlinKaptContextTest import org.jetbrains.kotlin.noarg.AbstractBlackBoxCodegenTestForNoArg @@ -993,6 +995,16 @@ fun main(args: Array) { } } + testGroup("plugins/kapt3/kapt3-cli/test", "plugins/kapt3/kapt3-cli/testData") { + testClass { + model("argumentParsing", extension = "txt") + } + + testClass { + model("integration", recursive = false, extension = null) + } + } + testGroup("plugins/allopen/allopen-cli/test", "plugins/allopen/allopen-cli/testData") { testClass { model("bytecodeListing", extension = "kt") diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as32 b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as32 index 1e0b291684f..89d157cdfe9 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as32 +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as32 @@ -148,6 +148,8 @@ import org.jetbrains.kotlin.j2k.AbstractJavaToKotlinConverterSingleFileTest //import org.jetbrains.kotlin.jps.build.android.AbstractAndroidJpsTestCase //import org.jetbrains.kotlin.jps.incremental.AbstractJsProtoComparisonTest //import org.jetbrains.kotlin.jps.incremental.AbstractJvmProtoComparisonTest +import org.jetbrains.kotlin.kapt.cli.test.AbstractArgumentParsingTest +import org.jetbrains.kotlin.kapt.cli.test.AbstractKaptToolIntegrationTest import org.jetbrains.kotlin.kapt3.test.AbstractClassFileToSourceStubConverterTest import org.jetbrains.kotlin.kapt3.test.AbstractKotlinKaptContextTest import org.jetbrains.kotlin.noarg.AbstractBlackBoxCodegenTestForNoArg @@ -993,6 +995,16 @@ fun main(args: Array) { } } + testGroup("plugins/kapt3/kapt3-cli/test", "plugins/kapt3/kapt3-cli/testData") { + testClass { + model("argumentParsing", extension = "txt") + } + + testClass { + model("integration", recursive = false, extension = null) + } + } + testGroup("plugins/allopen/allopen-cli/test", "plugins/allopen/allopen-cli/testData") { testClass { model("bytecodeListing", extension = "kt") diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as33 b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as33 index aee3556e831..67aa767299f 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as33 +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as33 @@ -140,6 +140,8 @@ import org.jetbrains.kotlin.j2k.AbstractJavaToKotlinConverterSingleFileTest //import org.jetbrains.kotlin.jps.build.android.AbstractAndroidJpsTestCase //import org.jetbrains.kotlin.jps.incremental.AbstractJsProtoComparisonTest //import org.jetbrains.kotlin.jps.incremental.AbstractJvmProtoComparisonTest +import org.jetbrains.kotlin.kapt.cli.test.AbstractArgumentParsingTest +import org.jetbrains.kotlin.kapt.cli.test.AbstractKaptToolIntegrationTest import org.jetbrains.kotlin.kapt3.test.AbstractClassFileToSourceStubConverterTest import org.jetbrains.kotlin.kapt3.test.AbstractKotlinKaptContextTest import org.jetbrains.kotlin.noarg.AbstractBlackBoxCodegenTestForNoArg @@ -985,6 +987,16 @@ fun main(args: Array) { } } + testGroup("plugins/kapt3/kapt3-cli/test", "plugins/kapt3/kapt3-cli/testData") { + testClass { + model("argumentParsing", extension = "txt") + } + + testClass { + model("integration", recursive = false, extension = null) + } + } + testGroup("plugins/allopen/allopen-cli/test", "plugins/allopen/allopen-cli/testData") { testClass { model("bytecodeListing", extension = "kt") diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as34 b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as34 index aee3556e831..67aa767299f 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as34 +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as34 @@ -140,6 +140,8 @@ import org.jetbrains.kotlin.j2k.AbstractJavaToKotlinConverterSingleFileTest //import org.jetbrains.kotlin.jps.build.android.AbstractAndroidJpsTestCase //import org.jetbrains.kotlin.jps.incremental.AbstractJsProtoComparisonTest //import org.jetbrains.kotlin.jps.incremental.AbstractJvmProtoComparisonTest +import org.jetbrains.kotlin.kapt.cli.test.AbstractArgumentParsingTest +import org.jetbrains.kotlin.kapt.cli.test.AbstractKaptToolIntegrationTest import org.jetbrains.kotlin.kapt3.test.AbstractClassFileToSourceStubConverterTest import org.jetbrains.kotlin.kapt3.test.AbstractKotlinKaptContextTest import org.jetbrains.kotlin.noarg.AbstractBlackBoxCodegenTestForNoArg @@ -985,6 +987,16 @@ fun main(args: Array) { } } + testGroup("plugins/kapt3/kapt3-cli/test", "plugins/kapt3/kapt3-cli/testData") { + testClass { + model("argumentParsing", extension = "txt") + } + + testClass { + model("integration", recursive = false, extension = null) + } + } + testGroup("plugins/allopen/allopen-cli/test", "plugins/allopen/allopen-cli/testData") { testClass { model("bytecodeListing", extension = "kt") diff --git a/plugins/kapt3/kapt3-cli/build.gradle.kts b/plugins/kapt3/kapt3-cli/build.gradle.kts index 13d6238a53b..66379a00d08 100644 --- a/plugins/kapt3/kapt3-cli/build.gradle.kts +++ b/plugins/kapt3/kapt3-cli/build.gradle.kts @@ -5,11 +5,15 @@ plugins { dependencies { compile(project(":compiler:cli")) + + testCompile(projectTests(":compiler:tests-common")) + testCompile(projectTests(":compiler")) + testCompile(commonDep("junit:junit")) } sourceSets { "main" { projectDefault() } - "test" { } + "test" { projectDefault() } } testsJar {} diff --git a/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/AbstractArgumentParsingTest.kt b/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/AbstractArgumentParsingTest.kt new file mode 100644 index 00000000000..b4c67a103a7 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/AbstractArgumentParsingTest.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ +package org.jetbrains.kotlin.kapt.cli.test + +import junit.framework.TestCase +import org.jetbrains.kotlin.daemon.TestMessageCollector +import org.jetbrains.kotlin.kapt.cli.transformArgs +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners +import org.jetbrains.kotlin.test.KotlinTestUtils +import org.junit.runner.RunWith +import java.io.File + +private val LINE_SEPARATOR: String = System.getProperty("line.separator") + +@RunWith(JUnit3RunnerWithInners::class) +abstract class AbstractArgumentParsingTest : TestCase() { + fun doTest(filePath: String) { + val testFile = File(filePath) + + val sections = Section.parse(testFile) + val before = sections.single { it.name == "before" } + + val messageCollector = TestMessageCollector() + val transformedArgs = transformArgs(before.content.split(LINE_SEPARATOR), messageCollector, isTest = true) + val actualAfter = if (messageCollector.hasErrors()) messageCollector.toString() else transformedArgs.joinToString(LINE_SEPARATOR) + val actual = sections.replacingSection("after", actualAfter).render() + + KotlinTestUtils.assertEqualsToFile(testFile, actual) + } +} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/AbstractKaptToolIntegrationTest.kt b/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/AbstractKaptToolIntegrationTest.kt new file mode 100644 index 00000000000..fe2c0c43954 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/AbstractKaptToolIntegrationTest.kt @@ -0,0 +1,122 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.kapt.cli.test + +import com.intellij.openapi.util.SystemInfo +import org.jetbrains.kotlin.cli.common.arguments.readArgumentsFromArgFile +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners +import org.jetbrains.kotlin.test.KotlinTestUtils +import org.jetbrains.kotlin.test.TestCaseWithTmpdir +import org.junit.runner.RunWith +import java.io.File +import java.util.concurrent.TimeUnit + +@RunWith(JUnit3RunnerWithInners::class) +abstract class AbstractKaptToolIntegrationTest : TestCaseWithTmpdir() { + fun doTest(filePath: String) { + val testDir = File(filePath) + val testFile = File(testDir, "build.txt") + assert(testFile.isFile) { "build.txt doesn't exist" } + + testDir.listFiles().forEach { it.copyRecursively(File(tmpdir, it.name)) } + doTestInTempDirectory(testFile, File(tmpdir, testFile.name)) + } + + private class GotResult(val actual: String): RuntimeException() + + private fun doTestInTempDirectory(originalTestFile: File, testFile: File) { + val sections = Section.parse(testFile) + + for (section in sections) { + try { + when (section.name) { + "mkdir" -> section.args.forEach { File(tmpdir, it).mkdirs() } + "copy" -> copyFile(originalTestFile.parentFile, section.args) + "kotlinc" -> runKotlinDistBinary("kotlinc", section.args) + "kapt" -> runKotlinDistBinary("kapt", section.args) + "javac" -> runJavac(section.args) + "java" -> runJava(section.args) + "after" -> {} + else -> error("Unknown section name ${section.name}") + } + } catch (e: GotResult) { + val actual = sections.replacingSection("after", e.actual).render() + KotlinTestUtils.assertEqualsToFile(originalTestFile, actual) + return + } catch (e: Throwable) { + throw RuntimeException("Section ${section.name} failed:\n${section.content}", e) + } + } + } + + private fun copyFile(testDir: File, args: List) { + assert(args.size == 2) + val source = File(testDir, args[0]) + val target = File(tmpdir, args[1]).also { it.parentFile.mkdirs() } + source.copyRecursively(target) + } + + private fun runKotlinDistBinary(name: String, args: List) { + val executableName = if (SystemInfo.isWindows) name + ".bat" else name + val executablePath = File("dist/kotlinc/bin/" + executableName).absolutePath + runProcess(executablePath, args) + } + + private fun runJavac(args: List) { + val executableName = if (SystemInfo.isWindows) "javac.exe" else "javac" + val executablePath = File(getJdk8Home(), "bin/" + executableName).absolutePath + runProcess(executablePath, args) + } + + private fun runJava(args: List) { + val outputFile = File(tmpdir, "javaOutput.txt") + + val executableName = if (SystemInfo.isWindows) "java.exe" else "java" + val executablePath = File(getJdk8Home(), "bin/" + executableName).absolutePath + runProcess(executablePath, args, outputFile) + + throw GotResult(outputFile.takeIf { it.isFile }?.readText() ?: "") + } + + private fun runProcess(executablePath: String, args: List, outputFile: File = File(tmpdir, "processOutput.txt")) { + fun err(message: String): Nothing = error("$message: $name (${args.joinToString(" ")})") + + outputFile.delete() + + val transformedArgs = transformArguments(args).toTypedArray() + val process = ProcessBuilder(executablePath, *transformedArgs).directory(tmpdir) + .inheritIO() + .redirectError(ProcessBuilder.Redirect.to(outputFile)) + .redirectOutput(ProcessBuilder.Redirect.to(outputFile)) + .start() + + if (!process.waitFor(2, TimeUnit.MINUTES)) err("Process is still alive") + if (process.exitValue() != 0) { + throw GotResult(buildString { + append("Return code: ").appendln(process.exitValue()).appendln() + appendln(outputFile.readText()) + }) + } + } + + private fun transformArguments(args: List): List { + return args.map { it.replace("%KOTLIN_STDLIB%", File("dist/kotlinc/lib/kotlin-stdlib.jar").absolutePath) } + } + + private fun getJdk8Home(): File { + val homePath = System.getenv()["JDK_18"] ?: error("Can't find JDK 1.8 home") + return File(homePath) + } +} + +private val Section.args get() = readArgumentsFromArgFile(preprocessPathSeparators(content)) + +private fun preprocessPathSeparators(text: String): String = buildString { + for (line in text.lineSequence()) { + val transformed = if (line.startsWith("-cp ")) line.replace(':', File.pathSeparatorChar) else line + appendln(transformed) + } +} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/ArgumentParsingTestGenerated.java b/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/ArgumentParsingTestGenerated.java new file mode 100644 index 00000000000..f4877e50387 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/ArgumentParsingTestGenerated.java @@ -0,0 +1,56 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.kapt.cli.test; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TargetBackend; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("plugins/kapt3/kapt3-cli/testData/argumentParsing") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class ArgumentParsingTestGenerated extends AbstractArgumentParsingTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInArgumentParsing() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("plugins/kapt3/kapt3-cli/testData/argumentParsing"), Pattern.compile("^(.+)\\.txt$"), TargetBackend.ANY, true); + } + + @TestMetadata("errorFlag.txt") + public void testErrorFlag() throws Exception { + runTest("plugins/kapt3/kapt3-cli/testData/argumentParsing/errorFlag.txt"); + } + + @TestMetadata("errorKeyValue.txt") + public void testErrorKeyValue() throws Exception { + runTest("plugins/kapt3/kapt3-cli/testData/argumentParsing/errorKeyValue.txt"); + } + + @TestMetadata("errorValue.txt") + public void testErrorValue() throws Exception { + runTest("plugins/kapt3/kapt3-cli/testData/argumentParsing/errorValue.txt"); + } + + @TestMetadata("kotlincHelp.txt") + public void testKotlincHelp() throws Exception { + runTest("plugins/kapt3/kapt3-cli/testData/argumentParsing/kotlincHelp.txt"); + } + + @TestMetadata("simple.txt") + public void testSimple() throws Exception { + runTest("plugins/kapt3/kapt3-cli/testData/argumentParsing/simple.txt"); + } +} diff --git a/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/KaptToolIntegrationTestGenerated.java b/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/KaptToolIntegrationTestGenerated.java new file mode 100644 index 00000000000..0ee0c4ca8e2 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/KaptToolIntegrationTestGenerated.java @@ -0,0 +1,61 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.kapt.cli.test; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TargetBackend; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("plugins/kapt3/kapt3-cli/testData/integration") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class KaptToolIntegrationTestGenerated extends AbstractKaptToolIntegrationTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInIntegration() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("plugins/kapt3/kapt3-cli/testData/integration"), Pattern.compile("^([^\\.]+)$"), TargetBackend.ANY, false); + } + + @TestMetadata("argfile") + public void testArgfile() throws Exception { + runTest("plugins/kapt3/kapt3-cli/testData/integration/argfile/"); + } + + @TestMetadata("correctErrorTypesOff") + public void testCorrectErrorTypesOff() throws Exception { + runTest("plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOff/"); + } + + @TestMetadata("correctErrorTypesOn") + public void testCorrectErrorTypesOn() throws Exception { + runTest("plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/"); + } + + @TestMetadata("separateStubAptCompilation") + public void testSeparateStubAptCompilation() throws Exception { + runTest("plugins/kapt3/kapt3-cli/testData/integration/separateStubAptCompilation/"); + } + + @TestMetadata("simple") + public void testSimple() throws Exception { + runTest("plugins/kapt3/kapt3-cli/testData/integration/simple/"); + } + + @TestMetadata("withoutService") + public void testWithoutService() throws Exception { + runTest("plugins/kapt3/kapt3-cli/testData/integration/withoutService/"); + } +} diff --git a/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/Section.kt b/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/Section.kt new file mode 100644 index 00000000000..d6b330a812b --- /dev/null +++ b/plugins/kapt3/kapt3-cli/test/org/jetbrains/kotlin/kapt/cli/test/Section.kt @@ -0,0 +1,68 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.kapt.cli.test + +import org.jetbrains.kotlin.kapt.cli.test.Section.Companion.SECTION_INDICATOR +import java.io.File + +class Section(val name: String, val content: String) { + companion object { + const val SECTION_INDICATOR = "# " + + fun parse(file: File): List
{ + val sections = mutableListOf
() + + var currentName = "" + val currentContent = StringBuilder() + + fun saveCurrent() { + if (currentName.isNotEmpty()) { + sections += Section(currentName.trim(), currentContent.toString().trim()) + } + + currentName = "" + currentContent.clear() + } + + file.forEachLine { line -> + if (line.startsWith(SECTION_INDICATOR)) { + assert(line.length > 2) + saveCurrent() + currentName = line.drop(2) + } else { + currentContent.appendln(line) + } + } + + saveCurrent() + return sections + } + } +} + +fun List
.render(): String = buildString { + for (section in this@render) { + append(SECTION_INDICATOR).appendln(section.name) + appendln(section.content).appendln() + } +}.trim() + +fun List
.replacingSection(name: String, newContent: String): List
{ + val result = mutableListOf
() + var found = false + + for (section in this) { + result += if (section.name == name) { + found = true + Section(name, newContent) + } else { + section + } + } + + assert(found) { "Section $name not found" } + return result +} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/argumentParsing/errorFlag.txt b/plugins/kapt3/kapt3-cli/testData/argumentParsing/errorFlag.txt new file mode 100644 index 00000000000..79ae510ae30 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/argumentParsing/errorFlag.txt @@ -0,0 +1,5 @@ +# before +-Kapt-verbose=blah + +# after +ERROR: Invalid option format, should be -Kapt-verbose=true/false \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/argumentParsing/errorKeyValue.txt b/plugins/kapt3/kapt3-cli/testData/argumentParsing/errorKeyValue.txt new file mode 100644 index 00000000000..149e2be1b26 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/argumentParsing/errorKeyValue.txt @@ -0,0 +1,7 @@ +# before +-Kapt-option=a:b + +# after +-P +plugin:org.jetbrains.kotlin.kapt3:aptMode=compile +-Kapt-option=a:b \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/argumentParsing/errorValue.txt b/plugins/kapt3/kapt3-cli/testData/argumentParsing/errorValue.txt new file mode 100644 index 00000000000..af4a3ea9fd8 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/argumentParsing/errorValue.txt @@ -0,0 +1,9 @@ +# before +-Kapt-sources +blah + +# after +-P +plugin:org.jetbrains.kotlin.kapt3:aptMode=compile +-Kapt-sources +blah \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/argumentParsing/kotlincHelp.txt b/plugins/kapt3/kapt3-cli/testData/argumentParsing/kotlincHelp.txt new file mode 100644 index 00000000000..1c9e31717ac --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/argumentParsing/kotlincHelp.txt @@ -0,0 +1,7 @@ +# before +-help-kotlinc + +# after +-P +plugin:org.jetbrains.kotlin.kapt3:aptMode=compile +-help-kotlinc \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/argumentParsing/simple.txt b/plugins/kapt3/kapt3-cli/testData/argumentParsing/simple.txt new file mode 100644 index 00000000000..2c2bbeec8fd --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/argumentParsing/simple.txt @@ -0,0 +1,42 @@ +# before +-Kapt-sources=output/sources +-Kapt-classes=output/classes +-Kapt-stubs=output/stubs +-Kapt-classpath=out/production/apt +-Kapt-processors=test.Foo +-Kapt-option:foo=true +-Kapt-option:bar=abc +-Kapt-javac-option:-Xmaxerrs=500 +-Kapt-verbose=true +-Kapt-use-light-analysis=false +-Kapt-correct-error-types=true +-Kapt-map-diagnostic-locations=false +-Kapt-mode=apt + +# after +-P +plugin:org.jetbrains.kotlin.kapt3:sources=output/sources +-P +plugin:org.jetbrains.kotlin.kapt3:classes=output/classes +-P +plugin:org.jetbrains.kotlin.kapt3:stubs=output/stubs +-P +plugin:org.jetbrains.kotlin.kapt3:apclasspath=out/production/apt +-P +plugin:org.jetbrains.kotlin.kapt3:processors=test.Foo +-P +plugin:org.jetbrains.kotlin.kapt3:apOption=foo=true +-P +plugin:org.jetbrains.kotlin.kapt3:apOption=bar=abc +-P +plugin:org.jetbrains.kotlin.kapt3:javacOption=-Xmaxerrs=500 +-P +plugin:org.jetbrains.kotlin.kapt3:verbose=true +-P +plugin:org.jetbrains.kotlin.kapt3:useLightAnalysis=false +-P +plugin:org.jetbrains.kotlin.kapt3:correctErrorTypes=true +-P +plugin:org.jetbrains.kotlin.kapt3:mapDiagnosticLocations=false +-P +plugin:org.jetbrains.kotlin.kapt3:aptMode=apt \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/argfile/apKotlincArgs.txt b/plugins/kapt3/kapt3-cli/testData/integration/argfile/apKotlincArgs.txt new file mode 100644 index 00000000000..0587b56b206 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/argfile/apKotlincArgs.txt @@ -0,0 +1,3 @@ +-cp %KOTLIN_STDLIB% +-d output/ap +ap/Processor.kt \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/argfile/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/argfile/build.txt new file mode 100644 index 00000000000..8b118334e29 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/argfile/build.txt @@ -0,0 +1,30 @@ +# copy +../simple/ap +ap + +# copy +../simple/Test.kt +Test.kt + +# mkdir +output/ap +output/stubs +output/classes +output/javaClasses +output/sources + +# kotlinc +@apKotlincArgs.txt + +# kapt +@kaptArgs.txt + +# javac +@javacArgs.txt + +# java +-cp output/classes:output/javaClasses:output/ap:%KOTLIN_STDLIB% +test.TestKt + +# after +Generated class: generated.Test \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/argfile/javacArgs.txt b/plugins/kapt3/kapt3-cli/testData/integration/argfile/javacArgs.txt new file mode 100644 index 00000000000..626b0cbaccf --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/argfile/javacArgs.txt @@ -0,0 +1,6 @@ +-cp output/ap +-d output/javaClasses +-proc:none +output/sources/generated/Function.java +output/sources/generated/Property.java +output/sources/generated/Test.java \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/argfile/kaptArgs.txt b/plugins/kapt3/kapt3-cli/testData/integration/argfile/kaptArgs.txt new file mode 100644 index 00000000000..b391192ee61 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/argfile/kaptArgs.txt @@ -0,0 +1,8 @@ +-Kapt-stubs=output/stubs +-Kapt-classes=output/classes +-Kapt-sources=output/sources +-Kapt-classpath=output/ap +-Kapt-processors=apt.SampleApt +-d output/classes +-cp output/ap:%KOTLIN_STDLIB% +Test.kt \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOff/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOff/build.txt new file mode 100644 index 00000000000..1e013b88208 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOff/build.txt @@ -0,0 +1,50 @@ +# copy +../correctErrorTypesOn/ap +ap + +# copy +../correctErrorTypesOn/Test.kt +Test.kt + +# mkdir +output/ap +output/stubs +output/classes +output/javaClasses +output/sources + +# kotlinc +-cp %KOTLIN_STDLIB% +-d output/ap +ap/Processor.kt + +# kapt +-Kapt-stubs=output/stubs +-Kapt-classes=output/classes +-Kapt-sources=output/sources +-Kapt-classpath=output/ap +-Kapt-processors=apt.SampleApt +-d output/classes +-cp output/ap:%KOTLIN_STDLIB% +Test.kt + +# javac +-cp output/ap +-d output/javaClasses +-proc:none +output/sources/generated/Property.java + +# java +-cp output/classes:output/javaClasses:output/ap:%KOTLIN_STDLIB% +test.Test + +# after +Return code: 1 + +error: error: NonExistentClass type occurred +Test.kt:4:8: error: unresolved reference: generated +import generated.Property + ^ +Test.kt:8:28: error: unresolved reference: Property + lateinit var property: Property + ^ \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/Test.kt b/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/Test.kt new file mode 100644 index 00000000000..0dca3a7104c --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/Test.kt @@ -0,0 +1,14 @@ +package test + +import apt.Anno +import generated.Property + +object Test { + @field:Anno + lateinit var property: Property + + @JvmStatic + fun main(args: Array) { + print(javaClass.getDeclaredField("property").type.toGenericString()) + } +} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/ap/Processor.kt b/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/ap/Processor.kt new file mode 100644 index 00000000000..720015f97d6 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/ap/Processor.kt @@ -0,0 +1,31 @@ +package apt + +import javax.annotation.processing.* +import javax.lang.model.SourceVersion +import javax.lang.model.element.* +import javax.lang.model.type.DeclaredType +import javax.tools.Diagnostic.Kind.* + +annotation class Anno + +class SampleApt : AbstractProcessor() { + override fun process(annotations: Set, roundEnv: RoundEnvironment): Boolean { + for (element in roundEnv.getElementsAnnotatedWith(Anno::class.java).filterIsInstance()) { + val type = element.asType() as? DeclaredType ?: continue + if (type.toString() == "error.NonExistentClass") { + processingEnv.messager.printMessage(ERROR, "NonExistentClass type occurred") + } + + val generatedSimpleName = element.simpleName.toString().capitalize() + processingEnv.filer.createSourceFile("generated.$generatedSimpleName").openWriter().use { + it.write("package generated;\npublic class $generatedSimpleName {}") + } + } + + return true + } + + override fun getSupportedOptions() = emptySet() + override fun getSupportedSourceVersion() = SourceVersion.RELEASE_8 + override fun getSupportedAnnotationTypes() = setOf("apt.Anno") +} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/build.txt new file mode 100644 index 00000000000..5cc53e3e9d1 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/correctErrorTypesOn/build.txt @@ -0,0 +1,35 @@ +# mkdir +output/ap +output/stubs +output/classes +output/javaClasses +output/sources + +# kotlinc +-cp %KOTLIN_STDLIB% +-d output/ap +ap/Processor.kt + +# kapt +-Kapt-stubs=output/stubs +-Kapt-classes=output/classes +-Kapt-sources=output/sources +-Kapt-classpath=output/ap +-Kapt-processors=apt.SampleApt +-Kapt-correct-error-types=true +-d output/classes +-cp output/ap:%KOTLIN_STDLIB% +Test.kt + +# javac +-cp output/ap +-d output/javaClasses +-proc:none +output/sources/generated/Property.java + +# java +-cp output/classes:output/javaClasses:output/ap:%KOTLIN_STDLIB% +test.Test + +# after +public class generated.Property \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/separateStubAptCompilation/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/separateStubAptCompilation/build.txt new file mode 100644 index 00000000000..6abb00d3b8d --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/separateStubAptCompilation/build.txt @@ -0,0 +1,61 @@ +# copy +../simple/ap +ap + +# copy +../simple/Test.kt +Test.kt + +# mkdir +output/ap +output/stubs +output/classes +output/javaClasses +output/sources + +# kotlinc +-cp %KOTLIN_STDLIB% +-d output/ap +ap/Processor.kt + +# kapt +-Kapt-stubs=output/stubs +-Kapt-classes=output/classes +-Kapt-sources=output/sources +-Kapt-classpath=output/ap +-Kapt-mode=stubs +-d output/classes +-cp output/ap:%KOTLIN_STDLIB% +Test.kt + +# kapt +-Kapt-stubs=output/stubs +-Kapt-classes=output/classes +-Kapt-sources=output/sources +-Kapt-classpath=output/ap +-Kapt-mode=apt +-Kapt-processors=apt.SampleApt +-d output/classes +-cp output/ap:%KOTLIN_STDLIB% +Test.kt + +# kotlinc +-d output/classes +-cp output/ap:%KOTLIN_STDLIB% +output/sources +Test.kt + +# javac +-cp output/ap +-d output/javaClasses +-proc:none +output/sources/generated/Function.java +output/sources/generated/Property.java +output/sources/generated/Test.java + +# java +-cp output/classes:output/javaClasses:output/ap:%KOTLIN_STDLIB% +test.TestKt + +# after +Generated class: generated.Test \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/simple/Test.kt b/plugins/kapt3/kapt3-cli/testData/integration/simple/Test.kt new file mode 100644 index 00000000000..a23c6701f3b --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/simple/Test.kt @@ -0,0 +1,19 @@ +package test + +import apt.Anno +import generated.Test as TestGenerated + +@Anno +class Test { + @field:Anno + val property: String = "" + + @Anno + fun function() { + + } +} + +fun main() { + println("Generated class: " + TestGenerated::class.java.name) +} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/simple/ap/META-INF/services/javax.annotation.processing.Processor b/plugins/kapt3/kapt3-cli/testData/integration/simple/ap/META-INF/services/javax.annotation.processing.Processor new file mode 100644 index 00000000000..078558ee7db --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/simple/ap/META-INF/services/javax.annotation.processing.Processor @@ -0,0 +1 @@ +apt.SampleApt \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/simple/ap/Processor.kt b/plugins/kapt3/kapt3-cli/testData/integration/simple/ap/Processor.kt new file mode 100644 index 00000000000..8734674d9c7 --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/simple/ap/Processor.kt @@ -0,0 +1,25 @@ +package apt + +import javax.annotation.processing.* +import javax.lang.model.SourceVersion +import javax.lang.model.element.TypeElement +import javax.tools.Diagnostic.Kind.* + +annotation class Anno + +class SampleApt : AbstractProcessor() { + override fun process(annotations: Set, roundEnv: RoundEnvironment): Boolean { + for (element in roundEnv.getElementsAnnotatedWith(Anno::class.java)) { + val generatedSimpleName = element.simpleName.toString().capitalize() + processingEnv.filer.createSourceFile("generated.$generatedSimpleName").openWriter().use { + it.write("package generated;\npublic class $generatedSimpleName {}") + } + } + + return true + } + + override fun getSupportedOptions() = emptySet() + override fun getSupportedSourceVersion() = SourceVersion.RELEASE_8 + override fun getSupportedAnnotationTypes() = setOf("apt.Anno") +} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/simple/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/simple/build.txt new file mode 100644 index 00000000000..6ec1cd7527b --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/simple/build.txt @@ -0,0 +1,39 @@ +# mkdir +output/ap +output/stubs +output/classes +output/javaClasses +output/sources + +# kotlinc +-cp %KOTLIN_STDLIB% +-d output/ap +ap/Processor.kt + +# copy +ap/META-INF/services/javax.annotation.processing.Processor +output/ap/META-INF/services/javax.annotation.processing.Processor + +# kapt +-Kapt-stubs=output/stubs +-Kapt-classes=output/classes +-Kapt-sources=output/sources +-Kapt-classpath=output/ap +-d output/classes +-cp output/ap:%KOTLIN_STDLIB% +Test.kt + +# javac +-cp output/ap +-d output/javaClasses +-proc:none +output/sources/generated/Function.java +output/sources/generated/Property.java +output/sources/generated/Test.java + +# java +-cp output/classes:output/javaClasses:output/ap:%KOTLIN_STDLIB% +test.TestKt + +# after +Generated class: generated.Test \ No newline at end of file diff --git a/plugins/kapt3/kapt3-cli/testData/integration/withoutService/build.txt b/plugins/kapt3/kapt3-cli/testData/integration/withoutService/build.txt new file mode 100644 index 00000000000..741b60e3d9c --- /dev/null +++ b/plugins/kapt3/kapt3-cli/testData/integration/withoutService/build.txt @@ -0,0 +1,44 @@ +# copy +../simple/ap +ap + +# copy +../simple/Test.kt +Test.kt + +# mkdir +output/ap +output/stubs +output/classes +output/javaClasses +output/sources + +# kotlinc +-cp %KOTLIN_STDLIB% +-d output/ap +ap/Processor.kt + +# kapt +-Kapt-stubs=output/stubs +-Kapt-classes=output/classes +-Kapt-sources=output/sources +-Kapt-classpath=output/ap +-Kapt-processors=apt.SampleApt +-d output/classes +-cp output/ap:%KOTLIN_STDLIB% +Test.kt + +# javac +-cp output/ap +-d output/javaClasses +-proc:none +output/sources/generated/Function.java +output/sources/generated/Property.java +output/sources/generated/Test.java + +# java +-cp output/classes:output/javaClasses:output/ap:%KOTLIN_STDLIB% +test.TestKt + +# after +Generated class: generated.Test \ No newline at end of file