From dbcd8999f30ee6cf2895667e0f2da9f85bb5685a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 14 Dec 2023 00:16:17 +0100 Subject: [PATCH] Don't separate plugins by reflection. `DataAnnotationsValidationPlugin` is public and so it can't be moved. No point in moving the others if this one will be in the wrong place. --- .../Data/Core/Plugins/BindingPlugins.cs | 1 - .../DataAnnotationsValidationPlugin.cs | 2 +- .../InpcPropertyAccessorPlugin.cs | 2 +- .../{Reflection => }/MethodAccessorPlugin.cs | 2 +- .../Core/Plugins/ObservableStreamPlugin.cs | 90 +++++++++++++--- .../Core/Plugins/ObservableStreamPlugin`1.cs | 27 +++++ .../Reflection/ObservableStreamPlugin.cs | 91 ---------------- .../Plugins/Reflection/TaskStreamPlugin.cs | 85 --------------- .../ReflectionMethodAccessorPlugin.cs | 2 +- .../Data/Core/Plugins/TaskStreamPlugin.cs | 100 ++++++++++++------ .../Data/Core/Plugins/TaskStreamPlugin`1.cs | 49 +++++++++ .../CompiledBindings/CompiledBindingPath.cs | 1 - .../DataAnnotationsValidationPluginTests.cs | 2 +- .../Plugins/ExceptionValidationPluginTests.cs | 1 - .../Plugins/IndeiValidationPluginTests.cs | 1 - .../Data/PropertyAccessorBenchmarks.cs | 2 +- .../Data/PropertyAccessorPluginBenchmarks.cs | 1 - .../Data/BindingTests_Logging.cs | 2 +- 18 files changed, 228 insertions(+), 233 deletions(-) rename src/Avalonia.Base/Data/Core/Plugins/{Reflection => }/DataAnnotationsValidationPlugin.cs (98%) rename src/Avalonia.Base/Data/Core/Plugins/{Reflection => }/InpcPropertyAccessorPlugin.cs (99%) rename src/Avalonia.Base/Data/Core/Plugins/{Reflection => }/MethodAccessorPlugin.cs (97%) create mode 100644 src/Avalonia.Base/Data/Core/Plugins/ObservableStreamPlugin`1.cs delete mode 100644 src/Avalonia.Base/Data/Core/Plugins/Reflection/ObservableStreamPlugin.cs delete mode 100644 src/Avalonia.Base/Data/Core/Plugins/Reflection/TaskStreamPlugin.cs rename src/Avalonia.Base/Data/Core/Plugins/{Reflection => }/ReflectionMethodAccessorPlugin.cs (99%) create mode 100644 src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin`1.cs diff --git a/src/Avalonia.Base/Data/Core/Plugins/BindingPlugins.cs b/src/Avalonia.Base/Data/Core/Plugins/BindingPlugins.cs index 10db09de48..16b09d3448 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/BindingPlugins.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/BindingPlugins.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using Avalonia.Data.Core.Plugins.Reflection; namespace Avalonia.Data.Core.Plugins { diff --git a/src/Avalonia.Base/Data/Core/Plugins/Reflection/DataAnnotationsValidationPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs similarity index 98% rename from src/Avalonia.Base/Data/Core/Plugins/Reflection/DataAnnotationsValidationPlugin.cs rename to src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs index 294a0de2b1..bd166d8d92 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/Reflection/DataAnnotationsValidationPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs @@ -5,7 +5,7 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; -namespace Avalonia.Data.Core.Plugins.Reflection +namespace Avalonia.Data.Core.Plugins { /// /// Validates properties on that have s. diff --git a/src/Avalonia.Base/Data/Core/Plugins/Reflection/InpcPropertyAccessorPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/InpcPropertyAccessorPlugin.cs similarity index 99% rename from src/Avalonia.Base/Data/Core/Plugins/Reflection/InpcPropertyAccessorPlugin.cs rename to src/Avalonia.Base/Data/Core/Plugins/InpcPropertyAccessorPlugin.cs index 43fce2193c..2f04e7eb91 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/Reflection/InpcPropertyAccessorPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/InpcPropertyAccessorPlugin.cs @@ -5,7 +5,7 @@ using System.Diagnostics.CodeAnalysis; using System.Reflection; using Avalonia.Utilities; -namespace Avalonia.Data.Core.Plugins.Reflection +namespace Avalonia.Data.Core.Plugins { /// /// Reads a property from a standard C# object that optionally supports the diff --git a/src/Avalonia.Base/Data/Core/Plugins/Reflection/MethodAccessorPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/MethodAccessorPlugin.cs similarity index 97% rename from src/Avalonia.Base/Data/Core/Plugins/Reflection/MethodAccessorPlugin.cs rename to src/Avalonia.Base/Data/Core/Plugins/MethodAccessorPlugin.cs index af54028b33..d908ffb57b 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/Reflection/MethodAccessorPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/MethodAccessorPlugin.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using System.Reflection; -namespace Avalonia.Data.Core.Plugins.Reflection; +namespace Avalonia.Data.Core.Plugins; internal class MethodAccessorPlugin : IPropertyAccessorPlugin { diff --git a/src/Avalonia.Base/Data/Core/Plugins/ObservableStreamPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/ObservableStreamPlugin.cs index 3577911bc4..523c0bcf39 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/ObservableStreamPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/ObservableStreamPlugin.cs @@ -1,27 +1,91 @@ using System; +using System.Diagnostics.CodeAnalysis; using System.Linq; +using System.Reflection; using Avalonia.Reactive; -namespace Avalonia.Data.Core.Plugins; - -internal class ObservableStreamPlugin : IStreamPlugin +namespace Avalonia.Data.Core.Plugins { - public bool Match(WeakReference reference) + /// + /// Handles binding to s for the '^' stream binding operator. + /// + [UnconditionalSuppressMessage("Trimming", "IL3050", Justification = TrimmingMessages.IgnoreNativeAotSupressWarningMessage)] + [RequiresUnreferencedCode(TrimmingMessages.StreamPluginRequiresUnreferencedCodeMessage)] + internal class ObservableStreamPlugin : IStreamPlugin { - return reference.TryGetTarget(out var target) && target is IObservable; - } + private static MethodInfo? s_observableGeneric; + private static MethodInfo? s_observableSelect; - public IObservable Start(WeakReference reference) - { - if (!(reference.TryGetTarget(out var target) && target is IObservable obs)) + [DynamicDependency(DynamicallyAccessedMemberTypes.NonPublicMethods, "Avalonia.Data.Core.Plugins.ObservableStreamPlugin", "Avalonia.Base")] + public ObservableStreamPlugin() { - return Observable.Empty(); + } - else if (target is IObservable obj) + + /// + /// Checks whether this plugin handles the specified value. + /// + /// A weak reference to the value. + /// True if the plugin can handle the value; otherwise false. + public virtual bool Match(WeakReference reference) { - return obj; + reference.TryGetTarget(out var target); + + return target != null && target.GetType().GetInterfaces().Any(x => + x.IsGenericType && + x.GetGenericTypeDefinition() == typeof(IObservable<>)); } - return obs.Select(x => (object?)x); + /// + /// Starts producing output based on the specified value. + /// + /// A weak reference to the object. + /// + /// An observable that produces the output for the value. + /// + public virtual IObservable Start(WeakReference reference) + { + if (!reference.TryGetTarget(out var target) || target is null) + return Observable.Empty(); + + // If the observable returns a reference type then we can cast it. + if (target is IObservable result) + { + return result; + } + + // If the observable returns a value type then we need to call Observable.Select on it. + // First get the type of T in `IObservable`. + var sourceType = target.GetType().GetInterfaces().First(x => + x.IsGenericType && + x.GetGenericTypeDefinition() == typeof(IObservable<>)).GetGenericArguments()[0]; + + // Get the BoxObservable method. + var select = GetBoxObservable(sourceType); + + // Call BoxObservable(target); + return (IObservable)select.Invoke( + null, + new[] { target })!; + } + + [RequiresUnreferencedCode(TrimmingMessages.StreamPluginRequiresUnreferencedCodeMessage)] + private static MethodInfo GetBoxObservable(Type source) + { + return (s_observableGeneric ??= GetBoxObservable()).MakeGenericMethod(source); + } + + [RequiresUnreferencedCode(TrimmingMessages.StreamPluginRequiresUnreferencedCodeMessage)] + private static MethodInfo GetBoxObservable() + { + return s_observableSelect + ??= typeof(ObservableStreamPlugin).GetMethod(nameof(BoxObservable), BindingFlags.Static | BindingFlags.NonPublic) + ?? throw new InvalidOperationException("BoxObservable method was not found."); + } + + private static IObservable BoxObservable(IObservable source) + { + return source.Select(v => (object?)v); + } } } diff --git a/src/Avalonia.Base/Data/Core/Plugins/ObservableStreamPlugin`1.cs b/src/Avalonia.Base/Data/Core/Plugins/ObservableStreamPlugin`1.cs new file mode 100644 index 0000000000..3577911bc4 --- /dev/null +++ b/src/Avalonia.Base/Data/Core/Plugins/ObservableStreamPlugin`1.cs @@ -0,0 +1,27 @@ +using System; +using System.Linq; +using Avalonia.Reactive; + +namespace Avalonia.Data.Core.Plugins; + +internal class ObservableStreamPlugin : IStreamPlugin +{ + public bool Match(WeakReference reference) + { + return reference.TryGetTarget(out var target) && target is IObservable; + } + + public IObservable Start(WeakReference reference) + { + if (!(reference.TryGetTarget(out var target) && target is IObservable obs)) + { + return Observable.Empty(); + } + else if (target is IObservable obj) + { + return obj; + } + + return obs.Select(x => (object?)x); + } +} diff --git a/src/Avalonia.Base/Data/Core/Plugins/Reflection/ObservableStreamPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/Reflection/ObservableStreamPlugin.cs deleted file mode 100644 index b2b122453e..0000000000 --- a/src/Avalonia.Base/Data/Core/Plugins/Reflection/ObservableStreamPlugin.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Reflection; -using Avalonia.Reactive; - -namespace Avalonia.Data.Core.Plugins.Reflection -{ - /// - /// Handles binding to s for the '^' stream binding operator. - /// - [UnconditionalSuppressMessage("Trimming", "IL3050", Justification = TrimmingMessages.IgnoreNativeAotSupressWarningMessage)] - [RequiresUnreferencedCode(TrimmingMessages.StreamPluginRequiresUnreferencedCodeMessage)] - internal class ObservableStreamPlugin : IStreamPlugin - { - private static MethodInfo? s_observableGeneric; - private static MethodInfo? s_observableSelect; - - [DynamicDependency(DynamicallyAccessedMemberTypes.NonPublicMethods, "Avalonia.Data.Core.Plugins.ObservableStreamPlugin", "Avalonia.Base")] - public ObservableStreamPlugin() - { - - } - - /// - /// Checks whether this plugin handles the specified value. - /// - /// A weak reference to the value. - /// True if the plugin can handle the value; otherwise false. - public virtual bool Match(WeakReference reference) - { - reference.TryGetTarget(out var target); - - return target != null && target.GetType().GetInterfaces().Any(x => - x.IsGenericType && - x.GetGenericTypeDefinition() == typeof(IObservable<>)); - } - - /// - /// Starts producing output based on the specified value. - /// - /// A weak reference to the object. - /// - /// An observable that produces the output for the value. - /// - public virtual IObservable Start(WeakReference reference) - { - if (!reference.TryGetTarget(out var target) || target is null) - return Observable.Empty(); - - // If the observable returns a reference type then we can cast it. - if (target is IObservable result) - { - return result; - } - - // If the observable returns a value type then we need to call Observable.Select on it. - // First get the type of T in `IObservable`. - var sourceType = target.GetType().GetInterfaces().First(x => - x.IsGenericType && - x.GetGenericTypeDefinition() == typeof(IObservable<>)).GetGenericArguments()[0]; - - // Get the BoxObservable method. - var select = GetBoxObservable(sourceType); - - // Call BoxObservable(target); - return (IObservable)select.Invoke( - null, - new[] { target })!; - } - - [RequiresUnreferencedCode(TrimmingMessages.StreamPluginRequiresUnreferencedCodeMessage)] - private static MethodInfo GetBoxObservable(Type source) - { - return (s_observableGeneric ??= GetBoxObservable()).MakeGenericMethod(source); - } - - [RequiresUnreferencedCode(TrimmingMessages.StreamPluginRequiresUnreferencedCodeMessage)] - private static MethodInfo GetBoxObservable() - { - return s_observableSelect - ??= typeof(ObservableStreamPlugin).GetMethod(nameof(BoxObservable), BindingFlags.Static | BindingFlags.NonPublic) - ?? throw new InvalidOperationException("BoxObservable method was not found."); - } - - private static IObservable BoxObservable(IObservable source) - { - return source.Select(v => (object?)v); - } - } -} diff --git a/src/Avalonia.Base/Data/Core/Plugins/Reflection/TaskStreamPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/Reflection/TaskStreamPlugin.cs deleted file mode 100644 index 64b9518fdb..0000000000 --- a/src/Avalonia.Base/Data/Core/Plugins/Reflection/TaskStreamPlugin.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Diagnostics.CodeAnalysis; -using System.Reflection; -using System.Threading.Tasks; -using Avalonia.Reactive; - -namespace Avalonia.Data.Core.Plugins.Reflection -{ - /// - /// Handles binding to s for the '^' stream binding operator. - /// - [UnconditionalSuppressMessage("Trimming", "IL3050", Justification = TrimmingMessages.IgnoreNativeAotSupressWarningMessage)] - [RequiresUnreferencedCode(TrimmingMessages.StreamPluginRequiresUnreferencedCodeMessage)] - internal class TaskStreamPlugin : IStreamPlugin - { - /// - /// Checks whether this plugin handles the specified value. - /// - /// A weak reference to the value. - /// True if the plugin can handle the value; otherwise false. - public virtual bool Match(WeakReference reference) - { - reference.TryGetTarget(out var target); - - return target is Task; - } - - /// - /// Starts producing output based on the specified value. - /// - /// A weak reference to the object. - /// - /// An observable that produces the output for the value. - /// - public virtual IObservable Start(WeakReference reference) - { - reference.TryGetTarget(out var target); - - if (target is Task task) - { - var resultProperty = task.GetType().GetRuntimeProperty("Result"); - - if (resultProperty != null) - { - switch (task.Status) - { - case TaskStatus.RanToCompletion: - case TaskStatus.Faulted: - return HandleCompleted(task); - default: - var subject = new LightweightSubject(); - task.ContinueWith( - x => HandleCompleted(task).Subscribe(subject), - TaskScheduler.FromCurrentSynchronizationContext()) - .ConfigureAwait(false); - return subject; - } - } - } - - return Observable.Empty(); - } - - [RequiresUnreferencedCode(TrimmingMessages.StreamPluginRequiresUnreferencedCodeMessage)] - private static IObservable HandleCompleted(Task task) - { - var resultProperty = task.GetType().GetRuntimeProperty("Result"); - - if (resultProperty != null) - { - switch (task.Status) - { - case TaskStatus.RanToCompletion: - return Observable.Return(resultProperty.GetValue(task)); - case TaskStatus.Faulted: - return Observable.Return(new BindingNotification(task.Exception!, BindingErrorType.Error)); - default: - throw new AvaloniaInternalException("HandleCompleted called for non-completed Task."); - } - } - - return Observable.Empty(); - } - } -} diff --git a/src/Avalonia.Base/Data/Core/Plugins/Reflection/ReflectionMethodAccessorPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/ReflectionMethodAccessorPlugin.cs similarity index 99% rename from src/Avalonia.Base/Data/Core/Plugins/Reflection/ReflectionMethodAccessorPlugin.cs rename to src/Avalonia.Base/Data/Core/Plugins/ReflectionMethodAccessorPlugin.cs index 5424889500..e295fc6066 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/Reflection/ReflectionMethodAccessorPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/ReflectionMethodAccessorPlugin.cs @@ -4,7 +4,7 @@ using System.Diagnostics.CodeAnalysis; using System.Linq.Expressions; using System.Reflection; -namespace Avalonia.Data.Core.Plugins.Reflection +namespace Avalonia.Data.Core.Plugins { [RequiresUnreferencedCode(TrimmingMessages.PropertyAccessorsRequiresUnreferencedCodeMessage)] internal class ReflectionMethodAccessorPlugin : IPropertyAccessorPlugin diff --git a/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin.cs index 2746494b1e..56a7fcefe4 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin.cs @@ -1,49 +1,85 @@ using System; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; using System.Threading.Tasks; using Avalonia.Reactive; -namespace Avalonia.Data.Core.Plugins; - -internal class TaskStreamPlugin : IStreamPlugin +namespace Avalonia.Data.Core.Plugins { - public bool Match(WeakReference reference) + /// + /// Handles binding to s for the '^' stream binding operator. + /// + [UnconditionalSuppressMessage("Trimming", "IL3050", Justification = TrimmingMessages.IgnoreNativeAotSupressWarningMessage)] + [RequiresUnreferencedCode(TrimmingMessages.StreamPluginRequiresUnreferencedCodeMessage)] + internal class TaskStreamPlugin : IStreamPlugin { - return reference.TryGetTarget(out var target) && target is Task; - } + /// + /// Checks whether this plugin handles the specified value. + /// + /// A weak reference to the value. + /// True if the plugin can handle the value; otherwise false. + public virtual bool Match(WeakReference reference) + { + reference.TryGetTarget(out var target); - public IObservable Start(WeakReference reference) - { - if (!(reference.TryGetTarget(out var target) && target is Task task)) + return target is Task; + } + + /// + /// Starts producing output based on the specified value. + /// + /// A weak reference to the object. + /// + /// An observable that produces the output for the value. + /// + public virtual IObservable Start(WeakReference reference) { + reference.TryGetTarget(out var target); + + if (target is Task task) + { + var resultProperty = task.GetType().GetRuntimeProperty("Result"); + + if (resultProperty != null) + { + switch (task.Status) + { + case TaskStatus.RanToCompletion: + case TaskStatus.Faulted: + return HandleCompleted(task); + default: + var subject = new LightweightSubject(); + task.ContinueWith( + x => HandleCompleted(task).Subscribe(subject), + TaskScheduler.FromCurrentSynchronizationContext()) + .ConfigureAwait(false); + return subject; + } + } + } + return Observable.Empty(); } - switch (task.Status) + [RequiresUnreferencedCode(TrimmingMessages.StreamPluginRequiresUnreferencedCodeMessage)] + private static IObservable HandleCompleted(Task task) { - case TaskStatus.RanToCompletion: - case TaskStatus.Faulted: - return HandleCompleted(task); - default: - var subject = new LightweightSubject(); - task.ContinueWith( - _ => HandleCompleted(task).Subscribe(subject), - TaskScheduler.FromCurrentSynchronizationContext()) - .ConfigureAwait(false); - return subject; - } - } + var resultProperty = task.GetType().GetRuntimeProperty("Result"); + if (resultProperty != null) + { + switch (task.Status) + { + case TaskStatus.RanToCompletion: + return Observable.Return(resultProperty.GetValue(task)); + case TaskStatus.Faulted: + return Observable.Return(new BindingNotification(task.Exception!, BindingErrorType.Error)); + default: + throw new AvaloniaInternalException("HandleCompleted called for non-completed Task."); + } + } - private static IObservable HandleCompleted(Task task) - { - switch (task.Status) - { - case TaskStatus.RanToCompletion: - return Observable.Return((object?)task.Result); - case TaskStatus.Faulted: - return Observable.Return(new BindingNotification(task.Exception!, BindingErrorType.Error)); - default: - throw new AvaloniaInternalException("HandleCompleted called for non-completed Task."); + return Observable.Empty(); } } } diff --git a/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin`1.cs b/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin`1.cs new file mode 100644 index 0000000000..2746494b1e --- /dev/null +++ b/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin`1.cs @@ -0,0 +1,49 @@ +using System; +using System.Threading.Tasks; +using Avalonia.Reactive; + +namespace Avalonia.Data.Core.Plugins; + +internal class TaskStreamPlugin : IStreamPlugin +{ + public bool Match(WeakReference reference) + { + return reference.TryGetTarget(out var target) && target is Task; + } + + public IObservable Start(WeakReference reference) + { + if (!(reference.TryGetTarget(out var target) && target is Task task)) + { + return Observable.Empty(); + } + + switch (task.Status) + { + case TaskStatus.RanToCompletion: + case TaskStatus.Faulted: + return HandleCompleted(task); + default: + var subject = new LightweightSubject(); + task.ContinueWith( + _ => HandleCompleted(task).Subscribe(subject), + TaskScheduler.FromCurrentSynchronizationContext()) + .ConfigureAwait(false); + return subject; + } + } + + + private static IObservable HandleCompleted(Task task) + { + switch (task.Status) + { + case TaskStatus.RanToCompletion: + return Observable.Return((object?)task.Result); + case TaskStatus.Faulted: + return Observable.Return(new BindingNotification(task.Exception!, BindingErrorType.Error)); + default: + throw new AvaloniaInternalException("HandleCompleted called for non-completed Task."); + } + } +} diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindings/CompiledBindingPath.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindings/CompiledBindingPath.cs index 0217344ef4..7249c389df 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindings/CompiledBindingPath.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/CompiledBindings/CompiledBindingPath.cs @@ -5,7 +5,6 @@ using Avalonia.Controls; using Avalonia.Data.Core; using Avalonia.Data.Core.ExpressionNodes; using Avalonia.Data.Core.Plugins; -using Avalonia.Data.Core.Plugins.Reflection; using Avalonia.Markup.Parsers; namespace Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs index d9d2f93acd..7570fe9539 100644 --- a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs +++ b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using Avalonia.Data; -using Avalonia.Data.Core.Plugins.Reflection; +using Avalonia.Data.Core.Plugins; using Avalonia.UnitTests; using Xunit; diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/ExceptionValidationPluginTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/ExceptionValidationPluginTests.cs index 3b44e255e9..73bb9ba2ff 100644 --- a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/ExceptionValidationPluginTests.cs +++ b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/ExceptionValidationPluginTests.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using Avalonia.Data; using Avalonia.Data.Core.Plugins; -using Avalonia.Data.Core.Plugins.Reflection; using Avalonia.UnitTests; using Xunit; diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs index ae83cebba3..e8f1f38b90 100644 --- a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs +++ b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs @@ -3,7 +3,6 @@ using System.Collections; using System.Collections.Generic; using Avalonia.Data; using Avalonia.Data.Core.Plugins; -using Avalonia.Data.Core.Plugins.Reflection; using Avalonia.Threading; using Xunit; diff --git a/tests/Avalonia.Benchmarks/Data/PropertyAccessorBenchmarks.cs b/tests/Avalonia.Benchmarks/Data/PropertyAccessorBenchmarks.cs index c26ae9c422..87b8dd6521 100644 --- a/tests/Avalonia.Benchmarks/Data/PropertyAccessorBenchmarks.cs +++ b/tests/Avalonia.Benchmarks/Data/PropertyAccessorBenchmarks.cs @@ -1,5 +1,5 @@ using System; -using Avalonia.Data.Core.Plugins.Reflection; +using Avalonia.Data.Core.Plugins; using BenchmarkDotNet.Attributes; namespace Avalonia.Benchmarks.Data diff --git a/tests/Avalonia.Benchmarks/Data/PropertyAccessorPluginBenchmarks.cs b/tests/Avalonia.Benchmarks/Data/PropertyAccessorPluginBenchmarks.cs index 13bb20ad77..6a6792d5b6 100644 --- a/tests/Avalonia.Benchmarks/Data/PropertyAccessorPluginBenchmarks.cs +++ b/tests/Avalonia.Benchmarks/Data/PropertyAccessorPluginBenchmarks.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using Avalonia.Data.Core.Plugins; -using Avalonia.Data.Core.Plugins.Reflection; using BenchmarkDotNet.Attributes; namespace Avalonia.Benchmarks.Data diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Logging.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Logging.cs index 0a00ffce81..10a8b8855d 100644 --- a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Logging.cs +++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Logging.cs @@ -6,7 +6,7 @@ using Avalonia.Controls.Converters; using Avalonia.Data; using Avalonia.Data.Converters; using Avalonia.Data.Core; -using Avalonia.Data.Core.Plugins.Reflection; +using Avalonia.Data.Core.Plugins; using Avalonia.Input; using Avalonia.Logging; using Avalonia.LogicalTree;