Skip to content

Commit 00a6935

Browse files
Merge pull request #113 from usefulness/filter_sourcesets
2 parents 8cfb733 + 2a1ef66 commit 00a6935

File tree

11 files changed

+192
-19
lines changed

11 files changed

+192
-19
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ ktlint {
6666
ktlintVersion = "1.0.0-SNAPSHOT"
6767
chunkSize = 50
6868
baselineFile.set(file("config/ktlint_baseline.xml"))
69+
ignoreKspGeneratedSources = true
6970
}
7071
```
7172

@@ -81,7 +82,8 @@ ktlint {
8182
provided `ktlint` version isn't compatible with the latest ktlint apis.
8283

8384
- `chunkSize` - defines how many files will be processed by a single gradle worker in parallel
84-
- `baselineFile` - points at location of baseline file containing _known_ offenses that will be ignored during `lintKotlin` task execution
85+
- `baselineFile` - points at location of baseline file containing _known_ offenses that will be ignored during `lintKotlin` task execution
86+
- `ignoreKspGeneratedSources` - indicates if the plugin should automatically register tasks for KSP generated sources (hence triggering compilation tasks). This is an incubating, rather primitive workaround for the issue reported: https://github.com/google/ksp/issues/1261.
8587

8688
### Customizing Tasks
8789

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ gradle-starter = "0.64.0"
33
gradle-pluginpublish = "1.2.1"
44
gradle-doctor = "0.8.1"
55
google-agp = "8.1.1"
6+
google-ksp = "1.9.10-1.0.13"
67
maven-junit = "5.10.0"
78
maven-assertj = "3.24.2"
89
maven-ktlint = "1.0.0"
@@ -19,6 +20,7 @@ junit-jupiter-api = { module = "org.junit.jupiter:junit-jupiter-api", version.re
1920
junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "maven-junit" }
2021
assertj-core = { module = "org.assertj:assertj-core", version.ref = "maven-assertj" }
2122
commons-io = { module = "commons-io:commons-io", version.ref = "maven-commons" }
23+
google-ksp-gradle = { module = "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin", version.ref = "google-ksp"}
2224

2325
[plugins]
2426
starter-config = { id = "com.starter.config", version.ref = "gradle-starter" }

ktlint-gradle-plugin/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ dependencies {
4141

4242
testRuntimeDependencies(libs.kotlin.gradle)
4343
testRuntimeDependencies(libs.agp.gradle)
44+
testRuntimeDependencies(libs.google.ksp.gradle)
4445
}
4546

4647
kotlin {

ktlint-gradle-plugin/src/main/kotlin/io/github/usefulness/KtlintGradleExtension.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.github.usefulness
33
import io.github.usefulness.support.versionProperties
44
import io.github.usefulness.tasks.listProperty
55
import io.github.usefulness.tasks.property
6+
import org.gradle.api.Incubating
67
import org.gradle.api.file.RegularFileProperty
78
import org.gradle.api.model.ObjectFactory
89
import org.gradle.api.provider.ListProperty
@@ -21,17 +22,20 @@ public open class KtlintGradleExtension internal constructor(
2122
val DEFAULT_DISABLED_RULES = emptyList<String>()
2223
}
2324

24-
public var ignoreFailures: Property<Boolean> = objectFactory.property(default = DEFAULT_IGNORE_FAILURES)
25+
public val ignoreFailures: Property<Boolean> = objectFactory.property(default = DEFAULT_IGNORE_FAILURES)
2526

26-
public var reporters: ListProperty<String> = objectFactory.listProperty(default = emptyList())
27+
public val reporters: ListProperty<String> = objectFactory.listProperty(default = emptyList())
2728

28-
public var experimentalRules: Property<Boolean> = objectFactory.property(default = DEFAULT_EXPERIMENTAL_RULES)
29+
public val experimentalRules: Property<Boolean> = objectFactory.property(default = DEFAULT_EXPERIMENTAL_RULES)
2930

30-
public var disabledRules: ListProperty<String> = objectFactory.listProperty(default = DEFAULT_DISABLED_RULES)
31+
public val disabledRules: ListProperty<String> = objectFactory.listProperty(default = DEFAULT_DISABLED_RULES)
3132

32-
public var ktlintVersion: Property<String> = objectFactory.property(providerFactory.provider { versionProperties.ktlintVersion() })
33+
public val ktlintVersion: Property<String> = objectFactory.property(providerFactory.provider { versionProperties.ktlintVersion() })
3334

34-
public var chunkSize: Property<Int> = objectFactory.property(default = DEFAULT_CHUNK_SIZE)
35+
public val chunkSize: Property<Int> = objectFactory.property(default = DEFAULT_CHUNK_SIZE)
3536

36-
public var baselineFile: RegularFileProperty = objectFactory.fileProperty()
37+
public val baselineFile: RegularFileProperty = objectFactory.fileProperty()
38+
39+
@Incubating
40+
public val ignoreKspGeneratedSources: Property<Boolean> = objectFactory.property(default = true)
3741
}

ktlint-gradle-plugin/src/main/kotlin/io/github/usefulness/KtlintGradlePlugin.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class KtlintGradlePlugin : Plugin<Project> {
4545
task.chunkSize.set(pluginExtension.chunkSize)
4646
}
4747

48-
sourceResolver.applyToAll(this) { id, resolvedSources ->
48+
sourceResolver.applyToAll(this, pluginExtension) { id, resolvedSources ->
4949
val checkWorker = tasks.register(
5050
"lintKotlin${id.capitalize()}",
5151
LintTask::class.java,

ktlint-gradle-plugin/src/main/kotlin/io/github/usefulness/SourceSetApplier.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ import org.gradle.api.provider.Provider
77
internal typealias SourceSetAction = (String, Provider<FileTree>) -> Unit
88

99
internal interface SourceSetApplier {
10-
fun applyToAll(project: Project, action: SourceSetAction)
10+
fun applyToAll(project: Project, extension: KtlintGradleExtension, action: SourceSetAction)
1111
}

ktlint-gradle-plugin/src/main/kotlin/io/github/usefulness/pluginapplier/AndroidSourceSetApplier.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.github.usefulness.pluginapplier
33
import com.android.build.api.dsl.AndroidSourceDirectorySet
44
import com.android.build.api.dsl.AndroidSourceSet
55
import com.android.build.api.variant.AndroidComponentsExtension
6+
import io.github.usefulness.KtlintGradleExtension
67
import io.github.usefulness.SourceSetAction
78
import io.github.usefulness.SourceSetApplier
89
import io.github.usefulness.id
@@ -11,7 +12,7 @@ import org.gradle.api.file.FileTree
1112

1213
internal object AndroidSourceSetApplier : SourceSetApplier {
1314

14-
override fun applyToAll(project: Project, action: SourceSetAction) {
15+
override fun applyToAll(project: Project, extension: KtlintGradleExtension, action: SourceSetAction) {
1516
val android = project.extensions.findByName("androidComponents") as? AndroidComponentsExtension<*, *, *> ?: return
1617
android.finalizeDsl { commonExtension ->
1718
commonExtension.sourceSets.configureEach { sourceSet ->
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
package io.github.usefulness.pluginapplier
22

3+
import io.github.usefulness.KtlintGradleExtension
34
import io.github.usefulness.SourceSetAction
45
import io.github.usefulness.SourceSetApplier
56
import io.github.usefulness.id
67
import org.gradle.api.Project
78
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
89

910
internal object KotlinSourceSetApplier : SourceSetApplier {
10-
override fun applyToAll(project: Project, action: SourceSetAction) {
11-
getSourceSets(project).configureEach { sourceSet ->
12-
sourceSet.kotlin.let { directorySet ->
13-
action(directorySet.name.id, project.provider { directorySet })
11+
12+
override fun applyToAll(project: Project, extension: KtlintGradleExtension, action: SourceSetAction) {
13+
project.extensions.getByType(KotlinProjectExtension::class.java).sourceSets.configureEach { sourceSet ->
14+
if (!sourceSet.name.startsWith("generatedByKsp") || !extension.ignoreKspGeneratedSources.get()) {
15+
action(sourceSet.kotlin.name.id, project.provider { sourceSet.kotlin })
1416
}
1517
}
1618
}
17-
18-
private fun getSourceSets(project: Project) = project.extensions.getByType(KotlinProjectExtension::class.java).sourceSets
1919
}

ktlint-gradle-plugin/src/test/kotlin/io/github/usefulness/functional/ReportersTest.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import io.github.usefulness.functional.utils.settingsFile
66
import org.assertj.core.api.Assertions.assertThat
77
import org.gradle.testkit.runner.TaskOutcome
88
import org.junit.jupiter.api.BeforeEach
9-
import org.junit.jupiter.api.Disabled
109
import org.junit.jupiter.api.Test
1110
import org.junit.jupiter.api.condition.DisabledOnOs
1211
import org.junit.jupiter.api.condition.OS
@@ -98,7 +97,6 @@ class ReportersTest : WithGradleTest.Kotlin() {
9897
}
9998

10099
@Test
101-
@Disabled("ktlint doesn't maintain binary compatibility for some reason 🤷‍♂️")
102100
fun `uses reporters from overridden ktlint version`() {
103101
projectRoot.resolve("build.gradle") {
104102
// language=groovy
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
package io.github.usefulness.functional
2+
3+
import io.github.usefulness.functional.utils.editorConfig
4+
import io.github.usefulness.functional.utils.kotlinClass
5+
import io.github.usefulness.functional.utils.resolve
6+
import io.github.usefulness.functional.utils.settingsFile
7+
import org.assertj.core.api.Assertions.assertThat
8+
import org.junit.jupiter.api.Test
9+
10+
class ThirdPartyPlugins : WithGradleTest.Android() {
11+
12+
@Test
13+
fun kspKotlin() {
14+
testProjectDir.apply {
15+
resolve("settings.gradle") { writeText(settingsFile) }
16+
resolve(".editorconfig") { writeText(editorConfig) }
17+
resolve("build.gradle") {
18+
// language=groovy
19+
writeText(
20+
"""
21+
plugins {
22+
id 'org.jetbrains.kotlin.jvm'
23+
id 'com.google.devtools.ksp'
24+
id 'io.github.usefulness.ktlint-gradle-plugin'
25+
}
26+
27+
repositories.mavenCentral()
28+
29+
dependencies {
30+
ksp "com.google.dagger:dagger-compiler:2.48"
31+
}
32+
33+
""".trimIndent(),
34+
)
35+
}
36+
resolve("src/main/kotlin/KotlinClass.kt") {
37+
writeText(kotlinClass("KotlinClass"))
38+
}
39+
}
40+
41+
val result = build("lintKotlin")
42+
43+
assertThat(result.tasks.map { it.path }).containsExactlyInAnyOrder(
44+
":lintKotlinTest",
45+
":lintKotlinMain",
46+
":lintKotlin",
47+
)
48+
testProjectDir.resolve("build.gradle") {
49+
appendText(
50+
// language=groovy
51+
"""
52+
53+
ktlint {
54+
ignoreKspGeneratedSources = false
55+
}
56+
57+
""".trimIndent(),
58+
)
59+
}
60+
61+
val onlyMain = build("lintKotlin")
62+
63+
assertThat(onlyMain.tasks.map { it.path }).containsAll(
64+
listOf(
65+
":compileKotlin",
66+
":compileJava",
67+
":lintKotlinGeneratedByKspTestKotlin",
68+
":lintKotlinTest",
69+
":lintKotlinMain",
70+
":lintKotlin",
71+
),
72+
)
73+
}
74+
75+
@Test
76+
fun kspAndroid() {
77+
testProjectDir.apply {
78+
resolve("settings.gradle") { writeText(settingsFile) }
79+
resolve(".editorconfig") { writeText(editorConfig) }
80+
resolve("build.gradle") {
81+
// language=groovy
82+
writeText(
83+
"""
84+
plugins {
85+
id 'com.android.library'
86+
id 'org.jetbrains.kotlin.android'
87+
id 'com.google.devtools.ksp'
88+
id 'io.github.usefulness.ktlint-gradle-plugin'
89+
}
90+
91+
android {
92+
namespace 'io.github.usefulness'
93+
compileSdk 33
94+
defaultConfig {
95+
minSdkVersion 23
96+
}
97+
}
98+
99+
100+
repositories.mavenCentral()
101+
102+
dependencies {
103+
ksp "com.google.dagger:dagger-compiler:2.48"
104+
}
105+
106+
""".trimIndent(),
107+
)
108+
}
109+
resolve("src/main/kotlin/KotlinClass.kt") {
110+
writeText(kotlinClass("KotlinClass"))
111+
}
112+
}
113+
114+
val result = build("lintKotlin")
115+
116+
assertThat(result.tasks.map { it.path }).containsExactlyInAnyOrder(
117+
":lintKotlinTestFixturesRelease",
118+
":lintKotlinTestDebug",
119+
":lintKotlinAndroidTest",
120+
":lintKotlinTestFixtures",
121+
":lintKotlinTestFixturesDebug",
122+
":lintKotlinRelease",
123+
":lintKotlinTest",
124+
":lintKotlinTestRelease",
125+
":lintKotlinMain",
126+
":lintKotlinDebug",
127+
":lintKotlinAndroidTestRelease",
128+
":lintKotlinAndroidTestDebug",
129+
":lintKotlin",
130+
)
131+
132+
testProjectDir.resolve("build.gradle") {
133+
appendText(
134+
// language=groovy
135+
"""
136+
137+
ktlint {
138+
ignoreKspGeneratedSources = false
139+
}
140+
141+
""".trimIndent(),
142+
)
143+
}
144+
145+
val onlyMain = build("lintKotlin")
146+
147+
assertThat(onlyMain.tasks.map { it.path }).containsExactlyInAnyOrder(
148+
":lintKotlinTestFixturesRelease",
149+
":lintKotlinTestDebug",
150+
":lintKotlinAndroidTest",
151+
":lintKotlinTestFixtures",
152+
":lintKotlinTestFixturesDebug",
153+
":lintKotlinRelease",
154+
":lintKotlinTest",
155+
":lintKotlinTestRelease",
156+
":lintKotlinMain",
157+
":lintKotlinDebug",
158+
":lintKotlinAndroidTestRelease",
159+
":lintKotlinAndroidTestDebug",
160+
":lintKotlin",
161+
)
162+
}
163+
}

0 commit comments

Comments
 (0)