Skip to content
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/pr_checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
uses: gradle/actions/setup-gradle@v3

- name: "Run static analysis"
run: ./gradlew detektAll mergeLintSarif
run: ./gradlew detektAll lintReportDebug mergeLintSarif
continue-on-error: false

- name: "Upload Detkt sarif results"
Expand Down
1 change: 1 addition & 0 deletions .idea/codeStyles/Project.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,24 +1,90 @@
package com.github.terrakok

import io.gitlab.arturbosch.detekt.report.ReportMergeTask
import org.gradle.api.DefaultTask
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.register

class CollectSarifPlugin : Plugin<Project> {

override fun apply(target: Project) {
with(target) {
val fixLintSarifTask = tasks.register<FixLintSarifTask>(FIX_LINT_SARIF) {
group = JavaBasePlugin.VERIFICATION_GROUP
outputDir.set(layout.buildDirectory.dir("reports/lint-sarif-fixed"))
}

tasks.register<ReportMergeTask>(MERGE_LINT_SARIF) {
group = JavaBasePlugin.VERIFICATION_GROUP
output.set(layout.buildDirectory.file("reports/lint-merged.sarif"))
dependsOn(fixLintSarifTask)
// Configure inputs from the fix task's output directory
input.from(
fixLintSarifTask.map { task ->
task.outputDir.get().asFileTree.matching {
include("**/*.sarif")
}
}
)
}
}
}

companion object {
const val MERGE_LINT_SARIF = "mergeLintSarif"
const val FIX_LINT_SARIF = "fixLintSarif"
}
}

abstract class FixLintSarifTask : DefaultTask() {

@get:InputFiles
abstract val inputFiles: ConfigurableFileCollection

@get:OutputDirectory
abstract val outputDir: DirectoryProperty

@TaskAction
fun fixSarifFiles() {
val outputDirectory = outputDir.get().asFile
outputDirectory.mkdirs()

// Group input files by their parent project to avoid name collisions
val filesByProject = inputFiles.files.groupBy { file ->
// Extract project path from file path
// e.g., /path/to/project/modo-compose/build/reports/lint-results-debug.sarif -> modo-compose
val buildIndex = file.absolutePath.indexOf("/build/")
if (buildIndex > 0) {
val projectPath = file.absolutePath.substring(0, buildIndex)
projectPath.substringAfterLast("/")
} else {
"unknown"
}
}

filesByProject.forEach { (projectName, files) ->
files.forEach { inputFile ->
if (inputFile.exists() && inputFile.extension == "sarif") {
val content = inputFile.readText()
// Fix trailing commas in arrays and objects which are invalid JSON
val fixedContent = content
.replace(Regex(",\\s*]"), "]") // Remove trailing comma before ]
.replace(Regex(",\\s*}"), "}") // Remove trailing comma before }

// Create unique output filename using project name
val outputFileName = "${projectName}-${inputFile.name}"
val outputFile = outputDirectory.resolve(outputFileName)
outputFile.writeText(fixedContent)
logger.lifecycle("Fixed SARIF file: ${inputFile.absolutePath} -> ${outputFile.absolutePath}")
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,9 @@ import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.provideDelegate
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

private val JAVA_VERSION = JavaVersion.VERSION_11
private val JVM_TARGET = JvmTarget.JVM_11
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.github.terrakok

import com.android.build.api.dsl.CommonExtension
import com.android.build.gradle.internal.lint.AndroidLintTask
import io.gitlab.arturbosch.detekt.report.ReportMergeTask
import org.gradle.api.Project

fun Project.configureLintAndroid(
Expand All @@ -17,14 +16,20 @@ fun Project.configureLintAndroid(
htmlReport = true
lintConfig = rootProject.file("config/lint/lint.xml")
}
rootProject.tasks.named(
CollectSarifPlugin.MERGE_LINT_SARIF,
ReportMergeTask::class.java,
) {
input.from(
tasks
.named("lintReportDebug", AndroidLintTask::class.java)
.flatMap { it.sarifReportOutputFile }
)

// Use afterEvaluate to ensure the lintReportDebug task exists
afterEvaluate {
tasks.matching { it.name == "lintReportDebug" && it is AndroidLintTask }.configureEach {
val lintTask = this as AndroidLintTask
val lintSarifFile = lintTask.sarifReportOutputFile

// Add lint SARIF files to the fix task
rootProject.tasks.named(
CollectSarifPlugin.FIX_LINT_SARIF,
FixLintSarifTask::class.java,
) {
inputFiles.from(lintSarifFile)
}
}
}
}
2 changes: 1 addition & 1 deletion config/detekt/detekt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -881,7 +881,7 @@ Compose:
# -- You can optionally have a list of types to be treated as lambdas (e.g. typedefs or fun interfaces not picked up automatically)
# treatAsLambda: MyLambdaType
CompositionLocalAllowlist:
active: true
active: false
# -- You can optionally define a list of CompositionLocals that are allowed here
allowedCompositionLocals: LocalContainerScreen,LocalMultiScreenNavigation,LocalSaveableStateHolder,LocalBeforeScreenContentOnDispose,LocalAfterScreenContentOnDispose,LocalStackNavigation,
CompositionLocalNaming:
Expand Down
11 changes: 6 additions & 5 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
[versions]
composeWheelPicker = "1.0.0-beta05"
leakcanaryAndroid = "2.14"
modo = "0.10.1"
modo = "0.11.0"
androidGradlePlugin = "8.13.0"
detektComposeVersion = "0.3.20"
detektVersion = "1.23.6"
junit = "4.13.2"
androidxComposeBomModo = "2024.03.00"
androidxComposeBomApp = "2024.06.00"
androidxComposeBomModo = "2025.11.01"

Check notice

Code scanning / Android Lint

A newer version of androidx.compose:compose-bom than 2025.11.01 is available: 2026.02.00 Note

A newer version of androidx.compose:compose-bom than 2025.11.01 is available: 2026.02.00
androidxComposeBomApp = "2025.11.01"

Check notice

Code scanning / Android Lint

A newer version of androidx.compose:compose-bom than 2025.11.01 is available: 2026.02.00 Note

A newer version of androidx.compose:compose-bom than 2025.11.01 is available: 2026.02.00
androidxActivityCompose = "1.8.2"
androidxLifecycle = "2.7.0"
androidxCore = "1.13.1"
Expand All @@ -18,7 +18,7 @@
kotlin = "2.0.21"
kotlinCompilerExtension = "1.5.12"
minSdk = "21"
compileSdk = "34"
compileSdk = "36"
koin = "4.0.0"

[libraries]
Expand All @@ -30,7 +30,8 @@
androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" }
androidx-compose-animation = { group = "androidx.compose.animation", name = "animation" }
androidx-compose-material = { group = "androidx.compose.material", name = "material" }
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3", version = "1.2.1" }
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3", version = "1.4.0" }
androidx-compose-material-icons = { group = "androidx.compose.material", name = "material-icons-core" }
androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "androidxActivityCompose" }
Expand Down
119 changes: 66 additions & 53 deletions modo-compose/dependencies/debugCompileClasspath.txt
Original file line number Diff line number Diff line change
@@ -1,68 +1,81 @@
androidx.activity:activity-compose:1.8.2
androidx.activity:activity-ktx:1.8.2
androidx.activity:activity:1.8.2
androidx.annotation:annotation-experimental:1.3.0
androidx.annotation:annotation-jvm:1.7.0
androidx.annotation:annotation:1.7.0
androidx.annotation:annotation-experimental:1.4.1
androidx.annotation:annotation-jvm:1.9.1
androidx.annotation:annotation:1.9.1
androidx.arch.core:core-common:2.2.0
androidx.arch.core:core-runtime:2.2.0
androidx.collection:collection-jvm:1.4.0
androidx.collection:collection-ktx:1.4.0
androidx.collection:collection:1.4.0
androidx.compose.animation:animation-android:1.6.4
androidx.compose.animation:animation-core-android:1.6.4
androidx.compose.animation:animation-core:1.6.4
androidx.compose.animation:animation:1.6.4
androidx.compose.foundation:foundation-android:1.6.4
androidx.compose.foundation:foundation-layout-android:1.6.4
androidx.compose.foundation:foundation-layout:1.6.4
androidx.compose.foundation:foundation:1.6.4
androidx.compose.runtime:runtime-android:1.6.4
androidx.compose.runtime:runtime-saveable-android:1.6.4
androidx.compose.runtime:runtime-saveable:1.6.4
androidx.compose.runtime:runtime:1.6.4
androidx.compose.ui:ui-android:1.6.4
androidx.compose.ui:ui-geometry-android:1.6.4
androidx.compose.ui:ui-geometry:1.6.4
androidx.compose.ui:ui-graphics-android:1.6.4
androidx.compose.ui:ui-graphics:1.6.4
androidx.compose.ui:ui-text-android:1.6.4
androidx.compose.ui:ui-text:1.6.4
androidx.compose.ui:ui-unit-android:1.6.4
androidx.compose.ui:ui-unit:1.6.4
androidx.compose.ui:ui-util-android:1.6.4
androidx.compose.ui:ui-util:1.6.4
androidx.compose.ui:ui:1.6.4
androidx.compose:compose-bom:2024.03.00
androidx.core:core-ktx:1.12.0
androidx.core:core:1.12.0
androidx.collection:collection-jvm:1.5.0
androidx.collection:collection-ktx:1.5.0
androidx.collection:collection:1.5.0
androidx.compose.animation:animation-android:1.9.5
androidx.compose.animation:animation-core-android:1.9.5
androidx.compose.animation:animation-core:1.9.5
androidx.compose.animation:animation:1.9.5
androidx.compose.foundation:foundation-android:1.9.5
androidx.compose.foundation:foundation-layout-android:1.9.5
androidx.compose.foundation:foundation-layout:1.9.5
androidx.compose.foundation:foundation:1.9.5
androidx.compose.runtime:runtime-android:1.9.5
androidx.compose.runtime:runtime-annotation-android:1.9.5
androidx.compose.runtime:runtime-annotation:1.9.5
androidx.compose.runtime:runtime-saveable-android:1.9.5
androidx.compose.runtime:runtime-saveable:1.9.5
androidx.compose.runtime:runtime:1.9.5
androidx.compose.ui:ui-android:1.9.5
androidx.compose.ui:ui-geometry-android:1.9.5
androidx.compose.ui:ui-geometry:1.9.5
androidx.compose.ui:ui-graphics-android:1.9.5
androidx.compose.ui:ui-graphics:1.9.5
androidx.compose.ui:ui-text-android:1.9.5
androidx.compose.ui:ui-text:1.9.5
androidx.compose.ui:ui-unit-android:1.9.5
androidx.compose.ui:ui-unit:1.9.5
androidx.compose.ui:ui-util-android:1.9.5
androidx.compose.ui:ui-util:1.9.5
androidx.compose.ui:ui:1.9.5
androidx.compose:compose-bom:2025.11.01
androidx.core:core-ktx:1.15.0
androidx.core:core:1.15.0
androidx.customview:customview:1.0.0
androidx.fragment:fragment-ktx:1.6.2
androidx.fragment:fragment:1.6.2
androidx.lifecycle:lifecycle-common-java8:2.7.0
androidx.lifecycle:lifecycle-common:2.7.0
androidx.lifecycle:lifecycle-livedata-core-ktx:2.7.0
androidx.lifecycle:lifecycle-livedata-core:2.7.0
androidx.lifecycle:lifecycle-livedata:2.7.0
androidx.lifecycle:lifecycle-runtime-ktx:2.7.0
androidx.lifecycle:lifecycle-runtime:2.7.0
androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0
androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0
androidx.lifecycle:lifecycle-viewmodel-savedstate:2.7.0
androidx.lifecycle:lifecycle-viewmodel:2.7.0
androidx.lifecycle:lifecycle-common-jvm:2.9.4
androidx.lifecycle:lifecycle-common:2.9.4
androidx.lifecycle:lifecycle-livedata-core-ktx:2.9.4
androidx.lifecycle:lifecycle-livedata-core:2.9.4
androidx.lifecycle:lifecycle-livedata:2.9.4
androidx.lifecycle:lifecycle-runtime-android:2.9.4
androidx.lifecycle:lifecycle-runtime-compose-android:2.9.4
androidx.lifecycle:lifecycle-runtime-compose:2.9.4
androidx.lifecycle:lifecycle-runtime-ktx-android:2.9.4
androidx.lifecycle:lifecycle-runtime-ktx:2.9.4
androidx.lifecycle:lifecycle-runtime:2.9.4
androidx.lifecycle:lifecycle-viewmodel-android:2.9.4
androidx.lifecycle:lifecycle-viewmodel-compose-android:2.9.4
androidx.lifecycle:lifecycle-viewmodel-compose:2.9.4
androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.4
androidx.lifecycle:lifecycle-viewmodel-savedstate-android:2.9.4
androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.4
androidx.lifecycle:lifecycle-viewmodel:2.9.4
androidx.loader:loader:1.0.0
androidx.savedstate:savedstate-ktx:1.2.1
androidx.savedstate:savedstate:1.2.1
androidx.savedstate:savedstate-android:1.3.3
androidx.savedstate:savedstate-compose-android:1.3.3
androidx.savedstate:savedstate-compose:1.3.3
androidx.savedstate:savedstate-ktx:1.3.3
androidx.savedstate:savedstate:1.3.3
androidx.versionedparcelable:versionedparcelable:1.1.1
androidx.viewpager:viewpager:1.0.0
org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.0.21
org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.21
org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20
org.jetbrains.kotlin:kotlin-stdlib:2.0.21
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.1
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.1
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.1
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.1
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1
org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3
org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3
org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3
org.jetbrains:annotations:23.0.0
org.jspecify:jspecify:1.0.0
Loading
Loading