Browse Source

Make GetVisualRoot trimmable + some other helper methods

pull/11564/head
Max Katz 3 years ago
parent
commit
8f952396c9
  1. 24
      src/Avalonia.Base/Utilities/ThrowHelper.cs
  2. 19
      src/Avalonia.Base/VisualTree/VisualExtensions.cs

24
src/Avalonia.Base/Utilities/ThrowHelper.cs

@ -0,0 +1,24 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
namespace Avalonia.Utilities;
/// <summary>
/// Helper method to help inlining methods that do a throw check.
/// Equivalent of .NET6+ ArgumentNullException.ThrowIfNull() for netstandard2.0+
/// </summary>
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);
}

19
src/Avalonia.Base/VisualTree/VisualExtensions.cs

@ -1,7 +1,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices;
using Avalonia.Rendering; using Avalonia.Rendering;
using Avalonia.Utilities;
namespace Avalonia.VisualTree namespace Avalonia.VisualTree
{ {
@ -125,9 +128,9 @@ namespace Avalonia.VisualTree
/// <returns>The visual's ancestors.</returns> /// <returns>The visual's ancestors.</returns>
public static IEnumerable<Visual> GetVisualAncestors(this Visual visual) public static IEnumerable<Visual> 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) while (v != null)
{ {
@ -194,7 +197,7 @@ namespace Avalonia.VisualTree
/// <returns>The visual and its ancestors.</returns> /// <returns>The visual and its ancestors.</returns>
public static IEnumerable<Visual> GetSelfAndVisualAncestors(this Visual visual) public static IEnumerable<Visual> GetSelfAndVisualAncestors(this Visual visual)
{ {
_ = visual ?? throw new ArgumentNullException(nameof(visual)); ThrowHelper.ThrowIfNull(visual, nameof(visual));
yield return visual; yield return visual;
@ -275,7 +278,7 @@ namespace Avalonia.VisualTree
/// <returns>The visual at the requested point.</returns> /// <returns>The visual at the requested point.</returns>
public static Visual? GetVisualAt(this Visual visual, Point p) 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); return visual.GetVisualAt(p, x => x.IsVisible);
} }
@ -292,7 +295,7 @@ namespace Avalonia.VisualTree
/// <returns>The visual at the requested point.</returns> /// <returns>The visual at the requested point.</returns>
public static Visual? GetVisualAt(this Visual visual, Point p, Func<Visual, bool> filter) public static Visual? GetVisualAt(this Visual visual, Point p, Func<Visual, bool> filter)
{ {
_ = visual ?? throw new ArgumentNullException(nameof(visual)); ThrowHelper.ThrowIfNull(visual, nameof(visual));
var root = visual.GetVisualRoot(); var root = visual.GetVisualRoot();
@ -321,7 +324,7 @@ namespace Avalonia.VisualTree
this Visual visual, this Visual visual,
Point p) Point p)
{ {
_ = visual ?? throw new ArgumentNullException(nameof(visual)); ThrowHelper.ThrowIfNull(visual, nameof(visual));
return visual.GetVisualsAt(p, x => x.IsVisible); return visual.GetVisualsAt(p, x => x.IsVisible);
} }
@ -341,7 +344,7 @@ namespace Avalonia.VisualTree
Point p, Point p,
Func<Visual, bool> filter) Func<Visual, bool> filter)
{ {
_ = visual ?? throw new ArgumentNullException(nameof(visual)); ThrowHelper.ThrowIfNull(visual, nameof(visual));
var root = visual.GetVisualRoot(); var root = visual.GetVisualRoot();
@ -435,7 +438,7 @@ namespace Avalonia.VisualTree
/// </returns> /// </returns>
public static IRenderRoot? GetVisualRoot(this Visual visual) public static IRenderRoot? GetVisualRoot(this Visual visual)
{ {
_ = visual ?? throw new ArgumentNullException(nameof(visual)); ThrowHelper.ThrowIfNull(visual, nameof(visual));
return visual as IRenderRoot ?? visual.VisualRoot; return visual as IRenderRoot ?? visual.VisualRoot;
} }

Loading…
Cancel
Save