From e3c1cbd2e09c2bf6f3ba091f441902b8aece2208 Mon Sep 17 00:00:00 2001 From: Julien Lebosquain Date: Sun, 5 Mar 2023 12:42:46 +0100 Subject: [PATCH] Nullable annotations for Markup.Xaml --- src/Avalonia.Base/Styling/ITemplate.cs | 2 +- .../Primitives/TemplatedControl.cs | 19 ++++--- .../Templates/IControlTemplate.cs | 4 +- .../Avalonia.Markup.Xaml.csproj | 2 +- .../AvaloniaXamlLoader.cs | 5 +- .../AvaloniaPropertyTypeConverter.cs | 14 ++--- .../Converters/AvaloniaUriTypeConverter.cs | 6 ++- .../Converters/BitmapTypeConverter.cs | 11 ++-- .../Converters/ColorToBrushConverter.cs | 8 +-- .../Converters/FontFamilyTypeConverter.cs | 10 ++-- .../Converters/IconTypeConverter.cs | 13 ++--- .../Converters/PointsListTypeConverter.cs | 9 ++-- .../Converters/TimeSpanTypeConverter.cs | 13 ++--- src/Markup/Avalonia.Markup.Xaml/Extensions.cs | 31 ++++++----- .../CompiledBindingExtension.cs | 12 +++-- .../CompiledBindings/ArrayElementPlugin.cs | 10 ++-- .../CompiledBindings/CommandAccessorPlugin.cs | 36 ++++++------- .../CompiledBindings/CompiledBindingPath.cs | 54 ++++++++++--------- .../FindVisualAncestorNode.cs | 12 ++--- .../CompiledBindings/MethodAccessorPlugin.cs | 6 +-- .../ObservableStreamPlugin.cs | 14 +++-- .../PropertyInfoAccessorFactory.cs | 52 +++++++++--------- .../PropertyInfoAccessorPlugin.cs | 11 ++-- .../CompiledBindings/StrongTypeCastNode.cs | 6 +-- .../CompiledBindings/TaskStreamPlugin.cs | 18 +++---- .../DynamicResourceExtension.cs | 4 +- .../MarkupExtensions/On.cs | 3 +- .../MarkupExtensions/OnFormFactorExtension.cs | 6 +-- .../MarkupExtensions/OnPlatformExtension.cs | 4 +- .../ReflectionBindingExtension.cs | 27 +++++----- .../RelativeSourceExtension.cs | 2 +- .../ResolveByNameExtension.cs | 11 ++-- .../StaticResourceExtension.cs | 34 ++++++------ .../Parsers/PropertyParser.cs | 8 +-- .../RuntimeXamlLoaderConfiguration.cs | 2 - .../RuntimeXamlLoaderDocument.cs | 3 +- .../Styling/MergeResourceInclude.cs | 3 -- .../Styling/ResourceInclude.cs | 2 - .../Styling/StyleInclude.cs | 6 +-- .../Templates/ControlTemplate.cs | 6 +-- .../Templates/DataTemplate.cs | 10 ++-- .../Templates/ItemsPanelTemplate.cs | 8 +-- .../Templates/Template.cs | 8 +-- .../Templates/TemplateContent.cs | 17 +++--- .../Templates/TreeDataTemplate.cs | 12 ++--- ...valoniaXamlIlXmlNamespaceInfoProviderV1.cs | 4 +- .../XamlIl/Runtime/XamlIlRuntimeHelpers.cs | 40 +++++++------- src/Markup/Avalonia.Markup/Data/Binding.cs | 3 +- .../Avalonia.Markup/Data/BindingBase.cs | 5 +- .../Avalonia.Markup/Data/TemplateBinding.cs | 27 ++++++---- .../Markup/Data/DelayedBinding.cs | 9 ++-- .../Parsers/BindingExpressionGrammar.cs | 6 +-- .../Parsers/ExpressionObserverBuilder.cs | 8 +-- .../Markup/Parsers/ExpressionParser.cs | 12 ++--- .../Markup/Parsers/SelectorGrammar.cs | 6 +-- .../Xaml/ControlTemplateTests.cs | 11 ++++ 56 files changed, 333 insertions(+), 352 deletions(-) diff --git a/src/Avalonia.Base/Styling/ITemplate.cs b/src/Avalonia.Base/Styling/ITemplate.cs index 8a130cb3b4..d183d3ff74 100644 --- a/src/Avalonia.Base/Styling/ITemplate.cs +++ b/src/Avalonia.Base/Styling/ITemplate.cs @@ -2,6 +2,6 @@ { public interface ITemplate { - object Build(); + object? Build(); } } diff --git a/src/Avalonia.Controls/Primitives/TemplatedControl.cs b/src/Avalonia.Controls/Primitives/TemplatedControl.cs index e1cf25d89f..44d68fcf30 100644 --- a/src/Avalonia.Controls/Primitives/TemplatedControl.cs +++ b/src/Avalonia.Controls/Primitives/TemplatedControl.cs @@ -286,14 +286,17 @@ namespace Avalonia.Controls.Primitives { Logger.TryGet(LogEventLevel.Verbose, LogArea.Control)?.Log(this, "Creating control template"); - var (child, nameScope) = template.Build(this); - ApplyTemplatedParent(child, this); - ((ISetLogicalParent)child).SetParent(this); - VisualChildren.Add(child); - - var e = new TemplateAppliedEventArgs(nameScope); - OnApplyTemplate(e); - RaiseEvent(e); + if (template.Build(this) is { } templateResult) + { + var (child, nameScope) = templateResult; + ApplyTemplatedParent(child, this); + ((ISetLogicalParent)child).SetParent(this); + VisualChildren.Add(child); + + var e = new TemplateAppliedEventArgs(nameScope); + OnApplyTemplate(e); + RaiseEvent(e); + } } _appliedTemplate = template; diff --git a/src/Avalonia.Controls/Templates/IControlTemplate.cs b/src/Avalonia.Controls/Templates/IControlTemplate.cs index 67e861f6ab..38ad6561ab 100644 --- a/src/Avalonia.Controls/Templates/IControlTemplate.cs +++ b/src/Avalonia.Controls/Templates/IControlTemplate.cs @@ -1,13 +1,11 @@ -using System; using Avalonia.Controls.Primitives; -using Avalonia.Styling; namespace Avalonia.Controls.Templates { /// /// Interface representing a template used to build a . /// - public interface IControlTemplate : ITemplate + public interface IControlTemplate : ITemplate { } diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index da739c754c..05e937fc05 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -58,7 +58,6 @@ - @@ -69,6 +68,7 @@ + diff --git a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs index 0b6a2c522f..834fa84b53 100644 --- a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs +++ b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs @@ -1,8 +1,7 @@ using System; using System.Diagnostics.CodeAnalysis; -using System.IO; using Avalonia.Platform; -#nullable enable + namespace Avalonia.Markup.Xaml { /// @@ -79,7 +78,7 @@ namespace Avalonia.Markup.Xaml var compiledLoader = assetLocator.GetAssembly(uri, baseUri) ?.GetType("CompiledAvaloniaXaml.!XamlLoader") - ?.GetMethod("TryLoad", new[] { typeof(System.IServiceProvider), typeof(string) }); + ?.GetMethod("TryLoad", new[] { typeof(IServiceProvider), typeof(string) }); if (compiledLoader != null) { var compiledResult = compiledLoader.Invoke(null, new object?[] { sp, absoluteUri.ToString()}); diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs index 5b660af887..0a5ecebe5d 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs @@ -14,18 +14,20 @@ namespace Avalonia.Markup.Xaml.Converters [RequiresUnreferencedCode(TrimmingMessages.XamlTypeResolvedRequiresUnreferenceCodeMessage)] public class AvaloniaPropertyTypeConverter : TypeConverter { - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + /// + public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType) { return sourceType == typeof(string); } - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + /// + public override object ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value) { var registry = AvaloniaPropertyRegistry.Instance; var (ns, owner, propertyName) = PropertyParser.Parse(new CharacterReader(((string)value).AsSpan())); var ownerType = TryResolveOwnerByName(context, ns, owner); - var targetType = context.GetFirstParent()?.TargetType ?? - context.GetFirstParent