From bb515dbdc9b47eb0bde66f2085bece6ba137ae4b Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Wed, 30 Sep 2026 00:24:38 +0000 Subject: [PATCH] build(detekt): analyse every source set and resolve BuildConfig (#7466) --- build-logic/convention/build.gradle.kts | 1 - .../org/meshtastic/buildlogic/Detekt.kt | 52 +++++++++++++------ core/datastore/detekt-baseline.xml | 6 --- 3 files changed, 35 insertions(+), 24 deletions(-) delete mode 100644 core/datastore/detekt-baseline.xml diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index c7c21ca9ba..e9891f261c 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -99,7 +99,6 @@ detekt { config.setFrom(repoConfigDir.file("detekt/detekt.yml").asFile) buildUponDefaultConfig = true allRules = false - baseline = file("detekt-baseline.xml") source.setFrom(files("src/main/java", "src/main/kotlin")) } diff --git a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/Detekt.kt b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/Detekt.kt index 93e9a9a2c1..0434353771 100644 --- a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/Detekt.kt +++ b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/Detekt.kt @@ -18,14 +18,18 @@ package org.meshtastic.buildlogic import com.android.build.api.variant.AndroidComponentsExtension import dev.detekt.gradle.Detekt +import dev.detekt.gradle.DetektCreateBaselineTask import dev.detekt.gradle.extensions.DetektExtension import dev.detekt.gradle.extensions.FailOnSeverity import org.gradle.api.Project +import org.gradle.api.tasks.compile.JavaCompile import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.getByType +import org.gradle.kotlin.dsl.named import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile import java.io.File internal fun Project.configureDetekt(extension: DetektExtension) = extension.apply { @@ -45,24 +49,13 @@ internal fun Project.configureDetekt(extension: DetektExtension) = extension.app baseline.set(baselineFile) } - // Default sources. Every production source set that ships code must be listed explicitly — detekt silently - // skips anything not named here, which is how src/fdroid, src/google, src/iosMain, and src/jvmAndroidMain - // went unanalyzed for as long as only the main/common sets were listed. (Test source sets are deliberately - // not scanned, matching the original list.) + // Every source set under src/ (main, *Main, flavors, build types), so a new one is analysed without being + // listed here. Test source sets (test*, *Test*) are skipped. source.setFrom( - files( - "src/main/java", - "src/main/kotlin", - "src/commonMain/kotlin", - "src/androidMain/kotlin", - "src/jvmMain/kotlin", - "src/jvmAndroidMain/kotlin", - "src/iosMain/kotlin", - "src/fdroid/java", - "src/fdroid/kotlin", - "src/google/java", - "src/google/kotlin", - ), + fileTree("src") { + include("*/kotlin/**", "*/java/**") + exclude("test*/**", "*Test*/**") + }, ) // Type-resolved tasks take their sources from the compilation, which includes generated code under build/. @@ -133,6 +126,31 @@ private fun Project.registerTypeResolvedDetekt() { plugins.withId(pluginId) { val components = extensions.getByType(AndroidComponentsExtension::class.java) components.onVariants(components.selector().withBuildType("debug")) { variant -> include(variant.name) } + components.onVariants { variant -> addJavacClassesToDetektClasspath(variant.name) } } } } + +/** + * Generated Java such as `BuildConfig` reaches the analysis only as javac's classes, which the plugin leaves off the + * classpath. Its classpath is a convention set after this action runs, so the whole value is set here instead. + */ +private fun Project.addJavacClassesToDetektClasspath(variantName: String) { + val suffix = variantName.replaceFirstChar { char -> char.uppercase() } + fun variantClasspath() = listOf( + tasks.named("compile${suffix}Kotlin").map { task -> task.libraries }, + tasks.named("compile${suffix}JavaWithJavac").flatMap { task -> task.destinationDirectory }, + ) + tasks + .withType() + .named { name -> name == "detekt$suffix" } + .configureEach { + classpath.setFrom(variantClasspath()) + } + tasks + .withType() + .named { name -> name == "detektBaseline$suffix" } + .configureEach { + classpath.setFrom(variantClasspath()) + } +} diff --git a/core/datastore/detekt-baseline.xml b/core/datastore/detekt-baseline.xml deleted file mode 100644 index 5703cad343..0000000000 --- a/core/datastore/detekt-baseline.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - -