Extended property patterns are pure syntax sugar: { A.B: p } compiles
to the same IL as { A: { B: p } }, so today's decompiler renders every
dotted pattern in the nested C# 8 form. Two-part coverage:
PatternMatching.cs gains CS100-guarded green tests that compile the
dotted source and pin the current output via EXPECTED_OUTPUT: class
links come back as nested property patterns; a struct link ending in
an int comparison (CustomStruct.I == 42) is not reconstructed as a
pattern at all but as a plain comparison on the matched variable,
while a struct chain ending in a string constant does come back as a
nested pattern - both shapes are recompilable and semantics-preserving.
ExtendedPropertyPatterns.cs is the Assert.Ignore'd desired-output spec
(#829): each method's dotted pattern differs from today's output only
by collapsing single-subpattern nesting to the dotted form (constants,
not-patterns, var captures, leaf type patterns, four-link chains via
string.Length, mixing dotted with plain subpatterns, whole-pattern
designations, and a recursive subpattern with designation behind a
dotted chain). All four Roslyn 4.14/latest debug/opt configs compile
the fixture and fail only at the output comparison.
Not covered on purpose: { NullableInt.Value: ... } is rejected by the
compiler (member lookup happens on the unwrapped int), and matching on
an input that already has the pattern's type produces plain null-check
chains instead of any pattern, which is a separate reconstruction gap.
Assisted-by: Claude:claude-fable-5:Claude Code