Skip to content

Releases: skydoves/compose-stability-analyzer

0.7.3

11 Apr 00:28
a7eb472

Choose a tag to compare

Compose Stability Analyzer 0.7.3

[0.7.3] - 2026-04-11

Added

  • Internal state change tracking for @TraceRecomposition (Issue #89)
    • New traceStates annotation parameter: @TraceRecomposition(traceStates = true)
    • Tracks mutableStateOf, mutableIntStateOf, derivedStateOf and other Compose state changes
    • Compiler plugin detects delegated state variables via IrLocalDelegatedProperty IR analysis
    • Logs state changes with [state] prefix, parameter changes with [param] prefix
    • Only changed states are logged to reduce noise
  • Stability configuration file support for stabilityDump (Issue #130, PR #105)
    • stabilityConfigurationFiles now applies to both stabilityDump and stabilityCheck tasks
    • Types matching configuration patterns are overridden to STABLE in the baseline file
    • Composable skippable flag is recalculated based on resolved parameter stability
  • unstableOnly option for stability baseline (Issue #128)
    • New unstableOnly option: when enabled, only unstable composables are included in the baseline file
    • Reduces baseline file size in large projects and focuses on stability issues
  • New composable diff now includes parameter-level stability details (PR #105)
    • stabilityCheck output for new composables shows each parameter's stability status

Fixed

  • ignoredPackages now consistently respected during stabilityCheck (Issue #129)
    • Previously, composables in ignored packages were excluded from stabilityDump but still detected as "new composable" during stabilityCheck
    • Now both tasks apply the same package/class filtering
  • @Optional annotation added to stabilityConfigurationFiles task input (PR #105)
    • Prevents Gradle task validation failure when configuration files are not set
  • ADB not found on Windows (Issue #139)
    • Fixed adb.exe detection on Windows for the Heatmap feature
    • Added Windows default SDK path (%LOCALAPPDATA%\Android\Sdk)
    • Uses where command instead of which on Windows for PATH lookup
  • First recomposition false positive fixed
    • Parameters and states no longer report changed = true on the first recomposition when no previous value exists

Changed

  • Log format updated — Parameter changes now display with [param] prefix, state changes with [state] prefix for clearer distinction
  • Tool window actions always visible — Toggle Heatmap, Clear Data, Settings, and GitHub icons moved from hover-only title bar to content toolbar (right-aligned) across all tabs
  • Tool window icon updated — Changed from monochrome gray to blue color matching the plugin icon
  • Stability comparison logic extracted to StabilityComparison.kt (PR #105)
  • Stability configuration parser added as StabilityConfigParser.kt (PR #105)

0.7.2

02 Apr 07:39
20724ec

Choose a tag to compare

[0.7.2] - 2026-04-02

Added

  • Stability configuration file support for stabilityDump (Issue #130, PR #105)
    • stabilityConfigurationFiles now applies to both stabilityDump and stabilityCheck tasks
    • Types matching configuration patterns are overridden to STABLE in the baseline file
    • Composable skippable flag is recalculated based on resolved parameter stability
  • unstableOnly option for stability baseline (Issue #128)
    • New unstableOnly option: when enabled, only unstable composables are included in the baseline file
    • Reduces baseline file size in large projects and focuses on stability issues
  • New composable diff now includes parameter-level stability details (PR #105)
    • stabilityCheck output for new composables shows each parameter's stability status

Fixed

  • ignoredPackages now consistently respected during stabilityCheck (Issue #129)
    • Previously, composables in ignored packages were excluded from stabilityDump but still detected as "new composable" during stabilityCheck
    • Now both tasks apply the same package/class filtering
  • @Optional annotation added to stabilityConfigurationFiles task input (PR #105)
    • Prevents Gradle task validation failure when configuration files are not set
  • ADB not found on Windows (Issue #139)
    • Fixed adb.exe detection on Windows for the Heatmap feature
    • Added Windows default SDK path (%LOCALAPPDATA%\Android\Sdk)
    • Uses where command instead of which on Windows for PATH lookup

Changed

  • Tool window actions always visible — Toggle Heatmap, Clear Data, Settings, and GitHub icons moved from hover-only title bar to content toolbar across all tabs
  • Tool window icon updated — Changed from monochrome gray to blue color matching the plugin icon
  • Stability comparison logic extracted to StabilityComparison.kt (PR #105)
  • Stability configuration parser added as StabilityConfigParser.kt (PR #105)

0.7.1

21 Mar 14:47
9b42288

Choose a tag to compare

What's Changed

Full Changelog: 0.7.0...0.7.1

0.7.0

13 Feb 06:53
f0ca750

Choose a tag to compare

Added

  • Recomposition Cascade Visualizer (PR #119)
    • Right-click any @Composable function and select "Analyze Recomposition Cascade" to trace downstream composables affected by recomposition
    • Tree view showing each downstream composable with stability status (skippable vs. non-skippable)
    • Summary statistics: total downstream count, skippable/unskippable counts, and max depth
    • Cycle detection and configurable depth limits (max 10) prevent infinite analysis
    • Double-click any node to navigate directly to its source code
    • Available via editor right-click context menu
    • New "Cascade" tab in the Compose Stability Analyzer tool window
cascade
  • Live Recomposition Heatmap (PR #120, #121)
    • Real-time recomposition counts from a connected device overlaid directly above composable functions in the editor
    • Reads @TraceRecomposition events from ADB logcat and aggregates per-composable data
    • Color-coded severity: green (< 10 recompositions), yellow (10-50), red (50+)
    • Click any recomposition count to open the Heatmap tab with detailed event logs and parameter change history
    • Start/Stop toggle button in the tool window title bar and Code menu
    • Multi-device support with device picker when multiple ADB devices are connected
    • Flicker-free rendering using deterministic pre-baked inlay renderers
    • Heatmap enabled by default in plugin settings
    • Configurable severity thresholds in Settings > Tools > Compose Stability Analyzer
    • New "Heatmap" tab in the Compose Stability Analyzer tool window
  • Plugin Verifier integration (PR #118)
    • Extended IDE compatibility to build 261 (IntelliJ IDEA 2026.1)
    • Added runPluginVerifier task for automated compatibility testing

heatmap

Improved

  • Tool window now has three tabs: Explorer, Cascade, and Heatmap
  • Start/Stop Recomposition Heatmap button moved to tool window title bar for visibility across all tabs
  • K2-safe reference resolution using runCatching pattern in cascade analyzer
  • Cancellation support in cascade background analysis via ProgressIndicator.checkCanceled()

What's Changed

Full Changelog: 0.6.7...0.7.0

0.6.7

10 Feb 09:58
5515e25

Choose a tag to compare

Added

  • Android variant-specific stability tasks (Issue #85, PR #101)
    • Gradle plugin now creates per-variant tasks (e.g., debugStabilityDump, releaseStabilityCheck) for Android projects
    • Allows running stability analysis on a single variant without compiling others
    • Improved build cache compatibility
  • Non-regressive change filtering for stability validation (Issue #82, PR #104)
    • New ignoreNonRegressiveChanges option to only flag stability regressions
    • New allowMissingBaseline option to allow checks without an existing baseline file
  • Stability configuration file wildcard support (Issue #108, PR #110)
    • Implemented stabilityPatternToRegex supporting * and ** wildcard syntax
    • Matches the official Compose compiler stability configuration format

Fixed

  • @StabilityInferred annotation now supported in Gradle plugin (Issue #102, PR #112)
    • Cross-module classes with @StabilityInferred(parameters=0) now correctly treated as stable during stabilityDump/stabilityCheck
    • Aligns Gradle plugin behavior with the IDEA plugin
  • Skip analysis for @NonRestartableComposable and @NonSkippableComposable (Issue #103, PR #111)
    • These composable functions are now excluded from stability analysis as they are not subject to recomposition skipping
  • Improved typealias handling (Issue #16, PR #106)
    • Typealias to function types (e.g., typealias ComposableAction = @Composable () -> Unit) now correctly recognized as stable
    • Added typealias expansion support across PSI, K1, and K2 analysis paths with circular alias recursion guard

Improved

  • Replaced internal nj2k.descendantsOfType with stable PsiTreeUtil API (PR #109)
    • Intelligent caching for typealias resolution with automatic expiration
    • Streamlined function-type detection and composability checking logic
    • Improved IDE responsiveness during analysis

Contributions

New Contributors

Full Changelog: 0.6.6...0.6.7

0.6.6

24 Dec 08:18
894b09f

Choose a tag to compare

[0.6.6] - 2025-12-24

Fixed

  • Fixed stabilityDump task incorrectly marked as UP-TO-DATE
    • Task now properly tracks the stability-info.json input file for up-to-date checks
    • Changed from @Internal to @InputFiles annotation on input file property
    • Ensures stability files are regenerated when compiler output changes
    • Fixes issue where running ./gradlew stabilityDump would skip execution even when stability files were missing
    • Task now correctly runs after clean or when stability output is deleted

0.6.5

17 Dec 11:39
d2beaf8

Choose a tag to compare

[0.6.5] - 2025-12-17

Added

  • Quiet mode for stability validation (Issue #83)
    • New quietCheck: Boolean = false option in stabilityValidation configuration
    • Suppresses "✅ Stability check passed." messages for modules that pass checks
    • Reduces log noise in multi-module projects where many modules pass validation
    • Errors and warnings still shown normally
    • Example: stabilityValidation { quietCheck.set(true) }

Changed

  • Upgraded to Kotlin 2.3.0

0.6.4

17 Dec 02:41
3bf0cf3

Choose a tag to compare

Fixed

  • Fixed "Wrong plugin option format: null" compilation error (Issue #87)

0.6.3

13 Dec 09:18

Choose a tag to compare

Fix: #87

0.6.2

13 Dec 01:34
822107f

Choose a tag to compare

[0.6.2] - 2025-12-13

Added

  • Cross-module stability detection - Classes from other modules now require explicit stability annotations
    • Classes from different Gradle modules are marked as UNSTABLE unless annotated with @Stable/@Immutable/@StabilityInferred
    • Gradle plugin automatically detects project dependencies and passes them to compiler plugin
    • IDE plugin uses IntelliJ module system to identify cross-module types
    • Prevents accidentally assuming stability for classes where implementation details aren't visible
    • Both compiler plugin and IDE plugin now consistently handle cross-module boundaries

Fixed

  • Fixed property source file location and navigation in tool window (Issue #67)
    • Tool window now correctly identifies source file for composable properties
    • Properties no longer show "Unknown.kt" as file name
    • Double-clicking on property names in tool window now navigates to correct source location
    • Extended source location search to include KtProperty declarations in addition to KtNamedFunction
  • Fixed compiler tests compatibility with new cross-module detection
    • Updated test configurator to pass projectDependencies parameter
    • All compiler tests now passing with cross-module detection enabled

Improved

  • Enhanced tool window handling of ignored type patterns (Issue #74)
    • Ignored parameters are now displayed as stable instead of being hidden completely
    • Composable skippability is recalculated based on processed parameters after applying ignore patterns
    • Composables with only ignored unstable parameters now correctly show as skippable
    • Provides better visibility of composable signatures while respecting ignore patterns