Releases: skydoves/compose-stability-analyzer
Releases · skydoves/compose-stability-analyzer
0.7.3
Compose Stability Analyzer 0.7.3
[0.7.3] - 2026-04-11
Added
- Internal state change tracking for
@TraceRecomposition(Issue #89)- New
traceStatesannotation parameter:@TraceRecomposition(traceStates = true) - Tracks
mutableStateOf,mutableIntStateOf,derivedStateOfand other Compose state changes - Compiler plugin detects delegated state variables via
IrLocalDelegatedPropertyIR analysis - Logs state changes with
[state]prefix, parameter changes with[param]prefix - Only changed states are logged to reduce noise
- New
- Stability configuration file support for
stabilityDump(Issue #130, PR #105)stabilityConfigurationFilesnow applies to bothstabilityDumpandstabilityChecktasks- Types matching configuration patterns are overridden to STABLE in the baseline file
- Composable
skippableflag is recalculated based on resolved parameter stability
unstableOnlyoption for stability baseline (Issue #128)- New
unstableOnlyoption: when enabled, only unstable composables are included in the baseline file - Reduces baseline file size in large projects and focuses on stability issues
- New
- New composable diff now includes parameter-level stability details (PR #105)
stabilityCheckoutput for new composables shows each parameter's stability status
Fixed
ignoredPackagesnow consistently respected duringstabilityCheck(Issue #129)- Previously, composables in ignored packages were excluded from
stabilityDumpbut still detected as "new composable" duringstabilityCheck - Now both tasks apply the same package/class filtering
- Previously, composables in ignored packages were excluded from
@Optionalannotation added tostabilityConfigurationFilestask input (PR #105)- Prevents Gradle task validation failure when configuration files are not set
- ADB not found on Windows (Issue #139)
- Fixed
adb.exedetection on Windows for the Heatmap feature - Added Windows default SDK path (
%LOCALAPPDATA%\Android\Sdk) - Uses
wherecommand instead ofwhichon Windows for PATH lookup
- Fixed
- First recomposition false positive fixed
- Parameters and states no longer report
changed = trueon the first recomposition when no previous value exists
- Parameters and states no longer report
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
[0.7.2] - 2026-04-02
Added
- Stability configuration file support for
stabilityDump(Issue #130, PR #105)stabilityConfigurationFilesnow applies to bothstabilityDumpandstabilityChecktasks- Types matching configuration patterns are overridden to STABLE in the baseline file
- Composable
skippableflag is recalculated based on resolved parameter stability
unstableOnlyoption for stability baseline (Issue #128)- New
unstableOnlyoption: when enabled, only unstable composables are included in the baseline file - Reduces baseline file size in large projects and focuses on stability issues
- New
- New composable diff now includes parameter-level stability details (PR #105)
stabilityCheckoutput for new composables shows each parameter's stability status
Fixed
ignoredPackagesnow consistently respected duringstabilityCheck(Issue #129)- Previously, composables in ignored packages were excluded from
stabilityDumpbut still detected as "new composable" duringstabilityCheck - Now both tasks apply the same package/class filtering
- Previously, composables in ignored packages were excluded from
@Optionalannotation added tostabilityConfigurationFilestask input (PR #105)- Prevents Gradle task validation failure when configuration files are not set
- ADB not found on Windows (Issue #139)
- Fixed
adb.exedetection on Windows for the Heatmap feature - Added Windows default SDK path (
%LOCALAPPDATA%\Android\Sdk) - Uses
wherecommand instead ofwhichon Windows for PATH lookup
- Fixed
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
What's Changed
- Revert IDE compatibility to build 261 by @skydoves in #123
- Remove incompatible plugin APIs by @skydoves in #124
- Add recomposition heatmap data clear by @skydoves in #125
- Fix inlay text shows unstable in the recomposition live heatmap by @skydoves in #131
- Support Kotlin 2.3.20 by @skydoves in #134
- Prepare for release 0.7.1 by @skydoves in #135
- Pin to Kotlin 2.2 language level so context receivers continue to work by @skydoves in #136
Full Changelog: 0.7.0...0.7.1
0.7.0
Added
- Recomposition Cascade Visualizer (PR #119)
- Right-click any
@Composablefunction 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
- Right-click any
- Live Recomposition Heatmap (PR #120, #121)
- Real-time recomposition counts from a connected device overlaid directly above composable functions in the editor
- Reads
@TraceRecompositionevents 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
runPluginVerifiertask for automated compatibility testing
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
runCatchingpattern in cascade analyzer - Cancellation support in cascade background analysis via
ProgressIndicator.checkCanceled()
What's Changed
- Add docs and publication workflows by @skydoves in #115
- Bump plugin support to 261 and add plugin verifier by @skydoves in #118
- Implement the real-time ADB recomposition heatmap by @skydoves in #120
- Recomposition Cascade Visualizer by @skydoves in #119
- Implement the heatmap window by @skydoves in #121
- Prepare for release 0.7.0 by @skydoves in #122
Full Changelog: 0.6.7...0.7.0
0.6.7
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
- Gradle plugin now creates per-variant tasks (e.g.,
- Non-regressive change filtering for stability validation (Issue #82, PR #104)
- New
ignoreNonRegressiveChangesoption to only flag stability regressions - New
allowMissingBaselineoption to allow checks without an existing baseline file
- New
- Stability configuration file wildcard support (Issue #108, PR #110)
- Implemented
stabilityPatternToRegexsupporting*and**wildcard syntax - Matches the official Compose compiler stability configuration format
- Implemented
Fixed
@StabilityInferredannotation now supported in Gradle plugin (Issue #102, PR #112)- Cross-module classes with
@StabilityInferred(parameters=0)now correctly treated as stable duringstabilityDump/stabilityCheck - Aligns Gradle plugin behavior with the IDEA plugin
- Cross-module classes with
- Skip analysis for
@NonRestartableComposableand@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
- Typealias to function types (e.g.,
Improved
- Replaced internal
nj2k.descendantsOfTypewith stablePsiTreeUtilAPI (PR #109)- Intelligent caching for typealias resolution with automatic expiration
- Streamlined function-type detection and composability checking logic
- Improved IDE responsiveness during analysis
Contributions
- Introduce separate task variants for Android projects by @matejdro in #101
- Ignore non regressive changes by @matejdro in #104
- Improved handling of typealiases by @gamer3dx in #106
- Replace internal nj2k.descendantsOfType with stable PsiTreeUtil API by @skydoves in #109
- Implement stabilityPatternToRegex by @skydoves in #110
- Skip analyzing for specific compose annotation by @skydoves in #111
- Support StabilityInferred annotation for Gradle plugin by @skydoves in #112
- Prepare for release 0.6.7 by @skydoves in #113
New Contributors
Full Changelog: 0.6.6...0.6.7
0.6.6
[0.6.6] - 2025-12-24
Fixed
- Fixed stabilityDump task incorrectly marked as UP-TO-DATE
- Task now properly tracks the
stability-info.jsoninput file for up-to-date checks - Changed from
@Internalto@InputFilesannotation on input file property - Ensures stability files are regenerated when compiler output changes
- Fixes issue where running
./gradlew stabilityDumpwould skip execution even when stability files were missing - Task now correctly runs after
cleanor when stability output is deleted
- Task now properly tracks the
0.6.5
[0.6.5] - 2025-12-17
Added
- Quiet mode for stability validation (Issue #83)
- New
quietCheck: Boolean = falseoption instabilityValidationconfiguration - 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) }
- New
Changed
- Upgraded to Kotlin 2.3.0
0.6.4
0.6.3
0.6.2
[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
KtPropertydeclarations in addition toKtNamedFunction
- 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
