@@ -18,12 +18,15 @@ package com.skydoves.compose.stability.gradle
1818import org.gradle.api.DefaultTask
1919import org.gradle.api.file.ConfigurableFileCollection
2020import org.gradle.api.file.DirectoryProperty
21+ import org.gradle.api.file.RegularFile
2122import org.gradle.api.provider.ListProperty
2223import org.gradle.api.provider.Property
2324import org.gradle.api.tasks.Input
2425import org.gradle.api.tasks.InputFiles
2526import org.gradle.api.tasks.Optional
2627import org.gradle.api.tasks.OutputDirectory
28+ import org.gradle.api.tasks.PathSensitive
29+ import org.gradle.api.tasks.PathSensitivity
2730import org.gradle.api.tasks.TaskAction
2831
2932/* *
@@ -71,6 +74,11 @@ public abstract class StabilityDumpTask : DefaultTask() {
7174 @get:Optional
7275 public abstract val stabilityFileSuffix: Property <String >
7376
77+ @get:InputFiles
78+ @get:Optional
79+ @get:PathSensitive(PathSensitivity .RELATIVE )
80+ public abstract val stabilityConfigurationFiles: ListProperty <RegularFile >
81+
7482 init {
7583 group = " verification"
7684 description = " Dump composable stability information to stability file"
@@ -103,7 +111,13 @@ public abstract class StabilityDumpTask : DefaultTask() {
103111 ignoredClasses.get(),
104112 )
105113
106- writeStabilityFile(outputFile, filtered)
114+ val stableTypeMatchers = stabilityConfigurationFiles.getOrElse(emptyList())
115+ .flatMap { configRegularFile ->
116+ StabilityConfigParser .fromFile(configRegularFile.asFile.path).stableTypeMatchers
117+ }
118+
119+ val resolved = applyStabilityConfiguration(filtered, stableTypeMatchers)
120+ writeStabilityFile(outputFile, resolved)
107121
108122 logger.lifecycle(" Stability file written to: ${outputFile.absolutePath} " )
109123 }
@@ -282,6 +296,26 @@ public abstract class StabilityDumpTask : DefaultTask() {
282296 }
283297 }
284298
299+ private fun applyStabilityConfiguration (
300+ entries : List <StabilityEntry >,
301+ stableTypeMatchers : Collection <FqNameMatcher >,
302+ ): List <StabilityEntry > {
303+ if (stableTypeMatchers.isEmpty()) return entries
304+
305+ return entries.map { entry ->
306+ val resolvedParams = entry.parameters.map { param ->
307+ if (param.stability != " STABLE" && stableTypeMatchers.any { it.matches(param.type) }) {
308+ param.copy(stability = " STABLE" , reason = " matched by stability configuration" )
309+ } else {
310+ param
311+ }
312+ }
313+ val resolvedSkippable = entry.skippable ||
314+ (resolvedParams.isNotEmpty() && resolvedParams.all { it.stability == " STABLE" })
315+ entry.copy(parameters = resolvedParams, skippable = resolvedSkippable)
316+ }
317+ }
318+
285319 private fun writeStabilityFile (
286320 file : java.io.File ,
287321 entries : List <StabilityEntry >,
0 commit comments