mirror of
https://github.com/fankes/moshi.git
synced 2025-10-20 16:39:22 +08:00
Add apoptions support in KotlinCompilerCall (#499)
* Add apoptions support to KotlinCompilerCall * Add bad annotated annotation test
This commit is contained in:
@@ -188,4 +188,22 @@ class CompilerTest {
|
|||||||
assertThat(result.systemErr).contains(
|
assertThat(result.systemErr).contains(
|
||||||
"error: No property for required constructor parameter a")
|
"error: No property for required constructor parameter a")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test fun badGeneratedAnnotation() {
|
||||||
|
val call = KotlinCompilerCall(temporaryFolder.root)
|
||||||
|
call.inheritClasspath = true
|
||||||
|
call.addService(Processor::class, JsonClassCodeGenProcessor::class)
|
||||||
|
call.kaptArgs[JsonClassCodeGenProcessor.OPTION_GENERATED] = "javax.annotation.GeneratedBlerg"
|
||||||
|
call.addKt("source.kt", """
|
||||||
|
|import com.squareup.moshi.JsonClass
|
||||||
|
|
|
||||||
|
|@JsonClass(generateAdapter = true)
|
||||||
|
|data class Foo(val a: Int)
|
||||||
|
|""".trimMargin())
|
||||||
|
|
||||||
|
val result = call.execute()
|
||||||
|
assertThat(result.exitCode).isEqualTo(ExitCode.COMPILATION_ERROR)
|
||||||
|
assertThat(result.systemErr).contains(
|
||||||
|
"Invalid option value for ${JsonClassCodeGenProcessor.OPTION_GENERATED}")
|
||||||
|
}
|
||||||
}
|
}
|
@@ -20,11 +20,14 @@ import okio.Buffer
|
|||||||
import okio.Okio
|
import okio.Okio
|
||||||
import org.jetbrains.kotlin.cli.common.CLITool
|
import org.jetbrains.kotlin.cli.common.CLITool
|
||||||
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
|
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
|
||||||
|
import java.io.ByteArrayOutputStream
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
|
import java.io.ObjectOutputStream
|
||||||
import java.io.PrintStream
|
import java.io.PrintStream
|
||||||
import java.net.URLClassLoader
|
import java.net.URLClassLoader
|
||||||
import java.net.URLDecoder
|
import java.net.URLDecoder
|
||||||
|
import java.util.Base64
|
||||||
import java.util.zip.ZipEntry
|
import java.util.zip.ZipEntry
|
||||||
import java.util.zip.ZipOutputStream
|
import java.util.zip.ZipOutputStream
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
@@ -38,6 +41,7 @@ class KotlinCompilerCall(var scratchDir: File) {
|
|||||||
var inheritClasspath = false
|
var inheritClasspath = false
|
||||||
|
|
||||||
val args = mutableListOf<String>()
|
val args = mutableListOf<String>()
|
||||||
|
val kaptArgs = mutableMapOf<String, String>()
|
||||||
val classpath = mutableListOf<String>()
|
val classpath = mutableListOf<String>()
|
||||||
val services = LinkedHashMultimap.create<KClass<*>, KClass<*>>()
|
val services = LinkedHashMultimap.create<KClass<*>, KClass<*>>()
|
||||||
|
|
||||||
@@ -73,6 +77,12 @@ class KotlinCompilerCall(var scratchDir: File) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fullArgs.addAll(annotationProcessorArgs())
|
fullArgs.addAll(annotationProcessorArgs())
|
||||||
|
if (kaptArgs.isNotEmpty()) {
|
||||||
|
fullArgs.apply {
|
||||||
|
add("-P")
|
||||||
|
add("plugin:org.jetbrains.kotlin.kapt3:apoptions=${encodeOptions(kaptArgs)}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val systemErrBuffer = Buffer()
|
val systemErrBuffer = Buffer()
|
||||||
val oldSystemErr = System.err
|
val oldSystemErr = System.err
|
||||||
@@ -166,4 +176,20 @@ class KotlinCompilerCall(var scratchDir: File) {
|
|||||||
throw IllegalStateException("no kotlin-annotation-processing-embeddable jar on classpath:\n " +
|
throw IllegalStateException("no kotlin-annotation-processing-embeddable jar on classpath:\n " +
|
||||||
"${classpathFiles().joinToString(separator = "\n ")}}")
|
"${classpathFiles().joinToString(separator = "\n ")}}")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64 encodes a mapping of annotation processor args for kapt, borrowed from
|
||||||
|
* https://kotlinlang.org/docs/reference/kapt.html#apjavac-options-encoding
|
||||||
|
*/
|
||||||
|
private fun encodeOptions(options: Map<String, String>): String {
|
||||||
|
val os = ByteArrayOutputStream()
|
||||||
|
ObjectOutputStream(os).use { oos ->
|
||||||
|
oos.writeInt(options.size)
|
||||||
|
for ((key, value) in options.entries) {
|
||||||
|
oos.writeUTF(key)
|
||||||
|
oos.writeUTF(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Base64.getEncoder().encodeToString(os.toByteArray())
|
||||||
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user