diff --git a/src/Avalonia.Base/Utilities/ThrowHelper.cs b/src/Avalonia.Base/Utilities/ThrowHelper.cs new file mode 100644 index 0000000000..e97ab754e5 --- /dev/null +++ b/src/Avalonia.Base/Utilities/ThrowHelper.cs @@ -0,0 +1,24 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace Avalonia.Utilities; + +/// +/// Helper method to help inlining methods that do a throw check. +/// Equivalent of .NET6+ ArgumentNullException.ThrowIfNull() for netstandard2.0+ +/// +internal class ThrowHelper +{ + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void ThrowIfNull([NotNull] object? argument, string paramName) + { + if (argument is null) + { + ThrowArgumentNullException(paramName); + } + } + + [DoesNotReturn] + private static void ThrowArgumentNullException(string paramName) => throw new ArgumentNullException(paramName); +} diff --git a/src/Avalonia.Base/VisualTree/VisualExtensions.cs b/src/Avalonia.Base/VisualTree/VisualExtensions.cs index b3cdd70fa0..e244323ed9 100644 --- a/src/Avalonia.Base/VisualTree/VisualExtensions.cs +++ b/src/Avalonia.Base/VisualTree/VisualExtensions.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; +using System.Runtime.CompilerServices; using Avalonia.Rendering; +using Avalonia.Utilities; namespace Avalonia.VisualTree { @@ -125,9 +128,9 @@ namespace Avalonia.VisualTree /// The visual's ancestors. public static IEnumerable GetVisualAncestors(this Visual visual) { - Visual? v = visual ?? throw new ArgumentNullException(nameof(visual)); + ThrowHelper.ThrowIfNull(visual, nameof(visual)); - v = v.VisualParent; + var v = visual.VisualParent; while (v != null) { @@ -194,7 +197,7 @@ namespace Avalonia.VisualTree /// The visual and its ancestors. public static IEnumerable GetSelfAndVisualAncestors(this Visual visual) { - _ = visual ?? throw new ArgumentNullException(nameof(visual)); + ThrowHelper.ThrowIfNull(visual, nameof(visual)); yield return visual; @@ -275,7 +278,7 @@ namespace Avalonia.VisualTree /// The visual at the requested point. public static Visual? GetVisualAt(this Visual visual, Point p) { - _ = visual ?? throw new ArgumentNullException(nameof(visual)); + ThrowHelper.ThrowIfNull(visual, nameof(visual)); return visual.GetVisualAt(p, x => x.IsVisible); } @@ -292,7 +295,7 @@ namespace Avalonia.VisualTree /// The visual at the requested point. public static Visual? GetVisualAt(this Visual visual, Point p, Func filter) { - _ = visual ?? throw new ArgumentNullException(nameof(visual)); + ThrowHelper.ThrowIfNull(visual, nameof(visual)); var root = visual.GetVisualRoot(); @@ -321,7 +324,7 @@ namespace Avalonia.VisualTree this Visual visual, Point p) { - _ = visual ?? throw new ArgumentNullException(nameof(visual)); + ThrowHelper.ThrowIfNull(visual, nameof(visual)); return visual.GetVisualsAt(p, x => x.IsVisible); } @@ -341,7 +344,7 @@ namespace Avalonia.VisualTree Point p, Func filter) { - _ = visual ?? throw new ArgumentNullException(nameof(visual)); + ThrowHelper.ThrowIfNull(visual, nameof(visual)); var root = visual.GetVisualRoot(); @@ -435,7 +438,7 @@ namespace Avalonia.VisualTree /// public static IRenderRoot? GetVisualRoot(this Visual visual) { - _ = visual ?? throw new ArgumentNullException(nameof(visual)); + ThrowHelper.ThrowIfNull(visual, nameof(visual)); return visual as IRenderRoot ?? visual.VisualRoot; }