Skip to content

Commit de39e5f

Browse files
yigittschuchortdev
authored andcommitted
add test for multiple processors at once
1 parent d8f685b commit de39e5f

File tree

3 files changed

+50
-4
lines changed

3 files changed

+50
-4
lines changed

ksp/src/main/kotlin/com/tschuchort/compiletesting/Ksp.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff 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?
1313
fun 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
}

ksp/src/test/kotlin/com/tschuchort/compiletesting/DelegatingSymbolProcessorRule.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import org.jetbrains.kotlin.ksp.processing.SymbolProcessor
66
import org.junit.rules.TestWatcher
77
import 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+
*/
913
internal 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+
*/
3643
class DelegatingSymbolProcessorRule : TestWatcher() {
3744
fun delegateTo(processor: SymbolProcessor): Class<out SymbolProcessor> {
3845
check(DelegateProcessor.delegate == null) {

ksp/src/test/kotlin/com/tschuchort/compiletesting/KspTest.kt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff 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", """

0 commit comments

Comments
 (0)