From 6acd85536305cdb9f260f6a3c5d7a51d39cd5e53 Mon Sep 17 00:00:00 2001 From: Michael Stonis <120685+michaelstonis@users.noreply.github.com> Date: Sun, 9 Aug 2026 16:20:29 -0500 Subject: [PATCH] fix(build): repair syntax mangled by auto-fix commits, unblocking the release The v2.1.3 release workflow failed: Stellar.Avalonia did not compile, which cancelled the remaining matrix jobs and left 2.1.3 published for only 4 of 11 packages (StellarUI, .Maui, .WinUI, .FluentValidation pushed before the cancel; .Uno, .Avalonia, .Wpf, .Blazor, .DiskDataCache, .SourceGenerators and .Maui.PopUp never shipped). Cause: the "Potential fix for pull request finding" commits on #37 rewrote both ICreatesObservableForProperty implementations and introduced three breakages in each: - quotes escaped inside an interpolated string ($"... ?? \"null\"") - the opening brace of the Handler local function deleted (Avalonia) - the SA1313 parameter-naming fix reverted (Avalonia) They also dedented the method out of its class indentation. This keeps the two guards those commits legitimately added - beforeChanged returning Observable.Never, and honouring suppressWarnings when the property is not registered - and restores valid syntax around them. Verified: Release build of Stellar.slnf, 259/259 unit tests, pack rehearsal of Stellar/.Avalonia/.Uno, and the live Uno desktop runtime test still passing (control-rooted WhenAnyValue 3/3 emissions, scheduler marshaling, full lifecycle). Co-Authored-By: Claude Opus 5 --- .../AvaloniaObjectObservableForProperty.cs | 38 ++++++++++--------- .../DependencyObjectObservableForProperty.cs | 35 +++++++++-------- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/Stellar.Avalonia/AvaloniaObjectObservableForProperty.cs b/Stellar.Avalonia/AvaloniaObjectObservableForProperty.cs index 36ff6d9..0118faa 100644 --- a/Stellar.Avalonia/AvaloniaObjectObservableForProperty.cs +++ b/Stellar.Avalonia/AvaloniaObjectObservableForProperty.cs @@ -38,33 +38,37 @@ public int GetAffinityForObject(Type type, string propertyName, bool beforeChang public IObservable> GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged) => GetNotificationForProperty(sender, expression, propertyName, beforeChanged, suppressWarnings: false); -public IObservable> GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged, bool suppressWarnings) -{ - if (beforeChanged) + public IObservable> GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged, bool suppressWarnings) { - return Observable.Never>(); - } + // GetAffinityForObject already declines beforeChanged requests, so this is + // defensive: the PropertyChanged event cannot report values before they change. + if (beforeChanged) + { + return Observable.Never>(); + } - if (sender is not AvaloniaObject avaloniaObject) - { - throw new ArgumentException($"Sender must be an AvaloniaObject, but was {sender?.GetType().FullName ?? \"null\"}.", nameof(sender)); - } + if (sender is not AvaloniaObject avaloniaObject) + { + throw new ArgumentException($"Sender must be an AvaloniaObject, but was {sender?.GetType().FullName ?? "null"}.", nameof(sender)); + } - var property = AvaloniaPropertyRegistry.Instance.FindRegistered(sender.GetType(), propertyName); + var property = AvaloniaPropertyRegistry.Instance.FindRegistered(sender.GetType(), propertyName); - if (property is null) - { - if (suppressWarnings) + if (property is null) { - return Observable.Never>(); + if (suppressWarnings) + { + return Observable.Never>(); + } + + throw new ArgumentException($"No AvaloniaProperty named '{propertyName}' is registered on {sender.GetType().FullName}.", nameof(propertyName)); } - throw new ArgumentException($"No AvaloniaProperty named '{propertyName}' is registered on {sender.GetType().FullName}.", nameof(propertyName)); - } return Observable.Create>( observer => { -void Handler(object? _, AvaloniaPropertyChangedEventArgs args) + void Handler(object? handlerSender, AvaloniaPropertyChangedEventArgs args) + { if (args.Property == property) { observer.OnNext(new ObservedChange(sender, expression, default)); diff --git a/Stellar.Uno/DependencyObjectObservableForProperty.cs b/Stellar.Uno/DependencyObjectObservableForProperty.cs index 6018037..57ebf3e 100644 --- a/Stellar.Uno/DependencyObjectObservableForProperty.cs +++ b/Stellar.Uno/DependencyObjectObservableForProperty.cs @@ -38,29 +38,32 @@ public int GetAffinityForObject(Type type, string propertyName, bool beforeChang public IObservable> GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged) => GetNotificationForProperty(sender, expression, propertyName, beforeChanged, suppressWarnings: false); -public IObservable> GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged, bool suppressWarnings) -{ - if (beforeChanged) + public IObservable> GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged, bool suppressWarnings) { - return Observable.Never>(); - } + // GetAffinityForObject already declines beforeChanged requests, so this is + // defensive: DependencyProperty callbacks fire only after a value changes. + if (beforeChanged) + { + return Observable.Never>(); + } - if (sender is not DependencyObject dependencyObject) - { - throw new ArgumentException($"Sender must be a DependencyObject, but was {sender?.GetType().FullName ?? \"null\"}.", nameof(sender)); - } + if (sender is not DependencyObject dependencyObject) + { + throw new ArgumentException($"Sender must be a DependencyObject, but was {sender?.GetType().FullName ?? "null"}.", nameof(sender)); + } - var dependencyProperty = GetDependencyProperty(sender.GetType(), propertyName); + var dependencyProperty = GetDependencyProperty(sender.GetType(), propertyName); - if (dependencyProperty is null) - { - if (suppressWarnings) + if (dependencyProperty is null) { - return Observable.Never>(); + if (suppressWarnings) + { + return Observable.Never>(); + } + + throw new ArgumentException($"No DependencyProperty named '{propertyName}Property' was found on {sender.GetType().FullName}.", nameof(propertyName)); } - throw new ArgumentException($"No DependencyProperty named '{propertyName}Property' was found on {sender.GetType().FullName}.", nameof(propertyName)); - } return Observable.Create>( observer => {