# Changelog

## Baseline

- First survey — no prior run to compare against. CAI 67.

## Lenses

- Code Health 78
- Architecture 97
- Maturity 68
- Readiness 75
- Security 78
- Performance 61

## Changes since last survey

- 300 commits — 245 feature/other, 55 fixes

## By area

- ICSharpCode.Decompiler.Tests/TestCases — 72 commits
- ICSharpCode.Decompiler/CSharp — 46 commits
- ICSharpCode.Decompiler/IL — 13 commits
- (repo) — 11 commits
- ICSharpCode.Decompiler.Generators/DecompilerSyntaxTreeGenerator.cs — 10 commits
- (root) — 9 commits
- ICSharpCode.Decompiler.Tests/Documentation — 9 commits
- ILSpy/TextView — 9 commits
- .github/workflows — 7 commits
- ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs — 6 commits
- ICSharpCode.Decompiler.Tests/Semantics — 6 commits
- ILSpy.Tests/Views — 6 commits
- ICSharpCode.Decompiler.Tests/Output — 5 commits
- ILSpy.Tests/Metadata — 5 commits
- ILSpy/Bookmarks — 5 commits
- ICSharpCode.Decompiler.Tests/Helpers — 4 commits
- ICSharpCode.Decompiler/Output — 4 commits
- ILSpy.Tests/Bookmarks — 4 commits
- ILSpy.Tests/Editor — 4 commits
- ILSpy/Views — 4 commits

## Notable commits

- fix: Add ILPretty regression test for duplicate stackalloc store
- fix: Add regression test for duplicate array-element assignment
- fix: Add regression test for property rows without accessors
- fix: Address bookmarks review: lifecycle and sentinel fixes
- fix: Await debug-step replay decompiles to fix flaky UI tests
- fix: Document two CSharpConversions bugs found by differential fuzzing csc
- fix: Fix #1388, #1928: decompile await on dynamic expressions
- fix: Fix #1603: recognize foreach over enumerators that cannot be disposable
- fix: Fix #1638: identify renamed yield state machine members via method impls
- fix: Fix #1924: don't undo the compiler's &&-to-& optimization
- fix: Fix #2032: avoid propagating mutated SROA fields
- fix: Fix #2078: Generic local functions not highlighted properly
- fix: Fix #2728: render the MSVC C++/CLI ID string dialect
- fix: Fix #2879: show stored member-list values for empty ranges
- fix: Fix #3230: do not emit base-list interfaces the base list cannot name
- fix: Fix #3475: Emit 'true ? null : new { ... }' for null of anonymous type
- fix: Fix #3652: Apostrophe in identifiers must not start a char literal
- fix: Fix #3754: omit async stepping info for runtime-async methods
- fix: Fix #3799: keep stackalloc initializer element type when the hint is not a pointer
- fix: Fix #3803: Crash on nested deconstruction of custom structs
- …and 280 more
