Skip to content

Commit c40532e

Browse files
Report KSP logs in compilations (#95)
* Report KSP logs in compilations Resolves #69. This is based on an implementation I've been using in my projects, and also works around internal access across modules via lesser-known suppression mechanism until kotlin finally finishes implementing friend-paths support in their gradle/IDE tooling. * Add tests * Remove unnecessary copy of MessageCollectorBasedKSPLogger Co-authored-by: Thilo Schuchort <[email protected]>
1 parent fe87dec commit c40532e

File tree

4 files changed

+49
-4
lines changed

4 files changed

+49
-4
lines changed

core/src/main/kotlin/com/tschuchort/compiletesting/AbstractKotlinCompilation.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,8 @@ abstract class AbstractKotlinCompilation<A : CommonCompilerArguments> internal c
262262

263263
protected fun warn(s: String) = internalMessageStream.println("warning: $s")
264264
protected fun error(s: String) = internalMessageStream.println("error: $s")
265+
266+
internal val internalMessageStreamAccess: PrintStream get() = internalMessageStream
265267
}
266268

267269
internal fun kotlinDependencyRegex(prefix:String): Regex {

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,17 @@ private class KspCompileTestingComponentRegistrar(
160160
it.mkdirs()
161161
}
162162
}.build()
163-
// TODO: replace with KotlinCompilation.internalMessageStream
164-
val registrar = KspTestExtension(
165-
options, processors, MessageCollectorBasedKSPLogger(
166-
PrintingMessageCollector(System.err, MessageRenderer.GRADLE_STYLE, compilation.verbose)
163+
164+
// Temporary until friend-paths is fully supported https://youtrack.jetbrains.com/issue/KT-34102
165+
@Suppress("invisible_member")
166+
val messageCollectorBasedKSPLogger = MessageCollectorBasedKSPLogger(
167+
PrintingMessageCollector(
168+
compilation.internalMessageStreamAccess,
169+
MessageRenderer.GRADLE_STYLE,
170+
compilation.verbose
167171
)
168172
)
173+
val registrar = KspTestExtension(options, processors, messageCollectorBasedKSPLogger)
169174
AnalysisHandlerExtension.registerExtension(project, registrar)
170175
}
171176
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ import com.google.devtools.ksp.processing.SymbolProcessor
1010
*/
1111
internal open class AbstractTestSymbolProcessor : SymbolProcessor {
1212
protected lateinit var codeGenerator: CodeGenerator
13+
protected lateinit var logger: KSPLogger
1314
override fun finish() {
1415
}
1516

1617
override fun init(options: Map<String, String>, kotlinVersion: KotlinVersion, codeGenerator: CodeGenerator, logger: KSPLogger) {
1718
this.codeGenerator = codeGenerator
19+
this.logger = logger
1820
}
1921

2022
override fun process(resolver: Resolver) {

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,42 @@ class KspTest {
178178
}
179179
}
180180

181+
@Test
182+
fun messagesAreReadable() {
183+
val annotation = SourceFile.kotlin(
184+
"TestAnnotation.kt", """
185+
package foo.bar
186+
annotation class TestAnnotation
187+
""".trimIndent()
188+
)
189+
val targetClass = SourceFile.kotlin(
190+
"AppCode.kt", """
191+
package foo.bar
192+
@TestAnnotation
193+
class AppCode
194+
""".trimIndent()
195+
)
196+
val processor = object : AbstractTestSymbolProcessor() {
197+
override fun process(resolver: Resolver) {
198+
logger.logging("This is a log message")
199+
logger.info("This is an info message")
200+
logger.warn("This is an warn message")
201+
logger.error("This is an error message")
202+
logger.exception(Throwable("This is a failure"))
203+
}
204+
}
205+
val result = KotlinCompilation().apply {
206+
sources = listOf(annotation, targetClass)
207+
symbolProcessors = listOf(processor)
208+
}.compile()
209+
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
210+
assertThat(result.messages).contains("This is a log message")
211+
assertThat(result.messages).contains("This is an info message")
212+
assertThat(result.messages).contains("This is an warn message")
213+
assertThat(result.messages).contains("This is an error message")
214+
assertThat(result.messages).contains("This is a failure")
215+
}
216+
181217
companion object {
182218
private val DUMMY_KOTLIN_SRC = SourceFile.kotlin(
183219
"foo.bar.Dummy.kt", """

0 commit comments

Comments
 (0)