Skip to content

Commit e6ba003

Browse files
committed
work around to make ksp fail execution on error or exception log event
1 parent 657931a commit e6ba003

File tree

4 files changed

+29
-1
lines changed

4 files changed

+29
-1
lines changed

api/src/main/kotlin/com/google/devtools/ksp/processing/KSPLogger.kt

+6
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ import com.google.devtools.ksp.symbol.KSNode
2222

2323
interface KSPLogger {
2424

25+
var errorCount: Int
26+
var warningCount: Int
27+
var infoCount: Int
28+
var loggingCount: Int
29+
var exceptionCount: Int
30+
2531
fun logging(message: String, symbol: KSNode? = null)
2632
fun info(message: String, symbol: KSNode? = null)
2733
fun warn(message: String, symbol: KSNode? = null)

compiler-plugin/src/main/kotlin/com/google/devtools/ksp/KotlinSymbolProcessingExtension.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,11 @@ abstract class AbstractKotlinSymbolProcessingExtension(val options: KspOptions,
107107
bindingTrace: BindingTrace,
108108
files: Collection<KtFile>
109109
): AnalysisResult? {
110-
return AnalysisResult.success(BindingContext.EMPTY, module, shouldGenerateCode = false)
110+
return if (logger.errorCount > 0 || logger.exceptionCount > 0) {
111+
AnalysisResult.success(bindingTrace.bindingContext, module, shouldGenerateCode = false)
112+
} else {
113+
AnalysisResult.success(BindingContext.EMPTY, module, shouldGenerateCode = false)
114+
}
111115
}
112116

113117
private var annotationProcessingComplete = false

compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processing/impl/MessageCollectorBasedKSPLogger.kt

+11
Original file line numberDiff line numberDiff line change
@@ -33,29 +33,40 @@ class MessageCollectorBasedKSPLogger(private val messageCollector: MessageCollec
3333
const val PREFIX = "[ksp] "
3434
}
3535

36+
override var errorCount = 0
37+
override var warningCount = 0
38+
override var infoCount = 0
39+
override var loggingCount = 0
40+
override var exceptionCount = 0
41+
3642
private fun convertMessage(message: String, symbol: KSNode?): String =
3743
when (val location = symbol?.location) {
3844
is FileLocation -> "$PREFIX${location.filePath}:${location.lineNumber}: $message"
3945
is NonExistLocation, null -> "$PREFIX$message"
4046
}
4147

4248
override fun logging(message: String, symbol: KSNode?) {
49+
loggingCount++
4350
messageCollector.report(CompilerMessageSeverity.LOGGING, convertMessage(message, symbol))
4451
}
4552

4653
override fun info(message: String, symbol: KSNode?) {
54+
infoCount++
4755
messageCollector.report(CompilerMessageSeverity.INFO, convertMessage(message, symbol))
4856
}
4957

5058
override fun warn(message: String, symbol: KSNode?) {
59+
warningCount++
5160
messageCollector.report(CompilerMessageSeverity.WARNING, convertMessage(message, symbol))
5261
}
5362

5463
override fun error(message: String, symbol: KSNode?) {
64+
errorCount++
5565
messageCollector.report(CompilerMessageSeverity.ERROR, convertMessage(message, symbol))
5666
}
5767

5868
override fun exception(e: Throwable) {
69+
exceptionCount++
5970
val writer = StringWriter()
6071
e.printStackTrace(PrintWriter(writer))
6172
messageCollector.report(CompilerMessageSeverity.EXCEPTION, writer.toString())

compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processor/ErrorTypeProcessor.kt

+7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
package com.google.devtools.ksp.processor
2020

2121
import com.google.devtools.ksp.getClassDeclarationByName
22+
import com.google.devtools.ksp.processing.CodeGenerator
23+
import com.google.devtools.ksp.processing.KSPLogger
2224
import com.google.devtools.ksp.processing.Resolver
2325
import com.google.devtools.ksp.processing.impl.ResolverImpl
2426
import com.google.devtools.ksp.symbol.KSPropertyDeclaration
@@ -31,7 +33,12 @@ class ErrorTypeProcessor : AbstractTestProcessor() {
3133
return result
3234
}
3335

36+
override fun init(options: Map<String, String>, kotlinVersion: KotlinVersion, codeGenerator: CodeGenerator, logger: KSPLogger) {
37+
logger.error("Test Error")
38+
}
39+
3440
override fun process(resolver: Resolver) {
41+
3542
val classC = resolver.getClassDeclarationByName(resolver.getKSNameFromString("C"))!!
3643
val errorAtTop = classC.declarations.single { it.simpleName.asString() == "errorAtTop" } as KSPropertyDeclaration
3744
val errorInComponent = classC.declarations.single { it.simpleName.asString() == "errorInComponent" } as KSPropertyDeclaration

0 commit comments

Comments
 (0)