diff options
author | Ting-Yuan Huang <laszio@google.com> | 2021-10-14 23:19:35 -0700 |
---|---|---|
committer | laszio <ting-yuan@users.noreply.github.com> | 2021-10-15 14:11:32 -0700 |
commit | 4f829364524aadf68c174a2b5ff97fad5df6259d (patch) | |
tree | 8d348ee23b5b12e58faeef0dea3deb65fa0f1273 | |
parent | c7dc3d1949c8a3c4f4bcb6081299e1d4e566afed (diff) | |
download | ksp-4f829364524aadf68c174a2b5ff97fad5df6259d.tar.gz |
New ksp option: allWarningsAsErrors
7 files changed, 40 insertions, 6 deletions
diff --git a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/KotlinSymbolProcessingPlugin.kt b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/KotlinSymbolProcessingPlugin.kt index 08753c05..8c035786 100644 --- a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/KotlinSymbolProcessingPlugin.kt +++ b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/KotlinSymbolProcessingPlugin.kt @@ -71,6 +71,7 @@ class KotlinSymbolProcessingCommandLineProcessor : CommandLineProcessor { KspCliOption.KNOWN_REMOVED_OPTION -> knownRemoved.addAll(value.split(File.pathSeparator).map { File(it) }) KspCliOption.INCREMENTAL_OPTION -> incremental = value.toBoolean() KspCliOption.INCREMENTAL_LOG_OPTION -> incrementalLog = value.toBoolean() + KspCliOption.ALL_WARNINGS_AS_ERRORS_OPTION -> allWarningsAsErrors = value.toBoolean() KspCliOption.CHANGED_CLASSES_OPTION -> changedClasses.addAll(value.split(':')) } } @@ -88,7 +89,7 @@ class KotlinSymbolProcessingComponentRegistrar : ComponentRegistrar { }?.build() ?: return val messageCollector = configuration.get(CLIConfigurationKeys.ORIGINAL_MESSAGE_COLLECTOR_KEY) ?: throw IllegalStateException("message collector not found!") - val logger = MessageCollectorBasedKSPLogger(messageCollector) + val logger = MessageCollectorBasedKSPLogger(messageCollector, options.allWarningsAsErrors) if (options.processingClasspath.isNotEmpty()) { val kotlinSymbolProcessingHandlerExtension = KotlinSymbolProcessingExtension(options, logger) AnalysisHandlerExtension.registerExtension(project, kotlinSymbolProcessingHandlerExtension) @@ -205,6 +206,14 @@ enum class KspCliOption( false ), + ALL_WARNINGS_AS_ERRORS_OPTION( + "allWarningsAsErrors", + "<allWarningsAsErrors>", + "treat all warnings as errors", + false, + false + ), + CHANGED_CLASSES_OPTION( "changedClasses", "<changedClasses>", @@ -236,6 +245,7 @@ class KspOptions( val kspOutputDir: File, val incremental: Boolean, val incrementalLog: Boolean, + val allWarningsAsErrors: Boolean, val changedClasses: List<String>, ) { class Builder { @@ -260,6 +270,7 @@ class KspOptions( var kspOutputDir: File? = null var incremental: Boolean = false var incrementalLog: Boolean = false + var allWarningsAsErrors: Boolean = false var changedClasses: MutableList<String> = mutableListOf() fun build(): KspOptions { @@ -270,7 +281,8 @@ class KspOptions( kotlinOutputDir!!, resourceOutputDir!!, processingClasspath, processors, processingOptions, - knownModified, knownRemoved, cachesDir!!, kspOutputDir!!, incremental, incrementalLog, changedClasses + knownModified, knownRemoved, cachesDir!!, kspOutputDir!!, incremental, incrementalLog, + allWarningsAsErrors, changedClasses ) } } diff --git a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processing/impl/MessageCollectorBasedKSPLogger.kt b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processing/impl/MessageCollectorBasedKSPLogger.kt index cda47429..779f2b3a 100644 --- a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processing/impl/MessageCollectorBasedKSPLogger.kt +++ b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/processing/impl/MessageCollectorBasedKSPLogger.kt @@ -26,7 +26,10 @@ import org.jetbrains.kotlin.cli.common.messages.MessageCollector import java.io.PrintWriter import java.io.StringWriter -class MessageCollectorBasedKSPLogger(private val messageCollector: MessageCollector) : KSPLogger { +class MessageCollectorBasedKSPLogger( + private val messageCollector: MessageCollector, + private val allWarningsAsErrors: Boolean +) : KSPLogger { companion object { const val PREFIX = "[ksp] " @@ -51,7 +54,8 @@ class MessageCollectorBasedKSPLogger(private val messageCollector: MessageCollec } override fun warn(message: String, symbol: KSNode?) { - recordedEvents.add(Event(CompilerMessageSeverity.WARNING, convertMessage(message, symbol))) + val severity = if (allWarningsAsErrors) CompilerMessageSeverity.ERROR else CompilerMessageSeverity.WARNING + recordedEvents.add(Event(severity, convertMessage(message, symbol))) } override fun error(message: String, symbol: KSNode?) { diff --git a/compiler-plugin/src/test/kotlin/com/google/devtools/ksp/test/AbstractKotlinKSPTest.kt b/compiler-plugin/src/test/kotlin/com/google/devtools/ksp/test/AbstractKotlinKSPTest.kt index c79b1b86..51d28c3e 100644 --- a/compiler-plugin/src/test/kotlin/com/google/devtools/ksp/test/AbstractKotlinKSPTest.kt +++ b/compiler-plugin/src/test/kotlin/com/google/devtools/ksp/test/AbstractKotlinKSPTest.kt @@ -129,7 +129,8 @@ abstract class AbstractKotlinKSPTest : KotlinBaseTest<AbstractKotlinKSPTest.KspT } if (testProcessor != null) { val logger = MessageCollectorBasedKSPLogger( - PrintingMessageCollector(System.err, MessageRenderer.PLAIN_FULL_PATHS, false) + PrintingMessageCollector(System.err, MessageRenderer.PLAIN_FULL_PATHS, false), + false ) val analysisExtension = KotlinSymbolProcessingExtension( diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspExtension.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspExtension.kt index 83ace369..2a82ad9a 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspExtension.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspExtension.kt @@ -37,4 +37,7 @@ open class KspExtension { // Note that it depends on behaviors of other Gradle plugins, that may bring surprises and can be hard to debug. // Use your discretion. open var allowSourcesFromOtherPlugins: Boolean = false + + // Treat all warning as errors. + open var allWarningsAsErrors: Boolean = false } diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt index b89545a9..76743a52 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt @@ -110,6 +110,7 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool classpath: Configuration, sourceSetName: String, isIncremental: Boolean, + allWarningsAsErrors: Boolean, ): List<SubpluginOption> { val options = mutableListOf<SubpluginOption>() options += SubpluginOption("classOutputDir", getKspClassOutputDir(project, sourceSetName).path) @@ -124,6 +125,7 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool project.findProperty("ksp.incremental.log")?.toString() ?: "false" ) options += SubpluginOption("projectBaseDir", project.project.projectDir.canonicalPath) + options += SubpluginOption("allWarningsAsErrors", allWarningsAsErrors.toString()) options += FilesSubpluginOption("apclasspath", classpath.toList()) kspExtension.apOptions.forEach { @@ -211,7 +213,8 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool kspExtension, processorClasspath, sourceSetName, - isIncremental + isIncremental, + kspExtension.allWarningsAsErrors ) } ) diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PlaygroundIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PlaygroundIT.kt index 42c68de6..2e746a21 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PlaygroundIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PlaygroundIT.kt @@ -89,6 +89,16 @@ class PlaygroundIT { } } + @Test + fun testAllWarningsAsErrors() { + File(project.root, "workload/build.gradle.kts") + .appendText("\nksp {\n allWarningsAsErrors = true\n}\n") + val gradleRunner = GradleRunner.create().withProjectDir(project.root) + gradleRunner.withArguments("build").buildAndFail().let { result -> + Assert.assertTrue(result.output.contains("This is a harmless warning.")) + } + } + // Compiler's test infra report this kind of error before KSP, so it is not testable there. @Test fun testNoFunctionName() { diff --git a/integration-tests/src/test/resources/playground/test-processor/src/main/kotlin/TestProcessor.kt b/integration-tests/src/test/resources/playground/test-processor/src/main/kotlin/TestProcessor.kt index e1c9965f..a1c7fe54 100644 --- a/integration-tests/src/test/resources/playground/test-processor/src/main/kotlin/TestProcessor.kt +++ b/integration-tests/src/test/resources/playground/test-processor/src/main/kotlin/TestProcessor.kt @@ -18,6 +18,7 @@ class TestProcessor : SymbolProcessor { codeGenerator: CodeGenerator, logger: KSPLogger ) { + logger.warn("This is a harmless warning.") this.codeGenerator = codeGenerator file = codeGenerator.createNewFile(Dependencies(false), "", "TestProcessor", "log") emit("TestProcessor: init($options)", "") |