Skip to content

Commit eeb6325

Browse files
committed
Use MapProperty for check names/severity and options
1 parent 205e996 commit eeb6325

File tree

3 files changed

+53
-15
lines changed

3 files changed

+53
-15
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -341,9 +341,9 @@ import net.ltgt.gradle.errorprone.errorprone
341341
| `warn(checkNames...)` | Adds checks with warning severity.
342342
| `error(checkNames...)` | Adds checks with error severity.
343343
| `check(checkName to severity...)` | (Kotlin DSL only) Adds pairs of check name to severity.
344-
| `check(checkName, severity)` | Adds a check with a given severity.
344+
| `check(checkName, severity)` | Adds a check with a given severity. The severity can be passed as a provider for lazy configuration.
345345
| `option(optionName)` | Enables a boolean check option. Equivalent to `option(checkName, true)`.
346-
| `option(optionName, value)` | Adds a check option with a given value. Value can be a boolean or a string.
346+
| `option(optionName, value)` | Adds a check option with a given value. Value can be a boolean or a string, or a provider of string.
347347

348348
A check severity can take values: `DEFAULT`, `OFF`, `WARN`, or `ERROR`.
349349
Note that the `net.ltgt.gradle.errorprone.CheckSeverity` needs to be `import`ed into your build scripts (see examples above).

src/main/kotlin/net/ltgt/gradle/errorprone/ErrorProneOptions.kt

+13-6
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ open class ErrorProneOptions constructor(
2424
@get:Input val ignoreSuppressionAnnotations = objectFactory.property<Boolean>().convention(false)
2525
@get:Input val isCompilingTestOnlyCode = objectFactory.property<Boolean>().convention(false)
2626
@get:Input @get:Optional val excludedPaths = objectFactory.property<String>()
27-
@get:Input var checks: MutableMap<String, CheckSeverity> = linkedMapOf()
28-
@get:Input var checkOptions: MutableMap<String, String> = linkedMapOf()
27+
@get:Input val checks = objectFactory.mapProperty<String, CheckSeverity>().empty()
28+
@get:Input val checkOptions = objectFactory.mapProperty<String, String>().empty()
2929
@get:Input val errorproneArgs = objectFactory.listProperty<String>().empty()
3030
@get:Nested val errorproneArgumentProviders: MutableList<CommandLineArgumentProvider> = arrayListOf()
3131

@@ -38,7 +38,11 @@ open class ErrorProneOptions constructor(
3838
fun check(vararg pairs: Pair<String, CheckSeverity>) = pairs.forEach { (checkName, severity) -> check(checkName, severity) }
3939
fun check(checkName: String, severity: CheckSeverity) {
4040
validateName(checkName)
41-
checks[checkName] = severity
41+
checks.put(checkName, severity)
42+
}
43+
fun check(checkName: String, severity: Provider<CheckSeverity>) {
44+
validateName(checkName)
45+
checks.put(checkName, severity)
4246
}
4347

4448
fun enable(vararg checkNames: String) = set(*checkNames, atSeverity = CheckSeverity.DEFAULT)
@@ -51,7 +55,10 @@ open class ErrorProneOptions constructor(
5155

5256
@JvmOverloads fun option(name: String, value: Boolean = true) = option(name, value.toString())
5357
fun option(name: String, value: String) {
54-
checkOptions[name] = value
58+
checkOptions.put(name, value)
59+
}
60+
fun option(name: String, value: Provider<String>) {
61+
checkOptions.put(name, value)
5562
}
5663

5764
override fun toString(): String {
@@ -66,8 +73,8 @@ open class ErrorProneOptions constructor(
6673
booleanOption("-XepCompilingTestOnlyCode", isCompilingTestOnlyCode),
6774
stringOption("-XepExcludedPaths", excludedPaths)
6875
).filterNotNull() +
69-
checks.asSequence().map { (name, severity) -> validateName(name); "-Xep:$name${severity.asArg}" } +
70-
checkOptions.asSequence().map { (name, value) -> "-XepOpt:$name=$value" } +
76+
checks.getOrElse(emptyMap()).asSequence().map { (name, severity) -> validateName(name); "-Xep:$name${severity.asArg}" } +
77+
checkOptions.getOrElse(emptyMap()).asSequence().map { (name, value) -> "-XepOpt:$name=$value" } +
7178
errorproneArgs.getOrElse(emptyList()) +
7279
errorproneArgumentProviders.asSequence().flatMap { it.asArguments().asSequence() }
7380
).onEach(::validate)

src/test/kotlin/net/ltgt/gradle/errorprone/ErrorProneOptionsTest.kt

+38-7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import com.google.errorprone.ErrorProneOptions.Severity
55
import com.google.errorprone.InvalidCommandLineOptionException
66
import org.gradle.api.InvalidUserDataException
77
import org.gradle.api.model.ObjectFactory
8+
import org.gradle.api.provider.ProviderFactory
9+
import org.gradle.kotlin.dsl.property
810
import org.gradle.process.CommandLineArgumentProvider
911
import org.gradle.testfixtures.ProjectBuilder
1012
import org.junit.Assert.fail
@@ -18,9 +20,13 @@ class ErrorProneOptionsTest {
1820
@JvmField @ClassRule val projectDir = TemporaryFolder()
1921

2022
lateinit var objects: ObjectFactory
23+
lateinit var providers: ProviderFactory
2124

2225
@JvmStatic @BeforeClass fun setup() {
23-
objects = ProjectBuilder.builder().withProjectDir(projectDir.root).build().objects
26+
ProjectBuilder.builder().withProjectDir(projectDir.root).build().let { project ->
27+
objects = project.objects
28+
providers = project.providers
29+
}
2430
}
2531
}
2632

@@ -40,12 +46,12 @@ class ErrorProneOptionsTest {
4046
doTestOptions { error("ArrayEquals") }
4147
doTestOptions { check("ArrayEquals" to CheckSeverity.OFF) }
4248
doTestOptions { check("ArrayEquals", CheckSeverity.WARN) }
43-
doTestOptions { checks["ArrayEquals"] = CheckSeverity.ERROR }
44-
doTestOptions { checks = mutableMapOf("ArrayEquals" to CheckSeverity.DEFAULT) }
49+
doTestOptions { checks.put("ArrayEquals", CheckSeverity.ERROR) }
50+
doTestOptions { checks.set(mutableMapOf("ArrayEquals" to CheckSeverity.DEFAULT)) }
4551
doTestOptions { option("Foo") }
4652
doTestOptions { option("Foo", "Bar") }
47-
doTestOptions { checkOptions["Foo"] = "Bar" }
48-
doTestOptions { checkOptions = mutableMapOf("Foo" to "Bar") }
53+
doTestOptions { checkOptions.put("Foo", "Bar") }
54+
doTestOptions { checkOptions.set(mutableMapOf("Foo" to "Bar")) }
4955

5056
doTestOptions {
5157
disableAllChecks.set(true)
@@ -93,6 +99,31 @@ class ErrorProneOptionsTest {
9399
})
94100
}
95101

102+
@Test
103+
fun `correctly allows lazy configuration`() {
104+
doTestOptions({
105+
check("NullAway", isCompilingTestOnlyCode.map { if (it) CheckSeverity.WARN else CheckSeverity.ERROR })
106+
}, {
107+
error("NullAway")
108+
})
109+
110+
doTestOptions({
111+
check("NullAway", isCompilingTestOnlyCode.map { if (it) CheckSeverity.WARN else CheckSeverity.ERROR })
112+
isCompilingTestOnlyCode.set(providers.provider { true })
113+
}, {
114+
isCompilingTestOnlyCode.set(true)
115+
warn("NullAway")
116+
})
117+
118+
doTestOptions({
119+
val annotatedPackages = objects.property<String>()
120+
option("NullAway:AnnotatedPackages", annotatedPackages)
121+
annotatedPackages.set(providers.provider { "net.ltgt.gradle.errorprone" })
122+
}, {
123+
option("NullAway:AnnotatedPackages", "net.ltgt.gradle.errorprone")
124+
})
125+
}
126+
96127
private fun doTestOptions(configure: ErrorProneOptions.() -> Unit, reference: ErrorProneOptions.() -> Unit) {
97128
val options = ErrorProneOptions(objects).apply(reference)
98129
val parsedOptions = parseOptions(ErrorProneOptions(objects).apply(configure))
@@ -162,8 +193,8 @@ class ErrorProneOptionsTest {
162193
assertThat(parsedOptions.isIgnoreSuppressionAnnotations).isEqualTo(options.ignoreSuppressionAnnotations.get())
163194
assertThat(parsedOptions.isTestOnlyTarget).isEqualTo(options.isCompilingTestOnlyCode.get())
164195
assertThat(parsedOptions.excludedPattern?.pattern()).isEqualTo(options.excludedPaths.orNull)
165-
assertThat(parsedOptions.severityMap).containsExactlyEntriesIn(options.checks.mapValues { it.value.toSeverity() })
166-
assertThat(parsedOptions.flags.flagsMap).containsExactlyEntriesIn(options.checkOptions)
196+
assertThat(parsedOptions.severityMap).containsExactlyEntriesIn(options.checks.get().mapValues { it.value.toSeverity() })
197+
assertThat(parsedOptions.flags.flagsMap).containsExactlyEntriesIn(options.checkOptions.get())
167198
assertThat(parsedOptions.remainingArgs).isEmpty()
168199
}
169200

0 commit comments

Comments
 (0)