File tree Expand file tree Collapse file tree 3 files changed +50
-4
lines changed
main/kotlin/com/tschuchort/compiletesting
test/kotlin/com/tschuchort/compiletesting Expand file tree Collapse file tree 3 files changed +50
-4
lines changed Original file line number Diff line number Diff line change @@ -11,7 +11,7 @@ private const val KSP_PLUGIN_ID = "org.jetbrains.kotlin.ksp"
1111
1212// TODO can we add support for instances?
1313fun KotlinCompilation.symbolProcessor (
14- vararg processors : Class <out SymbolProcessor >
14+ vararg processors : Class <out SymbolProcessor >
1515) {
1616 check(processors.isNotEmpty()) {
1717 " Must provide at least 1 symbol processor"
@@ -42,8 +42,8 @@ fun KotlinCompilation.symbolProcessor(
4242 PluginOption (KSP_PLUGIN_ID , " classes" , classesFolder.path),
4343 PluginOption (KSP_PLUGIN_ID , " sources" , sourceFolder.path)
4444 )
45- compilerPlugins + = KotlinSymbolProcessingComponentRegistrar ()
46- commandLineProcessors + = listOf (KotlinSymbolProcessingCommandLineProcessor ())
47- pluginOptions + = kspOptions
45+ compilerPlugins = compilerPlugins + KotlinSymbolProcessingComponentRegistrar ()
46+ commandLineProcessors = commandLineProcessors + listOf (KotlinSymbolProcessingCommandLineProcessor ())
47+ pluginOptions = pluginOptions + kspOptions
4848 this .kaptSourceDir
4949}
Original file line number Diff line number Diff line change @@ -6,6 +6,10 @@ import org.jetbrains.kotlin.ksp.processing.SymbolProcessor
66import org.junit.rules.TestWatcher
77import org.junit.runner.Description
88
9+ /* *
10+ * A processor implementation that delegates to an instance given in test.
11+ * Must be used via [DelegatingSymbolProcessorRule] until we move this support into internals.
12+ */
913internal class DelegateProcessor : SymbolProcessor {
1014 private val delegate
1115 get() = checkNotNull(Companion .delegate) {
@@ -33,6 +37,9 @@ internal class DelegateProcessor : SymbolProcessor {
3337 }
3438}
3539
40+ /* *
41+ * JUnit test rule that can trigger a single KSP processor
42+ */
3643class DelegatingSymbolProcessorRule : TestWatcher () {
3744 fun delegateTo (processor : SymbolProcessor ): Class <out SymbolProcessor > {
3845 check(DelegateProcessor .delegate == null ) {
Original file line number Diff line number Diff line change @@ -97,6 +97,45 @@ class KspTest {
9797 assertThat(result.exitCode).isEqualTo(ExitCode .OK )
9898 }
9999
100+ @Test
101+ fun multipleProcessors () {
102+ // access generated code by multiple processors
103+ val source = SourceFile .kotlin(
104+ " foo.bar.Dummy.kt" , """
105+ package foo.bar
106+ import generated.A
107+ import generated.B
108+ class Dummy(val a:A, val b:B)
109+ """ .trimIndent()
110+ )
111+ val result = KotlinCompilation ().apply {
112+ sources = listOf (source)
113+ symbolProcessor(Write_foo_bar_A ::class .java, Write_foo_bar_B ::class .java)
114+ }.compile()
115+ assertThat(result.exitCode).isEqualTo(ExitCode .OK )
116+ }
117+
118+ @Suppress(" ClassName" )
119+ internal class Write_foo_bar_A () : ClassGeneratingProcessor(" generated" , " A" )
120+
121+ @Suppress(" ClassName" )
122+ internal class Write_foo_bar_B () : ClassGeneratingProcessor(" generated" , " B" )
123+
124+ internal open class ClassGeneratingProcessor (
125+ private val packageName : String ,
126+ private val className : String
127+ ) : AbstractSymbolProcessor() {
128+ override fun process (resolver : Resolver ) {
129+ super .process(resolver)
130+ codeGenerator.createNewFile(packageName, className).writeText(
131+ """
132+ package $packageName
133+ class $className () {}
134+ """ .trimIndent()
135+ )
136+ }
137+ }
138+
100139 companion object {
101140 private val DUMMY_KOTLIN_SRC = SourceFile .kotlin(
102141 " foo.bar.Dummy.kt" , """
You can’t perform that action at this time.
0 commit comments