From cc93b6cb861e96075620e1067184ee2657ab47b2 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 15:37:53 +0200 Subject: [PATCH 01/97] feat: Enable rule CA1822 --- .editorconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.editorconfig b/.editorconfig index 337760636b..bcc1b4e011 100644 --- a/.editorconfig +++ b/.editorconfig @@ -141,6 +141,8 @@ dotnet_analyzer_diagnostic.category-Performance.severity = none #error - Uncomme dotnet_diagnostic.CA1802.severity = warning # CA1825: Avoid zero-length array allocations dotnet_diagnostic.CA1825.severity = warning +# CA1822: Mark members as static +dotnet_diagnostic.CA1822.severity = warning # Wrapping preferences csharp_wrap_before_ternary_opsigns = false From 8724514a73e901d61e5fc622e4e21cadbe3d54d3 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:04:53 +0200 Subject: [PATCH 02/97] feat(ControlCatalog): Address rule CA1822 --- .../Pages/AutoCompleteBoxPage.xaml.cs | 8 +++---- .../Pages/CompositionPage.axaml.cs | 4 ++-- .../ControlCatalog/Pages/ImagePage.xaml.cs | 4 ++-- .../ControlCatalog/Pages/OpenGlPage.xaml.cs | 22 +++++++++---------- samples/ControlCatalog/Pages/ScreenPage.cs | 12 +++++----- .../Pages/TabControlPage.xaml.cs | 16 +++++++------- 6 files changed, 33 insertions(+), 33 deletions(-) diff --git a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs index bc18327f12..15021b89c6 100644 --- a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs +++ b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs @@ -32,7 +32,7 @@ namespace ControlCatalog.Pages } } - private StateData[] BuildAllStates() + private static StateData[] BuildAllStates() { return new StateData[] { @@ -90,7 +90,7 @@ namespace ControlCatalog.Pages } public StateData[] States { get; private set; } - private LinkedList[] BuildAllSentences() + private static LinkedList[] BuildAllSentences() { return new string[] { @@ -108,8 +108,8 @@ namespace ControlCatalog.Pages { this.InitializeComponent(); - States = BuildAllStates(); - Sentences = BuildAllSentences(); + States = AutoCompleteBoxPage.BuildAllStates(); + Sentences = AutoCompleteBoxPage.BuildAllSentences(); foreach (AutoCompleteBox box in GetAllAutoCompleteBox().Where(x => x.Name != "CustomAutocompleteBox")) { diff --git a/samples/ControlCatalog/Pages/CompositionPage.axaml.cs b/samples/ControlCatalog/Pages/CompositionPage.axaml.cs index 61e0ed5acb..877c183a22 100644 --- a/samples/ControlCatalog/Pages/CompositionPage.axaml.cs +++ b/samples/ControlCatalog/Pages/CompositionPage.axaml.cs @@ -22,10 +22,10 @@ public partial class CompositionPage : UserControl protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) { base.OnAttachedToVisualTree(e); - this.Get("Items").Items = CreateColorItems(); + this.Get("Items").Items = CompositionPage.CreateColorItems(); } - private List CreateColorItems() + private static List CreateColorItems() { var list = new List(); diff --git a/samples/ControlCatalog/Pages/ImagePage.xaml.cs b/samples/ControlCatalog/Pages/ImagePage.xaml.cs index 45043aa5af..a520ee9b46 100644 --- a/samples/ControlCatalog/Pages/ImagePage.xaml.cs +++ b/samples/ControlCatalog/Pages/ImagePage.xaml.cs @@ -52,13 +52,13 @@ namespace ControlCatalog.Pages var comboxBox = (ComboBox)sender; if (_croppedImage.Source is CroppedBitmap croppedBitmap) { - croppedBitmap.SourceRect = GetCropRect(comboxBox.SelectedIndex); + croppedBitmap.SourceRect = ImagePage.GetCropRect(comboxBox.SelectedIndex); } } } - private PixelRect GetCropRect(int index) + private static PixelRect GetCropRect(int index) { var bitmapWidth = 640; var bitmapHeight = 426; diff --git a/samples/ControlCatalog/Pages/OpenGlPage.xaml.cs b/samples/ControlCatalog/Pages/OpenGlPage.xaml.cs index a126fbefe5..2f636f88cf 100644 --- a/samples/ControlCatalog/Pages/OpenGlPage.xaml.cs +++ b/samples/ControlCatalog/Pages/OpenGlPage.xaml.cs @@ -247,7 +247,7 @@ namespace ControlCatalog.Pages } - private void CheckError(GlInterface gl) + private static void CheckError(GlInterface gl) { int err; while ((err = gl.GetError()) != GL_NO_ERROR) @@ -256,7 +256,7 @@ namespace ControlCatalog.Pages protected unsafe override void OnOpenGlInit(GlInterface GL, int fb) { - CheckError(GL); + OpenGlPageControl.CheckError(GL); Info = $"Renderer: {GL.GetString(GL_RENDERER)} Version: {GL.GetString(GL_VERSION)}"; @@ -277,13 +277,13 @@ namespace ControlCatalog.Pages GL.BindAttribLocationString(_shaderProgram, positionLocation, "aPos"); GL.BindAttribLocationString(_shaderProgram, normalLocation, "aNormal"); Console.WriteLine(GL.LinkProgramAndGetError(_shaderProgram)); - CheckError(GL); + OpenGlPageControl.CheckError(GL); // Create the vertex buffer object (VBO) for the vertex data. _vertexBufferObject = GL.GenBuffer(); // Bind the VBO and copy the vertex data into it. GL.BindBuffer(GL_ARRAY_BUFFER, _vertexBufferObject); - CheckError(GL); + OpenGlPageControl.CheckError(GL); var vertexSize = Marshal.SizeOf(); fixed (void* pdata = _points) GL.BufferData(GL_ARRAY_BUFFER, new IntPtr(_points.Length * vertexSize), @@ -291,21 +291,21 @@ namespace ControlCatalog.Pages _indexBufferObject = GL.GenBuffer(); GL.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBufferObject); - CheckError(GL); + OpenGlPageControl.CheckError(GL); fixed (void* pdata = _indices) GL.BufferData(GL_ELEMENT_ARRAY_BUFFER, new IntPtr(_indices.Length * sizeof(ushort)), new IntPtr(pdata), GL_STATIC_DRAW); - CheckError(GL); + OpenGlPageControl.CheckError(GL); _vertexArrayObject = GL.GenVertexArray(); GL.BindVertexArray(_vertexArrayObject); - CheckError(GL); + OpenGlPageControl.CheckError(GL); GL.VertexAttribPointer(positionLocation, 3, GL_FLOAT, 0, vertexSize, IntPtr.Zero); GL.VertexAttribPointer(normalLocation, 3, GL_FLOAT, 0, vertexSize, new IntPtr(12)); GL.EnableVertexAttribArray(positionLocation); GL.EnableVertexAttribArray(normalLocation); - CheckError(GL); + OpenGlPageControl.CheckError(GL); } @@ -339,7 +339,7 @@ namespace ControlCatalog.Pages GL.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBufferObject); GL.BindVertexArray(_vertexArrayObject); GL.UseProgram(_shaderProgram); - CheckError(GL); + OpenGlPageControl.CheckError(GL); var projection = Matrix4x4.CreatePerspectiveFieldOfView((float)(Math.PI / 4), (float)(Bounds.Width / Bounds.Height), 0.01f, 1000); @@ -361,10 +361,10 @@ namespace ControlCatalog.Pages GL.Uniform1f(minYLoc, _minY); GL.Uniform1f(timeLoc, (float)St.Elapsed.TotalSeconds); GL.Uniform1f(discoLoc, _disco); - CheckError(GL); + OpenGlPageControl.CheckError(GL); GL.DrawElements(GL_TRIANGLES, _indices.Length, GL_UNSIGNED_SHORT, IntPtr.Zero); - CheckError(GL); + OpenGlPageControl.CheckError(GL); if (_disco > 0.01) Dispatcher.UIThread.Post(InvalidateVisual, DispatcherPriority.Background); } diff --git a/samples/ControlCatalog/Pages/ScreenPage.cs b/samples/ControlCatalog/Pages/ScreenPage.cs index 823f59e030..841b347d78 100644 --- a/samples/ControlCatalog/Pages/ScreenPage.cs +++ b/samples/ControlCatalog/Pages/ScreenPage.cs @@ -55,21 +55,21 @@ namespace ControlCatalog.Pages context.DrawRectangle(p, workingAreaRect); - var formattedText = CreateFormattedText($"Bounds: {screen.Bounds.Width}:{screen.Bounds.Height}"); + var formattedText = ScreenPage.CreateFormattedText($"Bounds: {screen.Bounds.Width}:{screen.Bounds.Height}"); context.DrawText(formattedText, boundsRect.Position.WithY(boundsRect.Size.Height)); formattedText = - CreateFormattedText($"WorkArea: {screen.WorkingArea.Width}:{screen.WorkingArea.Height}"); + ScreenPage.CreateFormattedText($"WorkArea: {screen.WorkingArea.Width}:{screen.WorkingArea.Height}"); context.DrawText(formattedText, boundsRect.Position.WithY(boundsRect.Size.Height + 20)); - formattedText = CreateFormattedText($"Scaling: {screen.PixelDensity * 100}%"); + formattedText = ScreenPage.CreateFormattedText($"Scaling: {screen.PixelDensity * 100}%"); context.DrawText(formattedText, boundsRect.Position.WithY(boundsRect.Size.Height + 40)); - formattedText = CreateFormattedText($"Primary: {screen.Primary}"); + formattedText = ScreenPage.CreateFormattedText($"Primary: {screen.Primary}"); context.DrawText(formattedText, boundsRect.Position.WithY(boundsRect.Size.Height + 60)); formattedText = - CreateFormattedText( + ScreenPage.CreateFormattedText( $"Current: {screen.Equals(w.Screens.ScreenFromBounds(new PixelRect(w.Position, PixelSize.FromSize(w.Bounds.Size, scaling))))}"); context.DrawText(formattedText, boundsRect.Position.WithY(boundsRect.Size.Height + 80)); } @@ -77,7 +77,7 @@ namespace ControlCatalog.Pages context.DrawRectangle(p, new Rect(w.Position.X / 10f + Math.Abs(_leftMost), w.Position.Y / 10f, w.Bounds.Width / 10, w.Bounds.Height / 10)); } - private FormattedText CreateFormattedText(string textToFormat) + private static FormattedText CreateFormattedText(string textToFormat) { return new FormattedText(textToFormat, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, Typeface.Default, 12, Brushes.Green); diff --git a/samples/ControlCatalog/Pages/TabControlPage.xaml.cs b/samples/ControlCatalog/Pages/TabControlPage.xaml.cs index bd0214c72e..2cc4587dce 100644 --- a/samples/ControlCatalog/Pages/TabControlPage.xaml.cs +++ b/samples/ControlCatalog/Pages/TabControlPage.xaml.cs @@ -14,6 +14,12 @@ namespace ControlCatalog.Pages public class TabControlPage : UserControl { + private static IBitmap LoadBitmap(string uri) + { + var assets = AvaloniaLocator.Current!.GetService()!; + return new Bitmap(assets.Open(new Uri(uri))); + } + public TabControlPage() { InitializeComponent(); @@ -26,13 +32,13 @@ namespace ControlCatalog.Pages { Header = "Arch", Text = "This is the first templated tab page.", - Image = LoadBitmap("avares://ControlCatalog/Assets/delicate-arch-896885_640.jpg"), + Image = TabControlPage.LoadBitmap("avares://ControlCatalog/Assets/delicate-arch-896885_640.jpg"), }, new TabItemViewModel { Header = "Leaf", Text = "This is the second templated tab page.", - Image = LoadBitmap("avares://ControlCatalog/Assets/maple-leaf-888807_640.jpg"), + Image = TabControlPage.LoadBitmap("avares://ControlCatalog/Assets/maple-leaf-888807_640.jpg"), }, new TabItemViewModel { @@ -50,12 +56,6 @@ namespace ControlCatalog.Pages AvaloniaXamlLoader.Load(this); } - private IBitmap LoadBitmap(string uri) - { - var assets = AvaloniaLocator.Current!.GetService()!; - return new Bitmap(assets.Open(new Uri(uri))); - } - private class PageViewModel : ViewModelBase { private Dock _tabPlacement; From 28c033982b17b3f9d9730eca946377207d352458 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:05:43 +0200 Subject: [PATCH 03/97] feat(Android): Address rule CA1822 --- .../Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs | 2 +- .../Avalonia.Android/Platform/Storage/AndroidStorageItem.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs index 4cae700c0a..9de9841266 100644 --- a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs +++ b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs @@ -30,7 +30,7 @@ namespace Avalonia.Android.Platform.Specific.Helpers return DispatchKeyEventInternal(e, out callBase); } - string UnicodeTextInput(KeyEvent keyEvent) + static string UnicodeTextInput(KeyEvent keyEvent) { return keyEvent.Action == KeyEventActions.Multiple && keyEvent.RepeatCount == 0 diff --git a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs index a9b2e16d43..078f70db60 100644 --- a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs +++ b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs @@ -178,7 +178,7 @@ internal sealed class AndroidStorageFile : AndroidStorageItem, IStorageBookmarkF return false; } - private Stream? GetVirtualFileStream(Context context, AndroidUri uri, bool isOutput) + private static Stream? GetVirtualFileStream(Context context, AndroidUri uri, bool isOutput) { var mimeTypes = context.ContentResolver?.GetStreamTypes(uri, FilePickerFileTypes.All.MimeTypes![0]); if (mimeTypes?.Length >= 1) From 93998f2a03d214248ca5384b51ca815527d4565c Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:07:00 +0200 Subject: [PATCH 04/97] feat(Base): Address rule CA1822 --- .../Animators/GradientBrushAnimator.cs | 8 ++++---- src/Avalonia.Base/Animation/KeySpline.cs | 8 ++++---- src/Avalonia.Base/Controls/Classes.cs | 18 +++++++++--------- src/Avalonia.Base/Data/Core/ExpressionNode.cs | 4 ++-- .../Parsers/ExpressionVisitorNodeBuilder.cs | 6 +++--- .../Plugins/DataAnnotationsValidationPlugin.cs | 4 ++-- .../Data/Core/Plugins/IndeiValidationPlugin.cs | 4 ++-- .../Data/Core/Plugins/TaskStreamPlugin.cs | 6 +++--- src/Avalonia.Base/Input/DragDropDevice.cs | 16 ++++++++-------- src/Avalonia.Base/Input/KeyGesture.cs | 4 ++-- src/Avalonia.Base/Input/MouseDevice.cs | 6 +++--- src/Avalonia.Base/Input/PenDevice.cs | 4 ++-- src/Avalonia.Base/Input/Pointer.cs | 4 ++-- src/Avalonia.Base/Input/TouchDevice.cs | 8 ++++---- src/Avalonia.Base/Layout/AttachedLayout.cs | 10 +++++----- src/Avalonia.Base/Layout/StackLayout.cs | 8 ++++---- src/Avalonia.Base/Layout/UniformGridLayout.cs | 8 ++++---- src/Avalonia.Base/Platform/AssetLoader.cs | 8 ++++---- .../Animations/KeyFrameAnimationInstance.cs | 12 ++++++------ .../Composition/CompositingRenderer.cs | 6 +++--- .../Rendering/Composition/CompositionTarget.cs | 6 +++--- .../Drawing/CompositionDrawingContext.cs | 14 +++++++------- .../Rendering/DeferredRenderer.cs | 6 +++--- .../Rendering/SceneGraph/SceneBuilder.cs | 6 +++--- 24 files changed, 92 insertions(+), 92 deletions(-) diff --git a/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs b/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs index 4727ea1bfb..f469ea5652 100644 --- a/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs +++ b/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs @@ -28,7 +28,7 @@ namespace Avalonia.Animation.Animators { case IRadialGradientBrush oldRadial when newValue is IRadialGradientBrush newRadial: return new ImmutableRadialGradientBrush( - InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), + GradientBrushAnimator.InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), s_doubleAnimator.Interpolate(progress, oldValue.Opacity, newValue.Opacity), oldValue.Transform is { } ? new ImmutableTransform(oldValue.Transform.Value) : null, s_relativePointAnimator.Interpolate(progress, oldValue.TransformOrigin, newValue.TransformOrigin), @@ -39,7 +39,7 @@ namespace Avalonia.Animation.Animators case IConicGradientBrush oldConic when newValue is IConicGradientBrush newConic: return new ImmutableConicGradientBrush( - InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), + GradientBrushAnimator.InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), s_doubleAnimator.Interpolate(progress, oldValue.Opacity, newValue.Opacity), oldValue.Transform is { } ? new ImmutableTransform(oldValue.Transform.Value) : null, s_relativePointAnimator.Interpolate(progress, oldValue.TransformOrigin, newValue.TransformOrigin), @@ -49,7 +49,7 @@ namespace Avalonia.Animation.Animators case ILinearGradientBrush oldLinear when newValue is ILinearGradientBrush newLinear: return new ImmutableLinearGradientBrush( - InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), + GradientBrushAnimator.InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), s_doubleAnimator.Interpolate(progress, oldValue.Opacity, newValue.Opacity), oldValue.Transform is { } ? new ImmutableTransform(oldValue.Transform.Value) : null, s_relativePointAnimator.Interpolate(progress, oldValue.TransformOrigin, newValue.TransformOrigin), @@ -72,7 +72,7 @@ namespace Avalonia.Animation.Animators return control.Bind((AvaloniaProperty)Property, instance, BindingPriority.Animation); } - private IReadOnlyList InterpolateStops(double progress, IReadOnlyList oldValue, IReadOnlyList newValue) + private static IReadOnlyList InterpolateStops(double progress, IReadOnlyList oldValue, IReadOnlyList newValue) { var resultCount = Math.Max(oldValue.Count, newValue.Count); var stops = new ImmutableGradientStop[resultCount]; diff --git a/src/Avalonia.Base/Animation/KeySpline.cs b/src/Avalonia.Base/Animation/KeySpline.cs index a6e9769186..b33cd6b881 100644 --- a/src/Avalonia.Base/Animation/KeySpline.cs +++ b/src/Avalonia.Base/Animation/KeySpline.cs @@ -98,7 +98,7 @@ namespace Avalonia.Animation get => _controlPointX1; set { - if (IsValidXValue(value)) + if (KeySpline.IsValidXValue(value)) { _controlPointX1 = value; _isDirty = true; @@ -131,7 +131,7 @@ namespace Avalonia.Animation get => _controlPointX2; set { - if (IsValidXValue(value)) + if (KeySpline.IsValidXValue(value)) { _controlPointX2 = value; _isDirty = true; @@ -188,7 +188,7 @@ namespace Avalonia.Animation /// acceptable range; false otherwise. public bool IsValid() { - return IsValidXValue(_controlPointX1) && IsValidXValue(_controlPointX2); + return KeySpline.IsValidXValue(_controlPointX1) && KeySpline.IsValidXValue(_controlPointX2); } /// @@ -196,7 +196,7 @@ namespace Avalonia.Animation /// /// /// - private bool IsValidXValue(double value) + private static bool IsValidXValue(double value) { return value >= 0.0 && value <= 1.0; } diff --git a/src/Avalonia.Base/Controls/Classes.cs b/src/Avalonia.Base/Controls/Classes.cs index c3d3fbca46..100c2b2a8f 100644 --- a/src/Avalonia.Base/Controls/Classes.cs +++ b/src/Avalonia.Base/Controls/Classes.cs @@ -63,7 +63,7 @@ namespace Avalonia.Controls /// public override void Add(string name) { - ThrowIfPseudoclass(name, "added"); + Classes.ThrowIfPseudoclass(name, "added"); if (!Contains(name)) { @@ -87,7 +87,7 @@ namespace Avalonia.Controls foreach (var name in names) { - ThrowIfPseudoclass(name, "added"); + Classes.ThrowIfPseudoclass(name, "added"); if (!Contains(name)) { @@ -127,7 +127,7 @@ namespace Avalonia.Controls /// public override void Insert(int index, string name) { - ThrowIfPseudoclass(name, "added"); + Classes.ThrowIfPseudoclass(name, "added"); if (!Contains(name)) { @@ -152,7 +152,7 @@ namespace Avalonia.Controls foreach (var name in names) { - ThrowIfPseudoclass(name, "added"); + Classes.ThrowIfPseudoclass(name, "added"); if (!Contains(name)) { @@ -180,7 +180,7 @@ namespace Avalonia.Controls /// public override bool Remove(string name) { - ThrowIfPseudoclass(name, "removed"); + Classes.ThrowIfPseudoclass(name, "removed"); if (base.Remove(name)) { @@ -206,7 +206,7 @@ namespace Avalonia.Controls foreach (var name in names) { - ThrowIfPseudoclass(name, "removed"); + Classes.ThrowIfPseudoclass(name, "removed"); toRemove ??= new List(); @@ -232,7 +232,7 @@ namespace Avalonia.Controls public override void RemoveAt(int index) { var name = this[index]; - ThrowIfPseudoclass(name, "removed"); + Classes.ThrowIfPseudoclass(name, "removed"); base.RemoveAt(index); NotifyChanged(); } @@ -258,7 +258,7 @@ namespace Avalonia.Controls foreach (var name in source) { - ThrowIfPseudoclass(name, "added"); + Classes.ThrowIfPseudoclass(name, "added"); } foreach (var name in this) @@ -320,7 +320,7 @@ namespace Avalonia.Controls listener.Changed(); } - private void ThrowIfPseudoclass(string name, string operation) + private static void ThrowIfPseudoclass(string name, string operation) { if (name.StartsWith(":")) { diff --git a/src/Avalonia.Base/Data/Core/ExpressionNode.cs b/src/Avalonia.Base/Data/Core/ExpressionNode.cs index 4f755ff140..d1bc60541c 100644 --- a/src/Avalonia.Base/Data/Core/ExpressionNode.cs +++ b/src/Avalonia.Base/Data/Core/ExpressionNode.cs @@ -138,7 +138,7 @@ namespace Avalonia.Data.Core if (target == null) { - ValueChanged(TargetNullNotification()); + ValueChanged(ExpressionNode.TargetNullNotification()); _listening = false; } else if (target != AvaloniaProperty.UnsetValue) @@ -159,7 +159,7 @@ namespace Avalonia.Data.Core _listening = false; } - private BindingNotification TargetNullNotification() + private static BindingNotification TargetNullNotification() { return new BindingNotification( new MarkupBindingChainException("Null value"), diff --git a/src/Avalonia.Base/Data/Core/Parsers/ExpressionVisitorNodeBuilder.cs b/src/Avalonia.Base/Data/Core/Parsers/ExpressionVisitorNodeBuilder.cs index 1e82214d76..9b9ddf2183 100644 --- a/src/Avalonia.Base/Data/Core/Parsers/ExpressionVisitorNodeBuilder.cs +++ b/src/Avalonia.Base/Data/Core/Parsers/ExpressionVisitorNodeBuilder.cs @@ -70,7 +70,7 @@ namespace Avalonia.Data.Core.Parsers if (node.Indexer == AvaloniaObjectIndexer) { - var property = GetArgumentExpressionValue(node.Arguments[0]); + var property = ExpressionVisitorNodeBuilder.GetArgumentExpressionValue(node.Arguments[0]); Nodes.Add(new AvaloniaPropertyAccessorNode(property, _enableDataValidation)); } else @@ -81,7 +81,7 @@ namespace Avalonia.Data.Core.Parsers return node; } - private T GetArgumentExpressionValue(Expression expr) + private static T GetArgumentExpressionValue(Expression expr) { try { @@ -162,7 +162,7 @@ namespace Avalonia.Data.Core.Parsers if (node.Method == CreateDelegateMethod) { var visited = Visit(node.Arguments[1]); - Nodes.Add(new PropertyAccessorNode(GetArgumentExpressionValue(node.Object!).Name, _enableDataValidation)); + Nodes.Add(new PropertyAccessorNode(ExpressionVisitorNodeBuilder.GetArgumentExpressionValue(node.Object!).Name, _enableDataValidation)); return node; } else if (node.Method.Name == StreamBindingExtensions.StreamBindingName || node.Method.Name.StartsWith(StreamBindingExtensions.StreamBindingName + '`')) diff --git a/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs index 361d68dc81..54d5b5ac28 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs @@ -57,13 +57,13 @@ namespace Avalonia.Data.Core.Plugins else { base.InnerValueChanged(new BindingNotification( - CreateException(errors), + Accessor.CreateException(errors), BindingErrorType.DataValidationError, value)); } } - private Exception CreateException(IList errors) + private static Exception CreateException(IList errors) { if (errors.Count == 1) { diff --git a/src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs index 1e7a0d5c8f..e45170ff7e 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs @@ -92,7 +92,7 @@ namespace Avalonia.Data.Core.Plugins if (errors?.Count > 0) { return new BindingNotification( - GenerateException(errors), + Validator.GenerateException(errors), BindingErrorType.DataValidationError, value); } @@ -108,7 +108,7 @@ namespace Avalonia.Data.Core.Plugins return target; } - private Exception GenerateException(IList errors) + private static Exception GenerateException(IList errors) { if (errors.Count == 1) { diff --git a/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin.cs index 377ea9f275..b25d592597 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin.cs @@ -44,11 +44,11 @@ namespace Avalonia.Data.Core.Plugins { case TaskStatus.RanToCompletion: case TaskStatus.Faulted: - return HandleCompleted(task); + return TaskStreamPlugin.HandleCompleted(task); default: var subject = new Subject(); task.ContinueWith( - x => HandleCompleted(task).Subscribe(subject), + x => TaskStreamPlugin.HandleCompleted(task).Subscribe(subject), TaskScheduler.FromCurrentSynchronizationContext()) .ConfigureAwait(false); return subject; @@ -59,7 +59,7 @@ namespace Avalonia.Data.Core.Plugins return Observable.Empty(); } - private IObservable HandleCompleted(Task task) + private static IObservable HandleCompleted(Task task) { var resultProperty = task.GetType().GetRuntimeProperty("Result"); diff --git a/src/Avalonia.Base/Input/DragDropDevice.cs b/src/Avalonia.Base/Input/DragDropDevice.cs index 30a08eda17..16ff428d69 100644 --- a/src/Avalonia.Base/Input/DragDropDevice.cs +++ b/src/Avalonia.Base/Input/DragDropDevice.cs @@ -11,7 +11,7 @@ namespace Avalonia.Input private Interactive? _lastTarget = null; - private Interactive? GetTarget(IInputRoot root, Point local) + private static Interactive? GetTarget(IInputRoot root, Point local) { var target = root.InputHitTest(local)?.GetSelfAndVisualAncestors()?.OfType()?.FirstOrDefault(); if (target != null && DragDrop.GetAllowDrop(target)) @@ -19,7 +19,7 @@ namespace Avalonia.Input return null; } - private DragDropEffects RaiseDragEvent(Interactive? target, IInputRoot inputRoot, Point point, RoutedEvent routedEvent, DragDropEffects operation, IDataObject data, KeyModifiers modifiers) + private static DragDropEffects RaiseDragEvent(Interactive? target, IInputRoot inputRoot, Point point, RoutedEvent routedEvent, DragDropEffects operation, IDataObject data, KeyModifiers modifiers) { if (target == null) return DragDropEffects.None; @@ -40,22 +40,22 @@ namespace Avalonia.Input private DragDropEffects DragEnter(IInputRoot inputRoot, Point point, IDataObject data, DragDropEffects effects, KeyModifiers modifiers) { - _lastTarget = GetTarget(inputRoot, point); - return RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DragEnterEvent, effects, data, modifiers); + _lastTarget = DragDropDevice.GetTarget(inputRoot, point); + return DragDropDevice.RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DragEnterEvent, effects, data, modifiers); } private DragDropEffects DragOver(IInputRoot inputRoot, Point point, IDataObject data, DragDropEffects effects, KeyModifiers modifiers) { - var target = GetTarget(inputRoot, point); + var target = DragDropDevice.GetTarget(inputRoot, point); if (target == _lastTarget) - return RaiseDragEvent(target, inputRoot, point, DragDrop.DragOverEvent, effects, data, modifiers); + return DragDropDevice.RaiseDragEvent(target, inputRoot, point, DragDrop.DragOverEvent, effects, data, modifiers); try { if (_lastTarget != null) _lastTarget.RaiseEvent(new RoutedEventArgs(DragDrop.DragLeaveEvent)); - return RaiseDragEvent(target, inputRoot, point, DragDrop.DragEnterEvent, effects, data, modifiers); + return DragDropDevice.RaiseDragEvent(target, inputRoot, point, DragDrop.DragEnterEvent, effects, data, modifiers); } finally { @@ -81,7 +81,7 @@ namespace Avalonia.Input { try { - return RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DropEvent, effects, data, modifiers); + return DragDropDevice.RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DropEvent, effects, data, modifiers); } finally { diff --git a/src/Avalonia.Base/Input/KeyGesture.cs b/src/Avalonia.Base/Input/KeyGesture.cs index 1a6372d346..7f4f69590a 100644 --- a/src/Avalonia.Base/Input/KeyGesture.cs +++ b/src/Avalonia.Base/Input/KeyGesture.cs @@ -138,7 +138,7 @@ namespace Avalonia.Input public bool Matches(KeyEventArgs keyEvent) => keyEvent != null && keyEvent.KeyModifiers == KeyModifiers && - ResolveNumPadOperationKey(keyEvent.Key) == ResolveNumPadOperationKey(Key); + KeyGesture.ResolveNumPadOperationKey(keyEvent.Key) == KeyGesture.ResolveNumPadOperationKey(Key); // TODO: Move that to external key parser private static Key ParseKey(string key) @@ -166,7 +166,7 @@ namespace Avalonia.Input return EnumHelper.Parse(modifier.ToString(), true); } - private Key ResolveNumPadOperationKey(Key key) + private static Key ResolveNumPadOperationKey(Key key) { switch (key) { diff --git a/src/Avalonia.Base/Input/MouseDevice.cs b/src/Avalonia.Base/Input/MouseDevice.cs index 055c9cf1fd..6fb34efdb5 100644 --- a/src/Avalonia.Base/Input/MouseDevice.cs +++ b/src/Avalonia.Base/Input/MouseDevice.cs @@ -34,7 +34,7 @@ namespace Avalonia.Input ProcessRawEvent(margs); } - int ButtonCount(PointerPointProperties props) + static int ButtonCount(PointerPointProperties props) { var rv = 0; if (props.IsLeftButtonPressed) @@ -71,7 +71,7 @@ namespace Avalonia.Input case RawPointerEventType.MiddleButtonDown: case RawPointerEventType.XButton1Down: case RawPointerEventType.XButton2Down: - if (ButtonCount(props) > 1) + if (MouseDevice.ButtonCount(props) > 1) e.Handled = MouseMove(mouse, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.IntermediatePoints, e.InputHitTestResult); else e.Handled = MouseDown(mouse, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult); @@ -81,7 +81,7 @@ namespace Avalonia.Input case RawPointerEventType.MiddleButtonUp: case RawPointerEventType.XButton1Up: case RawPointerEventType.XButton2Up: - if (ButtonCount(props) != 0) + if (MouseDevice.ButtonCount(props) != 0) e.Handled = MouseMove(mouse, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.IntermediatePoints, e.InputHitTestResult); else e.Handled = MouseUp(mouse, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult); diff --git a/src/Avalonia.Base/Input/PenDevice.cs b/src/Avalonia.Base/Input/PenDevice.cs index f5f0e90a45..876be42be8 100644 --- a/src/Avalonia.Base/Input/PenDevice.cs +++ b/src/Avalonia.Base/Input/PenDevice.cs @@ -56,7 +56,7 @@ namespace Avalonia.Input e.Handled = PenUp(pointer, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult); break; case RawPointerEventType.Move: - e.Handled = PenMove(pointer, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult, e.IntermediatePoints); + e.Handled = PenDevice.PenMove(pointer, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult, e.IntermediatePoints); break; } @@ -98,7 +98,7 @@ namespace Avalonia.Input return false; } - private bool PenMove(Pointer pointer, ulong timestamp, + private static bool PenMove(Pointer pointer, ulong timestamp, IInputRoot root, Point p, PointerPointProperties properties, KeyModifiers inputModifiers, IInputElement? hitTest, Lazy?>? intermediatePoints) diff --git a/src/Avalonia.Base/Input/Pointer.cs b/src/Avalonia.Base/Input/Pointer.cs index 3012f07f6a..be93d9d6b8 100644 --- a/src/Avalonia.Base/Input/Pointer.cs +++ b/src/Avalonia.Base/Input/Pointer.cs @@ -19,7 +19,7 @@ namespace Avalonia.Input public int Id { get; } - IInputElement? FindCommonParent(IInputElement? control1, IInputElement? control2) + static IInputElement? FindCommonParent(IInputElement? control1, IInputElement? control2) { if (control1 == null || control2 == null) return null; @@ -41,7 +41,7 @@ namespace Avalonia.Input PlatformCapture(control); if (oldCapture != null) { - var commonParent = FindCommonParent(control, oldCapture); + var commonParent = Pointer.FindCommonParent(control, oldCapture); foreach (var notifyTarget in oldCapture.GetSelfAndVisualAncestors().OfType()) { if (notifyTarget == commonParent) diff --git a/src/Avalonia.Base/Input/TouchDevice.cs b/src/Avalonia.Base/Input/TouchDevice.cs index 1d5b1d6bbf..b709b7d0cd 100644 --- a/src/Avalonia.Base/Input/TouchDevice.cs +++ b/src/Avalonia.Base/Input/TouchDevice.cs @@ -20,7 +20,7 @@ namespace Avalonia.Input private Rect _lastClickRect; private ulong _lastClickTime; - RawInputModifiers GetModifiers(RawInputModifiers modifiers, bool isLeftButtonDown) + static RawInputModifiers GetModifiers(RawInputModifiers modifiers, bool isLeftButtonDown) { var rv = modifiers &= RawInputModifiers.KeyboardMask; if (isLeftButtonDown) @@ -73,7 +73,7 @@ namespace Avalonia.Input target.RaiseEvent(new PointerPressedEventArgs(target, pointer, args.Root, args.Position, ev.Timestamp, - new PointerPointProperties(GetModifiers(args.InputModifiers, true), updateKind), + new PointerPointProperties(TouchDevice.GetModifiers(args.InputModifiers, true), updateKind), keyModifier, _clickCount)); } @@ -84,7 +84,7 @@ namespace Avalonia.Input { target.RaiseEvent(new PointerReleasedEventArgs(target, pointer, args.Root, args.Position, ev.Timestamp, - new PointerPointProperties(GetModifiers(args.InputModifiers, false), updateKind), + new PointerPointProperties(TouchDevice.GetModifiers(args.InputModifiers, false), updateKind), keyModifier, MouseButton.Left)); } } @@ -100,7 +100,7 @@ namespace Avalonia.Input { target.RaiseEvent(new PointerEventArgs(InputElement.PointerMovedEvent, target, pointer, args.Root, args.Position, ev.Timestamp, - new PointerPointProperties(GetModifiers(args.InputModifiers, true), updateKind), + new PointerPointProperties(TouchDevice.GetModifiers(args.InputModifiers, true), updateKind), keyModifier, args.IntermediatePoints)); } } diff --git a/src/Avalonia.Base/Layout/AttachedLayout.cs b/src/Avalonia.Base/Layout/AttachedLayout.cs index ece8bbe805..594fc04842 100644 --- a/src/Avalonia.Base/Layout/AttachedLayout.cs +++ b/src/Avalonia.Base/Layout/AttachedLayout.cs @@ -67,7 +67,7 @@ namespace Avalonia.Layout { if (this is VirtualizingLayout virtualizingLayout) { - var virtualizingContext = GetVirtualizingLayoutContext(context); + var virtualizingContext = AttachedLayout.GetVirtualizingLayoutContext(context); virtualizingLayout.InitializeForContextCore(virtualizingContext); } else if (this is NonVirtualizingLayout nonVirtualizingLayout) @@ -92,7 +92,7 @@ namespace Avalonia.Layout { if (this is VirtualizingLayout virtualizingLayout) { - var virtualizingContext = GetVirtualizingLayoutContext(context); + var virtualizingContext = AttachedLayout.GetVirtualizingLayoutContext(context); virtualizingLayout.UninitializeForContextCore(virtualizingContext); } else if (this is NonVirtualizingLayout nonVirtualizingLayout) @@ -126,7 +126,7 @@ namespace Avalonia.Layout { if (this is VirtualizingLayout virtualizingLayout) { - var virtualizingContext = GetVirtualizingLayoutContext(context); + var virtualizingContext = AttachedLayout.GetVirtualizingLayoutContext(context); return virtualizingLayout.MeasureOverride(virtualizingContext, availableSize); } else if (this is NonVirtualizingLayout nonVirtualizingLayout) @@ -157,7 +157,7 @@ namespace Avalonia.Layout { if (this is VirtualizingLayout virtualizingLayout) { - var virtualizingContext = GetVirtualizingLayoutContext(context); + var virtualizingContext = AttachedLayout.GetVirtualizingLayoutContext(context); return virtualizingLayout.ArrangeOverride(virtualizingContext, finalSize); } else if (this is NonVirtualizingLayout nonVirtualizingLayout) @@ -184,7 +184,7 @@ namespace Avalonia.Layout /// protected void InvalidateArrange() => ArrangeInvalidated?.Invoke(this, EventArgs.Empty); - private VirtualizingLayoutContext GetVirtualizingLayoutContext(LayoutContext context) + private static VirtualizingLayoutContext GetVirtualizingLayoutContext(LayoutContext context) { if (context is VirtualizingLayoutContext virtualizingContext) { diff --git a/src/Avalonia.Base/Layout/StackLayout.cs b/src/Avalonia.Base/Layout/StackLayout.cs index e3c2ab3817..7983b37843 100644 --- a/src/Avalonia.Base/Layout/StackLayout.cs +++ b/src/Avalonia.Base/Layout/StackLayout.cs @@ -90,7 +90,7 @@ namespace Avalonia.Layout // Constants int itemsCount = context.ItemCount; var stackState = (StackLayoutState)context.LayoutState!; - double averageElementSize = GetAverageElementSize(availableSize, context, stackState) + Spacing; + double averageElementSize = StackLayout.GetAverageElementSize(availableSize, context, stackState) + Spacing; _orientation.SetMinorSize(ref extent, stackState.MaxArrangeBounds); _orientation.SetMajorSize(ref extent, Math.Max(0.0f, itemsCount * averageElementSize - Spacing)); @@ -178,7 +178,7 @@ namespace Avalonia.Layout { index = targetIndex; var state = (StackLayoutState)context.LayoutState!; - double averageElementSize = GetAverageElementSize(availableSize, context, state) + Spacing; + double averageElementSize = StackLayout.GetAverageElementSize(availableSize, context, state) + Spacing; offset = index * averageElementSize + _orientation.MajorStart(state.FlowAlgorithm.LastExtent); } @@ -237,7 +237,7 @@ namespace Avalonia.Layout var state = (StackLayoutState)context.LayoutState!; var lastExtent = state.FlowAlgorithm.LastExtent; - double averageElementSize = GetAverageElementSize(availableSize, context, state) + Spacing; + double averageElementSize = StackLayout.GetAverageElementSize(availableSize, context, state) + Spacing; double realizationWindowOffsetInExtent = _orientation.MajorStart(realizationRect) - _orientation.MajorStart(lastExtent); double majorSize = _orientation.MajorSize(lastExtent) == 0 ? Math.Max(0.0, averageElementSize * itemsCount - Spacing) : _orientation.MajorSize(lastExtent); if (itemsCount > 0 && @@ -335,7 +335,7 @@ namespace Avalonia.Layout InvalidateLayout(); } - private double GetAverageElementSize( + private static double GetAverageElementSize( Size availableSize, VirtualizingLayoutContext context, StackLayoutState stackLayoutState) diff --git a/src/Avalonia.Base/Layout/UniformGridLayout.cs b/src/Avalonia.Base/Layout/UniformGridLayout.cs index a7880a1545..acb333bcfa 100644 --- a/src/Avalonia.Base/Layout/UniformGridLayout.cs +++ b/src/Avalonia.Base/Layout/UniformGridLayout.cs @@ -432,7 +432,7 @@ namespace Avalonia.Layout var gridState = (UniformGridLayoutState)context.LayoutState!; gridState.EnsureElementSize(availableSize, context, _minItemWidth, _minItemHeight, _itemsStretch, Orientation, MinRowSpacing, MinColumnSpacing, _maximumRowsOrColumns); - var desiredSize = GetFlowAlgorithm(context).Measure( + var desiredSize = UniformGridLayout.GetFlowAlgorithm(context).Measure( availableSize, context, true, @@ -452,7 +452,7 @@ namespace Avalonia.Layout protected internal override Size ArrangeOverride(VirtualizingLayoutContext context, Size finalSize) { - var value = GetFlowAlgorithm(context).Arrange( + var value = UniformGridLayout.GetFlowAlgorithm(context).Arrange( finalSize, context, true, @@ -463,7 +463,7 @@ namespace Avalonia.Layout protected internal override void OnItemsChangedCore(VirtualizingLayoutContext context, object? source, NotifyCollectionChangedEventArgs args) { - GetFlowAlgorithm(context).OnItemsSourceChanged(source, args, context); + UniformGridLayout.GetFlowAlgorithm(context).OnItemsSourceChanged(source, args, context); // Always invalidate layout to keep the view accurate. InvalidateLayout(); @@ -557,6 +557,6 @@ namespace Avalonia.Layout private void InvalidateLayout() => InvalidateMeasure(); - private FlowLayoutAlgorithm GetFlowAlgorithm(VirtualizingLayoutContext context) => ((UniformGridLayoutState)context.LayoutState!).FlowAlgorithm; + private static FlowLayoutAlgorithm GetFlowAlgorithm(VirtualizingLayoutContext context) => ((UniformGridLayoutState)context.LayoutState!).FlowAlgorithm; } } diff --git a/src/Avalonia.Base/Platform/AssetLoader.cs b/src/Avalonia.Base/Platform/AssetLoader.cs index a74da2a178..77ae9f4c32 100644 --- a/src/Avalonia.Base/Platform/AssetLoader.cs +++ b/src/Avalonia.Base/Platform/AssetLoader.cs @@ -126,7 +126,7 @@ namespace Avalonia.Platform uri = uri.EnsureAbsolute(baseUri); if (uri.IsAvares()) { - var (asm, path) = GetResAsmAndPath(uri); + var (asm, path) = AssetLoader.GetResAsmAndPath(uri); if (asm == null) { throw new ArgumentException( @@ -171,7 +171,7 @@ namespace Avalonia.Platform if (uri.IsAvares()) { - var (asm, path) = GetResAsmAndPath(uri); + var (asm, path) = AssetLoader.GetResAsmAndPath(uri); if (asm.AvaloniaResources == null) return null; asm.AvaloniaResources.TryGetValue(path, out var desc); @@ -181,7 +181,7 @@ namespace Avalonia.Platform throw new ArgumentException($"Unsupported url type: " + uri.Scheme, nameof(uri)); } - private (IAssemblyDescriptor asm, string path) GetResAsmAndPath(Uri uri) + private static (IAssemblyDescriptor asm, string path) GetResAsmAndPath(Uri uri) { var asm = s_assemblyDescriptorResolver.GetAssembly(uri.Authority); return (asm, uri.GetUnescapeAbsolutePath()); @@ -194,7 +194,7 @@ namespace Avalonia.Platform if (!uri.IsAbsoluteUri) return null; if (uri.IsAvares()) - return GetResAsmAndPath(uri).asm; + return AssetLoader.GetResAsmAndPath(uri).asm; if (uri.IsResm()) { diff --git a/src/Avalonia.Base/Rendering/Composition/Animations/KeyFrameAnimationInstance.cs b/src/Avalonia.Base/Rendering/Composition/Animations/KeyFrameAnimationInstance.cs index e20a4a9ad8..2b395f54af 100644 --- a/src/Avalonia.Base/Rendering/Composition/Animations/KeyFrameAnimationInstance.cs +++ b/src/Avalonia.Base/Rendering/Composition/Animations/KeyFrameAnimationInstance.cs @@ -87,7 +87,7 @@ namespace Avalonia.Rendering.Composition.Animations if (elapsed < _delayTime) { if (_delayBehavior == AnimationDelayBehavior.SetInitialValueBeforeDelay) - return ExpressionVariant.Create(GetKeyFrame(ref ctx, _keyFrames[0])); + return ExpressionVariant.Create(KeyFrameAnimationInstance.GetKeyFrame(ref ctx, _keyFrames[0])); return currentValue; } @@ -95,7 +95,7 @@ namespace Avalonia.Rendering.Composition.Animations var iterationNumber = elapsed.Ticks / _duration.Ticks; if (_iterationBehavior == AnimationIterationBehavior.Count && iterationNumber >= _iterationCount) - return ExpressionVariant.Create(GetKeyFrame(ref ctx, _keyFrames[_keyFrames.Length - 1])); + return ExpressionVariant.Create(KeyFrameAnimationInstance.GetKeyFrame(ref ctx, _keyFrames[_keyFrames.Length - 1])); var evenIterationNumber = iterationNumber % 2 == 0; @@ -124,7 +124,7 @@ namespace Avalonia.Rendering.Composition.Animations { // this is the last frame if (c == _keyFrames.Length - 1) - return ExpressionVariant.Create(GetKeyFrame(ref ctx, kf)); + return ExpressionVariant.Create(KeyFrameAnimationInstance.GetKeyFrame(ref ctx, kf)); left = kf; right = _keyFrames[c + 1]; @@ -139,13 +139,13 @@ namespace Avalonia.Rendering.Composition.Animations return currentValue; return ExpressionVariant.Create(_interpolator.Interpolate( - GetKeyFrame(ref ctx, left), - GetKeyFrame(ref ctx, right), + KeyFrameAnimationInstance.GetKeyFrame(ref ctx, left), + KeyFrameAnimationInstance.GetKeyFrame(ref ctx, right), easedKeyProgress )); } - T GetKeyFrame(ref ExpressionEvaluationContext ctx, ServerKeyFrame f) + static T GetKeyFrame(ref ExpressionEvaluationContext ctx, ServerKeyFrame f) { if (f.Expression != null) return f.Expression.Evaluate(ref ctx).CastOrDefault(); diff --git a/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs b/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs index 98a6a3600e..3c9a9feac0 100644 --- a/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs +++ b/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs @@ -124,7 +124,7 @@ public class CompositingRenderer : IRendererWithCompositor QueueUpdate(); } - private void SyncChildren(Visual v) + private static void SyncChildren(Visual v) { //TODO: Optimize by moving that logic to Visual itself if(v.CompositionVisual == null) @@ -233,11 +233,11 @@ public class CompositingRenderer : IRendererWithCompositor visual.Render(_recordingContext); comp.DrawList = _recorder.EndUpdate(); - SyncChildren(visual); + CompositingRenderer.SyncChildren(visual); } foreach(var v in _recalculateChildren) if (!_dirty.Contains(v)) - SyncChildren(v); + CompositingRenderer.SyncChildren(v); _dirty.Clear(); _recalculateChildren.Clear(); CompositionTarget.Size = _root.ClientSize; diff --git a/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs b/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs index d8a608651b..52215e8011 100644 --- a/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs +++ b/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs @@ -53,7 +53,7 @@ namespace Avalonia.Rendering.Composition var m = Matrix.Identity; while (v != null) { - if (!TryGetInvertedTransform(v, out var cm)) + if (!CompositionTarget.TryGetInvertedTransform(v, out var cm)) return null; m = m * cm; v = v.Parent; @@ -62,7 +62,7 @@ namespace Avalonia.Rendering.Composition return point * m; } - bool TryGetInvertedTransform(CompositionVisual visual, out Matrix matrix) + static bool TryGetInvertedTransform(CompositionVisual visual, out Matrix matrix) { var m = visual.TryGetServerGlobalTransform(); if (m == null) @@ -78,7 +78,7 @@ namespace Avalonia.Rendering.Composition bool TryTransformTo(CompositionVisual visual, Point globalPoint, out Point v) { v = default; - if (TryGetInvertedTransform(visual, out var m)) + if (CompositionTarget.TryGetInvertedTransform(visual, out var m)) { v = globalPoint * m; return true; diff --git a/src/Avalonia.Base/Rendering/Composition/Drawing/CompositionDrawingContext.cs b/src/Avalonia.Base/Rendering/Composition/Drawing/CompositionDrawingContext.cs index 30b57883fc..c02eb5687f 100644 --- a/src/Avalonia.Base/Rendering/Composition/Drawing/CompositionDrawingContext.cs +++ b/src/Avalonia.Base/Rendering/Composition/Drawing/CompositionDrawingContext.cs @@ -55,7 +55,7 @@ internal class CompositionDrawingContext : IDrawingContextImpl, IDrawingContextW if (next == null || !next.Item.Equals(Transform, brush, pen, geometry)) { - Add(new GeometryNode(Transform, brush, pen, geometry, CreateChildScene(brush))); + Add(new GeometryNode(Transform, brush, pen, geometry, CompositionDrawingContext.CreateChildScene(brush))); } else { @@ -94,7 +94,7 @@ internal class CompositionDrawingContext : IDrawingContextImpl, IDrawingContextW if (next == null || !next.Item.Equals(Transform, pen, p1, p2)) { - Add(new LineNode(Transform, pen, p1, p2, CreateChildScene(pen.Brush))); + Add(new LineNode(Transform, pen, p1, p2, CompositionDrawingContext.CreateChildScene(pen.Brush))); } else { @@ -110,7 +110,7 @@ internal class CompositionDrawingContext : IDrawingContextImpl, IDrawingContextW if (next == null || !next.Item.Equals(Transform, brush, pen, rect, boxShadows)) { - Add(new RectangleNode(Transform, brush, pen, rect, boxShadows, CreateChildScene(brush))); + Add(new RectangleNode(Transform, brush, pen, rect, boxShadows, CompositionDrawingContext.CreateChildScene(brush))); } else { @@ -139,7 +139,7 @@ internal class CompositionDrawingContext : IDrawingContextImpl, IDrawingContextW if (next == null || !next.Item.Equals(Transform, brush, pen, rect)) { - Add(new EllipseNode(Transform, brush, pen, rect, CreateChildScene(brush))); + Add(new EllipseNode(Transform, brush, pen, rect, CompositionDrawingContext.CreateChildScene(brush))); } else { @@ -165,7 +165,7 @@ internal class CompositionDrawingContext : IDrawingContextImpl, IDrawingContextW if (next == null || !next.Item.Equals(Transform, foreground, glyphRun)) { - Add(new GlyphRunNode(Transform, foreground, glyphRun, CreateChildScene(foreground))); + Add(new GlyphRunNode(Transform, foreground, glyphRun, CompositionDrawingContext.CreateChildScene(foreground))); } else @@ -324,7 +324,7 @@ internal class CompositionDrawingContext : IDrawingContextImpl, IDrawingContextW if (next == null || !next.Item.Equals(mask, bounds)) { - Add(new OpacityMaskNode(mask, bounds, CreateChildScene(mask))); + Add(new OpacityMaskNode(mask, bounds, CompositionDrawingContext.CreateChildScene(mask))); } else { @@ -368,7 +368,7 @@ internal class CompositionDrawingContext : IDrawingContextImpl, IDrawingContextW : null; } - private IDisposable? CreateChildScene(IBrush? brush) + private static IDisposable? CreateChildScene(IBrush? brush) { if (brush is VisualBrush visualBrush) { diff --git a/src/Avalonia.Base/Rendering/DeferredRenderer.cs b/src/Avalonia.Base/Rendering/DeferredRenderer.cs index 4236763e3b..1eefa5a177 100644 --- a/src/Avalonia.Base/Rendering/DeferredRenderer.cs +++ b/src/Avalonia.Base/Rendering/DeferredRenderer.cs @@ -272,18 +272,18 @@ namespace Avalonia.Rendering } } - Scene? TryGetChildScene(IRef? op) => (op?.Item as BrushDrawOperation)?.Aux as Scene; + static Scene? TryGetChildScene(IRef? op) => (op?.Item as BrushDrawOperation)?.Aux as Scene; /// Size IVisualBrushRenderer.GetRenderTargetSize(IVisualBrush brush) { - return TryGetChildScene(_currentDraw)?.Size ?? Size.Empty; + return DeferredRenderer.TryGetChildScene(_currentDraw)?.Size ?? Size.Empty; } /// void IVisualBrushRenderer.RenderVisualBrush(IDrawingContextImpl context, IVisualBrush brush) { - var childScene = TryGetChildScene(_currentDraw); + var childScene = DeferredRenderer.TryGetChildScene(_currentDraw); if (childScene != null) { diff --git a/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs b/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs index 0ceb44ed75..a34cce8796 100644 --- a/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs +++ b/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs @@ -18,7 +18,7 @@ namespace Avalonia.Rendering.SceneGraph _ = scene ?? throw new ArgumentNullException(nameof(scene)); Dispatcher.UIThread.VerifyAccess(); - UpdateSize(scene); + SceneBuilder.UpdateSize(scene); scene.Layers.GetOrAdd(scene.Root.Visual); using (var impl = new DeferredDrawingContextImpl(this, scene.Layers)) @@ -46,7 +46,7 @@ namespace Avalonia.Rendering.SceneGraph if (visual == scene.Root.Visual) { - UpdateSize(scene); + SceneBuilder.UpdateSize(scene); } if (visual.VisualRoot == scene.Root.Visual) @@ -318,7 +318,7 @@ namespace Avalonia.Rendering.SceneGraph } } - private void UpdateSize(Scene scene) + private static void UpdateSize(Scene scene) { var renderRoot = scene.Root.Visual as IRenderRoot; var newSize = renderRoot?.ClientSize ?? scene.Root.Visual.Bounds.Size; From ee84a8c7fd242a76353aad24d83d483d344f6b83 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:08:25 +0200 Subject: [PATCH 05/97] feat(Controls): Address rule CA1822 --- .../Automation/Peers/ComboBoxAutomationPeer.cs | 8 ++++---- .../Calendar/CalendarBlackoutDatesCollection.cs | 10 +++++----- .../Calendar/SelectedDatesCollection.cs | 10 +++++----- src/Avalonia.Controls/ComboBox.cs | 8 ++++---- .../DateTimePickers/DateTimePickerPanel.cs | 6 +++--- src/Avalonia.Controls/Grid.cs | 6 +++--- src/Avalonia.Controls/GridSplitter.cs | 16 ++++++++-------- .../Platform/InProcessDragSource.cs | 4 ++-- .../Presenters/ScrollContentPresenter.cs | 8 ++++---- src/Avalonia.Controls/Primitives/AdornerLayer.cs | 4 ++-- src/Avalonia.Controls/Primitives/Popup.cs | 4 ++-- src/Avalonia.Controls/Repeater/RecyclePool.cs | 10 +++++----- .../Repeater/RecyclingElementFactory.cs | 4 ++-- src/Avalonia.Controls/SplitView.cs | 6 +++--- src/Avalonia.Controls/TextBox.cs | 10 +++++----- src/Avalonia.Controls/TopLevel.cs | 4 ++-- src/Avalonia.Controls/TreeView.cs | 6 +++--- src/Avalonia.Controls/UserControl.cs | 1 - 18 files changed, 62 insertions(+), 63 deletions(-) diff --git a/src/Avalonia.Controls/Automation/Peers/ComboBoxAutomationPeer.cs b/src/Avalonia.Controls/Automation/Peers/ComboBoxAutomationPeer.cs index 5ff291d972..d6295fdbd9 100644 --- a/src/Avalonia.Controls/Automation/Peers/ComboBoxAutomationPeer.cs +++ b/src/Avalonia.Controls/Automation/Peers/ComboBoxAutomationPeer.cs @@ -18,7 +18,7 @@ namespace Avalonia.Automation.Peers public new ComboBox Owner => (ComboBox)base.Owner; - public ExpandCollapseState ExpandCollapseState => ToState(Owner.IsDropDownOpen); + public ExpandCollapseState ExpandCollapseState => ComboBoxAutomationPeer.ToState(Owner.IsDropDownOpen); public bool ShowsMenu => true; public void Collapse() => Owner.IsDropDownOpen = false; public void Expand() => Owner.IsDropDownOpen = true; @@ -66,12 +66,12 @@ namespace Avalonia.Automation.Peers { RaisePropertyChangedEvent( ExpandCollapsePatternIdentifiers.ExpandCollapseStateProperty, - ToState((bool)e.OldValue!), - ToState((bool)e.NewValue!)); + ComboBoxAutomationPeer.ToState((bool)e.OldValue!), + ComboBoxAutomationPeer.ToState((bool)e.NewValue!)); } } - private ExpandCollapseState ToState(bool value) + private static ExpandCollapseState ToState(bool value) { return value ? ExpandCollapseState.Expanded : ExpandCollapseState.Collapsed; } diff --git a/src/Avalonia.Controls/Calendar/CalendarBlackoutDatesCollection.cs b/src/Avalonia.Controls/Calendar/CalendarBlackoutDatesCollection.cs index a92feec509..61463795ee 100644 --- a/src/Avalonia.Controls/Calendar/CalendarBlackoutDatesCollection.cs +++ b/src/Avalonia.Controls/Calendar/CalendarBlackoutDatesCollection.cs @@ -122,7 +122,7 @@ namespace Avalonia.Controls.Primitives /// protected override void ClearItems() { - EnsureValidThread(); + CalendarBlackoutDatesCollection.EnsureValidThread(); base.ClearItems(); _owner.UpdateMonths(); @@ -140,7 +140,7 @@ namespace Avalonia.Controls.Primitives /// protected override void InsertItem(int index, CalendarDateRange item) { - EnsureValidThread(); + CalendarBlackoutDatesCollection.EnsureValidThread(); if (!IsValid(item)) { @@ -162,7 +162,7 @@ namespace Avalonia.Controls.Primitives /// protected override void RemoveItem(int index) { - EnsureValidThread(); + CalendarBlackoutDatesCollection.EnsureValidThread(); base.RemoveItem(index); _owner.UpdateMonths(); @@ -182,7 +182,7 @@ namespace Avalonia.Controls.Primitives /// protected override void SetItem(int index, CalendarDateRange item) { - EnsureValidThread(); + CalendarBlackoutDatesCollection.EnsureValidThread(); if (!IsValid(item)) { @@ -206,7 +206,7 @@ namespace Avalonia.Controls.Primitives return true; } - private void EnsureValidThread() + private static void EnsureValidThread() { Dispatcher.UIThread.VerifyAccess(); } diff --git a/src/Avalonia.Controls/Calendar/SelectedDatesCollection.cs b/src/Avalonia.Controls/Calendar/SelectedDatesCollection.cs index 211b5edb0d..8327442fcf 100644 --- a/src/Avalonia.Controls/Calendar/SelectedDatesCollection.cs +++ b/src/Avalonia.Controls/Calendar/SelectedDatesCollection.cs @@ -133,7 +133,7 @@ namespace Avalonia.Controls.Primitives /// protected override void ClearItems() { - EnsureValidThread(); + SelectedDatesCollection.EnsureValidThread(); Collection addedItems = new Collection(); Collection removedItems = new Collection(); @@ -170,7 +170,7 @@ namespace Avalonia.Controls.Primitives /// protected override void InsertItem(int index, DateTime item) { - EnsureValidThread(); + SelectedDatesCollection.EnsureValidThread(); if (!Contains(item)) { @@ -233,7 +233,7 @@ namespace Avalonia.Controls.Primitives /// protected override void RemoveItem(int index) { - EnsureValidThread(); + SelectedDatesCollection.EnsureValidThread(); if (index >= Count) { @@ -284,7 +284,7 @@ namespace Avalonia.Controls.Primitives /// protected override void SetItem(int index, DateTime item) { - EnsureValidThread(); + SelectedDatesCollection.EnsureValidThread(); if (!Contains(item)) { @@ -353,7 +353,7 @@ namespace Avalonia.Controls.Primitives return true; } - private void EnsureValidThread() + private static void EnsureValidThread() { Dispatcher.UIThread.VerifyAccess(); } diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs index 54196bdf1a..21918b27a8 100644 --- a/src/Avalonia.Controls/ComboBox.cs +++ b/src/Avalonia.Controls/ComboBox.cs @@ -236,7 +236,7 @@ namespace Avalonia.Controls else if (IsDropDownOpen && SelectedIndex < 0 && ItemCount > 0 && (e.Key == Key.Up || e.Key == Key.Down) && IsFocused == true) { - var firstChild = Presenter?.Panel?.Children.FirstOrDefault(c => CanFocus(c)); + var firstChild = Presenter?.Panel?.Children.FirstOrDefault(c => ComboBox.CanFocus(c)); if (firstChild != null) { FocusManager.Instance?.Focus(firstChild, NavigationMethod.Directional); @@ -341,7 +341,7 @@ namespace Avalonia.Controls { _subscriptionsOnOpen.Clear(); - if (CanFocus(this)) + if (ComboBox.CanFocus(this)) { Focus(); } @@ -403,14 +403,14 @@ namespace Avalonia.Controls container = ItemContainerGenerator.ContainerFromIndex(selectedIndex); } - if (container != null && CanFocus(container)) + if (container != null && ComboBox.CanFocus(container)) { container.Focus(); } } } - private bool CanFocus(IControl control) => control.Focusable && control.IsEffectivelyEnabled && control.IsVisible; + private static bool CanFocus(IControl control) => control.Focusable && control.IsEffectivelyEnabled && control.IsVisible; private void UpdateSelectionBoxItem(object? item) { diff --git a/src/Avalonia.Controls/DateTimePickers/DateTimePickerPanel.cs b/src/Avalonia.Controls/DateTimePickers/DateTimePickerPanel.cs index 3fdfbee54d..eb4a7391b0 100644 --- a/src/Avalonia.Controls/DateTimePickers/DateTimePickerPanel.cs +++ b/src/Avalonia.Controls/DateTimePickers/DateTimePickerPanel.cs @@ -545,8 +545,8 @@ namespace Avalonia.Controls.Primitives private void OnItemTapped(object? sender, TappedEventArgs e) { - if (e.Source is IVisual source && - GetItemFromSource(source) is ListBoxItem listBoxItem && + if (e.Source is IVisual source && + DateTimePickerPanel.GetItemFromSource(source) is ListBoxItem listBoxItem && listBoxItem.Tag is int tag) { SelectedValue = tag; @@ -555,7 +555,7 @@ namespace Avalonia.Controls.Primitives } //Helper to get ListBoxItem from pointerevent source - private ListBoxItem? GetItemFromSource(IVisual src) + private static ListBoxItem? GetItemFromSource(IVisual src) { var item = src; while (item != null && !(item is ListBoxItem)) diff --git a/src/Avalonia.Controls/Grid.cs b/src/Avalonia.Controls/Grid.cs index 8d246d35f4..4dc88fec6a 100644 --- a/src/Avalonia.Controls/Grid.cs +++ b/src/Avalonia.Controls/Grid.cs @@ -1117,7 +1117,7 @@ namespace Avalonia.Controls else { // otherwise... - cellMeasureWidth = GetMeasureSizeForRange( + cellMeasureWidth = Grid.GetMeasureSizeForRange( DefinitionsU, PrivateCells[cell].ColumnIndex, PrivateCells[cell].ColumnSpan); @@ -1137,7 +1137,7 @@ namespace Avalonia.Controls } else { - cellMeasureHeight = GetMeasureSizeForRange( + cellMeasureHeight = Grid.GetMeasureSizeForRange( DefinitionsV, PrivateCells[cell].RowIndex, PrivateCells[cell].RowSpan); @@ -1165,7 +1165,7 @@ namespace Avalonia.Controls /// /// For "Auto" definitions MinWidth is used in place of PreferredSize. /// - private double GetMeasureSizeForRange( + private static double GetMeasureSizeForRange( IReadOnlyList definitions, int start, int count) diff --git a/src/Avalonia.Controls/GridSplitter.cs b/src/Avalonia.Controls/GridSplitter.cs index 85dad894fd..1a4736fa92 100644 --- a/src/Avalonia.Controls/GridSplitter.cs +++ b/src/Avalonia.Controls/GridSplitter.cs @@ -288,13 +288,13 @@ namespace Avalonia.Controls _resizeData.Definition1 = GetGridDefinition(_resizeData.Grid, index1, _resizeData.ResizeDirection); _resizeData.OriginalDefinition1Length = _resizeData.Definition1.UserSizeValueCache; // Save Size if user cancels. - _resizeData.OriginalDefinition1ActualLength = GetActualLength(_resizeData.Definition1); + _resizeData.OriginalDefinition1ActualLength = GridSplitter.GetActualLength(_resizeData.Definition1); _resizeData.Definition2Index = index2; _resizeData.Definition2 = GetGridDefinition(_resizeData.Grid, index2, _resizeData.ResizeDirection); _resizeData.OriginalDefinition2Length = _resizeData.Definition2.UserSizeValueCache; // Save Size if user cancels. - _resizeData.OriginalDefinition2ActualLength = GetActualLength(_resizeData.Definition2); + _resizeData.OriginalDefinition2ActualLength = GridSplitter.GetActualLength(_resizeData.Definition2); // Determine how to resize the columns. bool isStar1 = IsStar(_resizeData.Definition1); @@ -516,7 +516,7 @@ namespace Avalonia.Controls /// /// Retrieves the ActualWidth or ActualHeight of the definition depending on its type Column or Row. /// - private double GetActualLength(DefinitionBase definition) + private static double GetActualLength(DefinitionBase definition) { var column = definition as ColumnDefinition; @@ -537,11 +537,11 @@ namespace Avalonia.Controls /// private void GetDeltaConstraints(out double minDelta, out double maxDelta) { - double definition1Len = GetActualLength(_resizeData!.Definition1!); + double definition1Len = GridSplitter.GetActualLength(_resizeData!.Definition1!); double definition1Min = _resizeData.Definition1!.UserMinSizeValueCache; double definition1Max = _resizeData.Definition1.UserMaxSizeValueCache; - double definition2Len = GetActualLength(_resizeData.Definition2!); + double definition2Len = GridSplitter.GetActualLength(_resizeData.Definition2!); double definition2Min = _resizeData.Definition2!.UserMinSizeValueCache; double definition2Max = _resizeData.Definition2.UserMaxSizeValueCache; @@ -590,7 +590,7 @@ namespace Avalonia.Controls } else if (IsStar(definition)) { - SetDefinitionLength(definition, new GridLength(GetActualLength(definition), GridUnitType.Star)); + SetDefinitionLength(definition, new GridLength(GridSplitter.GetActualLength(definition), GridUnitType.Star)); } } } @@ -629,8 +629,8 @@ namespace Avalonia.Controls if (definition1 != null && definition2 != null) { - double actualLength1 = GetActualLength(definition1); - double actualLength2 = GetActualLength(definition2); + double actualLength1 = GridSplitter.GetActualLength(definition1); + double actualLength2 = GridSplitter.GetActualLength(definition2); double pixelLength = 1 / _resizeData.Scaling; double epsilon = pixelLength + LayoutHelper.LayoutEpsilon; diff --git a/src/Avalonia.Controls/Platform/InProcessDragSource.cs b/src/Avalonia.Controls/Platform/InProcessDragSource.cs index 209d5f03dc..e107d2c217 100644 --- a/src/Avalonia.Controls/Platform/InProcessDragSource.cs +++ b/src/Avalonia.Controls/Platform/InProcessDragSource.cs @@ -64,12 +64,12 @@ namespace Avalonia.Platform var tl = root.GetSelfAndVisualAncestors().OfType().FirstOrDefault(); tl?.PlatformImpl?.Input?.Invoke(rawEvent); - var effect = GetPreferredEffect(rawEvent.Effects & _allowedEffects, modifiers); + var effect = InProcessDragSource.GetPreferredEffect(rawEvent.Effects & _allowedEffects, modifiers); UpdateCursor(root, effect); return effect; } - private DragDropEffects GetPreferredEffect(DragDropEffects effect, RawInputModifiers modifiers) + private static DragDropEffects GetPreferredEffect(DragDropEffects effect, RawInputModifiers modifiers) { if (effect == DragDropEffects.Copy || effect == DragDropEffects.Move || effect == DragDropEffects.Link || effect == DragDropEffects.None) return effect; // No need to check for the modifiers. diff --git a/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs b/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs index c526b7ac49..e5bf924120 100644 --- a/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs +++ b/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs @@ -295,7 +295,7 @@ namespace Avalonia.Controls.Presenters // arrange then that change wasn't just due to scrolling (as scrolling doesn't adjust // relative positions within Child). if (_anchorElement != null && - TranslateBounds(_anchorElement, Child!, out var updatedBounds) && + ScrollContentPresenter.TranslateBounds(_anchorElement, Child!, out var updatedBounds) && updatedBounds.Position != _anchorElementBounds.Position) { var offset = updatedBounds.Position - _anchorElementBounds.Position; @@ -588,7 +588,7 @@ namespace Avalonia.Controls.Presenters private bool GetViewportBounds(IControl element, out Rect bounds) { - if (TranslateBounds(element, Child!, out var childBounds)) + if (ScrollContentPresenter.TranslateBounds(element, Child!, out var childBounds)) { // We want the bounds relative to the new Offset, regardless of whether the child // control has actually been arranged to this offset yet, so translate first to the @@ -605,7 +605,7 @@ namespace Avalonia.Controls.Presenters private Rect TranslateBounds(IControl control, IControl to) { - if (TranslateBounds(control, to, out var bounds)) + if (ScrollContentPresenter.TranslateBounds(control, to, out var bounds)) { return bounds; } @@ -613,7 +613,7 @@ namespace Avalonia.Controls.Presenters throw new InvalidOperationException("The control's bounds could not be translated to the requested control."); } - private bool TranslateBounds(IControl control, IControl to, out Rect bounds) + private static bool TranslateBounds(IControl control, IControl to, out Rect bounds) { if (!control.IsVisible) { diff --git a/src/Avalonia.Controls/Primitives/AdornerLayer.cs b/src/Avalonia.Controls/Primitives/AdornerLayer.cs index d557424fbb..12a17b8c9f 100644 --- a/src/Avalonia.Controls/Primitives/AdornerLayer.cs +++ b/src/Avalonia.Controls/Primitives/AdornerLayer.cs @@ -211,7 +211,7 @@ namespace Avalonia.Controls.Primitives { child.RenderTransform = new MatrixTransform(info.Bounds.Value.Transform); child.RenderTransformOrigin = new RelativePoint(new Point(0, 0), RelativeUnit.Absolute); - UpdateClip(child, info.Bounds.Value, isClipEnabled); + AdornerLayer.UpdateClip(child, info.Bounds.Value, isClipEnabled); child.Arrange(info.Bounds.Value.Bounds); } else @@ -232,7 +232,7 @@ namespace Avalonia.Controls.Primitives layer?.UpdateAdornedElement(adorner, adorned); } - private void UpdateClip(IControl control, TransformedBounds bounds, bool isEnabled) + private static void UpdateClip(IControl control, TransformedBounds bounds, bool isEnabled) { if (!isEnabled) { diff --git a/src/Avalonia.Controls/Primitives/Popup.cs b/src/Avalonia.Controls/Primitives/Popup.cs index ccb81ba276..581a65f6b9 100644 --- a/src/Avalonia.Controls/Primitives/Popup.cs +++ b/src/Avalonia.Controls/Primitives/Popup.cs @@ -475,7 +475,7 @@ namespace Avalonia.Controls.Primitives _openState = new PopupOpenState(placementTarget, topLevel, popupHost, cleanupPopup); - WindowManagerAddShadowHintChanged(popupHost, WindowManagerAddShadowHint); + Popup.WindowManagerAddShadowHintChanged(popupHost, WindowManagerAddShadowHint); popupHost.Show(); @@ -639,7 +639,7 @@ namespace Avalonia.Controls.Primitives return Disposable.Create((unsubscribe, target, handler), state => state.unsubscribe(state.target, state.handler)); } - private void WindowManagerAddShadowHintChanged(IPopupHost host, bool hint) + private static void WindowManagerAddShadowHintChanged(IPopupHost host, bool hint) { if(host is PopupRoot pr && pr.PlatformImpl is not null) { diff --git a/src/Avalonia.Controls/Repeater/RecyclePool.cs b/src/Avalonia.Controls/Repeater/RecyclePool.cs index cf2b40836e..9d6ad37721 100644 --- a/src/Avalonia.Controls/Repeater/RecyclePool.cs +++ b/src/Avalonia.Controls/Repeater/RecyclePool.cs @@ -32,7 +32,7 @@ namespace Avalonia.Controls public void PutElement(IControl element, string key, IControl? owner) { - var ownerAsPanel = EnsureOwnerIsPanelOrNull(owner); + var ownerAsPanel = RecyclePool.EnsureOwnerIsPanelOrNull(owner); var elementInfo = new ElementInfo(element, ownerAsPanel); if (!_elements.TryGetValue(key, out var pool)) @@ -56,7 +56,7 @@ namespace Avalonia.Controls var elementInfo = elements.FirstOrDefault(x => x.Owner == owner) ?? elements.LastOrDefault(); elements.Remove(elementInfo!); - var ownerAsPanel = EnsureOwnerIsPanelOrNull(owner); + var ownerAsPanel = RecyclePool.EnsureOwnerIsPanelOrNull(owner); if (elementInfo!.Owner != null && elementInfo.Owner != ownerAsPanel) { // Element is still under its parent. remove it from its parent. @@ -80,10 +80,10 @@ namespace Avalonia.Controls return null; } - internal string GetReuseKey(IControl element) => ((Control)element).GetValue(ReuseKeyProperty); - internal void SetReuseKey(IControl element, string value) => ((Control)element).SetValue(ReuseKeyProperty, value); + internal static string GetReuseKey(IControl element) => ((Control)element).GetValue(ReuseKeyProperty); + internal static void SetReuseKey(IControl element, string value) => ((Control)element).SetValue(ReuseKeyProperty, value); - private IPanel? EnsureOwnerIsPanelOrNull(IControl? owner) + private static IPanel? EnsureOwnerIsPanelOrNull(IControl? owner) { if (owner is IPanel panel) { diff --git a/src/Avalonia.Controls/Repeater/RecyclingElementFactory.cs b/src/Avalonia.Controls/Repeater/RecyclingElementFactory.cs index c1baa66433..1258c58324 100644 --- a/src/Avalonia.Controls/Repeater/RecyclingElementFactory.cs +++ b/src/Avalonia.Controls/Repeater/RecyclingElementFactory.cs @@ -72,7 +72,7 @@ namespace Avalonia.Controls element = dataTemplate.Build(args.Data)!; // Associate ReuseKey with element - RecyclePool.SetReuseKey(element, templateKey); + Avalonia.Controls.RecyclePool.SetReuseKey(element, templateKey); } return element; @@ -81,7 +81,7 @@ namespace Avalonia.Controls protected override void RecycleElementCore(ElementFactoryRecycleArgs args) { var element = args.Element!; - var key = RecyclePool.GetReuseKey(element); + var key = Avalonia.Controls.RecyclePool.GetReuseKey(element); RecyclePool.PutElement(element, key, args.Parent); } diff --git a/src/Avalonia.Controls/SplitView.cs b/src/Avalonia.Controls/SplitView.cs index c344dd795d..2d735a2cbb 100644 --- a/src/Avalonia.Controls/SplitView.cs +++ b/src/Avalonia.Controls/SplitView.cs @@ -431,7 +431,7 @@ namespace Avalonia.Controls } } - private string GetPseudoClass(SplitViewDisplayMode mode) + private static string GetPseudoClass(SplitViewDisplayMode mode) { return mode switch { @@ -463,8 +463,8 @@ namespace Avalonia.Controls private void OnDisplayModeChanged(AvaloniaPropertyChangedEventArgs e) { - var oldState = GetPseudoClass(e.GetOldValue()); - var newState = GetPseudoClass(e.GetNewValue()); + var oldState = SplitView.GetPseudoClass(e.GetOldValue()); + var newState = SplitView.GetPseudoClass(e.GetNewValue()); PseudoClasses.Remove($":{oldState}"); PseudoClasses.Add($":{newState}"); diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index da4e90fb66..0ac57c9233 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -397,9 +397,9 @@ namespace Avalonia.Controls var selectionStart = SelectionStart; var selectionEnd = SelectionEnd; - CaretIndex = CoerceCaretIndex(caretIndex, value); - SelectionStart = CoerceCaretIndex(selectionStart, value); - SelectionEnd = CoerceCaretIndex(selectionEnd, value); + CaretIndex = TextBox.CoerceCaretIndex(caretIndex, value); + SelectionStart = TextBox.CoerceCaretIndex(selectionStart, value); + SelectionEnd = TextBox.CoerceCaretIndex(selectionEnd, value); var textChanged = SetAndRaise(TextProperty, ref _text, value); @@ -1380,9 +1380,9 @@ namespace Avalonia.Controls } } - private int CoerceCaretIndex(int value) => CoerceCaretIndex(value, Text); + private int CoerceCaretIndex(int value) => TextBox.CoerceCaretIndex(value, Text); - private int CoerceCaretIndex(int value, string? text) + private static int CoerceCaretIndex(int value, string? text) { if (text == null) { diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 47fc9d7988..9fad9824df 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -429,7 +429,7 @@ namespace Avalonia.Controls LayoutHelper.InvalidateSelfAndChildrenMeasure(this); } - private bool TransparencyLevelsMatch (WindowTransparencyLevel requested, WindowTransparencyLevel received) + private static bool TransparencyLevelsMatch (WindowTransparencyLevel requested, WindowTransparencyLevel received) { if(requested == received) { @@ -449,7 +449,7 @@ namespace Avalonia.Controls { if(transparencyLevel == WindowTransparencyLevel.None || TransparencyLevelHint == WindowTransparencyLevel.None || - !TransparencyLevelsMatch(TransparencyLevelHint, transparencyLevel)) + !TopLevel.TransparencyLevelsMatch(TransparencyLevelHint, transparencyLevel)) { _transparencyFallbackBorder.Background = TransparencyBackgroundFallback; } diff --git a/src/Avalonia.Controls/TreeView.cs b/src/Avalonia.Controls/TreeView.cs index d78f9c82ef..be30792cc8 100644 --- a/src/Avalonia.Controls/TreeView.cs +++ b/src/Avalonia.Controls/TreeView.cs @@ -284,7 +284,7 @@ namespace Avalonia.Controls foreach (IControl container in ItemContainerGenerator.Index!.Containers) { - MarkContainerSelected(container, false); + TreeView.MarkContainerSelected(container, false); } if (SelectedItems.Count > 0) @@ -339,7 +339,7 @@ namespace Avalonia.Controls { var container = ItemContainerGenerator.Index!.ContainerFromItem(item)!; - MarkContainerSelected(container, selected); + TreeView.MarkContainerSelected(container, selected); } private void SelectedItemsAdded(IList items) @@ -826,7 +826,7 @@ namespace Avalonia.Controls /// /// The container. /// Whether the control is selected - private void MarkContainerSelected(IControl container, bool selected) + private static void MarkContainerSelected(IControl container, bool selected) { if (container == null) { diff --git a/src/Avalonia.Controls/UserControl.cs b/src/Avalonia.Controls/UserControl.cs index 7b9cc2da1c..e9339d5f4b 100644 --- a/src/Avalonia.Controls/UserControl.cs +++ b/src/Avalonia.Controls/UserControl.cs @@ -1,4 +1,3 @@ -using System; using Avalonia.Styling; namespace Avalonia.Controls From 4620e5cf99ff0a82832d117b23ca97ffb66c764d Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:09:16 +0200 Subject: [PATCH 06/97] feat(ColorPicker): Address rule CA1822 --- .../ColorPalettes/MaterialColorPalette.cs | 8 ++++---- .../ColorSlider/ColorSlider.cs | 6 +++--- .../ColorSpectrum/ColorSpectrum.cs | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Avalonia.Controls.ColorPicker/ColorPalettes/MaterialColorPalette.cs b/src/Avalonia.Controls.ColorPicker/ColorPalettes/MaterialColorPalette.cs index 5cf5662ede..555965a9a7 100644 --- a/src/Avalonia.Controls.ColorPicker/ColorPalettes/MaterialColorPalette.cs +++ b/src/Avalonia.Controls.ColorPicker/ColorPalettes/MaterialColorPalette.cs @@ -35,7 +35,7 @@ namespace Avalonia.Controls /// This is pulled out separately to lazy load for performance. /// If no material color palette is ever used, no colors will be created. /// - private void InitColorChart() + private static void InitColorChart() { lock (_colorChartMutex) { @@ -322,7 +322,7 @@ namespace Avalonia.Controls { if (_colorChart == null) { - InitColorChart(); + MaterialColorPalette.InitColorChart(); } return _colorChartColorCount; @@ -336,7 +336,7 @@ namespace Avalonia.Controls { if (_colorChart == null) { - InitColorChart(); + MaterialColorPalette.InitColorChart(); } return _colorChartShadeCount; @@ -348,7 +348,7 @@ namespace Avalonia.Controls { if (_colorChart == null) { - InitColorChart(); + MaterialColorPalette.InitColorChart(); } return _colorChart![ diff --git a/src/Avalonia.Controls.ColorPicker/ColorSlider/ColorSlider.cs b/src/Avalonia.Controls.ColorPicker/ColorSlider/ColorSlider.cs index b662d20223..fab2b35969 100644 --- a/src/Avalonia.Controls.ColorPicker/ColorSlider/ColorSlider.cs +++ b/src/Avalonia.Controls.ColorPicker/ColorSlider/ColorSlider.cs @@ -121,7 +121,7 @@ namespace Avalonia.Controls.Primitives /// /// The to round component values for. /// A new with rounded component values. - private HsvColor RoundComponentValues(HsvColor hsvColor) + private static HsvColor RoundComponentValues(HsvColor hsvColor) { return new HsvColor( Math.Round(hsvColor.A, 2, MidpointRounding.AwayFromZero), @@ -147,7 +147,7 @@ namespace Avalonia.Controls.Primitives if (IsRoundingEnabled) { - hsvColor = RoundComponentValues(hsvColor); + hsvColor = ColorSlider.RoundComponentValues(hsvColor); } // Note: Components converted into a usable range for the user @@ -272,7 +272,7 @@ namespace Avalonia.Controls.Primitives if (IsRoundingEnabled) { - hsvColor = RoundComponentValues(hsvColor); + hsvColor = ColorSlider.RoundComponentValues(hsvColor); } return (rgbColor, hsvColor); diff --git a/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs b/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs index bd44161a42..1ff1445d8e 100644 --- a/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs +++ b/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs @@ -1027,7 +1027,7 @@ namespace Avalonia.Controls.Primitives { for (int y = pixelDimension - 1; y >= 0; --y) { - FillPixelForBox( + ColorSpectrum.FillPixelForBox( x, y, hsv, pixelDimension, components, minHue, maxHue, minSaturation, maxSaturation, minValue, maxValue, bgraMinPixelData, bgraMiddle1PixelData, bgraMiddle2PixelData, bgraMiddle3PixelData, bgraMiddle4PixelData, bgraMaxPixelData, newHsvValues); @@ -1099,7 +1099,7 @@ namespace Avalonia.Controls.Primitives }); } - private void FillPixelForBox( + private static void FillPixelForBox( double x, double y, Hsv baseHsv, From b8b180f64c781d782e7f9a044210a5a0a2192fd9 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:09:38 +0200 Subject: [PATCH 07/97] feat(DataGrid): Address rule CA1822 --- src/Avalonia.Controls.DataGrid/DataGridTemplateColumn.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls.DataGrid/DataGridTemplateColumn.cs b/src/Avalonia.Controls.DataGrid/DataGridTemplateColumn.cs index 0e754d5815..023ae99266 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridTemplateColumn.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridTemplateColumn.cs @@ -56,7 +56,7 @@ namespace Avalonia.Controls set => SetAndRaise(CellEditingTemplateProperty, ref _cellEditingCellTemplate, value); } - private void OnCellTemplateChanged(AvaloniaPropertyChangedEventArgs e) + private static void OnCellTemplateChanged(AvaloniaPropertyChangedEventArgs e) { var oldValue = (IDataTemplate)e.OldValue; var value = (IDataTemplate)e.NewValue; From bf1f6f04399b2b4290e025d714741a435ea04b25 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:09:57 +0200 Subject: [PATCH 08/97] feat(Diagnostic): Address rule CA1822 --- .../Diagnostics/Screenshots/FilePickerHandler.cs | 4 ++-- .../Diagnostics/ViewModels/ControlDetailsViewModel.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Diagnostics/Diagnostics/Screenshots/FilePickerHandler.cs b/src/Avalonia.Diagnostics/Diagnostics/Screenshots/FilePickerHandler.cs index 4153d2d38c..325c55783c 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/Screenshots/FilePickerHandler.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/Screenshots/FilePickerHandler.cs @@ -47,7 +47,7 @@ namespace Avalonia.Diagnostics.Screenshots /// public string Title { get; } = "Save Screenshot to ..."; - Window GetWindow(IControl control) + static Window GetWindow(IControl control) { var window = control.VisualRoot as Window; var app = Application.Current; @@ -61,7 +61,7 @@ namespace Avalonia.Diagnostics.Screenshots protected async override Task GetStream(IControl control) { Stream? output = default; - var result = await GetWindow(control).StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions + var result = await FilePickerHandler.GetWindow(control).StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions { SuggestedStartLocation = new BclStorageFolder(new DirectoryInfo(ScreenshotsRoot)), Title = Title, diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs index 631da80d8b..869b2fd600 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs @@ -83,7 +83,7 @@ namespace Avalonia.Diagnostics.ViewModels { var setterValue = regularSetter.Value; - var resourceInfo = GetResourceInfo(setterValue); + var resourceInfo = ControlDetailsViewModel.GetResourceInfo(setterValue); SetterViewModel setterVm; @@ -122,7 +122,7 @@ namespace Avalonia.Diagnostics.ViewModels public bool CanNavigateToParentProperty => _selectedEntitiesStack.Count >= 1; - private (object resourceKey, bool isDynamic)? GetResourceInfo(object? value) + private static (object resourceKey, bool isDynamic)? GetResourceInfo(object? value) { if (value is StaticResourceExtension staticResource) { From e014c941447f4f2a2243a697cf62b4fa1e248202 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:10:13 +0200 Subject: [PATCH 09/97] feat(Dialogs): Address rule CA1822 --- src/Avalonia.Dialogs/ManagedStorageProvider.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Dialogs/ManagedStorageProvider.cs b/src/Avalonia.Dialogs/ManagedStorageProvider.cs index 37d2781692..06c2c29dab 100644 --- a/src/Avalonia.Dialogs/ManagedStorageProvider.cs +++ b/src/Avalonia.Dialogs/ManagedStorageProvider.cs @@ -28,7 +28,7 @@ public class ManagedStorageProvider : BclStorageProvider where T : Window, ne public override async Task> OpenFilePickerAsync(FilePickerOpenOptions options) { var model = new ManagedFileChooserViewModel(options, _managedOptions); - var results = await Show(model, _parent); + var results = await ManagedStorageProvider.Show(model, _parent); return results.Select(f => new BclStorageFile(new FileInfo(f))).ToArray(); } @@ -36,7 +36,7 @@ public class ManagedStorageProvider : BclStorageProvider where T : Window, ne public override async Task SaveFilePickerAsync(FilePickerSaveOptions options) { var model = new ManagedFileChooserViewModel(options, _managedOptions); - var results = await Show(model, _parent); + var results = await ManagedStorageProvider.Show(model, _parent); return results.FirstOrDefault() is { } result ? new BclStorageFile(new FileInfo(result)) @@ -46,12 +46,12 @@ public class ManagedStorageProvider : BclStorageProvider where T : Window, ne public override async Task> OpenFolderPickerAsync(FolderPickerOpenOptions options) { var model = new ManagedFileChooserViewModel(options, _managedOptions); - var results = await Show(model, _parent); + var results = await ManagedStorageProvider.Show(model, _parent); return results.Select(f => new BclStorageFolder(new DirectoryInfo(f))).ToArray(); } - private async Task Show(ManagedFileChooserViewModel model, Window parent) + private static async Task Show(ManagedFileChooserViewModel model, Window parent) { var dialog = new T { From aa17cdf1dc5395e0184a2967450ba86e0f2ba7f5 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:10:42 +0200 Subject: [PATCH 10/97] feat(FreedDesktop): Address rule CA1822 --- src/Avalonia.FreeDesktop/LinuxMountedVolumeInfoListener.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.FreeDesktop/LinuxMountedVolumeInfoListener.cs b/src/Avalonia.FreeDesktop/LinuxMountedVolumeInfoListener.cs index 39ddd9d769..2d6a2569fb 100644 --- a/src/Avalonia.FreeDesktop/LinuxMountedVolumeInfoListener.cs +++ b/src/Avalonia.FreeDesktop/LinuxMountedVolumeInfoListener.cs @@ -34,7 +34,7 @@ namespace Avalonia.FreeDesktop Poll(0); } - private string GetSymlinkTarget(string x) => Path.GetFullPath(Path.Combine(DevByLabelDir, NativeMethods.ReadLink(x))); + private static string GetSymlinkTarget(string x) => Path.GetFullPath(Path.Combine(DevByLabelDir, NativeMethods.ReadLink(x))); private string UnescapeString(string input, string regexText, int escapeBase) => new Regex(regexText).Replace(input, m => Convert.ToChar(Convert.ToByte(m.Groups[1].Value, escapeBase)).ToString()); @@ -61,7 +61,7 @@ namespace Avalonia.FreeDesktop new DirectoryInfo(DevByLabelDir).GetFiles() : Enumerable.Empty(); var labelDevPathPairs = labelDirEnum - .Select(x => (GetSymlinkTarget(x.FullName), UnescapeDeviceLabel(x.Name))); + .Select(x => (LinuxMountedVolumeInfoListener.GetSymlinkTarget(x.FullName), UnescapeDeviceLabel(x.Name))); var q1 = from mount in fProcMounts join device in fProcPartitions on mount.Item1 equals device.Item2 From 3a9404171f4d8c8c4a0598403a9db04d776ba2a1 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:11:00 +0200 Subject: [PATCH 11/97] feat(Native): Address rule CA1822 --- src/Avalonia.Native/AvaloniaNativeDragSource.cs | 6 +++--- src/Avalonia.Native/AvaloniaNativeMenuExporter.cs | 4 ++-- src/Avalonia.Native/IAvnMenu.cs | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Native/AvaloniaNativeDragSource.cs b/src/Avalonia.Native/AvaloniaNativeDragSource.cs index f91a299b3b..f93d558d25 100644 --- a/src/Avalonia.Native/AvaloniaNativeDragSource.cs +++ b/src/Avalonia.Native/AvaloniaNativeDragSource.cs @@ -19,8 +19,8 @@ namespace Avalonia.Native { _factory = factory; } - - TopLevel FindRoot(IInteractive interactive) + + static TopLevel FindRoot(IInteractive interactive) { while (interactive != null && !(interactive is IVisual)) interactive = interactive.InteractiveParent; @@ -48,7 +48,7 @@ namespace Avalonia.Native public Task DoDragDrop(PointerEventArgs triggerEvent, IDataObject data, DragDropEffects allowedEffects) { // Sanity check - var tl = FindRoot(triggerEvent.Source); + var tl = AvaloniaNativeDragSource.FindRoot(triggerEvent.Source); var view = tl?.PlatformImpl as WindowBaseImpl; if (view == null) throw new ArgumentException(); diff --git a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs index d8753efe25..ddabfe8f5d 100644 --- a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs +++ b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs @@ -65,7 +65,7 @@ namespace Avalonia.Native } } - private NativeMenu CreateDefaultAppMenu() + private static NativeMenu CreateDefaultAppMenu() { var result = new NativeMenu(); @@ -167,7 +167,7 @@ namespace Avalonia.Native if (appMenu == null) { - appMenu = CreateDefaultAppMenu(); + appMenu = AvaloniaNativeMenuExporter.CreateDefaultAppMenu(); NativeMenu.SetMenu(Application.Current, appMenu); } diff --git a/src/Avalonia.Native/IAvnMenu.cs b/src/Avalonia.Native/IAvnMenu.cs index e413023f6d..f75621865c 100644 --- a/src/Avalonia.Native/IAvnMenu.cs +++ b/src/Avalonia.Native/IAvnMenu.cs @@ -111,7 +111,7 @@ namespace Avalonia.Native.Interop.Impl private __MicroComIAvnMenuItemProxy CreateNewAt(IAvaloniaNativeFactory factory, int index, NativeMenuItemBase item) { - var result = CreateNew(factory, item); + var result = __MicroComIAvnMenuProxy.CreateNew(factory, item); result.Initialize(item); @@ -123,7 +123,7 @@ namespace Avalonia.Native.Interop.Impl return result; } - private __MicroComIAvnMenuItemProxy CreateNew(IAvaloniaNativeFactory factory, NativeMenuItemBase item) + private static __MicroComIAvnMenuItemProxy CreateNew(IAvaloniaNativeFactory factory, NativeMenuItemBase item) { var nativeItem = (__MicroComIAvnMenuItemProxy)(item is NativeMenuItemSeparator ? factory.CreateMenuItemSeparator() : From 713b85522f34cc768a31ecf0fd8f28410d0ec1f6 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:11:19 +0200 Subject: [PATCH 12/97] feat(OpenGL): Address rule CA1822 --- src/Avalonia.OpenGL/Controls/OpenGlControlBase.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.OpenGL/Controls/OpenGlControlBase.cs b/src/Avalonia.OpenGL/Controls/OpenGlControlBase.cs index 279e7e750d..6f87ff19ee 100644 --- a/src/Avalonia.OpenGL/Controls/OpenGlControlBase.cs +++ b/src/Avalonia.OpenGL/Controls/OpenGlControlBase.cs @@ -27,7 +27,7 @@ namespace Avalonia.OpenGL.Controls _context.GlInterface.BindFramebuffer(GL_FRAMEBUFFER, _fb); EnsureTextureAttachment(); EnsureDepthBufferAttachment(_context.GlInterface); - if(!CheckFramebufferStatus(_context.GlInterface)) + if(!OpenGlControlBase.CheckFramebufferStatus(_context.GlInterface)) return; OnOpenGlRender(_context.GlInterface, _fb); @@ -38,7 +38,7 @@ namespace Avalonia.OpenGL.Controls base.Render(context); } - private void CheckError(GlInterface gl) + private static void CheckError(GlInterface gl) { int err; while ((err = gl.GetError()) != GL_NO_ERROR) @@ -186,7 +186,7 @@ namespace Avalonia.OpenGL.Controls EnsureDepthBufferAttachment(gl); EnsureTextureAttachment(); - return CheckFramebufferStatus(gl); + return OpenGlControlBase.CheckFramebufferStatus(gl); } catch(Exception e) { @@ -197,7 +197,7 @@ namespace Avalonia.OpenGL.Controls } } - private bool CheckFramebufferStatus(GlInterface gl) + private static bool CheckFramebufferStatus(GlInterface gl) { var status = gl.CheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) From 5196ef2cbc559525051938e5714b8342771d6769 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:11:37 +0200 Subject: [PATCH 13/97] feat(Reactive): Address rule CA1822 --- .../AvaloniaActivationForViewFetcher.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs index 9f69b4ee6e..94073506e3 100644 --- a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs +++ b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs @@ -26,15 +26,15 @@ namespace Avalonia.ReactiveUI public IObservable GetActivationForView(IActivatableView view) { if (!(view is IVisual visual)) return Observable.Return(false); - if (view is Control control) return GetActivationForControl(control); - return GetActivationForVisual(visual); + if (view is Control control) return AvaloniaActivationForViewFetcher.GetActivationForControl(control); + return AvaloniaActivationForViewFetcher.GetActivationForVisual(visual); } /// /// Listens to Loaded and Unloaded /// events for Avalonia Control. /// - private IObservable GetActivationForControl(Control control) + private static IObservable GetActivationForControl(Control control) { var controlLoaded = Observable .FromEventPattern( @@ -55,7 +55,7 @@ namespace Avalonia.ReactiveUI /// Listens to AttachedToVisualTree and DetachedFromVisualTree /// events for Avalonia IVisuals. /// - private IObservable GetActivationForVisual(IVisual visual) + private static IObservable GetActivationForVisual(IVisual visual) { var visualLoaded = Observable .FromEventPattern( From a88ba2a16d1eecebb9177da5f8c41a0533068fa2 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:11:53 +0200 Subject: [PATCH 14/97] feat(X11): Address rule CA1822 --- src/Avalonia.X11/X11IconLoader.cs | 6 +++--- src/Avalonia.X11/X11Platform.cs | 10 +++++----- src/Avalonia.X11/X11Window.Ime.cs | 2 +- src/Avalonia.X11/X11Window.cs | 6 +++--- src/Avalonia.X11/XI2Manager.cs | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Avalonia.X11/X11IconLoader.cs b/src/Avalonia.X11/X11IconLoader.cs index 632a7d39a2..de7c57a556 100644 --- a/src/Avalonia.X11/X11IconLoader.cs +++ b/src/Avalonia.X11/X11IconLoader.cs @@ -9,16 +9,16 @@ namespace Avalonia.X11 { class X11IconLoader : IPlatformIconLoader { - IWindowIconImpl LoadIcon(Bitmap bitmap) + static IWindowIconImpl LoadIcon(Bitmap bitmap) { var rv = new X11IconData(bitmap); bitmap.Dispose(); return rv; } - public IWindowIconImpl LoadIcon(string fileName) => LoadIcon(new Bitmap(fileName)); + public IWindowIconImpl LoadIcon(string fileName) => X11IconLoader.LoadIcon(new Bitmap(fileName)); - public IWindowIconImpl LoadIcon(Stream stream) => LoadIcon(new Bitmap(stream)); + public IWindowIconImpl LoadIcon(Stream stream) => X11IconLoader.LoadIcon(new Bitmap(stream)); public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) { diff --git a/src/Avalonia.X11/X11Platform.cs b/src/Avalonia.X11/X11Platform.cs index 381cdd74c3..312945e713 100644 --- a/src/Avalonia.X11/X11Platform.cs +++ b/src/Avalonia.X11/X11Platform.cs @@ -42,10 +42,10 @@ namespace Avalonia.X11 Options = options; bool useXim = false; - if (EnableIme(options)) + if (AvaloniaX11Platform.EnableIme(options)) { // Attempt to configure DBus-based input method and check if we can fall back to XIM - if (!X11DBusImeHelper.DetectAndRegister() && ShouldUseXim()) + if (!X11DBusImeHelper.DetectAndRegister() && AvaloniaX11Platform.ShouldUseXim()) useXim = true; } @@ -143,7 +143,7 @@ namespace Avalonia.X11 throw new NotSupportedException(); } - bool EnableIme(X11PlatformOptions options) + static bool EnableIme(X11PlatformOptions options) { // Disable if explicitly asked by user var avaloniaImModule = Environment.GetEnvironmentVariable("AVALONIA_IM_MODULE"); @@ -164,8 +164,8 @@ namespace Avalonia.X11 return isCjkLocale; } - - bool ShouldUseXim() + + static bool ShouldUseXim() { // Check if we are forbidden from using IME if (Environment.GetEnvironmentVariable("AVALONIA_IM_MODULE") == "none" diff --git a/src/Avalonia.X11/X11Window.Ime.cs b/src/Avalonia.X11/X11Window.Ime.cs index d68feaca78..128d48957c 100644 --- a/src/Avalonia.X11/X11Window.Ime.cs +++ b/src/Avalonia.X11/X11Window.Ime.cs @@ -107,7 +107,7 @@ namespace Avalonia.X11 var filtered = ScheduleKeyInput(new RawKeyEventArgs(_keyboard, (ulong)ev.KeyEvent.time.ToInt64(), _inputRoot, ev.type == XEventName.KeyPress ? RawKeyEventType.KeyDown : RawKeyEventType.KeyUp, - X11KeyTransform.ConvertKey(key), TranslateModifiers(ev.KeyEvent.state)), ref ev, (int)key, ev.KeyEvent.keycode); + X11KeyTransform.ConvertKey(key), X11Window.TranslateModifiers(ev.KeyEvent.state)), ref ev, (int)key, ev.KeyEvent.keycode); if (ev.type == XEventName.KeyPress && !filtered) TriggerClassicTextInputEvent(ref ev); diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index f24c33cafa..b2120b718e 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -463,7 +463,7 @@ namespace Avalonia.X11 : new Vector(-1, 0); ScheduleInput(new RawMouseWheelEventArgs(_mouse, (ulong)ev.ButtonEvent.time.ToInt64(), _inputRoot, new Point(ev.ButtonEvent.x, ev.ButtonEvent.y), delta, - TranslateModifiers(ev.ButtonEvent.state)), ref ev); + X11Window.TranslateModifiers(ev.ButtonEvent.state)), ref ev); } } @@ -683,7 +683,7 @@ namespace Avalonia.X11 } - RawInputModifiers TranslateModifiers(XModifierMask state) + static RawInputModifiers TranslateModifiers(XModifierMask state) { var rv = default(RawInputModifiers); if (state.HasAllFlags(XModifierMask.Button1Mask)) @@ -760,7 +760,7 @@ namespace Avalonia.X11 { var mev = new RawPointerEventArgs( _mouse, (ulong)ev.ButtonEvent.time.ToInt64(), _inputRoot, - type, new Point(ev.ButtonEvent.x, ev.ButtonEvent.y), TranslateModifiers(mods)); + type, new Point(ev.ButtonEvent.x, ev.ButtonEvent.y), X11Window.TranslateModifiers(mods)); ScheduleInput(mev, ref ev); } diff --git a/src/Avalonia.X11/XI2Manager.cs b/src/Avalonia.X11/XI2Manager.cs index 7bf1df41b6..952112b6fd 100644 --- a/src/Avalonia.X11/XI2Manager.cs +++ b/src/Avalonia.X11/XI2Manager.cs @@ -193,11 +193,11 @@ namespace Avalonia.X11 { var rev = (XIEnterLeaveEvent*)xev; if (_clients.TryGetValue(rev->EventWindow, out var client)) - OnEnterLeaveEvent(client, ref *rev); + XI2Manager.OnEnterLeaveEvent(client, ref *rev); } } - void OnEnterLeaveEvent(IXI2Client client, ref XIEnterLeaveEvent ev) + static void OnEnterLeaveEvent(IXI2Client client, ref XIEnterLeaveEvent ev) { if (ev.evtype == XiEventType.XI_Leave) { From 93f0fcf007c1e51556f25fd292a97b4375c9a3fd Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:12:14 +0200 Subject: [PATCH 15/97] feat(iOS): Address rule CA1822 --- src/iOS/Avalonia.iOS/CombinedSpan3.cs | 2 +- src/iOS/Avalonia.iOS/TouchHandler.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/iOS/Avalonia.iOS/CombinedSpan3.cs b/src/iOS/Avalonia.iOS/CombinedSpan3.cs index e9f44b7d58..13faea1848 100644 --- a/src/iOS/Avalonia.iOS/CombinedSpan3.cs +++ b/src/iOS/Avalonia.iOS/CombinedSpan3.cs @@ -16,7 +16,7 @@ internal ref struct CombinedSpan3 public int Length => Span1.Length + Span2.Length + Span3.Length; - void CopyFromSpan(ReadOnlySpan from, int offset, ref Span to) + static void CopyFromSpan(ReadOnlySpan from, int offset, ref Span to) { if(to.Length == 0) return; diff --git a/src/iOS/Avalonia.iOS/TouchHandler.cs b/src/iOS/Avalonia.iOS/TouchHandler.cs index 959a660d8a..44bf08365f 100644 --- a/src/iOS/Avalonia.iOS/TouchHandler.cs +++ b/src/iOS/Avalonia.iOS/TouchHandler.cs @@ -19,7 +19,7 @@ namespace Avalonia.iOS _tl = tl; } - ulong Ts(UIEvent evt) => (ulong) (evt.Timestamp * 1000); + static ulong Ts(UIEvent evt) => (ulong) (evt.Timestamp * 1000); private IInputRoot Root => _view.InputRoot; private static long _nextTouchPointId = 1; private Dictionary _knownTouches = new Dictionary(); From 4800f7a01b666d962e2f5103ff39dce0e98fea18 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 14 Oct 2022 17:14:27 +0200 Subject: [PATCH 16/97] feat(Markup): Address rule CA1822 --- .../CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs | 6 ++---- .../Converters/AvaloniaPropertyTypeConverter.cs | 8 ++++---- .../Avalonia.Markup.Xaml/Converters/IconTypeConverter.cs | 4 ++-- .../MarkupExtensions/DynamicResourceExtension.cs | 6 +++--- src/Markup/Avalonia.Markup.Xaml/Parsers/PropertyParser.cs | 2 +- .../Markup/Parsers/Nodes/StringIndexerNode.cs | 6 +++--- 6 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs index 6c9d510ba0..12406df765 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs @@ -67,10 +67,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions string propertyName, IXamlAstTypeReference selectorTypeReference, IXamlLineInfo lineInfo) { XamlAstNamePropertyReference forgedReference; - - var parser = new PropertyParser(); - - var parsedPropertyName = parser.Parse(new CharacterReader(propertyName.AsSpan())); + + var parsedPropertyName = PropertyParser.Parse(new CharacterReader(propertyName.AsSpan())); if(parsedPropertyName.owner == null) forgedReference = new XamlAstNamePropertyReference(lineInfo, selectorTypeReference, propertyName, selectorTypeReference); diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs index 45ca1c4adc..dff315c727 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs @@ -22,8 +22,8 @@ namespace Avalonia.Markup.Xaml.Converters { var registry = AvaloniaPropertyRegistry.Instance; var parser = new PropertyParser(); - var (ns, owner, propertyName) = parser.Parse(new CharacterReader(((string)value).AsSpan())); - var ownerType = TryResolveOwnerByName(context, ns, owner); + var (ns, owner, propertyName) = PropertyParser.Parse(new CharacterReader(((string)value).AsSpan())); + var ownerType = AvaloniaPropertyTypeConverter.TryResolveOwnerByName(context, ns, owner); var targetType = context.GetFirstParent()?.TargetType ?? context.GetFirstParent"; - using (StartWithResources(("test:style.xaml", styleXaml))) + using (StyleIncludeTests.StartWithResources(("test:style.xaml", styleXaml))) { var xaml = @" new Styles { - WindowStyle(), + ResourceDictionaryTests.WindowStyle(), }); return UnitTestApplication.Start(services); } - private Style WindowStyle() + private static Style WindowStyle() { return new Style(x => x.OfType()) { diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs index 77a4932ccc..b164f6c371 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs @@ -162,7 +162,7 @@ namespace Avalonia.Markup.Xaml.UnitTests } - void AssertThrows(Action callback, Func check) + static void AssertThrows(Action callback, Func check) { try { @@ -182,7 +182,7 @@ namespace Avalonia.Markup.Xaml.UnitTests public void Bug2570() { SomeStaticProperty = "123"; - AssertThrows(() => AvaloniaRuntimeXamlLoader + XamlIlTests.AssertThrows(() => AvaloniaRuntimeXamlLoader .Load(@" (child); } - private FuncControlTemplate GetTemplate() + private static FuncControlTemplate GetTemplate() { return new FuncControlTemplate((parent, scope) => { diff --git a/tests/Avalonia.RenderTests/Media/GeometryDrawingTests.cs b/tests/Avalonia.RenderTests/Media/GeometryDrawingTests.cs index 06e46c1a06..f6e7ba0c48 100644 --- a/tests/Avalonia.RenderTests/Media/GeometryDrawingTests.cs +++ b/tests/Avalonia.RenderTests/Media/GeometryDrawingTests.cs @@ -17,7 +17,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media { } - private GeometryDrawing CreateGeometryDrawing() + private static GeometryDrawing CreateGeometryDrawing() { GeometryDrawing geometryDrawing = new GeometryDrawing(); EllipseGeometry ellipse = new EllipseGeometry(); diff --git a/tests/Avalonia.RenderTests/Media/TextFormatting/TextLayoutTests.cs b/tests/Avalonia.RenderTests/Media/TextFormatting/TextLayoutTests.cs index b668f4d39e..f921d9fa64 100644 --- a/tests/Avalonia.RenderTests/Media/TextFormatting/TextLayoutTests.cs +++ b/tests/Avalonia.RenderTests/Media/TextFormatting/TextLayoutTests.cs @@ -39,7 +39,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media { } - private TextLayout Create(string text, + private static TextLayout Create(string text, string fontFamily, double fontSize, FontStyle fontStyle, @@ -56,7 +56,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media return formattedText; } - private TextLayout Create(string text, double fontSize) + private static TextLayout Create(string text, double fontSize) { return Create(text, FontName, fontSize, FontStyle.Normal, TextAlignment.Left, @@ -64,7 +64,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media -1); } - private TextLayout Create(string text, double fontSize, TextAlignment alignment, double widthConstraint) + private static TextLayout Create(string text, double fontSize, TextAlignment alignment, double widthConstraint) { return Create(text, FontName, fontSize, FontStyle.Normal, alignment, @@ -72,7 +72,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media widthConstraint); } - private TextLayout Create(string text, double fontSize, TextWrapping wrap, double widthConstraint) + private static TextLayout Create(string text, double fontSize, TextWrapping wrap, double widthConstraint) { return Create(text, FontName, fontSize, FontStyle.Normal, TextAlignment.Left, diff --git a/tests/Avalonia.RenderTests/TestBase.cs b/tests/Avalonia.RenderTests/TestBase.cs index 4d6b313ffc..3f918e2a73 100644 --- a/tests/Avalonia.RenderTests/TestBase.cs +++ b/tests/Avalonia.RenderTests/TestBase.cs @@ -237,7 +237,7 @@ namespace Avalonia.Direct2D1.RenderTests return Math.Sqrt(meanSquaresError); } - private string GetTestsDirectory() + private static string GetTestsDirectory() { var path = Directory.GetCurrentDirectory(); diff --git a/tests/Avalonia.Skia.UnitTests/DrawingContextImplTests.cs b/tests/Avalonia.Skia.UnitTests/DrawingContextImplTests.cs index df0cc2fc1a..68595a2f57 100644 --- a/tests/Avalonia.Skia.UnitTests/DrawingContextImplTests.cs +++ b/tests/Avalonia.Skia.UnitTests/DrawingContextImplTests.cs @@ -21,7 +21,7 @@ namespace Avalonia.Skia.UnitTests target.DrawRectangle(Brushes.Black, new Pen(Brushes.Black, 0), new RoundedRect(new Rect(0, 0, 100, 100), new CornerRadius(4))); } - private DrawingContextImpl CreateTarget() + private static DrawingContextImpl CreateTarget() { var canvas = new SKCanvas(new SKBitmap(100, 100)); return (DrawingContextImpl)DrawingContextHelper.WrapSkiaCanvas(canvas, new Vector(96, 96)); From 9e1ff3e3be9a855220153ba72a0dd991e41de19b Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Mon, 17 Oct 2022 16:38:15 +0200 Subject: [PATCH 21/97] fix: Addreaa review --- .../Animators/GradientBrushAnimator.cs | 6 +++--- src/Avalonia.Base/Animation/KeySpline.cs | 6 +++--- src/Avalonia.Base/Controls/Classes.cs | 18 +++++++++--------- src/Avalonia.Base/Data/Core/ExpressionNode.cs | 2 +- .../Parsers/ExpressionVisitorNodeBuilder.cs | 6 +++--- .../Plugins/DataAnnotationsValidationPlugin.cs | 2 +- .../Data/Core/Plugins/IndeiValidationPlugin.cs | 2 +- .../Data/Core/Plugins/TaskStreamPlugin.cs | 4 ++-- src/Avalonia.Base/Input/DragDropDevice.cs | 12 ++++++------ src/Avalonia.Base/Input/KeyGesture.cs | 2 +- src/Avalonia.Base/Input/KeyboardDevice.cs | 4 ++-- src/Avalonia.Base/Input/MouseDevice.cs | 11 ++++------- src/Avalonia.Base/Input/PenDevice.cs | 2 +- src/Avalonia.Base/Input/Pointer.cs | 4 ++-- src/Avalonia.Base/Input/TouchDevice.cs | 6 +++--- src/Avalonia.Base/Layout/AttachedLayout.cs | 8 ++++---- src/Avalonia.Base/Layout/StackLayout.cs | 8 ++++---- src/Avalonia.Base/Layout/UniformGridLayout.cs | 6 +++--- src/Avalonia.Base/Platform/AssetLoader.cs | 8 ++++---- .../Composition/CompositingRenderer.cs | 4 ++-- .../Rendering/Composition/CompositionTarget.cs | 6 +++--- .../Automation/Peers/ComboBoxAutomationPeer.cs | 6 +++--- .../CalendarBlackoutDatesCollection.cs | 8 ++++---- .../Calendar/SelectedDatesCollection.cs | 9 ++++----- src/Avalonia.Controls/ComboBox.cs | 14 +++++++------- .../DateTimePickers/DateTimePickerPanel.cs | 4 ++-- src/Avalonia.Controls/Grid.cs | 10 +++++----- src/Avalonia.Controls/GridSplitter.cs | 14 +++++++------- .../Platform/InProcessDragSource.cs | 4 ++-- .../Presenters/ScrollContentPresenter.cs | 8 ++++---- .../Primitives/AdornerLayer.cs | 8 ++++---- src/Avalonia.Controls/Primitives/Popup.cs | 6 ++---- src/Avalonia.Controls/Repeater/RecyclePool.cs | 4 ++-- .../Repeater/RecyclingElementFactory.cs | 6 +++--- src/Avalonia.Controls/SplitView.cs | 9 +++------ src/Avalonia.Controls/TextBox.cs | 9 ++++----- src/Avalonia.Controls/TopLevel.cs | 2 +- src/Avalonia.Controls/TreeView.cs | 6 ++---- .../Screenshots/FilePickerHandler.cs | 2 +- .../ViewModels/ControlDetailsViewModel.cs | 16 ++++++++-------- .../LinuxMountedVolumeInfoListener.cs | 8 ++++---- .../AvaloniaNativeDragSource.cs | 2 +- .../AvaloniaNativeMenuExporter.cs | 2 +- src/Avalonia.Native/IAvnMenu.cs | 3 +-- .../Controls/OpenGlControlBase.cs | 4 ++-- .../AvaloniaActivationForViewFetcher.cs | 4 ++-- src/Avalonia.X11/X11IconLoader.cs | 4 ++-- src/Avalonia.X11/X11Platform.cs | 7 +++---- src/Avalonia.X11/X11Window.Ime.cs | 3 +-- src/Avalonia.X11/X11Window.cs | 6 ++---- src/Avalonia.X11/XI2Manager.cs | 2 +- .../XamlIlAvaloniaPropertyHelper.cs | 2 -- .../Converters/IconTypeConverter.cs | 2 +- .../DynamicResourceExtension.cs | 4 ++-- .../Parsers/PropertyParser.cs | 4 +--- .../Markup/Parsers/Nodes/StringIndexerNode.cs | 8 ++++---- src/Skia/Avalonia.Skia/DrawingContextImpl.cs | 4 ++-- src/Windows/Avalonia.Win32/ClipboardImpl.cs | 6 +++--- src/Windows/Avalonia.Win32/CursorFactory.cs | 2 +- src/Windows/Avalonia.Win32/DataObject.cs | 8 ++++---- .../CompositionGenerator/Generator.cs | 2 +- 61 files changed, 169 insertions(+), 190 deletions(-) diff --git a/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs b/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs index f469ea5652..068c190fa1 100644 --- a/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs +++ b/src/Avalonia.Base/Animation/Animators/GradientBrushAnimator.cs @@ -28,7 +28,7 @@ namespace Avalonia.Animation.Animators { case IRadialGradientBrush oldRadial when newValue is IRadialGradientBrush newRadial: return new ImmutableRadialGradientBrush( - GradientBrushAnimator.InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), + InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), s_doubleAnimator.Interpolate(progress, oldValue.Opacity, newValue.Opacity), oldValue.Transform is { } ? new ImmutableTransform(oldValue.Transform.Value) : null, s_relativePointAnimator.Interpolate(progress, oldValue.TransformOrigin, newValue.TransformOrigin), @@ -39,7 +39,7 @@ namespace Avalonia.Animation.Animators case IConicGradientBrush oldConic when newValue is IConicGradientBrush newConic: return new ImmutableConicGradientBrush( - GradientBrushAnimator.InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), + InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), s_doubleAnimator.Interpolate(progress, oldValue.Opacity, newValue.Opacity), oldValue.Transform is { } ? new ImmutableTransform(oldValue.Transform.Value) : null, s_relativePointAnimator.Interpolate(progress, oldValue.TransformOrigin, newValue.TransformOrigin), @@ -49,7 +49,7 @@ namespace Avalonia.Animation.Animators case ILinearGradientBrush oldLinear when newValue is ILinearGradientBrush newLinear: return new ImmutableLinearGradientBrush( - GradientBrushAnimator.InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), + InterpolateStops(progress, oldValue.GradientStops, newValue.GradientStops), s_doubleAnimator.Interpolate(progress, oldValue.Opacity, newValue.Opacity), oldValue.Transform is { } ? new ImmutableTransform(oldValue.Transform.Value) : null, s_relativePointAnimator.Interpolate(progress, oldValue.TransformOrigin, newValue.TransformOrigin), diff --git a/src/Avalonia.Base/Animation/KeySpline.cs b/src/Avalonia.Base/Animation/KeySpline.cs index b33cd6b881..6ca5b2e759 100644 --- a/src/Avalonia.Base/Animation/KeySpline.cs +++ b/src/Avalonia.Base/Animation/KeySpline.cs @@ -98,7 +98,7 @@ namespace Avalonia.Animation get => _controlPointX1; set { - if (KeySpline.IsValidXValue(value)) + if (IsValidXValue(value)) { _controlPointX1 = value; _isDirty = true; @@ -131,7 +131,7 @@ namespace Avalonia.Animation get => _controlPointX2; set { - if (KeySpline.IsValidXValue(value)) + if (IsValidXValue(value)) { _controlPointX2 = value; _isDirty = true; @@ -188,7 +188,7 @@ namespace Avalonia.Animation /// acceptable range; false otherwise. public bool IsValid() { - return KeySpline.IsValidXValue(_controlPointX1) && KeySpline.IsValidXValue(_controlPointX2); + return IsValidXValue(_controlPointX1) && IsValidXValue(_controlPointX2); } /// diff --git a/src/Avalonia.Base/Controls/Classes.cs b/src/Avalonia.Base/Controls/Classes.cs index 100c2b2a8f..04193cf3d9 100644 --- a/src/Avalonia.Base/Controls/Classes.cs +++ b/src/Avalonia.Base/Controls/Classes.cs @@ -37,7 +37,7 @@ namespace Avalonia.Controls /// The initial items. public Classes(params string[] items) : base(items) - { + { } /// @@ -63,7 +63,7 @@ namespace Avalonia.Controls /// public override void Add(string name) { - Classes.ThrowIfPseudoclass(name, "added"); + ThrowIfPseudoclass(name, "added"); if (!Contains(name)) { @@ -87,7 +87,7 @@ namespace Avalonia.Controls foreach (var name in names) { - Classes.ThrowIfPseudoclass(name, "added"); + ThrowIfPseudoclass(name, "added"); if (!Contains(name)) { @@ -127,7 +127,7 @@ namespace Avalonia.Controls /// public override void Insert(int index, string name) { - Classes.ThrowIfPseudoclass(name, "added"); + ThrowIfPseudoclass(name, "added"); if (!Contains(name)) { @@ -152,7 +152,7 @@ namespace Avalonia.Controls foreach (var name in names) { - Classes.ThrowIfPseudoclass(name, "added"); + ThrowIfPseudoclass(name, "added"); if (!Contains(name)) { @@ -180,7 +180,7 @@ namespace Avalonia.Controls /// public override bool Remove(string name) { - Classes.ThrowIfPseudoclass(name, "removed"); + ThrowIfPseudoclass(name, "removed"); if (base.Remove(name)) { @@ -206,7 +206,7 @@ namespace Avalonia.Controls foreach (var name in names) { - Classes.ThrowIfPseudoclass(name, "removed"); + ThrowIfPseudoclass(name, "removed"); toRemove ??= new List(); @@ -232,7 +232,7 @@ namespace Avalonia.Controls public override void RemoveAt(int index) { var name = this[index]; - Classes.ThrowIfPseudoclass(name, "removed"); + ThrowIfPseudoclass(name, "removed"); base.RemoveAt(index); NotifyChanged(); } @@ -258,7 +258,7 @@ namespace Avalonia.Controls foreach (var name in source) { - Classes.ThrowIfPseudoclass(name, "added"); + ThrowIfPseudoclass(name, "added"); } foreach (var name in this) diff --git a/src/Avalonia.Base/Data/Core/ExpressionNode.cs b/src/Avalonia.Base/Data/Core/ExpressionNode.cs index d1bc60541c..e4b833176c 100644 --- a/src/Avalonia.Base/Data/Core/ExpressionNode.cs +++ b/src/Avalonia.Base/Data/Core/ExpressionNode.cs @@ -138,7 +138,7 @@ namespace Avalonia.Data.Core if (target == null) { - ValueChanged(ExpressionNode.TargetNullNotification()); + ValueChanged(TargetNullNotification()); _listening = false; } else if (target != AvaloniaProperty.UnsetValue) diff --git a/src/Avalonia.Base/Data/Core/Parsers/ExpressionVisitorNodeBuilder.cs b/src/Avalonia.Base/Data/Core/Parsers/ExpressionVisitorNodeBuilder.cs index 9b9ddf2183..42aefb3f54 100644 --- a/src/Avalonia.Base/Data/Core/Parsers/ExpressionVisitorNodeBuilder.cs +++ b/src/Avalonia.Base/Data/Core/Parsers/ExpressionVisitorNodeBuilder.cs @@ -70,7 +70,7 @@ namespace Avalonia.Data.Core.Parsers if (node.Indexer == AvaloniaObjectIndexer) { - var property = ExpressionVisitorNodeBuilder.GetArgumentExpressionValue(node.Arguments[0]); + var property = GetArgumentExpressionValue(node.Arguments[0]); Nodes.Add(new AvaloniaPropertyAccessorNode(property, _enableDataValidation)); } else @@ -162,7 +162,7 @@ namespace Avalonia.Data.Core.Parsers if (node.Method == CreateDelegateMethod) { var visited = Visit(node.Arguments[1]); - Nodes.Add(new PropertyAccessorNode(ExpressionVisitorNodeBuilder.GetArgumentExpressionValue(node.Object!).Name, _enableDataValidation)); + Nodes.Add(new PropertyAccessorNode(GetArgumentExpressionValue(node.Object!).Name, _enableDataValidation)); return node; } else if (node.Method.Name == StreamBindingExtensions.StreamBindingName || node.Method.Name.StartsWith(StreamBindingExtensions.StreamBindingName + '`')) @@ -193,7 +193,7 @@ namespace Avalonia.Data.Core.Parsers throw new ExpressionParseException(0, $"Invalid method call in binding expression: '{node.Method.DeclaringType!.AssemblyQualifiedName}.{node.Method.Name}'."); } - private PropertyInfo? TryGetPropertyFromMethod(MethodInfo method) + private static PropertyInfo? TryGetPropertyFromMethod(MethodInfo method) { var type = method.DeclaringType; return type?.GetRuntimeProperties().FirstOrDefault(prop => prop.GetMethod == method); diff --git a/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs index 54d5b5ac28..118b18c020 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs @@ -57,7 +57,7 @@ namespace Avalonia.Data.Core.Plugins else { base.InnerValueChanged(new BindingNotification( - Accessor.CreateException(errors), + CreateException(errors), BindingErrorType.DataValidationError, value)); } diff --git a/src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs index e45170ff7e..385d96a7b8 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs @@ -92,7 +92,7 @@ namespace Avalonia.Data.Core.Plugins if (errors?.Count > 0) { return new BindingNotification( - Validator.GenerateException(errors), + GenerateException(errors), BindingErrorType.DataValidationError, value); } diff --git a/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin.cs b/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin.cs index b25d592597..6703d1f54e 100644 --- a/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin.cs +++ b/src/Avalonia.Base/Data/Core/Plugins/TaskStreamPlugin.cs @@ -44,11 +44,11 @@ namespace Avalonia.Data.Core.Plugins { case TaskStatus.RanToCompletion: case TaskStatus.Faulted: - return TaskStreamPlugin.HandleCompleted(task); + return HandleCompleted(task); default: var subject = new Subject(); task.ContinueWith( - x => TaskStreamPlugin.HandleCompleted(task).Subscribe(subject), + x => HandleCompleted(task).Subscribe(subject), TaskScheduler.FromCurrentSynchronizationContext()) .ConfigureAwait(false); return subject; diff --git a/src/Avalonia.Base/Input/DragDropDevice.cs b/src/Avalonia.Base/Input/DragDropDevice.cs index 16ff428d69..ef4c7f8787 100644 --- a/src/Avalonia.Base/Input/DragDropDevice.cs +++ b/src/Avalonia.Base/Input/DragDropDevice.cs @@ -40,22 +40,22 @@ namespace Avalonia.Input private DragDropEffects DragEnter(IInputRoot inputRoot, Point point, IDataObject data, DragDropEffects effects, KeyModifiers modifiers) { - _lastTarget = DragDropDevice.GetTarget(inputRoot, point); - return DragDropDevice.RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DragEnterEvent, effects, data, modifiers); + _lastTarget = GetTarget(inputRoot, point); + return RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DragEnterEvent, effects, data, modifiers); } private DragDropEffects DragOver(IInputRoot inputRoot, Point point, IDataObject data, DragDropEffects effects, KeyModifiers modifiers) { - var target = DragDropDevice.GetTarget(inputRoot, point); + var target = GetTarget(inputRoot, point); if (target == _lastTarget) - return DragDropDevice.RaiseDragEvent(target, inputRoot, point, DragDrop.DragOverEvent, effects, data, modifiers); + return RaiseDragEvent(target, inputRoot, point, DragDrop.DragOverEvent, effects, data, modifiers); try { if (_lastTarget != null) _lastTarget.RaiseEvent(new RoutedEventArgs(DragDrop.DragLeaveEvent)); - return DragDropDevice.RaiseDragEvent(target, inputRoot, point, DragDrop.DragEnterEvent, effects, data, modifiers); + return RaiseDragEvent(target, inputRoot, point, DragDrop.DragEnterEvent, effects, data, modifiers); } finally { @@ -81,7 +81,7 @@ namespace Avalonia.Input { try { - return DragDropDevice.RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DropEvent, effects, data, modifiers); + return RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DropEvent, effects, data, modifiers); } finally { diff --git a/src/Avalonia.Base/Input/KeyGesture.cs b/src/Avalonia.Base/Input/KeyGesture.cs index 7f4f69590a..b08f5d0ba5 100644 --- a/src/Avalonia.Base/Input/KeyGesture.cs +++ b/src/Avalonia.Base/Input/KeyGesture.cs @@ -138,7 +138,7 @@ namespace Avalonia.Input public bool Matches(KeyEventArgs keyEvent) => keyEvent != null && keyEvent.KeyModifiers == KeyModifiers && - KeyGesture.ResolveNumPadOperationKey(keyEvent.Key) == KeyGesture.ResolveNumPadOperationKey(Key); + ResolveNumPadOperationKey(keyEvent.Key) == ResolveNumPadOperationKey(Key); // TODO: Move that to external key parser private static Key ParseKey(string key) diff --git a/src/Avalonia.Base/Input/KeyboardDevice.cs b/src/Avalonia.Base/Input/KeyboardDevice.cs index 0600b54618..68d09ea19a 100644 --- a/src/Avalonia.Base/Input/KeyboardDevice.cs +++ b/src/Avalonia.Base/Input/KeyboardDevice.cs @@ -26,7 +26,7 @@ namespace Avalonia.Input public IInputElement? FocusedElement => _focusedElement; - private void ClearFocusWithinAncestors(IInputElement? element) + private static void ClearFocusWithinAncestors(IInputElement? element) { var el = element; @@ -65,7 +65,7 @@ namespace Avalonia.Input { if (newElement == null && oldElement != null) { - ClearFocusWithinAncestors(oldElement); + KeyboardDevice.ClearFocusWithinAncestors(oldElement); return; } diff --git a/src/Avalonia.Base/Input/MouseDevice.cs b/src/Avalonia.Base/Input/MouseDevice.cs index 6fb34efdb5..a7540b5afa 100644 --- a/src/Avalonia.Base/Input/MouseDevice.cs +++ b/src/Avalonia.Base/Input/MouseDevice.cs @@ -1,12 +1,8 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Reactive.Linq; using Avalonia.Input.Raw; -using Avalonia.Interactivity; using Avalonia.Platform; using Avalonia.Utilities; -using Avalonia.VisualTree; namespace Avalonia.Input { @@ -71,7 +67,7 @@ namespace Avalonia.Input case RawPointerEventType.MiddleButtonDown: case RawPointerEventType.XButton1Down: case RawPointerEventType.XButton2Down: - if (MouseDevice.ButtonCount(props) > 1) + if (ButtonCount(props) > 1) e.Handled = MouseMove(mouse, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.IntermediatePoints, e.InputHitTestResult); else e.Handled = MouseDown(mouse, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult); @@ -81,7 +77,7 @@ namespace Avalonia.Input case RawPointerEventType.MiddleButtonUp: case RawPointerEventType.XButton1Up: case RawPointerEventType.XButton2Up: - if (MouseDevice.ButtonCount(props) != 0) + if (ButtonCount(props) != 0) e.Handled = MouseMove(mouse, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.IntermediatePoints, e.InputHitTestResult); else e.Handled = MouseUp(mouse, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult); @@ -106,9 +102,10 @@ namespace Avalonia.Input private void LeaveWindow() { + } - PointerPointProperties CreateProperties(RawPointerEventArgs args) + static PointerPointProperties CreateProperties(RawPointerEventArgs args) { return new PointerPointProperties(args.InputModifiers, args.Type.ToUpdateKind()); } diff --git a/src/Avalonia.Base/Input/PenDevice.cs b/src/Avalonia.Base/Input/PenDevice.cs index 876be42be8..b530364fc1 100644 --- a/src/Avalonia.Base/Input/PenDevice.cs +++ b/src/Avalonia.Base/Input/PenDevice.cs @@ -56,7 +56,7 @@ namespace Avalonia.Input e.Handled = PenUp(pointer, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult); break; case RawPointerEventType.Move: - e.Handled = PenDevice.PenMove(pointer, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult, e.IntermediatePoints); + e.Handled = PenMove(pointer, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult, e.IntermediatePoints); break; } diff --git a/src/Avalonia.Base/Input/Pointer.cs b/src/Avalonia.Base/Input/Pointer.cs index be93d9d6b8..7948939d41 100644 --- a/src/Avalonia.Base/Input/Pointer.cs +++ b/src/Avalonia.Base/Input/Pointer.cs @@ -41,7 +41,7 @@ namespace Avalonia.Input PlatformCapture(control); if (oldCapture != null) { - var commonParent = Pointer.FindCommonParent(control, oldCapture); + var commonParent = FindCommonParent(control, oldCapture); foreach (var notifyTarget in oldCapture.GetSelfAndVisualAncestors().OfType()) { if (notifyTarget == commonParent) @@ -54,7 +54,7 @@ namespace Avalonia.Input Captured.DetachedFromVisualTree += OnCaptureDetached; } - IInputElement? GetNextCapture(IVisual parent) + static IInputElement? GetNextCapture(IVisual parent) { return parent as IInputElement ?? parent.FindAncestorOfType(); } diff --git a/src/Avalonia.Base/Input/TouchDevice.cs b/src/Avalonia.Base/Input/TouchDevice.cs index b709b7d0cd..35c7555784 100644 --- a/src/Avalonia.Base/Input/TouchDevice.cs +++ b/src/Avalonia.Base/Input/TouchDevice.cs @@ -73,7 +73,7 @@ namespace Avalonia.Input target.RaiseEvent(new PointerPressedEventArgs(target, pointer, args.Root, args.Position, ev.Timestamp, - new PointerPointProperties(TouchDevice.GetModifiers(args.InputModifiers, true), updateKind), + new PointerPointProperties(GetModifiers(args.InputModifiers, true), updateKind), keyModifier, _clickCount)); } @@ -84,7 +84,7 @@ namespace Avalonia.Input { target.RaiseEvent(new PointerReleasedEventArgs(target, pointer, args.Root, args.Position, ev.Timestamp, - new PointerPointProperties(TouchDevice.GetModifiers(args.InputModifiers, false), updateKind), + new PointerPointProperties(GetModifiers(args.InputModifiers, false), updateKind), keyModifier, MouseButton.Left)); } } @@ -100,7 +100,7 @@ namespace Avalonia.Input { target.RaiseEvent(new PointerEventArgs(InputElement.PointerMovedEvent, target, pointer, args.Root, args.Position, ev.Timestamp, - new PointerPointProperties(TouchDevice.GetModifiers(args.InputModifiers, true), updateKind), + new PointerPointProperties(GetModifiers(args.InputModifiers, true), updateKind), keyModifier, args.IntermediatePoints)); } } diff --git a/src/Avalonia.Base/Layout/AttachedLayout.cs b/src/Avalonia.Base/Layout/AttachedLayout.cs index 594fc04842..ac3a53dabb 100644 --- a/src/Avalonia.Base/Layout/AttachedLayout.cs +++ b/src/Avalonia.Base/Layout/AttachedLayout.cs @@ -67,7 +67,7 @@ namespace Avalonia.Layout { if (this is VirtualizingLayout virtualizingLayout) { - var virtualizingContext = AttachedLayout.GetVirtualizingLayoutContext(context); + var virtualizingContext = GetVirtualizingLayoutContext(context); virtualizingLayout.InitializeForContextCore(virtualizingContext); } else if (this is NonVirtualizingLayout nonVirtualizingLayout) @@ -92,7 +92,7 @@ namespace Avalonia.Layout { if (this is VirtualizingLayout virtualizingLayout) { - var virtualizingContext = AttachedLayout.GetVirtualizingLayoutContext(context); + var virtualizingContext = GetVirtualizingLayoutContext(context); virtualizingLayout.UninitializeForContextCore(virtualizingContext); } else if (this is NonVirtualizingLayout nonVirtualizingLayout) @@ -126,7 +126,7 @@ namespace Avalonia.Layout { if (this is VirtualizingLayout virtualizingLayout) { - var virtualizingContext = AttachedLayout.GetVirtualizingLayoutContext(context); + var virtualizingContext = GetVirtualizingLayoutContext(context); return virtualizingLayout.MeasureOverride(virtualizingContext, availableSize); } else if (this is NonVirtualizingLayout nonVirtualizingLayout) @@ -157,7 +157,7 @@ namespace Avalonia.Layout { if (this is VirtualizingLayout virtualizingLayout) { - var virtualizingContext = AttachedLayout.GetVirtualizingLayoutContext(context); + var virtualizingContext = GetVirtualizingLayoutContext(context); return virtualizingLayout.ArrangeOverride(virtualizingContext, finalSize); } else if (this is NonVirtualizingLayout nonVirtualizingLayout) diff --git a/src/Avalonia.Base/Layout/StackLayout.cs b/src/Avalonia.Base/Layout/StackLayout.cs index 7983b37843..d36667a7f2 100644 --- a/src/Avalonia.Base/Layout/StackLayout.cs +++ b/src/Avalonia.Base/Layout/StackLayout.cs @@ -90,7 +90,7 @@ namespace Avalonia.Layout // Constants int itemsCount = context.ItemCount; var stackState = (StackLayoutState)context.LayoutState!; - double averageElementSize = StackLayout.GetAverageElementSize(availableSize, context, stackState) + Spacing; + double averageElementSize = GetAverageElementSize(availableSize, context, stackState) + Spacing; _orientation.SetMinorSize(ref extent, stackState.MaxArrangeBounds); _orientation.SetMajorSize(ref extent, Math.Max(0.0f, itemsCount * averageElementSize - Spacing)); @@ -178,7 +178,7 @@ namespace Avalonia.Layout { index = targetIndex; var state = (StackLayoutState)context.LayoutState!; - double averageElementSize = StackLayout.GetAverageElementSize(availableSize, context, state) + Spacing; + double averageElementSize = GetAverageElementSize(availableSize, context, state) + Spacing; offset = index * averageElementSize + _orientation.MajorStart(state.FlowAlgorithm.LastExtent); } @@ -237,7 +237,7 @@ namespace Avalonia.Layout var state = (StackLayoutState)context.LayoutState!; var lastExtent = state.FlowAlgorithm.LastExtent; - double averageElementSize = StackLayout.GetAverageElementSize(availableSize, context, state) + Spacing; + double averageElementSize = GetAverageElementSize(availableSize, context, state) + Spacing; double realizationWindowOffsetInExtent = _orientation.MajorStart(realizationRect) - _orientation.MajorStart(lastExtent); double majorSize = _orientation.MajorSize(lastExtent) == 0 ? Math.Max(0.0, averageElementSize * itemsCount - Spacing) : _orientation.MajorSize(lastExtent); if (itemsCount > 0 && @@ -359,6 +359,6 @@ namespace Avalonia.Layout private void InvalidateLayout() => InvalidateMeasure(); - private FlowLayoutAlgorithm GetFlowAlgorithm(VirtualizingLayoutContext context) => ((StackLayoutState)context.LayoutState!).FlowAlgorithm; + private static FlowLayoutAlgorithm GetFlowAlgorithm(VirtualizingLayoutContext context) => ((StackLayoutState)context.LayoutState!).FlowAlgorithm; } } diff --git a/src/Avalonia.Base/Layout/UniformGridLayout.cs b/src/Avalonia.Base/Layout/UniformGridLayout.cs index acb333bcfa..407d115bcd 100644 --- a/src/Avalonia.Base/Layout/UniformGridLayout.cs +++ b/src/Avalonia.Base/Layout/UniformGridLayout.cs @@ -432,7 +432,7 @@ namespace Avalonia.Layout var gridState = (UniformGridLayoutState)context.LayoutState!; gridState.EnsureElementSize(availableSize, context, _minItemWidth, _minItemHeight, _itemsStretch, Orientation, MinRowSpacing, MinColumnSpacing, _maximumRowsOrColumns); - var desiredSize = UniformGridLayout.GetFlowAlgorithm(context).Measure( + var desiredSize = GetFlowAlgorithm(context).Measure( availableSize, context, true, @@ -452,7 +452,7 @@ namespace Avalonia.Layout protected internal override Size ArrangeOverride(VirtualizingLayoutContext context, Size finalSize) { - var value = UniformGridLayout.GetFlowAlgorithm(context).Arrange( + var value = GetFlowAlgorithm(context).Arrange( finalSize, context, true, @@ -463,7 +463,7 @@ namespace Avalonia.Layout protected internal override void OnItemsChangedCore(VirtualizingLayoutContext context, object? source, NotifyCollectionChangedEventArgs args) { - UniformGridLayout.GetFlowAlgorithm(context).OnItemsSourceChanged(source, args, context); + GetFlowAlgorithm(context).OnItemsSourceChanged(source, args, context); // Always invalidate layout to keep the view accurate. InvalidateLayout(); diff --git a/src/Avalonia.Base/Platform/AssetLoader.cs b/src/Avalonia.Base/Platform/AssetLoader.cs index 77ae9f4c32..a08e3b3d4c 100644 --- a/src/Avalonia.Base/Platform/AssetLoader.cs +++ b/src/Avalonia.Base/Platform/AssetLoader.cs @@ -126,7 +126,7 @@ namespace Avalonia.Platform uri = uri.EnsureAbsolute(baseUri); if (uri.IsAvares()) { - var (asm, path) = AssetLoader.GetResAsmAndPath(uri); + var (asm, path) = GetResAsmAndPath(uri); if (asm == null) { throw new ArgumentException( @@ -171,7 +171,7 @@ namespace Avalonia.Platform if (uri.IsAvares()) { - var (asm, path) = AssetLoader.GetResAsmAndPath(uri); + var (asm, path) = GetResAsmAndPath(uri); if (asm.AvaloniaResources == null) return null; asm.AvaloniaResources.TryGetValue(path, out var desc); @@ -187,14 +187,14 @@ namespace Avalonia.Platform return (asm, uri.GetUnescapeAbsolutePath()); } - private IAssemblyDescriptor? GetAssembly(Uri? uri) + private static IAssemblyDescriptor? GetAssembly(Uri? uri) { if (uri != null) { if (!uri.IsAbsoluteUri) return null; if (uri.IsAvares()) - return AssetLoader.GetResAsmAndPath(uri).asm; + return GetResAsmAndPath(uri).asm; if (uri.IsResm()) { diff --git a/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs b/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs index 3c9a9feac0..3f145c1539 100644 --- a/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs +++ b/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs @@ -233,11 +233,11 @@ public class CompositingRenderer : IRendererWithCompositor visual.Render(_recordingContext); comp.DrawList = _recorder.EndUpdate(); - CompositingRenderer.SyncChildren(visual); + SyncChildren(visual); } foreach(var v in _recalculateChildren) if (!_dirty.Contains(v)) - CompositingRenderer.SyncChildren(v); + SyncChildren(v); _dirty.Clear(); _recalculateChildren.Clear(); CompositionTarget.Size = _root.ClientSize; diff --git a/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs b/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs index 52215e8011..0c24d6cd44 100644 --- a/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs +++ b/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs @@ -53,7 +53,7 @@ namespace Avalonia.Rendering.Composition var m = Matrix.Identity; while (v != null) { - if (!CompositionTarget.TryGetInvertedTransform(v, out var cm)) + if (!TryGetInvertedTransform(v, out var cm)) return null; m = m * cm; v = v.Parent; @@ -75,10 +75,10 @@ namespace Avalonia.Rendering.Composition return m33.TryInvert(out matrix); } - bool TryTransformTo(CompositionVisual visual, Point globalPoint, out Point v) + static bool TryTransformTo(CompositionVisual visual, Point globalPoint, out Point v) { v = default; - if (CompositionTarget.TryGetInvertedTransform(visual, out var m)) + if (TryGetInvertedTransform(visual, out var m)) { v = globalPoint * m; return true; diff --git a/src/Avalonia.Controls/Automation/Peers/ComboBoxAutomationPeer.cs b/src/Avalonia.Controls/Automation/Peers/ComboBoxAutomationPeer.cs index d6295fdbd9..5d71e7a8e4 100644 --- a/src/Avalonia.Controls/Automation/Peers/ComboBoxAutomationPeer.cs +++ b/src/Avalonia.Controls/Automation/Peers/ComboBoxAutomationPeer.cs @@ -18,7 +18,7 @@ namespace Avalonia.Automation.Peers public new ComboBox Owner => (ComboBox)base.Owner; - public ExpandCollapseState ExpandCollapseState => ComboBoxAutomationPeer.ToState(Owner.IsDropDownOpen); + public ExpandCollapseState ExpandCollapseState => ToState(Owner.IsDropDownOpen); public bool ShowsMenu => true; public void Collapse() => Owner.IsDropDownOpen = false; public void Expand() => Owner.IsDropDownOpen = true; @@ -66,8 +66,8 @@ namespace Avalonia.Automation.Peers { RaisePropertyChangedEvent( ExpandCollapsePatternIdentifiers.ExpandCollapseStateProperty, - ComboBoxAutomationPeer.ToState((bool)e.OldValue!), - ComboBoxAutomationPeer.ToState((bool)e.NewValue!)); + ToState((bool)e.OldValue!), + ToState((bool)e.NewValue!)); } } diff --git a/src/Avalonia.Controls/Calendar/CalendarBlackoutDatesCollection.cs b/src/Avalonia.Controls/Calendar/CalendarBlackoutDatesCollection.cs index 61463795ee..fe8b616e02 100644 --- a/src/Avalonia.Controls/Calendar/CalendarBlackoutDatesCollection.cs +++ b/src/Avalonia.Controls/Calendar/CalendarBlackoutDatesCollection.cs @@ -122,7 +122,7 @@ namespace Avalonia.Controls.Primitives /// protected override void ClearItems() { - CalendarBlackoutDatesCollection.EnsureValidThread(); + EnsureValidThread(); base.ClearItems(); _owner.UpdateMonths(); @@ -140,7 +140,7 @@ namespace Avalonia.Controls.Primitives /// protected override void InsertItem(int index, CalendarDateRange item) { - CalendarBlackoutDatesCollection.EnsureValidThread(); + EnsureValidThread(); if (!IsValid(item)) { @@ -162,7 +162,7 @@ namespace Avalonia.Controls.Primitives /// protected override void RemoveItem(int index) { - CalendarBlackoutDatesCollection.EnsureValidThread(); + EnsureValidThread(); base.RemoveItem(index); _owner.UpdateMonths(); @@ -182,7 +182,7 @@ namespace Avalonia.Controls.Primitives /// protected override void SetItem(int index, CalendarDateRange item) { - CalendarBlackoutDatesCollection.EnsureValidThread(); + EnsureValidThread(); if (!IsValid(item)) { diff --git a/src/Avalonia.Controls/Calendar/SelectedDatesCollection.cs b/src/Avalonia.Controls/Calendar/SelectedDatesCollection.cs index 8327442fcf..ac4159d536 100644 --- a/src/Avalonia.Controls/Calendar/SelectedDatesCollection.cs +++ b/src/Avalonia.Controls/Calendar/SelectedDatesCollection.cs @@ -6,7 +6,6 @@ using Avalonia.Threading; using System; using System.Collections.ObjectModel; -using System.Threading; namespace Avalonia.Controls.Primitives { @@ -133,7 +132,7 @@ namespace Avalonia.Controls.Primitives /// protected override void ClearItems() { - SelectedDatesCollection.EnsureValidThread(); + EnsureValidThread(); Collection addedItems = new Collection(); Collection removedItems = new Collection(); @@ -170,7 +169,7 @@ namespace Avalonia.Controls.Primitives /// protected override void InsertItem(int index, DateTime item) { - SelectedDatesCollection.EnsureValidThread(); + EnsureValidThread(); if (!Contains(item)) { @@ -233,7 +232,7 @@ namespace Avalonia.Controls.Primitives /// protected override void RemoveItem(int index) { - SelectedDatesCollection.EnsureValidThread(); + EnsureValidThread(); if (index >= Count) { @@ -284,7 +283,7 @@ namespace Avalonia.Controls.Primitives /// protected override void SetItem(int index, DateTime item) { - SelectedDatesCollection.EnsureValidThread(); + EnsureValidThread(); if (!Contains(item)) { diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs index 21918b27a8..1d849ce1e3 100644 --- a/src/Avalonia.Controls/ComboBox.cs +++ b/src/Avalonia.Controls/ComboBox.cs @@ -96,7 +96,7 @@ namespace Avalonia.Controls ItemsPanelProperty.OverrideDefaultValue(DefaultPanel); FocusableProperty.OverrideDefaultValue(true); SelectedItemProperty.Changed.AddClassHandler((x, e) => x.SelectedItemChanged(e)); - KeyDownEvent.AddClassHandler((x, e) => x.OnKeyDown(e), Interactivity.RoutingStrategies.Tunnel); + KeyDownEvent.AddClassHandler((x, e) => x.OnKeyDown(e), RoutingStrategies.Tunnel); IsTextSearchEnabledProperty.OverrideDefaultValue(true); IsDropDownOpenProperty.Changed.AddClassHandler((x, e) => x.DropdownChanged(e)); } @@ -178,8 +178,8 @@ namespace Avalonia.Controls { return new ItemContainerGenerator( this, - ComboBoxItem.ContentProperty, - ComboBoxItem.ContentTemplateProperty); + ContentControl.ContentProperty, + ContentControl.ContentTemplateProperty); } protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) @@ -236,7 +236,7 @@ namespace Avalonia.Controls else if (IsDropDownOpen && SelectedIndex < 0 && ItemCount > 0 && (e.Key == Key.Up || e.Key == Key.Down) && IsFocused == true) { - var firstChild = Presenter?.Panel?.Children.FirstOrDefault(c => ComboBox.CanFocus(c)); + var firstChild = Presenter?.Panel?.Children.FirstOrDefault(c => CanFocus(c)); if (firstChild != null) { FocusManager.Instance?.Focus(firstChild, NavigationMethod.Directional); @@ -341,7 +341,7 @@ namespace Avalonia.Controls { _subscriptionsOnOpen.Clear(); - if (ComboBox.CanFocus(this)) + if (CanFocus(this)) { Focus(); } @@ -363,7 +363,7 @@ namespace Avalonia.Controls { ev.Handled = true; } - }, Interactivity.RoutingStrategies.Tunnel).DisposeWith(_subscriptionsOnOpen); + }, RoutingStrategies.Tunnel).DisposeWith(_subscriptionsOnOpen); } this.GetObservable(IsVisibleProperty).Subscribe(IsVisibleChanged).DisposeWith(_subscriptionsOnOpen); @@ -403,7 +403,7 @@ namespace Avalonia.Controls container = ItemContainerGenerator.ContainerFromIndex(selectedIndex); } - if (container != null && ComboBox.CanFocus(container)) + if (container != null && CanFocus(container)) { container.Focus(); } diff --git a/src/Avalonia.Controls/DateTimePickers/DateTimePickerPanel.cs b/src/Avalonia.Controls/DateTimePickers/DateTimePickerPanel.cs index eb4a7391b0..faf0b6415a 100644 --- a/src/Avalonia.Controls/DateTimePickers/DateTimePickerPanel.cs +++ b/src/Avalonia.Controls/DateTimePickers/DateTimePickerPanel.cs @@ -455,7 +455,7 @@ namespace Avalonia.Controls.Primitives { Height = ItemHeight, Classes = new Classes($"{PanelType}Item"), - VerticalContentAlignment = Avalonia.Layout.VerticalAlignment.Center, + VerticalContentAlignment = Layout.VerticalAlignment.Center, Focusable = false }); } @@ -546,7 +546,7 @@ namespace Avalonia.Controls.Primitives private void OnItemTapped(object? sender, TappedEventArgs e) { if (e.Source is IVisual source && - DateTimePickerPanel.GetItemFromSource(source) is ListBoxItem listBoxItem && + GetItemFromSource(source) is ListBoxItem listBoxItem && listBoxItem.Tag is int tag) { SelectedValue = tag; diff --git a/src/Avalonia.Controls/Grid.cs b/src/Avalonia.Controls/Grid.cs index 4dc88fec6a..7737fdac2e 100644 --- a/src/Avalonia.Controls/Grid.cs +++ b/src/Avalonia.Controls/Grid.cs @@ -1117,7 +1117,7 @@ namespace Avalonia.Controls else { // otherwise... - cellMeasureWidth = Grid.GetMeasureSizeForRange( + cellMeasureWidth = GetMeasureSizeForRange( DefinitionsU, PrivateCells[cell].ColumnIndex, PrivateCells[cell].ColumnSpan); @@ -1137,7 +1137,7 @@ namespace Avalonia.Controls } else { - cellMeasureHeight = Grid.GetMeasureSizeForRange( + cellMeasureHeight = GetMeasureSizeForRange( DefinitionsV, PrivateCells[cell].RowIndex, PrivateCells[cell].RowSpan); @@ -1192,7 +1192,7 @@ namespace Avalonia.Controls /// Starting index of the range. /// Number of definitions included in the range. /// Length type for given range. - private LayoutTimeSizeType GetLengthTypeForRange( + private static LayoutTimeSizeType GetLengthTypeForRange( IReadOnlyList definitions, int start, int count) @@ -1721,7 +1721,7 @@ namespace Avalonia.Controls /// /// Array of definitions to use for calculations. /// Desired size. - private double CalculateDesiredSize( + private static double CalculateDesiredSize( IReadOnlyList definitions) { double desiredSize = 0; @@ -2281,7 +2281,7 @@ namespace Avalonia.Controls /// Start of the range. /// Number of items in the range. /// Final size. - private double GetFinalSizeForRange( + private static double GetFinalSizeForRange( IReadOnlyList definitions, int start, int count) diff --git a/src/Avalonia.Controls/GridSplitter.cs b/src/Avalonia.Controls/GridSplitter.cs index 1a4736fa92..db8f038177 100644 --- a/src/Avalonia.Controls/GridSplitter.cs +++ b/src/Avalonia.Controls/GridSplitter.cs @@ -288,13 +288,13 @@ namespace Avalonia.Controls _resizeData.Definition1 = GetGridDefinition(_resizeData.Grid, index1, _resizeData.ResizeDirection); _resizeData.OriginalDefinition1Length = _resizeData.Definition1.UserSizeValueCache; // Save Size if user cancels. - _resizeData.OriginalDefinition1ActualLength = GridSplitter.GetActualLength(_resizeData.Definition1); + _resizeData.OriginalDefinition1ActualLength = GetActualLength(_resizeData.Definition1); _resizeData.Definition2Index = index2; _resizeData.Definition2 = GetGridDefinition(_resizeData.Grid, index2, _resizeData.ResizeDirection); _resizeData.OriginalDefinition2Length = _resizeData.Definition2.UserSizeValueCache; // Save Size if user cancels. - _resizeData.OriginalDefinition2ActualLength = GridSplitter.GetActualLength(_resizeData.Definition2); + _resizeData.OriginalDefinition2ActualLength = GetActualLength(_resizeData.Definition2); // Determine how to resize the columns. bool isStar1 = IsStar(_resizeData.Definition1); @@ -537,11 +537,11 @@ namespace Avalonia.Controls /// private void GetDeltaConstraints(out double minDelta, out double maxDelta) { - double definition1Len = GridSplitter.GetActualLength(_resizeData!.Definition1!); + double definition1Len = GetActualLength(_resizeData!.Definition1!); double definition1Min = _resizeData.Definition1!.UserMinSizeValueCache; double definition1Max = _resizeData.Definition1.UserMaxSizeValueCache; - double definition2Len = GridSplitter.GetActualLength(_resizeData.Definition2!); + double definition2Len = GetActualLength(_resizeData.Definition2!); double definition2Min = _resizeData.Definition2!.UserMinSizeValueCache; double definition2Max = _resizeData.Definition2.UserMaxSizeValueCache; @@ -590,7 +590,7 @@ namespace Avalonia.Controls } else if (IsStar(definition)) { - SetDefinitionLength(definition, new GridLength(GridSplitter.GetActualLength(definition), GridUnitType.Star)); + SetDefinitionLength(definition, new GridLength(GetActualLength(definition), GridUnitType.Star)); } } } @@ -629,8 +629,8 @@ namespace Avalonia.Controls if (definition1 != null && definition2 != null) { - double actualLength1 = GridSplitter.GetActualLength(definition1); - double actualLength2 = GridSplitter.GetActualLength(definition2); + double actualLength1 = GetActualLength(definition1); + double actualLength2 = GetActualLength(definition2); double pixelLength = 1 / _resizeData.Scaling; double epsilon = pixelLength + LayoutHelper.LayoutEpsilon; diff --git a/src/Avalonia.Controls/Platform/InProcessDragSource.cs b/src/Avalonia.Controls/Platform/InProcessDragSource.cs index e107d2c217..d0d4bcc8b4 100644 --- a/src/Avalonia.Controls/Platform/InProcessDragSource.cs +++ b/src/Avalonia.Controls/Platform/InProcessDragSource.cs @@ -64,7 +64,7 @@ namespace Avalonia.Platform var tl = root.GetSelfAndVisualAncestors().OfType().FirstOrDefault(); tl?.PlatformImpl?.Input?.Invoke(rawEvent); - var effect = InProcessDragSource.GetPreferredEffect(rawEvent.Effects & _allowedEffects, modifiers); + var effect = GetPreferredEffect(rawEvent.Effects & _allowedEffects, modifiers); UpdateCursor(root, effect); return effect; } @@ -80,7 +80,7 @@ namespace Avalonia.Platform return DragDropEffects.Move; } - private StandardCursorType GetCursorForDropEffect(DragDropEffects effects) + private static StandardCursorType GetCursorForDropEffect(DragDropEffects effects) { if (effects.HasAllFlags(DragDropEffects.Copy)) return StandardCursorType.DragCopy; diff --git a/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs b/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs index e5bf924120..2a35fd2a12 100644 --- a/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs +++ b/src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs @@ -295,7 +295,7 @@ namespace Avalonia.Controls.Presenters // arrange then that change wasn't just due to scrolling (as scrolling doesn't adjust // relative positions within Child). if (_anchorElement != null && - ScrollContentPresenter.TranslateBounds(_anchorElement, Child!, out var updatedBounds) && + TranslateBounds(_anchorElement, Child!, out var updatedBounds) && updatedBounds.Position != _anchorElementBounds.Position) { var offset = updatedBounds.Position - _anchorElementBounds.Position; @@ -588,7 +588,7 @@ namespace Avalonia.Controls.Presenters private bool GetViewportBounds(IControl element, out Rect bounds) { - if (ScrollContentPresenter.TranslateBounds(element, Child!, out var childBounds)) + if (TranslateBounds(element, Child!, out var childBounds)) { // We want the bounds relative to the new Offset, regardless of whether the child // control has actually been arranged to this offset yet, so translate first to the @@ -603,9 +603,9 @@ namespace Avalonia.Controls.Presenters return false; } - private Rect TranslateBounds(IControl control, IControl to) + private static Rect TranslateBounds(IControl control, IControl to) { - if (ScrollContentPresenter.TranslateBounds(control, to, out var bounds)) + if (TranslateBounds(control, to, out var bounds)) { return bounds; } diff --git a/src/Avalonia.Controls/Primitives/AdornerLayer.cs b/src/Avalonia.Controls/Primitives/AdornerLayer.cs index 12a17b8c9f..b681b43ce3 100644 --- a/src/Avalonia.Controls/Primitives/AdornerLayer.cs +++ b/src/Avalonia.Controls/Primitives/AdornerLayer.cs @@ -139,7 +139,7 @@ namespace Avalonia.Controls.Primitives private static void Attach(Visual visual, Control adorner) { - var layer = AdornerLayer.GetAdornerLayer(visual); + var layer = GetAdornerLayer(visual); AddVisualAdorner(visual, adorner, layer); visual.SetValue(s_savedAdornerLayerProperty, layer); } @@ -158,8 +158,8 @@ namespace Avalonia.Controls.Primitives return; } - AdornerLayer.SetAdornedElement(adorner, visual); - AdornerLayer.SetIsClipEnabled(adorner, false); + SetAdornedElement(adorner, visual); + SetIsClipEnabled(adorner, false); ((ISetLogicalParent) adorner).SetParent(visual); layer.Children.Add(adorner); @@ -211,7 +211,7 @@ namespace Avalonia.Controls.Primitives { child.RenderTransform = new MatrixTransform(info.Bounds.Value.Transform); child.RenderTransformOrigin = new RelativePoint(new Point(0, 0), RelativeUnit.Absolute); - AdornerLayer.UpdateClip(child, info.Bounds.Value, isClipEnabled); + UpdateClip(child, info.Bounds.Value, isClipEnabled); child.Arrange(info.Bounds.Value.Bounds); } else diff --git a/src/Avalonia.Controls/Primitives/Popup.cs b/src/Avalonia.Controls/Primitives/Popup.cs index 581a65f6b9..4fc58d5462 100644 --- a/src/Avalonia.Controls/Primitives/Popup.cs +++ b/src/Avalonia.Controls/Primitives/Popup.cs @@ -1,6 +1,5 @@ using System; using System.ComponentModel; -using System.Linq; using System.Reactive.Disposables; using Avalonia.Automation.Peers; using Avalonia.Controls.Mixins; @@ -15,7 +14,6 @@ using Avalonia.Metadata; using Avalonia.Platform; using Avalonia.VisualTree; using Avalonia.Media; -using Avalonia.Utilities; namespace Avalonia.Controls.Primitives { @@ -475,7 +473,7 @@ namespace Avalonia.Controls.Primitives _openState = new PopupOpenState(placementTarget, topLevel, popupHost, cleanupPopup); - Popup.WindowManagerAddShadowHintChanged(popupHost, WindowManagerAddShadowHint); + WindowManagerAddShadowHintChanged(popupHost, WindowManagerAddShadowHint); popupHost.Show(); @@ -769,7 +767,7 @@ namespace Avalonia.Controls.Primitives } } - private void PassThroughEvent(PointerPressedEventArgs e) + private static void PassThroughEvent(PointerPressedEventArgs e) { if (e.Source is LightDismissOverlayLayer layer && layer.GetVisualRoot() is IInputElement root) diff --git a/src/Avalonia.Controls/Repeater/RecyclePool.cs b/src/Avalonia.Controls/Repeater/RecyclePool.cs index 9d6ad37721..0c19a883df 100644 --- a/src/Avalonia.Controls/Repeater/RecyclePool.cs +++ b/src/Avalonia.Controls/Repeater/RecyclePool.cs @@ -32,7 +32,7 @@ namespace Avalonia.Controls public void PutElement(IControl element, string key, IControl? owner) { - var ownerAsPanel = RecyclePool.EnsureOwnerIsPanelOrNull(owner); + var ownerAsPanel = EnsureOwnerIsPanelOrNull(owner); var elementInfo = new ElementInfo(element, ownerAsPanel); if (!_elements.TryGetValue(key, out var pool)) @@ -56,7 +56,7 @@ namespace Avalonia.Controls var elementInfo = elements.FirstOrDefault(x => x.Owner == owner) ?? elements.LastOrDefault(); elements.Remove(elementInfo!); - var ownerAsPanel = RecyclePool.EnsureOwnerIsPanelOrNull(owner); + var ownerAsPanel = EnsureOwnerIsPanelOrNull(owner); if (elementInfo!.Owner != null && elementInfo.Owner != ownerAsPanel) { // Element is still under its parent. remove it from its parent. diff --git a/src/Avalonia.Controls/Repeater/RecyclingElementFactory.cs b/src/Avalonia.Controls/Repeater/RecyclingElementFactory.cs index 1258c58324..7d09155ea4 100644 --- a/src/Avalonia.Controls/Repeater/RecyclingElementFactory.cs +++ b/src/Avalonia.Controls/Repeater/RecyclingElementFactory.cs @@ -72,7 +72,7 @@ namespace Avalonia.Controls element = dataTemplate.Build(args.Data)!; // Associate ReuseKey with element - Avalonia.Controls.RecyclePool.SetReuseKey(element, templateKey); + RecyclePool.SetReuseKey(element, templateKey); } return element; @@ -81,13 +81,13 @@ namespace Avalonia.Controls protected override void RecycleElementCore(ElementFactoryRecycleArgs args) { var element = args.Element!; - var key = Avalonia.Controls.RecyclePool.GetReuseKey(element); + var key = RecyclePool.GetReuseKey(element); RecyclePool.PutElement(element, key, args.Parent); } protected virtual string OnSelectTemplateKeyCore(object? dataContext, IControl? owner) { - if (SelectTemplateKey is object) + if (SelectTemplateKey is not null) { _args ??= new SelectTemplateEventArgs(); _args.TemplateKey = null; diff --git a/src/Avalonia.Controls/SplitView.cs b/src/Avalonia.Controls/SplitView.cs index 2d735a2cbb..d4293446d9 100644 --- a/src/Avalonia.Controls/SplitView.cs +++ b/src/Avalonia.Controls/SplitView.cs @@ -1,14 +1,11 @@ using Avalonia.Controls.Metadata; using Avalonia.Controls.Primitives; using Avalonia.Input; -using Avalonia.Input.Raw; using Avalonia.Interactivity; using Avalonia.Media; using Avalonia.Metadata; -using Avalonia.Platform; using Avalonia.VisualTree; using System; -using System.Reactive.Disposables; using Avalonia.Controls.Presenters; using Avalonia.Controls.Templates; using Avalonia.LogicalTree; @@ -443,7 +440,7 @@ namespace Avalonia.Controls }; } - private string GetPseudoClass(SplitViewPanePlacement placement) + private static string GetPseudoClass(SplitViewPanePlacement placement) { return placement switch { @@ -463,8 +460,8 @@ namespace Avalonia.Controls private void OnDisplayModeChanged(AvaloniaPropertyChangedEventArgs e) { - var oldState = SplitView.GetPseudoClass(e.GetOldValue()); - var newState = SplitView.GetPseudoClass(e.GetNewValue()); + var oldState = GetPseudoClass(e.GetOldValue()); + var newState = GetPseudoClass(e.GetNewValue()); PseudoClasses.Remove($":{oldState}"); PseudoClasses.Add($":{newState}"); diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 0ac57c9233..331c75cd1f 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -17,7 +17,6 @@ using Avalonia.Controls.Metadata; using Avalonia.Media.TextFormatting; using Avalonia.Media.TextFormatting.Unicode; using Avalonia.Automation.Peers; -using System.Diagnostics; using Avalonia.Threading; namespace Avalonia.Controls @@ -397,9 +396,9 @@ namespace Avalonia.Controls var selectionStart = SelectionStart; var selectionEnd = SelectionEnd; - CaretIndex = TextBox.CoerceCaretIndex(caretIndex, value); - SelectionStart = TextBox.CoerceCaretIndex(selectionStart, value); - SelectionEnd = TextBox.CoerceCaretIndex(selectionEnd, value); + CaretIndex = CoerceCaretIndex(caretIndex, value); + SelectionStart = CoerceCaretIndex(selectionStart, value); + SelectionEnd = CoerceCaretIndex(selectionEnd, value); var textChanged = SetAndRaise(TextProperty, ref _text, value); @@ -1380,7 +1379,7 @@ namespace Avalonia.Controls } } - private int CoerceCaretIndex(int value) => TextBox.CoerceCaretIndex(value, Text); + private int CoerceCaretIndex(int value) => CoerceCaretIndex(value, Text); private static int CoerceCaretIndex(int value, string? text) { diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 9fad9824df..b723d21710 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -449,7 +449,7 @@ namespace Avalonia.Controls { if(transparencyLevel == WindowTransparencyLevel.None || TransparencyLevelHint == WindowTransparencyLevel.None || - !TopLevel.TransparencyLevelsMatch(TransparencyLevelHint, transparencyLevel)) + !TransparencyLevelsMatch(TransparencyLevelHint, transparencyLevel)) { _transparencyFallbackBorder.Background = TransparencyBackgroundFallback; } diff --git a/src/Avalonia.Controls/TreeView.cs b/src/Avalonia.Controls/TreeView.cs index be30792cc8..e897339afd 100644 --- a/src/Avalonia.Controls/TreeView.cs +++ b/src/Avalonia.Controls/TreeView.cs @@ -3,13 +3,11 @@ using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; -using System.ComponentModel; using System.Linq; using System.Reactive.Linq; using Avalonia.Collections; using Avalonia.Controls.Generators; using Avalonia.Controls.Primitives; -using Avalonia.Controls.Utils; using Avalonia.Data; using Avalonia.Input; using Avalonia.Input.Platform; @@ -284,7 +282,7 @@ namespace Avalonia.Controls foreach (IControl container in ItemContainerGenerator.Index!.Containers) { - TreeView.MarkContainerSelected(container, false); + MarkContainerSelected(container, false); } if (SelectedItems.Count > 0) @@ -339,7 +337,7 @@ namespace Avalonia.Controls { var container = ItemContainerGenerator.Index!.ContainerFromItem(item)!; - TreeView.MarkContainerSelected(container, selected); + MarkContainerSelected(container, selected); } private void SelectedItemsAdded(IList items) diff --git a/src/Avalonia.Diagnostics/Diagnostics/Screenshots/FilePickerHandler.cs b/src/Avalonia.Diagnostics/Diagnostics/Screenshots/FilePickerHandler.cs index 325c55783c..dca1e8008c 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/Screenshots/FilePickerHandler.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/Screenshots/FilePickerHandler.cs @@ -61,7 +61,7 @@ namespace Avalonia.Diagnostics.Screenshots protected async override Task GetStream(IControl control) { Stream? output = default; - var result = await FilePickerHandler.GetWindow(control).StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions + var result = await GetWindow(control).StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions { SuggestedStartLocation = new BclStorageFolder(new DirectoryInfo(ScreenshotsRoot)), Title = Title, diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs index 869b2fd600..39b9e3d3f0 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs @@ -34,8 +34,8 @@ namespace Avalonia.Diagnostics.ViewModels { _avaloniaObject = avaloniaObject; - TreePage = treePage; - Layout = avaloniaObject is IVisual + TreePage = treePage; + Layout = avaloniaObject is IVisual ? new ControlLayoutViewModel((IVisual)avaloniaObject) : default; @@ -83,7 +83,7 @@ namespace Avalonia.Diagnostics.ViewModels { var setterValue = regularSetter.Value; - var resourceInfo = ControlDetailsViewModel.GetResourceInfo(setterValue); + var resourceInfo = GetResourceInfo(setterValue); SetterViewModel setterVm; @@ -137,7 +137,7 @@ namespace Avalonia.Diagnostics.ViewModels return null; } - private bool IsBinding(object? value) + private static bool IsBinding(object? value) { switch (value) { @@ -254,7 +254,7 @@ namespace Avalonia.Diagnostics.ViewModels } } - private IEnumerable GetAvaloniaProperties(object o) + private static IEnumerable GetAvaloniaProperties(object o) { if (o is AvaloniaObject ao) { @@ -268,7 +268,7 @@ namespace Avalonia.Diagnostics.ViewModels } } - private IEnumerable GetClrProperties(object o, bool showImplementedInterfaces) + private static IEnumerable GetClrProperties(object o, bool showImplementedInterfaces) { foreach (var p in GetClrProperties(o, o.GetType())) { @@ -287,7 +287,7 @@ namespace Avalonia.Diagnostics.ViewModels } } - private IEnumerable GetClrProperties(object o, Type t) + private static IEnumerable GetClrProperties(object o, Type t) { return t.GetProperties() .Where(x => x.GetIndexParameters().Length == 0) @@ -412,7 +412,7 @@ namespace Avalonia.Diagnostics.ViewModels } } - private int GroupIndex(string? group) + private static int GroupIndex(string? group) { switch (group) { diff --git a/src/Avalonia.FreeDesktop/LinuxMountedVolumeInfoListener.cs b/src/Avalonia.FreeDesktop/LinuxMountedVolumeInfoListener.cs index 2d6a2569fb..34c1506a67 100644 --- a/src/Avalonia.FreeDesktop/LinuxMountedVolumeInfoListener.cs +++ b/src/Avalonia.FreeDesktop/LinuxMountedVolumeInfoListener.cs @@ -36,12 +36,12 @@ namespace Avalonia.FreeDesktop private static string GetSymlinkTarget(string x) => Path.GetFullPath(Path.Combine(DevByLabelDir, NativeMethods.ReadLink(x))); - private string UnescapeString(string input, string regexText, int escapeBase) => + private static string UnescapeString(string input, string regexText, int escapeBase) => new Regex(regexText).Replace(input, m => Convert.ToChar(Convert.ToByte(m.Groups[1].Value, escapeBase)).ToString()); - private string UnescapePathFromProcMounts(string input) => UnescapeString(input, @"\\(\d{3})", 8); + private static string UnescapePathFromProcMounts(string input) => UnescapeString(input, @"\\(\d{3})", 8); - private string UnescapeDeviceLabel(string input) => UnescapeString(input, @"\\x([0-9a-f]{2})", 16); + private static string UnescapeDeviceLabel(string input) => UnescapeString(input, @"\\x([0-9a-f]{2})", 16); private void Poll(long _) { @@ -61,7 +61,7 @@ namespace Avalonia.FreeDesktop new DirectoryInfo(DevByLabelDir).GetFiles() : Enumerable.Empty(); var labelDevPathPairs = labelDirEnum - .Select(x => (LinuxMountedVolumeInfoListener.GetSymlinkTarget(x.FullName), UnescapeDeviceLabel(x.Name))); + .Select(x => (GetSymlinkTarget(x.FullName), UnescapeDeviceLabel(x.Name))); var q1 = from mount in fProcMounts join device in fProcPartitions on mount.Item1 equals device.Item2 diff --git a/src/Avalonia.Native/AvaloniaNativeDragSource.cs b/src/Avalonia.Native/AvaloniaNativeDragSource.cs index f93d558d25..84e2b31f23 100644 --- a/src/Avalonia.Native/AvaloniaNativeDragSource.cs +++ b/src/Avalonia.Native/AvaloniaNativeDragSource.cs @@ -48,7 +48,7 @@ namespace Avalonia.Native public Task DoDragDrop(PointerEventArgs triggerEvent, IDataObject data, DragDropEffects allowedEffects) { // Sanity check - var tl = AvaloniaNativeDragSource.FindRoot(triggerEvent.Source); + var tl = FindRoot(triggerEvent.Source); var view = tl?.PlatformImpl as WindowBaseImpl; if (view == null) throw new ArgumentException(); diff --git a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs index ddabfe8f5d..7c7b32f7e4 100644 --- a/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs +++ b/src/Avalonia.Native/AvaloniaNativeMenuExporter.cs @@ -167,7 +167,7 @@ namespace Avalonia.Native if (appMenu == null) { - appMenu = AvaloniaNativeMenuExporter.CreateDefaultAppMenu(); + appMenu = CreateDefaultAppMenu(); NativeMenu.SetMenu(Application.Current, appMenu); } diff --git a/src/Avalonia.Native/IAvnMenu.cs b/src/Avalonia.Native/IAvnMenu.cs index f75621865c..709980c6b9 100644 --- a/src/Avalonia.Native/IAvnMenu.cs +++ b/src/Avalonia.Native/IAvnMenu.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Reactive.Disposables; using Avalonia.Controls; -using Avalonia.Platform.Interop; namespace Avalonia.Native.Interop { @@ -111,7 +110,7 @@ namespace Avalonia.Native.Interop.Impl private __MicroComIAvnMenuItemProxy CreateNewAt(IAvaloniaNativeFactory factory, int index, NativeMenuItemBase item) { - var result = __MicroComIAvnMenuProxy.CreateNew(factory, item); + var result = CreateNew(factory, item); result.Initialize(item); diff --git a/src/Avalonia.OpenGL/Controls/OpenGlControlBase.cs b/src/Avalonia.OpenGL/Controls/OpenGlControlBase.cs index 6f87ff19ee..e13ee80864 100644 --- a/src/Avalonia.OpenGL/Controls/OpenGlControlBase.cs +++ b/src/Avalonia.OpenGL/Controls/OpenGlControlBase.cs @@ -27,7 +27,7 @@ namespace Avalonia.OpenGL.Controls _context.GlInterface.BindFramebuffer(GL_FRAMEBUFFER, _fb); EnsureTextureAttachment(); EnsureDepthBufferAttachment(_context.GlInterface); - if(!OpenGlControlBase.CheckFramebufferStatus(_context.GlInterface)) + if(!CheckFramebufferStatus(_context.GlInterface)) return; OnOpenGlRender(_context.GlInterface, _fb); @@ -186,7 +186,7 @@ namespace Avalonia.OpenGL.Controls EnsureDepthBufferAttachment(gl); EnsureTextureAttachment(); - return OpenGlControlBase.CheckFramebufferStatus(gl); + return CheckFramebufferStatus(gl); } catch(Exception e) { diff --git a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs index 94073506e3..ed55192bf5 100644 --- a/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs +++ b/src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs @@ -26,8 +26,8 @@ namespace Avalonia.ReactiveUI public IObservable GetActivationForView(IActivatableView view) { if (!(view is IVisual visual)) return Observable.Return(false); - if (view is Control control) return AvaloniaActivationForViewFetcher.GetActivationForControl(control); - return AvaloniaActivationForViewFetcher.GetActivationForVisual(visual); + if (view is Control control) return GetActivationForControl(control); + return GetActivationForVisual(visual); } /// diff --git a/src/Avalonia.X11/X11IconLoader.cs b/src/Avalonia.X11/X11IconLoader.cs index de7c57a556..4ae1c1599f 100644 --- a/src/Avalonia.X11/X11IconLoader.cs +++ b/src/Avalonia.X11/X11IconLoader.cs @@ -16,9 +16,9 @@ namespace Avalonia.X11 return rv; } - public IWindowIconImpl LoadIcon(string fileName) => X11IconLoader.LoadIcon(new Bitmap(fileName)); + public IWindowIconImpl LoadIcon(string fileName) => LoadIcon(new Bitmap(fileName)); - public IWindowIconImpl LoadIcon(Stream stream) => X11IconLoader.LoadIcon(new Bitmap(stream)); + public IWindowIconImpl LoadIcon(Stream stream) => LoadIcon(new Bitmap(stream)); public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) { diff --git a/src/Avalonia.X11/X11Platform.cs b/src/Avalonia.X11/X11Platform.cs index 312945e713..6ffebaf32b 100644 --- a/src/Avalonia.X11/X11Platform.cs +++ b/src/Avalonia.X11/X11Platform.cs @@ -5,7 +5,6 @@ using System.Reflection; using System.Runtime.InteropServices; using Avalonia.Controls; using Avalonia.Controls.Platform; -using Avalonia.Dialogs; using Avalonia.FreeDesktop; using Avalonia.FreeDesktop.DBusIme; using Avalonia.Input; @@ -42,10 +41,10 @@ namespace Avalonia.X11 Options = options; bool useXim = false; - if (AvaloniaX11Platform.EnableIme(options)) + if (EnableIme(options)) { // Attempt to configure DBus-based input method and check if we can fall back to XIM - if (!X11DBusImeHelper.DetectAndRegister() && AvaloniaX11Platform.ShouldUseXim()) + if (!X11DBusImeHelper.DetectAndRegister() && ShouldUseXim()) useXim = true; } @@ -85,7 +84,7 @@ namespace Avalonia.X11 .Bind().ToConstant(new LinuxMountedVolumeInfoProvider()) .Bind().ToConstant(new X11PlatformLifetimeEvents(this)); - X11Screens = Avalonia.X11.X11Screens.Init(this); + X11Screens = X11.X11Screens.Init(this); Screens = new X11Screens(X11Screens); if (Info.XInputVersion != null) { diff --git a/src/Avalonia.X11/X11Window.Ime.cs b/src/Avalonia.X11/X11Window.Ime.cs index 128d48957c..8b267b2762 100644 --- a/src/Avalonia.X11/X11Window.Ime.cs +++ b/src/Avalonia.X11/X11Window.Ime.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; -using System.Threading.Tasks; using Avalonia.FreeDesktop; using Avalonia.Input; using Avalonia.Input.Raw; @@ -107,7 +106,7 @@ namespace Avalonia.X11 var filtered = ScheduleKeyInput(new RawKeyEventArgs(_keyboard, (ulong)ev.KeyEvent.time.ToInt64(), _inputRoot, ev.type == XEventName.KeyPress ? RawKeyEventType.KeyDown : RawKeyEventType.KeyUp, - X11KeyTransform.ConvertKey(key), X11Window.TranslateModifiers(ev.KeyEvent.state)), ref ev, (int)key, ev.KeyEvent.keycode); + X11KeyTransform.ConvertKey(key), TranslateModifiers(ev.KeyEvent.state)), ref ev, (int)key, ev.KeyEvent.keycode); if (ev.type == XEventName.KeyPress && !filtered) TriggerClassicTextInputEvent(ref ev); diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index b2120b718e..5d8ff0884b 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; using System.Diagnostics; using System.Linq; -using System.Reactive.Disposables; using System.Text; using System.Threading.Tasks; using System.Threading; @@ -463,7 +461,7 @@ namespace Avalonia.X11 : new Vector(-1, 0); ScheduleInput(new RawMouseWheelEventArgs(_mouse, (ulong)ev.ButtonEvent.time.ToInt64(), _inputRoot, new Point(ev.ButtonEvent.x, ev.ButtonEvent.y), delta, - X11Window.TranslateModifiers(ev.ButtonEvent.state)), ref ev); + TranslateModifiers(ev.ButtonEvent.state)), ref ev); } } @@ -760,7 +758,7 @@ namespace Avalonia.X11 { var mev = new RawPointerEventArgs( _mouse, (ulong)ev.ButtonEvent.time.ToInt64(), _inputRoot, - type, new Point(ev.ButtonEvent.x, ev.ButtonEvent.y), X11Window.TranslateModifiers(mods)); + type, new Point(ev.ButtonEvent.x, ev.ButtonEvent.y), TranslateModifiers(mods)); ScheduleInput(mev, ref ev); } diff --git a/src/Avalonia.X11/XI2Manager.cs b/src/Avalonia.X11/XI2Manager.cs index 952112b6fd..cfe55036a3 100644 --- a/src/Avalonia.X11/XI2Manager.cs +++ b/src/Avalonia.X11/XI2Manager.cs @@ -193,7 +193,7 @@ namespace Avalonia.X11 { var rev = (XIEnterLeaveEvent*)xev; if (_clients.TryGetValue(rev->EventWindow, out var client)) - XI2Manager.OnEnterLeaveEvent(client, ref *rev); + OnEnterLeaveEvent(client, ref *rev); } } diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs index 12406df765..264361e743 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs @@ -1,11 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Xml; using Avalonia.Markup.Xaml.Parsers; using Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers; using Avalonia.Utilities; -using XamlX; using XamlX.Ast; using XamlX.Transform; using XamlX.Transform.Transformers; diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/IconTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/IconTypeConverter.cs index 078efcab6e..24b690b6f1 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/IconTypeConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/IconTypeConverter.cs @@ -20,7 +20,7 @@ namespace Avalonia.Markup.Xaml.Converters var path = value as string; if (path != null) { - return IconTypeConverter.CreateIconFromPath(context, path); + return CreateIconFromPath(context, path); } var bitmap = value as IBitmap; diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs index 01d98ac9fb..dbcac7a2a3 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs @@ -56,12 +56,12 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions if (control != null) { - var source = control.GetResourceObservable(ResourceKey, DynamicResourceExtension.GetConverter(targetProperty)); + var source = control.GetResourceObservable(ResourceKey, GetConverter(targetProperty)); return InstancedBinding.OneWay(source, _priority); } else if (_anchor is IResourceProvider resourceProvider) { - var source = resourceProvider.GetResourceObservable(ResourceKey, DynamicResourceExtension.GetConverter(targetProperty)); + var source = resourceProvider.GetResourceObservable(ResourceKey, GetConverter(targetProperty)); return InstancedBinding.OneWay(source, _priority); } diff --git a/src/Markup/Avalonia.Markup.Xaml/Parsers/PropertyParser.cs b/src/Markup/Avalonia.Markup.Xaml/Parsers/PropertyParser.cs index de463e2903..507e0690fd 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Parsers/PropertyParser.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Parsers/PropertyParser.cs @@ -1,6 +1,4 @@ -using System; -using Avalonia.Data.Core; -using Avalonia.Markup.Parsers; +using Avalonia.Data.Core; using Avalonia.Utilities; namespace Avalonia.Markup.Xaml.Parsers diff --git a/src/Markup/Avalonia.Markup/Markup/Parsers/Nodes/StringIndexerNode.cs b/src/Markup/Avalonia.Markup/Markup/Parsers/Nodes/StringIndexerNode.cs index 824911902b..6176608196 100644 --- a/src/Markup/Avalonia.Markup/Markup/Parsers/Nodes/StringIndexerNode.cs +++ b/src/Markup/Avalonia.Markup/Markup/Parsers/Nodes/StringIndexerNode.cs @@ -113,9 +113,9 @@ namespace Avalonia.Markup.Parsers.Nodes } - private bool SetValueInArray(Array array, int[] indices, object? value) + private static bool SetValueInArray(Array array, int[] indices, object? value) { - if (StringIndexerNode.ValidBounds(indices, array)) + if (ValidBounds(indices, array)) { array.SetValue(value, indices); return true; @@ -223,9 +223,9 @@ namespace Avalonia.Markup.Parsers.Nodes return GetValueFromArray(array, intArgs); } - private object? GetValueFromArray(Array array, int[] indices) + private static object? GetValueFromArray(Array array, int[] indices) { - if (StringIndexerNode.ValidBounds(indices, array)) + if (ValidBounds(indices, array)) { return array.GetValue(indices); } diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index 46c8109fd8..60be732b8e 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -429,7 +429,7 @@ namespace Avalonia.Skia var spread = (float)boxShadow.Spread; var offsetX = (float)boxShadow.OffsetX; var offsetY = (float)boxShadow.OffsetY; - var outerRect = DrawingContextImpl.AreaCastingShadowInHole(rc, (float)boxShadow.Blur, spread, offsetX, offsetY); + var outerRect = AreaCastingShadowInHole(rc, (float)boxShadow.Blur, spread, offsetX, offsetY); Canvas.Save(); using var shadowRect = new SKRoundRect(skRoundRect); @@ -1044,7 +1044,7 @@ namespace Avalonia.Skia if (brush is IGradientBrush gradient) { - DrawingContextImpl.ConfigureGradientBrush(ref paintWrapper, targetSize, gradient); + ConfigureGradientBrush(ref paintWrapper, targetSize, gradient); return paintWrapper; } diff --git a/src/Windows/Avalonia.Win32/ClipboardImpl.cs b/src/Windows/Avalonia.Win32/ClipboardImpl.cs index 813903c270..85c97307e8 100644 --- a/src/Windows/Avalonia.Win32/ClipboardImpl.cs +++ b/src/Windows/Avalonia.Win32/ClipboardImpl.cs @@ -31,7 +31,7 @@ namespace Avalonia.Win32 public async Task GetTextAsync() { - using(await ClipboardImpl.OpenClipboard()) + using(await OpenClipboard()) { IntPtr hText = UnmanagedMethods.GetClipboardData(UnmanagedMethods.ClipboardFormat.CF_UNICODETEXT); if (hText == IntPtr.Zero) @@ -58,7 +58,7 @@ namespace Avalonia.Win32 throw new ArgumentNullException(nameof(text)); } - using(await ClipboardImpl.OpenClipboard()) + using(await OpenClipboard()) { UnmanagedMethods.EmptyClipboard(); @@ -69,7 +69,7 @@ namespace Avalonia.Win32 public async Task ClearAsync() { - using(await ClipboardImpl.OpenClipboard()) + using(await OpenClipboard()) { UnmanagedMethods.EmptyClipboard(); } diff --git a/src/Windows/Avalonia.Win32/CursorFactory.cs b/src/Windows/Avalonia.Win32/CursorFactory.cs index 73e45db6d3..862e99be19 100644 --- a/src/Windows/Avalonia.Win32/CursorFactory.cs +++ b/src/Windows/Avalonia.Win32/CursorFactory.cs @@ -92,7 +92,7 @@ namespace Avalonia.Win32 public ICursorImpl CreateCursor(IBitmapImpl cursor, PixelPoint hotSpot) { - using var source = CursorFactory.LoadSystemDrawingBitmap(cursor); + using var source = LoadSystemDrawingBitmap(cursor); using var mask = AlphaToMask(source); var info = new UnmanagedMethods.ICONINFO diff --git a/src/Windows/Avalonia.Win32/DataObject.cs b/src/Windows/Avalonia.Win32/DataObject.cs index c6ac9e63f5..27560df35e 100644 --- a/src/Windows/Avalonia.Win32/DataObject.cs +++ b/src/Windows/Avalonia.Win32/DataObject.cs @@ -288,7 +288,7 @@ namespace Avalonia.Win32 var byteArr = bytes is byte[] ? (byte[])bytes : bytes.ToArray(); return WriteBytesToHGlobal(ref hGlobal, byteArr); } - return WriteBytesToHGlobal(ref hGlobal, DataObject.SerializeObject(data)); + return WriteBytesToHGlobal(ref hGlobal, SerializeObject(data)); } private static byte[] SerializeObject(object data) @@ -302,7 +302,7 @@ namespace Avalonia.Win32 } } - private unsafe uint WriteBytesToHGlobal(ref IntPtr hGlobal, ReadOnlySpan data) + private static unsafe uint WriteBytesToHGlobal(ref IntPtr hGlobal, ReadOnlySpan data) { int required = data.Length; if (hGlobal == IntPtr.Zero) @@ -326,7 +326,7 @@ namespace Avalonia.Win32 } } - private uint WriteFileListToHGlobal(ref IntPtr hGlobal, IEnumerable files) + private static uint WriteFileListToHGlobal(ref IntPtr hGlobal, IEnumerable files) { if (!files?.Any() ?? false) return unchecked((int)UnmanagedMethods.HRESULT.S_OK); @@ -358,7 +358,7 @@ namespace Avalonia.Win32 } } - private uint WriteStringToHGlobal(ref IntPtr hGlobal, string data) + private static uint WriteStringToHGlobal(ref IntPtr hGlobal, string data) { int required = (data.Length + 1) * sizeof(char); if (hGlobal == IntPtr.Zero) diff --git a/src/tools/DevGenerators/CompositionGenerator/Generator.cs b/src/tools/DevGenerators/CompositionGenerator/Generator.cs index c5f5ffcea4..0fb0389ca8 100644 --- a/src/tools/DevGenerators/CompositionGenerator/Generator.cs +++ b/src/tools/DevGenerators/CompositionGenerator/Generator.cs @@ -540,7 +540,7 @@ var changed = reader.Read<{ChangedFieldsTypeName(cl)}>(); return cl.AddMembers(method); } - ClassDeclarationSyntax WithStartAnimation(ClassDeclarationSyntax cl, BlockSyntax body) + static ClassDeclarationSyntax WithStartAnimation(ClassDeclarationSyntax cl, BlockSyntax body) { body = body.AddStatements( ExpressionStatement(InvocationExpression(MemberAccess("base", "StartAnimation"), From 6213676115ae823cb70b1f8ad674a3900836a87b Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Mon, 17 Oct 2022 17:00:15 +0200 Subject: [PATCH 22/97] fix: Address CA1822 rule --- src/Windows/Avalonia.Win32/Win32Platform.cs | 38 +++++++++---------- .../Avalonia.Win32/WindowImpl.AppWndProc.cs | 4 +- .../WindowImpl.CustomCaptionProc.cs | 4 +- src/Windows/Avalonia.Win32/WindowImpl.cs | 7 ++-- .../CompositionGenerator/Generator.cs | 36 +++++++++--------- .../RenderTests_Culling.cs | 2 +- .../Rendering/DeferredRendererTests.cs | 10 ++--- .../AutoCompleteBoxTests.cs | 2 +- .../ButtonTests.cs | 2 +- .../CalendarDatePickerTests.cs | 4 +- .../Avalonia.Controls.UnitTests/GridTests.cs | 4 +- .../ListBoxTests.cs | 6 +-- .../MaskedTextBoxTests.cs | 6 +-- .../NumericUpDownTests.cs | 2 +- .../Primitives/PopupTests.cs | 2 +- .../TextBoxTests.cs | 8 ++-- .../TreeViewTests.cs | 2 +- .../CompiledBindingExtensionTests.cs | 10 ++--- .../DynamicResourceExtensionTests.cs | 20 +++++----- .../StaticResourceExtensionTests.cs | 12 +++--- .../Xaml/ResourceDictionaryTests.cs | 26 ++++++------- .../Xaml/XamlIlTests.cs | 2 +- 22 files changed, 105 insertions(+), 104 deletions(-) diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index 3cdc3586dc..69b47540a9 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -131,10 +131,10 @@ namespace Avalonia.Win32 internal static Compositor Compositor { get; private set; } public Size DoubleClickSize => new Size( - UnmanagedMethods.GetSystemMetrics(UnmanagedMethods.SystemMetric.SM_CXDOUBLECLK), - UnmanagedMethods.GetSystemMetrics(UnmanagedMethods.SystemMetric.SM_CYDOUBLECLK)); + GetSystemMetrics(SystemMetric.SM_CXDOUBLECLK), + GetSystemMetrics(SystemMetric.SM_CYDOUBLECLK)); - public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(UnmanagedMethods.GetDoubleClickTime()); + public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(GetDoubleClickTime()); /// public Size TouchDoubleClickSize => new Size(16,16); @@ -185,16 +185,16 @@ namespace Avalonia.Win32 public bool HasMessages() { UnmanagedMethods.MSG msg; - return UnmanagedMethods.PeekMessage(out msg, IntPtr.Zero, 0, 0, 0); + return PeekMessage(out msg, IntPtr.Zero, 0, 0, 0); } public void ProcessMessage() { - if (UnmanagedMethods.GetMessage(out var msg, IntPtr.Zero, 0, 0) > -1) + if (GetMessage(out var msg, IntPtr.Zero, 0, 0) > -1) { - UnmanagedMethods.TranslateMessage(ref msg); - UnmanagedMethods.DispatchMessage(ref msg); + TranslateMessage(ref msg); + DispatchMessage(ref msg); } else { @@ -208,10 +208,10 @@ namespace Avalonia.Win32 { var result = 0; while (!cancellationToken.IsCancellationRequested - && (result = UnmanagedMethods.GetMessage(out var msg, IntPtr.Zero, 0, 0)) > 0) + && (result = GetMessage(out var msg, IntPtr.Zero, 0, 0)) > 0) { - UnmanagedMethods.TranslateMessage(ref msg); - UnmanagedMethods.DispatchMessage(ref msg); + TranslateMessage(ref msg); + DispatchMessage(ref msg); } if (result < 0) { @@ -225,7 +225,7 @@ namespace Avalonia.Win32 UnmanagedMethods.TimerProc timerDelegate = (hWnd, uMsg, nIDEvent, dwTime) => callback(); - IntPtr handle = UnmanagedMethods.SetTimer( + IntPtr handle = SetTimer( IntPtr.Zero, IntPtr.Zero, (uint)interval.TotalMilliseconds, @@ -237,7 +237,7 @@ namespace Avalonia.Win32 return Disposable.Create(() => { _delegates.Remove(timerDelegate); - UnmanagedMethods.KillTimer(IntPtr.Zero, handle); + KillTimer(IntPtr.Zero, handle); }); } @@ -246,9 +246,9 @@ namespace Avalonia.Win32 public void Signal(DispatcherPriority prio) { - UnmanagedMethods.PostMessage( + PostMessage( _hwnd, - (int) UnmanagedMethods.WindowsMessage.WM_DISPATCH_WORK_ITEM, + (int)WindowsMessage.WM_DISPATCH_WORK_ITEM, new IntPtr(SignalW), new IntPtr(SignalL)); } @@ -262,7 +262,7 @@ namespace Avalonia.Win32 [SuppressMessage("Microsoft.StyleCop.CSharp.NamingRules", "SA1305:FieldNamesMustNotUseHungarianNotation", Justification = "Using Win32 naming for consistency.")] private IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam) { - if (msg == (int) UnmanagedMethods.WindowsMessage.WM_DISPATCH_WORK_ITEM && wParam.ToInt64() == SignalW && lParam.ToInt64() == SignalL) + if (msg == (int)WindowsMessage.WM_DISPATCH_WORK_ITEM && wParam.ToInt64() == SignalW && lParam.ToInt64() == SignalL) { Signaled?.Invoke(null); } @@ -284,7 +284,7 @@ namespace Avalonia.Win32 TrayIconImpl.ProcWnd(hWnd, msg, wParam, lParam); - return UnmanagedMethods.DefWindowProc(hWnd, msg, wParam, lParam); + return DefWindowProc(hWnd, msg, wParam, lParam); } private void CreateMessageWindow() @@ -296,18 +296,18 @@ namespace Avalonia.Win32 { cbSize = Marshal.SizeOf(), lpfnWndProc = _wndProcDelegate, - hInstance = UnmanagedMethods.GetModuleHandle(null), + hInstance = GetModuleHandle(null), lpszClassName = "AvaloniaMessageWindow " + Guid.NewGuid(), }; - ushort atom = UnmanagedMethods.RegisterClassEx(ref wndClassEx); + ushort atom = RegisterClassEx(ref wndClassEx); if (atom == 0) { throw new Win32Exception(); } - _hwnd = UnmanagedMethods.CreateWindowEx(0, atom, null, 0, 0, 0, 0, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); + _hwnd = CreateWindowEx(0, atom, null, 0, 0, 0, 0, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); if (_hwnd == IntPtr.Zero) { diff --git a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs index f8785371d9..9855435e9f 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs @@ -356,7 +356,7 @@ namespace Avalonia.Win32 RawPointerEventType.XButton1Down : RawPointerEventType.XButton2Down, }, - PointToClient(PointFromLParam(lParam)), GetMouseModifiers(wParam)); + PointToClient(WindowImpl.PointFromLParam(lParam)), GetMouseModifiers(wParam)); break; } case WindowsMessage.WM_TOUCH: @@ -948,7 +948,7 @@ namespace Avalonia.Win32 return new Point((short)(ToInt32(lParam) & 0xffff), (short)(ToInt32(lParam) >> 16)) / RenderScaling; } - private PixelPoint PointFromLParam(IntPtr lParam) + private static PixelPoint PointFromLParam(IntPtr lParam) { return new PixelPoint((short)(ToInt32(lParam) & 0xffff), (short)(ToInt32(lParam) >> 16)); } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.CustomCaptionProc.cs b/src/Windows/Avalonia.Win32/WindowImpl.CustomCaptionProc.cs index e864f32138..c7dc90ed58 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.CustomCaptionProc.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.CustomCaptionProc.cs @@ -13,7 +13,7 @@ namespace Avalonia.Win32 private HitTestValues HitTestNCA(IntPtr hWnd, IntPtr wParam, IntPtr lParam) { // Get the point coordinates for the hit test (screen space). - var ptMouse = PointFromLParam(lParam); + var ptMouse = WindowImpl.PointFromLParam(lParam); // Get the window rectangle. GetWindowRect(hWnd, out var rcWindow); @@ -105,7 +105,7 @@ namespace Avalonia.Win32 if (hittestResult == HitTestValues.HTCAPTION) { - var position = PointToClient(PointFromLParam(lParam)); + var position = PointToClient(WindowImpl.PointFromLParam(lParam)); if (_owner is Window window) { diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 0f243fcf9f..6e849a5b9d 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -639,7 +639,7 @@ namespace Avalonia.Win32 public Point PointToClient(PixelPoint point) { var p = new POINT { X = point.X, Y = point.Y }; - UnmanagedMethods.ScreenToClient(_hwnd, ref p); + ScreenToClient(_hwnd, ref p); return new Point(p.X, p.Y) / RenderScaling; } @@ -1321,12 +1321,13 @@ namespace Avalonia.Win32 private const int MF_DISABLED = 0x2; private const int SC_CLOSE = 0xF060; - void DisableCloseButton(IntPtr hwnd) + static void DisableCloseButton(IntPtr hwnd) { EnableMenuItem(GetSystemMenu(hwnd, false), SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); } - void EnableCloseButton(IntPtr hwnd) + + static void EnableCloseButton(IntPtr hwnd) { EnableMenuItem(GetSystemMenu(hwnd, false), SC_CLOSE, MF_BYCOMMAND | MF_ENABLED); diff --git a/src/tools/DevGenerators/CompositionGenerator/Generator.cs b/src/tools/DevGenerators/CompositionGenerator/Generator.cs index 0fb0389ca8..f8d5ad826e 100644 --- a/src/tools/DevGenerators/CompositionGenerator/Generator.cs +++ b/src/tools/DevGenerators/CompositionGenerator/Generator.cs @@ -311,7 +311,7 @@ namespace Avalonia.SourceGenerator.CompositionGenerator "Server", "Server" + cl.Name + ".generated.cs"); } - private ClassDeclarationSyntax GenerateClientProperty(ClassDeclarationSyntax client, GClass cl, GProperty prop, + private static ClassDeclarationSyntax GenerateClientProperty(ClassDeclarationSyntax client, GClass cl, GProperty prop, TypeSyntax propType, bool isObject, bool isNullable) { var fieldName = PropertyBackingFieldName(prop); @@ -344,7 +344,7 @@ namespace Avalonia.SourceGenerator.CompositionGenerator .AddModifiers(SyntaxKind.PartialKeyword).WithSemicolonToken(Semicolon())); } - EnumDeclarationSyntax GenerateChangedFieldsEnum(GClass cl) + static EnumDeclarationSyntax GenerateChangedFieldsEnum(GClass cl) { var changedFieldsEnum = EnumDeclaration(Identifier(ChangedFieldsTypeName(cl))); int count = 0; @@ -371,7 +371,7 @@ namespace Avalonia.SourceGenerator.CompositionGenerator .AddAttributeLists(AttributeList(SingletonSeparatedList(Attribute(IdentifierName("System.Flags"))))); } - StatementSyntax GeneratePropertySetterAssignment(GClass cl, GProperty prop, bool isObject, bool isNullable) + static StatementSyntax GeneratePropertySetterAssignment(GClass cl, GProperty prop, bool isObject, bool isNullable) { var code = @$" // Update the backing value @@ -404,8 +404,8 @@ namespace Avalonia.SourceGenerator.CompositionGenerator return ParseStatement("{\n" + code + "\n}"); } - - BlockSyntax ApplyStartAnimation(BlockSyntax body, GClass cl, GProperty prop) + + static BlockSyntax ApplyStartAnimation(BlockSyntax body, GClass cl, GProperty prop) { var code = $@" if (propertyName == ""{prop.Name}"") @@ -435,8 +435,8 @@ return; "Color", "Avalonia.Media.Color" }; - - BlockSyntax ApplyGetProperty(BlockSyntax body, GProperty prop, string? expr = null) + + static BlockSyntax ApplyGetProperty(BlockSyntax body, GProperty prop, string? expr = null) { if (VariantPropertyTypes.Contains(prop.Type)) return body.AddStatements( @@ -446,7 +446,7 @@ return; return body; } - private BlockSyntax SerializeChangesPrologue(GClass cl) + private static BlockSyntax SerializeChangesPrologue(GClass cl) { return Block( ParseStatement("base.SerializeChangesCore(writer);"), @@ -454,10 +454,10 @@ return; ); } - private BlockSyntax SerializeChangesEpilogue(GClass cl) => + private static BlockSyntax SerializeChangesEpilogue(GClass cl) => Block(ParseStatement(ChangedFieldsFieldName(cl) + " = default;")); - - BlockSyntax ApplySerializeField(BlockSyntax body, GClass cl, GProperty prop, bool isObject, bool isPassthrough) + + static BlockSyntax ApplySerializeField(BlockSyntax body, GClass cl, GProperty prop, bool isObject, bool isPassthrough) { var changedFields = ChangedFieldsFieldName(cl); var changedFieldsType = ChangedFieldsTypeName(cl); @@ -478,7 +478,7 @@ return; return body.AddStatements(ParseStatement(code)); } - private BlockSyntax DeserializeChangesPrologue(GClass cl) + private static BlockSyntax DeserializeChangesPrologue(GClass cl) { return Block(ParseStatement($@" base.DeserializeChangesCore(reader, commitedAt); @@ -487,12 +487,12 @@ var changed = reader.Read<{ChangedFieldsTypeName(cl)}>(); ")); } - private BlockSyntax ApplyDeserializeChangesEpilogue(BlockSyntax body, GClass cl) + private static BlockSyntax ApplyDeserializeChangesEpilogue(BlockSyntax body, GClass cl) { return body.AddStatements(ParseStatement("OnFieldsDeserialized(changed);")); } - - BlockSyntax ApplyDeserializeField(BlockSyntax body, GClass cl, GProperty prop, string serverType, bool isObject) + + static BlockSyntax ApplyDeserializeField(BlockSyntax body, GClass cl, GProperty prop, string serverType, bool isObject) { var changedFieldsType = ChangedFieldsTypeName(cl); var code = ""; @@ -514,7 +514,7 @@ var changed = reader.Read<{ChangedFieldsTypeName(cl)}>(); return body.AddStatements(ParseStatement(code)); } - ClassDeclarationSyntax WithGetPropertyForAnimation(ClassDeclarationSyntax cl, BlockSyntax body) + static ClassDeclarationSyntax WithGetPropertyForAnimation(ClassDeclarationSyntax cl, BlockSyntax body) { if (body.Statements.Count == 0) return cl; @@ -526,8 +526,8 @@ var changed = reader.Read<{ChangedFieldsTypeName(cl)}>(); return cl.AddMembers(method); } - - ClassDeclarationSyntax WithGetCompositionProperty(ClassDeclarationSyntax cl, BlockSyntax body) + + static ClassDeclarationSyntax WithGetCompositionProperty(ClassDeclarationSyntax cl, BlockSyntax body) { if (body.Statements.Count == 0) return cl; diff --git a/tests/Avalonia.Base.UnitTests/RenderTests_Culling.cs b/tests/Avalonia.Base.UnitTests/RenderTests_Culling.cs index 509d2451a9..d17302808d 100644 --- a/tests/Avalonia.Base.UnitTests/RenderTests_Culling.cs +++ b/tests/Avalonia.Base.UnitTests/RenderTests_Culling.cs @@ -171,7 +171,7 @@ namespace Avalonia.Base.UnitTests } } - private void Render(IControl control) + private static void Render(IControl control) { var ctx = CreateDrawingContext(); control.Measure(Size.Infinity); diff --git a/tests/Avalonia.Base.UnitTests/Rendering/DeferredRendererTests.cs b/tests/Avalonia.Base.UnitTests/Rendering/DeferredRendererTests.cs index 7f977103ce..df44575f68 100644 --- a/tests/Avalonia.Base.UnitTests/Rendering/DeferredRendererTests.cs +++ b/tests/Avalonia.Base.UnitTests/Rendering/DeferredRendererTests.cs @@ -726,7 +726,7 @@ namespace Avalonia.Base.UnitTests.Rendering } } - private DeferredRenderer CreateTargetAndRunFrame( + private static DeferredRenderer CreateTargetAndRunFrame( TestRoot root, Mock timer = null, ISceneBuilder sceneBuilder = null, @@ -750,25 +750,25 @@ namespace Avalonia.Base.UnitTests.Rendering return Mock.Get(renderer.Layers[layerRoot].Bitmap.Item.CreateDrawingContext(null)); } - private void IgnoreFirstFrame(IRenderLoopTask task, Mock sceneBuilder) + private static void IgnoreFirstFrame(IRenderLoopTask task, Mock sceneBuilder) { RunFrame(task); sceneBuilder.Invocations.Clear(); } - private void RunFrame(IRenderLoopTask task) + private static void RunFrame(IRenderLoopTask task) { task.Update(TimeSpan.Zero); task.Render(); } - private IRenderTargetBitmapImpl CreateLayer() + private static IRenderTargetBitmapImpl CreateLayer() { return Mock.Of(x => x.CreateDrawingContext(It.IsAny()) == Mock.Of()); } - private Mock MockSceneBuilder(IRenderRoot root) + private static Mock MockSceneBuilder(IRenderRoot root) { var result = new Mock(); result.Setup(x => x.UpdateAll(It.IsAny())) diff --git a/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs b/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs index c8bd289e54..f97b69c752 100644 --- a/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs @@ -455,7 +455,7 @@ namespace Avalonia.Controls.UnitTests /// Creates a large list of strings for AutoCompleteBox testing. /// /// Returns a new List of string values. - private IList CreateSimpleStringArray() + private static IList CreateSimpleStringArray() { return new List { diff --git a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs index 42bdffd908..68f46824c1 100644 --- a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs @@ -379,7 +379,7 @@ namespace Avalonia.Controls.UnitTests } } - private KeyEventArgs CreateKeyDownEvent(Key key, IInteractive source = null) + private static KeyEventArgs CreateKeyDownEvent(Key key, IInteractive source = null) { return new KeyEventArgs { RoutedEvent = InputElement.KeyDownEvent, Key = key, Source = source }; } diff --git a/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs b/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs index a73e14939d..c3acf31caa 100644 --- a/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs @@ -76,7 +76,7 @@ namespace Avalonia.Controls.UnitTests private static TestServices Services => TestServices.MockThreadingInterface.With( standardCursorFactory: Mock.Of()); - private CalendarDatePicker CreateControl() + private static CalendarDatePicker CreateControl() { var datePicker = new CalendarDatePicker @@ -88,7 +88,7 @@ namespace Avalonia.Controls.UnitTests return datePicker; } - private IControlTemplate CreateTemplate() + private static IControlTemplate CreateTemplate() { return new FuncControlTemplate((control, scope) => { diff --git a/tests/Avalonia.Controls.UnitTests/GridTests.cs b/tests/Avalonia.Controls.UnitTests/GridTests.cs index b2d00929d8..d372bb2af4 100644 --- a/tests/Avalonia.Controls.UnitTests/GridTests.cs +++ b/tests/Avalonia.Controls.UnitTests/GridTests.cs @@ -16,13 +16,13 @@ namespace Avalonia.Controls.UnitTests this.output = output; } - private Grid CreateGrid(params (string name, GridLength width)[] columns) + private static Grid CreateGrid(params (string name, GridLength width)[] columns) { return CreateGrid(columns.Select(c => (c.name, c.width, ColumnDefinition.MinWidthProperty.GetDefaultValue(typeof(ColumnDefinition)))).ToArray()); } - private Grid CreateGrid(params (string name, GridLength width, double minWidth)[] columns) + private static Grid CreateGrid(params (string name, GridLength width, double minWidth)[] columns) { return CreateGrid(columns.Select(c => (c.name, c.width, c.minWidth, ColumnDefinition.MaxWidthProperty.GetDefaultValue(typeof(ColumnDefinition)))).ToArray()); diff --git a/tests/Avalonia.Controls.UnitTests/ListBoxTests.cs b/tests/Avalonia.Controls.UnitTests/ListBoxTests.cs index 203df0aded..e65a3b62ee 100644 --- a/tests/Avalonia.Controls.UnitTests/ListBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ListBoxTests.cs @@ -590,7 +590,7 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(new[] { "Bar" }, target.Selection.SelectedItems); } - private FuncControlTemplate ListBoxTemplate() + private static FuncControlTemplate ListBoxTemplate() { return new FuncControlTemplate((parent, scope) => new ScrollViewer @@ -643,7 +643,7 @@ namespace Avalonia.Controls.UnitTests }); } - private void Prepare(ListBox target) + private static void Prepare(ListBox target) { // The ListBox needs to be part of a rooted visual tree. var root = new TestRoot(); @@ -718,7 +718,7 @@ namespace Avalonia.Controls.UnitTests Assert.True(DataValidationErrors.GetErrors(target).SequenceEqual(new[] { exception })); } - private void RaiseKeyEvent(ListBox listBox, Key key, KeyModifiers inputModifiers = 0) + private static void RaiseKeyEvent(ListBox listBox, Key key, KeyModifiers inputModifiers = 0) { listBox.RaiseEvent(new KeyEventArgs { diff --git a/tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs index d1fa522206..22b4e0e87d 100644 --- a/tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs @@ -118,7 +118,7 @@ namespace Avalonia.Controls.UnitTests target.ApplyTemplate(); target.CaretIndex = 3; target.Measure(Size.Infinity); - + RaiseKeyEvent(target, Key.Right, 0); Assert.Equal(4, target.CaretIndex); @@ -885,7 +885,7 @@ namespace Avalonia.Controls.UnitTests textShaperImpl: new MockTextShaperImpl(), fontManagerImpl: new MockFontManagerImpl()); - private IControlTemplate CreateTemplate() + private static IControlTemplate CreateTemplate() { return new FuncControlTemplate((control, scope) => new TextPresenter @@ -908,7 +908,7 @@ namespace Avalonia.Controls.UnitTests }.RegisterInNameScope(scope)); } - private void RaiseKeyEvent(MaskedTextBox textBox, Key key, KeyModifiers inputModifiers) + private static void RaiseKeyEvent(MaskedTextBox textBox, Key key, KeyModifiers inputModifiers) { textBox.RaiseEvent(new KeyEventArgs { diff --git a/tests/Avalonia.Controls.UnitTests/NumericUpDownTests.cs b/tests/Avalonia.Controls.UnitTests/NumericUpDownTests.cs index dc47b19299..bdb94707de 100644 --- a/tests/Avalonia.Controls.UnitTests/NumericUpDownTests.cs +++ b/tests/Avalonia.Controls.UnitTests/NumericUpDownTests.cs @@ -75,7 +75,7 @@ namespace Avalonia.Controls.UnitTests .OfType() .First(); } - private IControlTemplate CreateTemplate() + private static IControlTemplate CreateTemplate() { return new FuncControlTemplate((control, scope) => { diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs index 100de7f4f6..68c9fba8b9 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs @@ -1074,7 +1074,7 @@ namespace Avalonia.Controls.UnitTests.Primitives } - private PointerPressedEventArgs CreatePointerPressedEventArgs(Window source, Point p) + private static PointerPressedEventArgs CreatePointerPressedEventArgs(Window source, Point p) { var pointer = new Pointer(Pointer.GetNextFreeId(), PointerType.Mouse, true); return new PointerPressedEventArgs( diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs index 23a330c96f..d550d7c5f9 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs @@ -578,7 +578,7 @@ namespace Avalonia.Controls.UnitTests target1.Focus(); Assert.True(target1.IsFocused); - + RaiseKeyEvent(target1, key, KeyModifiers.None); } } @@ -747,7 +747,7 @@ namespace Avalonia.Controls.UnitTests var clipboard = AvaloniaLocator.CurrentMutable.GetService(); clipboard.SetTextAsync(textInput).GetAwaiter().GetResult(); - + RaiseKeyEvent(target, Key.V, KeyModifiers.Control); clipboard.ClearAsync().GetAwaiter().GetResult(); } @@ -904,7 +904,7 @@ namespace Avalonia.Controls.UnitTests }.RegisterInNameScope(scope)); } - private void RaiseKeyEvent(TextBox textBox, Key key, KeyModifiers inputModifiers) + private static void RaiseKeyEvent(TextBox textBox, Key key, KeyModifiers inputModifiers) { textBox.RaiseEvent(new KeyEventArgs { @@ -914,7 +914,7 @@ namespace Avalonia.Controls.UnitTests }); } - private void RaiseTextEvent(TextBox textBox, string text) + private static void RaiseTextEvent(TextBox textBox, string text) { textBox.RaiseEvent(new TextInputEventArgs { diff --git a/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs b/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs index fb21acad9e..81d76f8ca5 100644 --- a/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs @@ -1247,7 +1247,7 @@ namespace Avalonia.Controls.UnitTests } } - private TreeViewItem GetItem(TreeView target, params int[] indexes) + private static TreeViewItem GetItem(TreeView target, params int[] indexes) { var c = (ItemsControl)target; diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs index 215ae4d54f..418349e390 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs @@ -1568,8 +1568,8 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions Assert.Equal(typeof(string), node.Property.PropertyType); } } - - void Throws(string type, Action cb) + + static void Throws(string type, Action cb) { try { @@ -1583,8 +1583,8 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions throw new Exception("Expected " + type); } - void ThrowsXamlParseException(Action cb) => Throws("XamlParseException", cb); - void ThrowsXamlTransformException(Action cb) => Throws("XamlTransformException", cb); + static void ThrowsXamlParseException(Action cb) => Throws("XamlParseException", cb); + static void ThrowsXamlTransformException(Action cb) => Throws("XamlTransformException", cb); static void PerformClick(Button button) @@ -1592,7 +1592,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions button.RaiseEvent(new KeyEventArgs { RoutedEvent = InputElement.KeyDownEvent, - Key = Input.Key.Enter, + Key = Key.Enter, }); } } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs index 4f323d8b2c..ccc460d900 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs @@ -221,7 +221,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions [Fact] public void DynamicResource_From_Style_Can_Be_Assigned_To_Setter() { - using (StyledWindow()) + using (DynamicResourceExtensionTests.StyledWindow()) { var xaml = @" "; - using (StyledWindow(assets: ("test:style.xaml", styleXaml))) + using (DynamicResourceExtensionTests.StyledWindow(assets: ("test:style.xaml", styleXaml))) { var xaml = @" "; - using (StyledWindow(assets: ("test:style.xaml", styleXaml))) + using (DynamicResourceExtensionTests.StyledWindow(assets: ("test:style.xaml", styleXaml))) { var xaml = @" "; - using (StyledWindow( + using (DynamicResourceExtensionTests.StyledWindow( ("test:style1.xaml", style1Xaml), ("test:style2.xaml", style2Xaml))) { @@ -606,7 +606,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions "; - using (StyledWindow( + using (DynamicResourceExtensionTests.StyledWindow( ("test:style1.xaml", style1Xaml), ("test:style2.xaml", style2Xaml))) { @@ -631,7 +631,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions [Fact] public void Control_Property_Is_Updated_When_Parent_Is_Changed() { - using (StyledWindow()) + using (DynamicResourceExtensionTests.StyledWindow()) { var xaml = @" new Styles { - DynamicResourceExtensionTests.WindowStyle(), + WindowStyle(), }); return UnitTestApplication.Start(services); diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/StaticResourceExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/StaticResourceExtensionTests.cs index 625785a0b7..94e1e013d2 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/StaticResourceExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/StaticResourceExtensionTests.cs @@ -374,7 +374,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions [Fact] public void StaticResource_Can_Be_Assigned_To_Converter() { - using (StyledWindow()) + using (StaticResourceExtensionTests.StyledWindow()) { var xaml = @" new Styles { - StaticResourceExtensionTests.WindowStyle(), + WindowStyle(), }); return UnitTestApplication.Start(services); diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/ResourceDictionaryTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/ResourceDictionaryTests.cs index 05e69adae0..030fa669b8 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/ResourceDictionaryTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/ResourceDictionaryTests.cs @@ -15,7 +15,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml [Fact] public void StaticResource_Works_In_ResourceDictionary() { - using (StyledWindow()) + using (ResourceDictionaryTests.StyledWindow()) { var xaml = @" "; - using (StyledWindow(assets: ("test:dict.xaml", dictionaryXaml))) + using (ResourceDictionaryTests.StyledWindow(assets: ("test:dict.xaml", dictionaryXaml))) { var xaml = @" AvaloniaRuntimeXamlLoader + AssertThrows(() => AvaloniaRuntimeXamlLoader .Load(@" Date: Wed, 19 Oct 2022 09:58:58 +0200 Subject: [PATCH 23/97] fix: Apply rule CA1822 --- src/Avalonia.Base/Media/PathMarkupParser.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Base/Media/PathMarkupParser.cs b/src/Avalonia.Base/Media/PathMarkupParser.cs index 30c5206125..41f97e5d1b 100644 --- a/src/Avalonia.Base/Media/PathMarkupParser.cs +++ b/src/Avalonia.Base/Media/PathMarkupParser.cs @@ -519,7 +519,7 @@ namespace Avalonia.Media return span.Slice(i); } - private bool ReadBool(ref ReadOnlySpan span) + private static bool ReadBool(ref ReadOnlySpan span) { span = SkipWhitespace(span); @@ -543,7 +543,7 @@ namespace Avalonia.Media } } - private double ReadDouble(ref ReadOnlySpan span) + private static double ReadDouble(ref ReadOnlySpan span) { if (!ReadArgument(ref span, out var doubleValue)) { @@ -553,7 +553,7 @@ namespace Avalonia.Media return double.Parse(doubleValue.ToString(), CultureInfo.InvariantCulture); } - private Size ReadSize(ref ReadOnlySpan span) + private static Size ReadSize(ref ReadOnlySpan span) { var width = ReadDouble(ref span); span = ReadSeparator(span); @@ -561,7 +561,7 @@ namespace Avalonia.Media return new Size(width, height); } - private Point ReadPoint(ref ReadOnlySpan span) + private static Point ReadPoint(ref ReadOnlySpan span) { var x = ReadDouble(ref span); span = ReadSeparator(span); @@ -569,7 +569,7 @@ namespace Avalonia.Media return new Point(x, y); } - private Point ReadRelativePoint(ref ReadOnlySpan span, Point origin) + private static Point ReadRelativePoint(ref ReadOnlySpan span, Point origin) { var x = ReadDouble(ref span); span = ReadSeparator(span); @@ -577,7 +577,7 @@ namespace Avalonia.Media return new Point(origin.X + x, origin.Y + y); } - private bool ReadCommand(ref ReadOnlySpan span, out Command command, out bool relative) + private static bool ReadCommand(ref ReadOnlySpan span, out Command command, out bool relative) { span = SkipWhitespace(span); if (span.IsEmpty) From ac2f0f88d6156278dc2de28c63a461a7aaed0d4e Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Thu, 3 Nov 2022 14:48:39 +0100 Subject: [PATCH 24/97] fix: Rule CA1822 only private and internal --- .editorconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/.editorconfig b/.editorconfig index c3989db7f4..488453596d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -145,6 +145,7 @@ dotnet_diagnostic.CA1820.severity = warning dotnet_diagnostic.CA1821.severity = warning # CA1822: Mark members as static dotnet_diagnostic.CA1822.severity = warning +dotnet_code_quality.CA1822.api_surface = private, internal # CA1825: Avoid zero-length array allocations dotnet_diagnostic.CA1825.severity = warning #CA1847: Use string.Contains(char) instead of string.Contains(string) with single characters From 581481f7adfe3d56899b04cee811b3d49756c0a0 Mon Sep 17 00:00:00 2001 From: zhouzj Date: Mon, 7 Nov 2022 09:52:06 +0800 Subject: [PATCH 25/97] Indicator size calculation should care about the ProgressBar's Padding property setting --- src/Avalonia.Controls/ProgressBar.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/ProgressBar.cs b/src/Avalonia.Controls/ProgressBar.cs index 71a7a58da4..165bec3a95 100644 --- a/src/Avalonia.Controls/ProgressBar.cs +++ b/src/Avalonia.Controls/ProgressBar.cs @@ -270,15 +270,16 @@ namespace Avalonia.Controls double percent = Maximum == Minimum ? 1.0 : (Value - Minimum) / (Maximum - Minimum); // When the Orientation changed, the indicator's Width or Height should set to double.NaN. + // Indicator size calculation should consider the ProgressBar's Padding property setting if (Orientation == Orientation.Horizontal) { - _indicator.Width = barSize.Width * percent; + _indicator.Width = (barSize.Width - _indicator.Margin.Left - _indicator.Margin.Right) * percent; _indicator.Height = double.NaN; } else { _indicator.Width = double.NaN; - _indicator.Height = barSize.Height * percent; + _indicator.Height = (barSize.Height - _indicator.Margin.Top - _indicator.Margin.Bottom) * percent; } From 1e69527ea62b4f97c96fa1d0d2f7fc47d8db57dc Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Tue, 15 Nov 2022 10:12:48 +0100 Subject: [PATCH 26/97] fix: address review --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 488453596d..7c0301a124 100644 --- a/.editorconfig +++ b/.editorconfig @@ -144,7 +144,7 @@ dotnet_diagnostic.CA1820.severity = warning # CA1821: Remove empty finalizers dotnet_diagnostic.CA1821.severity = warning # CA1822: Mark members as static -dotnet_diagnostic.CA1822.severity = warning +dotnet_diagnostic.CA1822.severity = suggestion dotnet_code_quality.CA1822.api_surface = private, internal # CA1825: Avoid zero-length array allocations dotnet_diagnostic.CA1825.severity = warning From 2d7c8645d0e82ed71edce10472bb5d5b1360d1d2 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Mon, 21 Nov 2022 01:14:43 +0600 Subject: [PATCH 27/97] Recalculate parent's child render nodes on visual tree attachment --- src/Avalonia.Base/Visual.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Avalonia.Base/Visual.cs b/src/Avalonia.Base/Visual.cs index 69389def56..51fc143f72 100644 --- a/src/Avalonia.Base/Visual.cs +++ b/src/Avalonia.Base/Visual.cs @@ -432,6 +432,7 @@ namespace Avalonia OnAttachedToVisualTree(e); AttachedToVisualTree?.Invoke(this, e); InvalidateVisual(); + _visualRoot.Renderer.RecalculateChildren(_visualParent!); if (ZIndex != 0 && this.GetVisualParent() is Visual parent) parent.HasNonUniformZIndexChildren = true; From 4460de529ebb617dbe5928bb89a8c44e424caad7 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Fri, 25 Nov 2022 00:56:43 -0500 Subject: [PATCH 28/97] Implement multiple documents loading and transforming in AvaloniaRuntimeXamlLoader --- .../DesignWindowLoader.cs | 3 +- .../AvaloniaRuntimeXamlLoader.cs | 46 +++--- .../AvaloniaXamlIlRuntimeCompiler.cs | 133 +++++++++++++----- .../AvaloniaXamlIlCompiler.cs | 48 ++++++- .../IXamlAstGroupTransformer.cs | 78 ++++++++++ .../IXamlDocumentResource.cs | 17 +++ .../AvaloniaXamlIlWellKnownTypes.cs | 9 ++ .../XamlDocumentParseException.cs | 21 +++ .../XamlDocumentResource.cs | 40 ++++++ .../Avalonia.Markup.Xaml.csproj | 1 + .../AvaloniaXamlLoader.cs | 7 +- .../RuntimeXamlLoaderConfiguration.cs | 13 +- .../RuntimeXamlLoaderDocument.cs | 70 +++++++++ .../DesignXamlLoader.cs | 6 +- .../CompiledBindingExtensionTests.cs | 6 +- .../XamlTestBase.cs | 4 +- 16 files changed, 413 insertions(+), 89 deletions(-) create mode 100644 src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/GroupTransformers/IXamlAstGroupTransformer.cs create mode 100644 src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/IXamlDocumentResource.cs create mode 100644 src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlDocumentParseException.cs create mode 100644 src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlDocumentResource.cs create mode 100644 src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderDocument.cs diff --git a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs index 9a901f909a..b4cfffcdca 100644 --- a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs +++ b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs @@ -38,10 +38,9 @@ namespace Avalonia.DesignerSupport var useCompiledBindings = localAsm?.GetCustomAttributes() .FirstOrDefault(a => a.Key == "AvaloniaUseCompiledBindingsByDefault")?.Value; - var loaded = loader.Load(stream, new RuntimeXamlLoaderConfiguration + var loaded = loader.Load(new RuntimeXamlLoaderDocument(baseUri, stream), new RuntimeXamlLoaderConfiguration { LocalAssembly = localAsm, - BaseUri = baseUri, DesignMode = true, UseCompiledBindingsByDefault = bool.TryParse(useCompiledBindings, out var parsedValue ) && parsedValue }); diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaRuntimeXamlLoader.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaRuntimeXamlLoader.cs index 9393bb0aa4..eb05844ffb 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaRuntimeXamlLoader.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaRuntimeXamlLoader.cs @@ -1,9 +1,10 @@ using System; +using System.Collections.Generic; using System.IO; using System.Reflection; using System.Text; using Avalonia.Markup.Xaml.XamlIl; - +#nullable enable namespace Avalonia.Markup.Xaml { public static class AvaloniaRuntimeXamlLoader @@ -17,31 +18,15 @@ namespace Avalonia.Markup.Xaml /// The URI of the XAML being loaded. /// Indicates whether the XAML is being loaded in design mode. /// The loaded object. - public static object Load(string xaml, Assembly localAssembly = null, object rootInstance = null, Uri uri = null, bool designMode = false) + public static object Load(string xaml, Assembly? localAssembly = null, object? rootInstance = null, Uri? uri = null, bool designMode = false) { - Contract.Requires(xaml != null); + xaml = xaml ?? throw new ArgumentNullException(nameof(xaml)); using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(xaml))) { return Load(stream, localAssembly, rootInstance, uri, designMode); } } - - /// - /// Loads XAML from a string. - /// - /// The string containing the XAML. - /// Xaml loader configuration. - /// The loaded object. - public static object Load(string xaml, RuntimeXamlLoaderConfiguration configuration) - { - Contract.Requires(xaml != null); - - using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(xaml))) - { - return Load(stream, configuration); - } - } /// /// Loads XAML from a stream. @@ -52,9 +37,10 @@ namespace Avalonia.Markup.Xaml /// The URI of the XAML being loaded. /// Indicates whether the XAML is being loaded in design mode. /// The loaded object. - public static object Load(Stream stream, Assembly localAssembly, object rootInstance = null, Uri uri = null, + public static object Load(Stream stream, Assembly? localAssembly = null, object? rootInstance = null, Uri? uri = null, bool designMode = false) - => AvaloniaXamlIlRuntimeCompiler.Load(stream, localAssembly, rootInstance, uri, designMode, false); + => AvaloniaXamlIlRuntimeCompiler.Load(new RuntimeXamlLoaderDocument(uri, rootInstance, stream), + new RuntimeXamlLoaderConfiguration { DesignMode = designMode, LocalAssembly = localAssembly }); /// /// Loads XAML from a stream. @@ -62,9 +48,17 @@ namespace Avalonia.Markup.Xaml /// The stream containing the XAML. /// Xaml loader configuration. /// The loaded object. - public static object Load(Stream stream, RuntimeXamlLoaderConfiguration configuration) - => AvaloniaXamlIlRuntimeCompiler.Load(stream, configuration.LocalAssembly, configuration.RootInstance, - configuration.BaseUri, configuration.DesignMode, configuration.UseCompiledBindingsByDefault); + public static object Load(RuntimeXamlLoaderDocument document, RuntimeXamlLoaderConfiguration? configuration = null) + => AvaloniaXamlIlRuntimeCompiler.Load(document, configuration ?? new RuntimeXamlLoaderConfiguration()); + + /// + /// Loads group of XAML files from a stream. + /// + /// Collection of documents. + /// Xaml loader configuration. + /// The loaded objects per each input document. + public static IReadOnlyList LoadGroup(IReadOnlyCollection documents, RuntimeXamlLoaderConfiguration? configuration = null) + => AvaloniaXamlIlRuntimeCompiler.LoadGroup(documents, configuration ?? new RuntimeXamlLoaderConfiguration()); /// /// Parse XAML from a string. @@ -72,7 +66,7 @@ namespace Avalonia.Markup.Xaml /// The string containing the XAML. /// Default assembly for clr-namespace:. /// The loaded object. - public static object Parse(string xaml, Assembly localAssembly = null) + public static object Parse(string xaml, Assembly? localAssembly = null) => Load(xaml, localAssembly); /// @@ -82,7 +76,7 @@ namespace Avalonia.Markup.Xaml /// >The string containing the XAML. /// >Default assembly for clr-namespace:. /// The loaded object. - public static T Parse(string xaml, Assembly localAssembly = null) + public static T Parse(string xaml, Assembly? localAssembly = null) => (T)Parse(xaml, localAssembly); } diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaXamlIlRuntimeCompiler.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaXamlIlRuntimeCompiler.cs index b4b258e53e..1ee4402481 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaXamlIlRuntimeCompiler.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaXamlIlRuntimeCompiler.cs @@ -10,6 +10,7 @@ using System.Runtime.InteropServices; using Avalonia.Markup.Xaml.XamlIl.CompilerExtensions; using Avalonia.Markup.Xaml.XamlIl.Runtime; using Avalonia.Platform; +using XamlX.Ast; using XamlX.Transform; using XamlX.TypeSystem; using XamlX.IL; @@ -150,12 +151,12 @@ namespace Avalonia.Markup.Xaml.XamlIl } - static object LoadSre(string xaml, Assembly localAssembly, object rootInstance, Uri uri, bool isDesignMode, bool useCompiledBindingsByDefault) + static object LoadSre(RuntimeXamlLoaderDocument document, RuntimeXamlLoaderConfiguration configuration) { var success = false; try { - var rv = LoadSreCore(xaml, localAssembly, rootInstance, uri, isDesignMode, useCompiledBindingsByDefault); + var rv = LoadSreCore(document, configuration); success = true; return rv; } @@ -166,45 +167,100 @@ namespace Avalonia.Markup.Xaml.XamlIl } } + static IReadOnlyList LoadGroupSre(IReadOnlyCollection documents, + RuntimeXamlLoaderConfiguration configuration) + { + var success = false; + try + { + var rv = LoadGroupSreCore(documents, configuration); + success = true; + return rv; + } + finally + { + if( _sreCanSave) + DumpRuntimeCompilationResults(); + } + } - static object LoadSreCore(string xaml, Assembly localAssembly, object rootInstance, Uri uri, bool isDesignMode, bool useCompiledBindingsByDefault) + static IReadOnlyList LoadGroupSreCore(IReadOnlyCollection documents, RuntimeXamlLoaderConfiguration configuration) { - InitializeSre(); + var localAssembly = configuration.LocalAssembly; if (localAssembly?.GetName() != null) EmitIgnoresAccessCheckToAttribute(localAssembly.GetName()); var asm = localAssembly == null ? null : _sreTypeSystem.GetAssembly(localAssembly); - var tb = _sreBuilder.DefineType("Builder_" + Guid.NewGuid().ToString("N") + "_" + uri); - var clrPropertyBuilder = tb.DefineNestedType("ClrProperties_" + Guid.NewGuid().ToString("N")); + var clrPropertyBuilder = _sreBuilder.DefineType("ClrProperties_" + Guid.NewGuid().ToString("N")); var indexerClosureType = _sreBuilder.DefineType("IndexerClosure_" + Guid.NewGuid().ToString("N")); var trampolineBuilder = _sreBuilder.DefineType("Trampolines_" + Guid.NewGuid().ToString("N")); - + var compiler = new AvaloniaXamlIlCompiler(new AvaloniaXamlIlCompilerConfiguration(_sreTypeSystem, asm, - _sreMappings, _sreXmlns, AvaloniaXamlIlLanguage.CustomValueConverter, - new XamlIlClrPropertyInfoEmitter(_sreTypeSystem.CreateTypeBuilder(clrPropertyBuilder)), - new XamlIlPropertyInfoAccessorFactoryEmitter(_sreTypeSystem.CreateTypeBuilder(indexerClosureType)), - new XamlIlTrampolineBuilder(_sreTypeSystem.CreateTypeBuilder(trampolineBuilder))), + _sreMappings, _sreXmlns, AvaloniaXamlIlLanguage.CustomValueConverter, + new XamlIlClrPropertyInfoEmitter(_sreTypeSystem.CreateTypeBuilder(clrPropertyBuilder)), + new XamlIlPropertyInfoAccessorFactoryEmitter(_sreTypeSystem.CreateTypeBuilder(indexerClosureType)), + new XamlIlTrampolineBuilder(_sreTypeSystem.CreateTypeBuilder(trampolineBuilder))), _sreEmitMappings, - _sreContextType) { EnableIlVerification = true, DefaultCompileBindings = useCompiledBindingsByDefault }; + _sreContextType) + { + EnableIlVerification = true, + DefaultCompileBindings = configuration.UseCompiledBindingsByDefault, + IsDesignMode = configuration.DesignMode + }; - IXamlType overrideType = null; - if (rootInstance != null) + var parsedDocuments = new List(); + var rootInstances = new List(); + + foreach (var document in documents) { - overrideType = _sreTypeSystem.GetType(rootInstance.GetType()); + string xaml; + using (var sr = new StreamReader(document.XamlStream)) + xaml = sr.ReadToEnd(); + + IXamlType overrideType = null; + if (document.RootInstance != null) + { + overrideType = _sreTypeSystem.GetType(document.RootInstance.GetType()); + } + + var parsed = compiler.Parse(xaml, overrideType); + compiler.Transform(parsed); + + var xamlName = GetSafeUriIdentifier(document.BaseUri) + ?? document.RootInstance?.GetType().Name + ?? ((IXamlAstValueNode)parsed.Root).Type.GetClrType().Name; + var tb = _sreBuilder.DefineType("Builder_" + Guid.NewGuid().ToString("N") + "_" + xamlName); + var builder = _sreTypeSystem.CreateTypeBuilder(tb); + parsedDocuments.Add(new XamlDocumentResource(parsed, document.BaseUri?.ToString(), null, null, + builder, + compiler.DefinePopulateMethod(builder, parsed, AvaloniaXamlIlCompiler.PopulateName, true), + compiler.DefineBuildMethod(builder, parsed, AvaloniaXamlIlCompiler.BuildName, true))); + rootInstances.Add(document.RootInstance); } - compiler.IsDesignMode = isDesignMode; - compiler.ParseAndCompile(xaml, uri?.ToString(), null, _sreTypeSystem.CreateTypeBuilder(tb), overrideType); - var created = tb.CreateTypeInfo(); + compiler.TransformGroup(parsedDocuments); + + var createdTypes = parsedDocuments.Select(document => + { + compiler.Compile(document.XamlDocument, document.TypeBuilder, document.PopulateMethod, + document.BuildMethod, document.Uri, document.FileSource); + return _sreTypeSystem.GetType(document.TypeBuilder.CreateType()); + }).ToArray(); + clrPropertyBuilder.CreateTypeInfo(); indexerClosureType.CreateTypeInfo(); trampolineBuilder.CreateTypeInfo(); - return LoadOrPopulate(created, rootInstance); + return createdTypes.Zip(rootInstances, (l, r) => (l, r)).Select(t => LoadOrPopulate(t.Item1, t.Item2)).ToArray(); + } + + static object LoadSreCore(RuntimeXamlLoaderDocument document, RuntimeXamlLoaderConfiguration configuration) + { + return LoadGroupSreCore(new[] { document }, configuration).Single(); } #endif - static object LoadOrPopulate(Type created, object rootInstance) + static object LoadOrPopulate(Type created, object rootInstance) { var isp = Expression.Parameter(typeof(IServiceProvider)); @@ -249,19 +305,37 @@ namespace Avalonia.Markup.Xaml.XamlIl } } - public static object Load(Stream stream, Assembly localAssembly, object rootInstance, Uri uri, - bool isDesignMode, bool useCompiledBindingsByDefault) + public static object Load(RuntimeXamlLoaderDocument document, RuntimeXamlLoaderConfiguration configuration) { +#if RUNTIME_XAML_CECIL string xaml; - using (var sr = new StreamReader(stream)) + using (var sr = new StreamReader(document.XamlStream)) xaml = sr.ReadToEnd(); + return LoadCecil(xaml, configuration.LocalAssembly, document.RootInstance,document.BaseUri, configuration.UseCompiledBindingsByDefault); +#else + return LoadSre(document, configuration); +#endif + } + + public static IReadOnlyList LoadGroup(IReadOnlyCollection documents, RuntimeXamlLoaderConfiguration configuration) + { #if RUNTIME_XAML_CECIL - return LoadCecil(xaml, localAssembly, rootInstance, uri, useCompiledBindingsByDefault); + throw new NotImplementedException("Load group was not implemented for the Cecil backend"); #else - return LoadSre(xaml, localAssembly, rootInstance, uri, isDesignMode, useCompiledBindingsByDefault); + return LoadGroupSre(documents, configuration); #endif } + private static string GetSafeUriIdentifier(Uri uri) + { + return uri?.ToString() + .Replace(":", "_") + .Replace("/", "_") + .Replace("?", "_") + .Replace("=", "_") + .Replace(".", "_"); + } + #if RUNTIME_XAML_CECIL private static Dictionary populate, Func build)> @@ -303,12 +377,7 @@ namespace Avalonia.Markup.Xaml.XamlIl overrideType = _cecilTypeSystem.GetType(rootInstance.GetType().FullName); } - var safeUri = uri.ToString() - .Replace(":", "_") - .Replace("/", "_") - .Replace("?", "_") - .Replace("=", "_") - .Replace(".", "_"); + var safeUri = GetSafeUriIdentifier(uri); if (_cecilGeneratedCache.TryGetValue(safeUri, out var cached)) return LoadOrPopulate(cached, rootInstance); @@ -335,7 +404,7 @@ namespace Avalonia.Markup.Xaml.XamlIl { DefaultCompileBindings = useCompiledBindingsByDefault }; - compiler.ParseAndCompile(xaml, uri.ToString(), tb, overrideType); + compiler.ParseAndCompile(xaml, uri.ToString(), null, tb, overrideType); var asmPath = Path.Combine(_cecilEmitDir, safeUri + ".dll"); using(var f = File.Create(asmPath)) asm.Write(f); diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlCompiler.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlCompiler.cs index e601701d5c..ccda94ff1a 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlCompiler.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlCompiler.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; using System.Linq; - +using Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.GroupTransformers; using Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers; using XamlX; using XamlX.Ast; @@ -83,6 +83,11 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions Emitters.Add(new AvaloniaNameScopeRegistrationXamlIlNodeEmitter()); Emitters.Add(new AvaloniaXamlIlRootObjectScope.Emitter()); + + GroupTransformers = new() + { + new AvaloniaXamlIncludeTransformer() + }; } public AvaloniaXamlIlCompiler(TransformerConfiguration configuration, XamlLanguageEmitMappings emitMappings, @@ -115,7 +120,27 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions set => _bindingTransformer.CompileBindingsByDefault = value; } - public void ParseAndCompile(string xaml, string baseUri, IFileSource fileSource, IXamlTypeBuilder tb, IXamlType overrideRootType) + public List GroupTransformers { get; } + + public void TransformGroup(IReadOnlyCollection documents, bool strict = true) + { + var ctx = new AstGroupTransformationContext(documents, _configuration, strict); + foreach (var transformer in GroupTransformers) + { + foreach (var doc in documents) + { + var root = doc.XamlDocument.Root; + ctx.CurrentDocument = doc; + ctx.RootObject = (IXamlAstValueNode)root; + ctx.VisitChildren(ctx.RootObject, transformer); + root = ctx.Visit(root, transformer); + + doc.XamlDocument.Root = root; + } + } + } + + public XamlDocument Parse(string xaml, IXamlType overrideRootType) { var parsed = XDocumentXamlParser.Parse(xaml, new Dictionary { @@ -148,9 +173,26 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions OverrideRootType(parsed, rootType); + return parsed; + } + + public void Compile(XamlDocument document, IXamlTypeBuilder tb, IXamlMethodBuilder populateMethod, IXamlMethodBuilder buildMethod, string baseUri, IFileSource fileSource) + { + Compile(document, _contextType, populateMethod, buildMethod, + _configuration.TypeMappings.XmlNamespaceInfoProvider == null ? + null : + tb.DefineSubType(_configuration.WellKnownTypes.Object, + "__AvaloniaXamlIlNsInfo", false), (name, bt) => tb.DefineSubType(bt, name, false), + (s, returnType, parameters) => tb.DefineDelegateSubType(s, false, returnType, parameters), baseUri, + fileSource); + } + + public void ParseAndCompile(string xaml, string baseUri, IFileSource fileSource, IXamlTypeBuilder tb, IXamlType overrideRootType) + { + var parsed = Parse(xaml, overrideRootType); + Transform(parsed); Compile(parsed, tb, _contextType, PopulateName, BuildName, "__AvaloniaXamlIlNsInfo", baseUri, fileSource); - } public void OverrideRootType(XamlDocument doc, IXamlAstTypeReference newType) diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/GroupTransformers/IXamlAstGroupTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/GroupTransformers/IXamlAstGroupTransformer.cs new file mode 100644 index 0000000000..32bf37431f --- /dev/null +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/GroupTransformers/IXamlAstGroupTransformer.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Xml; +using XamlX; +using XamlX.Ast; +using XamlX.Transform; + +namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.GroupTransformers; + +internal class AstGroupTransformationContext : AstTransformationContext +{ + public AstGroupTransformationContext(IReadOnlyCollection documents, TransformerConfiguration configuration, bool strictMode = true) + : base(configuration, null, strictMode) + { + Documents = documents; + } + + public IXamlDocumentResource CurrentDocument { get; set; } + + public IReadOnlyCollection Documents { get; } + + public new IXamlAstNode ParseError(string message, IXamlAstNode node) => + Error(node, new XamlDocumentParseException(CurrentDocument?.FileSource?.FilePath, message, node)); + + public new IXamlAstNode ParseError(string message, IXamlAstNode offender, IXamlAstNode ret) => + Error(ret, new XamlDocumentParseException(CurrentDocument?.FileSource?.FilePath, message, offender)); + + class Visitor : IXamlAstVisitor + { + private readonly AstGroupTransformationContext _context; + private readonly IXamlAstGroupTransformer _transformer; + + public Visitor(AstGroupTransformationContext context, IXamlAstGroupTransformer transformer) + { + _context = context; + _transformer = transformer; + } + + public IXamlAstNode Visit(IXamlAstNode node) + { +#if Xaml_DEBUG + return _transformer.Transform(_context, node); +#else + try + { + return _transformer.Transform(_context, node); + } + catch (Exception e) when (!(e is XmlException)) + { + throw new XamlDocumentParseException( + _context.CurrentDocument?.FileSource?.FilePath, + "Internal compiler error while transforming node " + node + ":\n" + e, + node); + } +#endif + } + + public void Push(IXamlAstNode node) => _context.PushParent(node); + + public void Pop() => _context.PopParent(); + } + + public IXamlAstNode Visit(IXamlAstNode root, IXamlAstGroupTransformer transformer) + { + root = root.Visit(new Visitor(this, transformer)); + return root; + } + + public void VisitChildren(IXamlAstNode root, IXamlAstGroupTransformer transformer) + { + root.VisitChildren(new Visitor(this, transformer)); + } +} + +internal interface IXamlAstGroupTransformer +{ + IXamlAstNode Transform(AstGroupTransformationContext context, IXamlAstNode node); +} diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/IXamlDocumentResource.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/IXamlDocumentResource.cs new file mode 100644 index 0000000000..b859b3ed59 --- /dev/null +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/IXamlDocumentResource.cs @@ -0,0 +1,17 @@ +using System; +using XamlX.Ast; +using XamlX.TypeSystem; + +namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions; + +#nullable enable + +internal interface IXamlDocumentResource +{ + IXamlMethod? BuildMethod { get; } + IXamlType? ClassType { get; } + string? Uri { get; } + IXamlMethod PopulateMethod { get; } + IFileSource? FileSource { get; } + XamlDocument XamlDocument { get; } +} diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs index dd37ae6c93..cb1da5ef6e 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.GroupTransformers; using XamlX.Emit; using XamlX.IL; using XamlX.Transform; @@ -266,5 +267,13 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers ctx.SetItem(rv = new AvaloniaXamlIlWellKnownTypes(ctx.Configuration)); return rv; } + + public static AvaloniaXamlIlWellKnownTypes GetAvaloniaTypes(this AstGroupTransformationContext ctx) + { + if (ctx.TryGetItem(out var rv)) + return rv; + ctx.SetItem(rv = new AvaloniaXamlIlWellKnownTypes(ctx.Configuration)); + return rv; + } } } diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlDocumentParseException.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlDocumentParseException.cs new file mode 100644 index 0000000000..d031a6086b --- /dev/null +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlDocumentParseException.cs @@ -0,0 +1,21 @@ +using XamlX; +using XamlX.Ast; + +namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions; + +internal class XamlDocumentParseException : XamlParseException +{ + public string FilePath { get; } + + public XamlDocumentParseException(string path, XamlParseException parseException) + : base(parseException.Message, parseException.LineNumber, parseException.LinePosition) + { + FilePath = path; + } + + public XamlDocumentParseException(string path, string message, IXamlLineInfo lineInfo) + : base(message, lineInfo.Line, lineInfo.Position) + { + FilePath = path; + } +} diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlDocumentResource.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlDocumentResource.cs new file mode 100644 index 0000000000..d5d452a9f3 --- /dev/null +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlDocumentResource.cs @@ -0,0 +1,40 @@ +using System; +using XamlX.Ast; +using XamlX.IL; +using XamlX.TypeSystem; +#nullable enable + +namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions; + +internal class XamlDocumentResource : IXamlDocumentResource +{ + public XamlDocumentResource( + XamlDocument xamlDocument, + string? uri, + IFileSource? fileSource, + IXamlType? classType, + IXamlTypeBuilder typeBuilder, + IXamlMethodBuilder populateMethod, + IXamlMethodBuilder? buildMethod) + { + XamlDocument = xamlDocument; + Uri = uri; + FileSource = fileSource; + ClassType = classType; + TypeBuilder = typeBuilder; + PopulateMethod = populateMethod; + BuildMethod = buildMethod; + } + + public XamlDocument XamlDocument { get; } + public string? Uri { get; } + public IFileSource? FileSource { get; } + + public IXamlType? ClassType { get; } + public IXamlTypeBuilder TypeBuilder { get; } + public IXamlMethodBuilder PopulateMethod { get; } + public IXamlMethodBuilder? BuildMethod { get; } + + IXamlMethod? IXamlDocumentResource.BuildMethod => BuildMethod; + IXamlMethod IXamlDocumentResource.PopulateMethod => PopulateMethod; +} diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index b5ba49ce2c..0ab00007e7 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -43,6 +43,7 @@ + diff --git a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs index 578af64abb..0032c01d2f 100644 --- a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs +++ b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs @@ -11,7 +11,7 @@ namespace Avalonia.Markup.Xaml { public interface IRuntimeXamlLoader { - object Load(Stream stream, RuntimeXamlLoaderConfiguration configuration); + object Load(RuntimeXamlLoaderDocument document, RuntimeXamlLoaderConfiguration configuration); } /// @@ -64,10 +64,9 @@ namespace Avalonia.Markup.Xaml using (var stream = asset.stream) { var absoluteUri = uri.IsAbsoluteUri ? uri : new Uri(baseUri, uri); - return runtimeLoader.Load(stream, new RuntimeXamlLoaderConfiguration + return runtimeLoader.Load(new RuntimeXamlLoaderDocument(absoluteUri, stream), new RuntimeXamlLoaderConfiguration { - LocalAssembly = asset.assembly, - BaseUri = absoluteUri + LocalAssembly = asset.assembly }); } } diff --git a/src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderConfiguration.cs b/src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderConfiguration.cs index 9caf94fba6..b06f9a927e 100644 --- a/src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderConfiguration.cs +++ b/src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderConfiguration.cs @@ -1,4 +1,3 @@ -using System; using System.Reflection; namespace Avalonia.Markup.Xaml; @@ -7,21 +6,11 @@ namespace Avalonia.Markup.Xaml; public class RuntimeXamlLoaderConfiguration { - /// - /// The URI of the XAML being loaded. - /// - public Uri? BaseUri { get; set; } - /// /// Default assembly for clr-namespace:. /// public Assembly? LocalAssembly { get; set; } - - /// - /// The optional instance into which the XAML should be loaded. - /// - public object? RootInstance { get; set; } - + /// /// Defines is CompiledBinding should be used by default. /// Default is 'false'. diff --git a/src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderDocument.cs b/src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderDocument.cs new file mode 100644 index 0000000000..be22888156 --- /dev/null +++ b/src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderDocument.cs @@ -0,0 +1,70 @@ +#nullable enable +using System; +using System.IO; +using System.Text; + +namespace Avalonia.Markup.Xaml; + +public class RuntimeXamlLoaderDocument +{ + public RuntimeXamlLoaderDocument(string xaml) + { + XamlStream = new MemoryStream(Encoding.UTF8.GetBytes(xaml)); + } + + public RuntimeXamlLoaderDocument(Uri? baseUri, string xaml) + : this(xaml) + { + BaseUri = baseUri; + } + + public RuntimeXamlLoaderDocument(object? rootInstance, string xaml) + : this(xaml) + { + RootInstance = rootInstance; + } + + public RuntimeXamlLoaderDocument(Uri? baseUri, object? rootInstance, string xaml) + : this(baseUri, xaml) + { + RootInstance = rootInstance; + } + + public RuntimeXamlLoaderDocument(Stream stream) + { + XamlStream = stream; + } + + public RuntimeXamlLoaderDocument(Uri? baseUri, Stream stream) + : this(stream) + { + BaseUri = baseUri; + } + + public RuntimeXamlLoaderDocument(object? rootInstance, Stream stream) + : this(stream) + { + RootInstance = rootInstance; + } + + public RuntimeXamlLoaderDocument(Uri? baseUri, object? rootInstance, Stream stream) + : this(baseUri, stream) + { + RootInstance = rootInstance; + } + + /// + /// The URI of the XAML being loaded. + /// + public Uri? BaseUri { get; set; } + + /// + /// The optional instance into which the XAML should be loaded. + /// + public object? RootInstance { get; set; } + + /// + /// The stream containing the XAML. + /// + public Stream XamlStream { get; set; } +} diff --git a/src/tools/Avalonia.Designer.HostApp/DesignXamlLoader.cs b/src/tools/Avalonia.Designer.HostApp/DesignXamlLoader.cs index 7009151998..181883656c 100644 --- a/src/tools/Avalonia.Designer.HostApp/DesignXamlLoader.cs +++ b/src/tools/Avalonia.Designer.HostApp/DesignXamlLoader.cs @@ -8,11 +8,9 @@ namespace Avalonia.Designer.HostApp { class DesignXamlLoader : AvaloniaXamlLoader.IRuntimeXamlLoader { - public object Load(Stream stream, RuntimeXamlLoaderConfiguration configuration) + public object Load(RuntimeXamlLoaderDocument document, RuntimeXamlLoaderConfiguration configuration) { - return AvaloniaXamlIlRuntimeCompiler.Load(stream, - configuration.LocalAssembly, configuration.RootInstance, configuration.BaseUri, - configuration.DesignMode, configuration.UseCompiledBindingsByDefault); + return AvaloniaXamlIlRuntimeCompiler.Load(document, configuration); } } } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs index 88d2cc2912..cb34a9ac4d 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs @@ -1642,10 +1642,8 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.MarkupExtensions;assembly=Avalonia.Markup.Xaml.UnitTests' X='{Binding StringProperty, DataType=local:TestDataContext}' />"; - var control = (AssignBindingControl)AvaloniaRuntimeXamlLoader.Load(xaml, new RuntimeXamlLoaderConfiguration - { - UseCompiledBindingsByDefault = true - }); + var control = (AssignBindingControl)AvaloniaRuntimeXamlLoader.Load(new RuntimeXamlLoaderDocument(xaml), + new RuntimeXamlLoaderConfiguration { UseCompiledBindingsByDefault = true }); var compiledPath = ((CompiledBindingExtension)control.X).Path; var node = Assert.IsType(Assert.Single(compiledPath.Elements)); diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/XamlTestBase.cs b/tests/Avalonia.Markup.Xaml.UnitTests/XamlTestBase.cs index 2fc4867b35..ea03b003ca 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/XamlTestBase.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/XamlTestBase.cs @@ -20,8 +20,8 @@ namespace Avalonia.Markup.Xaml.UnitTests class TestXamlLoaderShim : AvaloniaXamlLoader.IRuntimeXamlLoader { - public object Load(Stream stream, RuntimeXamlLoaderConfiguration configuration) - => AvaloniaRuntimeXamlLoader.Load(stream, configuration); + public object Load(RuntimeXamlLoaderDocument document, RuntimeXamlLoaderConfiguration configuration) + => AvaloniaRuntimeXamlLoader.Load(document, configuration); } } } From a9e904b0d2112be95e53cb27f5c6b016dd6b85c2 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Fri, 25 Nov 2022 01:01:16 -0500 Subject: [PATCH 29/97] Support group transformations in the XAML Build Task --- .../Utilities/StringBuilderCache.cs | 1 + .../Avalonia.Build.Tasks.csproj | 3 + .../BuildEngineErrorCode.cs | 2 + src/Avalonia.Build.Tasks/Extensions.cs | 12 ++- .../XamlCompilerTaskExecutor.cs | 75 +++++++++++++++---- 5 files changed, 74 insertions(+), 19 deletions(-) diff --git a/src/Avalonia.Base/Utilities/StringBuilderCache.cs b/src/Avalonia.Base/Utilities/StringBuilderCache.cs index be8b24c848..cbbcf2b398 100644 --- a/src/Avalonia.Base/Utilities/StringBuilderCache.cs +++ b/src/Avalonia.Base/Utilities/StringBuilderCache.cs @@ -9,6 +9,7 @@ using System; using System.Text; namespace Avalonia.Utilities; +#nullable enable // Provide a cached reusable instance of stringbuilder per thread. internal static class StringBuilderCache diff --git a/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj b/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj index 74debed828..ce84f23dd4 100644 --- a/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj +++ b/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj @@ -55,6 +55,9 @@ Markup/%(RecursiveDir)%(FileName)%(Extension) + + Markup\AssetLoader.cs + Markup/%(RecursiveDir)%(FileName)%(Extension) diff --git a/src/Avalonia.Build.Tasks/BuildEngineErrorCode.cs b/src/Avalonia.Build.Tasks/BuildEngineErrorCode.cs index 43365346b3..a149a758f4 100644 --- a/src/Avalonia.Build.Tasks/BuildEngineErrorCode.cs +++ b/src/Avalonia.Build.Tasks/BuildEngineErrorCode.cs @@ -5,6 +5,8 @@ namespace Avalonia.Build.Tasks InvalidXAML = 1, DuplicateXClass = 2, LegacyResmScheme = 3, + TransformError = 4, + EmitError = 4, Unknown = 9999 } diff --git a/src/Avalonia.Build.Tasks/Extensions.cs b/src/Avalonia.Build.Tasks/Extensions.cs index 46c12eaf3d..7295f56b3a 100644 --- a/src/Avalonia.Build.Tasks/Extensions.cs +++ b/src/Avalonia.Build.Tasks/Extensions.cs @@ -7,15 +7,19 @@ namespace Avalonia.Build.Tasks { static string FormatErrorCode(BuildEngineErrorCode code) => $"AVLN:{(int)code:0000}"; - public static void LogError(this IBuildEngine engine, BuildEngineErrorCode code, string file, string message) + public static void LogError(this IBuildEngine engine, BuildEngineErrorCode code, string file, string message, + int lineNumber = 0, int linePosition = 0) { - engine.LogErrorEvent(new BuildErrorEventArgs("Avalonia", FormatErrorCode(code), file ?? "", 0, 0, 0, 0, message, + engine.LogErrorEvent(new BuildErrorEventArgs("Avalonia", FormatErrorCode(code), file ?? "", + lineNumber, linePosition, lineNumber, linePosition, message, "", "Avalonia")); } - public static void LogWarning(this IBuildEngine engine, BuildEngineErrorCode code, string file, string message) + public static void LogWarning(this IBuildEngine engine, BuildEngineErrorCode code, string file, string message, + int lineNumber = 0, int linePosition = 0) { - engine.LogWarningEvent(new BuildWarningEventArgs("Avalonia", FormatErrorCode(code), file ?? "", 0, 0, 0, 0, message, + engine.LogWarningEvent(new BuildWarningEventArgs("Avalonia", FormatErrorCode(code), file ?? "", + lineNumber, linePosition, lineNumber, linePosition, message, "", "Avalonia")); } diff --git a/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs b/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs index 974f8485c0..589472785d 100644 --- a/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs +++ b/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs @@ -233,13 +233,14 @@ namespace Avalonia.Build.Tasks var builder = typeSystem.CreateTypeBuilder(typeDef); var populateMethodsToTransform = new List<(MethodDefinition populateMethod, string resourceFilePath)>(); - - foreach (var res in group.Resources.Where(CheckXamlName).OrderBy(x=>x.FilePath.ToLowerInvariant())) + + IReadOnlyCollection parsedXamlDocuments = new List(); + foreach (var res in group.Resources.Where(CheckXamlName).OrderBy(x => x.FilePath.ToLowerInvariant())) { + engine.LogMessage($"XAMLIL: {res.Name} -> {res.Uri}", logImportance); + try { - engine.LogMessage($"XAMLIL: {res.Name} -> {res.Uri}", logImportance); - // StreamReader is needed here to handle BOM var xaml = new StreamReader(new MemoryStream(res.FileContents)).ReadToEnd(); var parsed = XDocumentXamlParser.Parse(xaml); @@ -276,9 +277,9 @@ namespace Avalonia.Build.Tasks compiler.Transform(parsed); + var populateName = classType == null ? "Populate:" + res.Name : "!XamlIlPopulate"; - var buildName = classType == null ? "Build:" + res.Name : null; - + var buildName = classType == null ? "Build:" + res.Name : null; var classTypeDefinition = classType == null ? null : typeSystem.GetTypeReference(classType).Resolve(); @@ -286,11 +287,57 @@ namespace Avalonia.Build.Tasks var populateBuilder = classTypeDefinition == null ? builder : typeSystem.CreateTypeBuilder(classTypeDefinition); - compiler.Compile(parsed, - contextClass, + + ((List)parsedXamlDocuments).Add(new XamlDocumentResource( + parsed, res.Uri, res, classType, + populateBuilder, compiler.DefinePopulateMethod(populateBuilder, parsed, populateName, classTypeDefinition == null), - buildName == null ? null : compiler.DefineBuildMethod(builder, parsed, buildName, true), + buildName == null ? null : compiler.DefineBuildMethod(builder, parsed, buildName, true))); + } + catch (Exception e) + { + int lineNumber = 0, linePosition = 0; + if (e is XamlParseException xe) + { + lineNumber = xe.LineNumber; + linePosition = xe.LinePosition; + } + + engine.LogError(BuildEngineErrorCode.TransformError, res.FilePath, e.Message, lineNumber, linePosition); + return false; + } + } + + try + { + compiler.TransformGroup(parsedXamlDocuments); + } + catch (XamlDocumentParseException e) + { + engine.LogError(BuildEngineErrorCode.TransformError, e.FilePath, e.Message, e.LineNumber, e.LinePosition); + } + catch (XamlParseException e) + { + engine.LogError(BuildEngineErrorCode.TransformError, "", e.Message, e.LineNumber, e.LinePosition); + } + + foreach (var document in parsedXamlDocuments) + { + var parsed = document.XamlDocument; + var res = (IResource)document.FileSource; + var classType = document.ClassType; + var populateBuilder = document.TypeBuilder; + + try + { + var classTypeDefinition = + classType == null ? null : typeSystem.GetTypeReference(classType).Resolve(); + + compiler.Compile(parsed, + contextClass, + document.PopulateMethod, + document.BuildMethod, builder.DefineSubType(compilerConfig.WellKnownTypes.Object, "NamespaceInfo:" + res.Name, true), (closureName, closureBaseType) => @@ -417,12 +464,12 @@ namespace Avalonia.Build.Tasks } - if (buildName != null || classTypeDefinition != null) + if (document.BuildMethod != null || classTypeDefinition != null) { - var compiledBuildMethod = buildName == null ? + var compiledBuildMethod = document.BuildMethod == null ? null : typeSystem.GetTypeReference(builder).Resolve() - .Methods.First(m => m.Name == buildName); + .Methods.First(m => m.Name == document.BuildMethod.Name); var parameterlessConstructor = compiledBuildMethod != null ? null : classTypeDefinition.GetConstructors().FirstOrDefault(c => @@ -459,9 +506,7 @@ namespace Avalonia.Build.Tasks lineNumber = xe.LineNumber; linePosition = xe.LinePosition; } - engine.LogErrorEvent(new BuildErrorEventArgs("Avalonia", "XAMLIL", res.FilePath, - lineNumber, linePosition, lineNumber, linePosition, - e.Message, "", "Avalonia")); + engine.LogError(BuildEngineErrorCode.EmitError, res.FilePath, e.Message, lineNumber, linePosition); return false; } res.Remove(); From 47b91121386735ae54e09a990583bf21fc53fbd9 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Fri, 25 Nov 2022 01:01:48 -0500 Subject: [PATCH 30/97] Make AvaloniaXamlIncludeTransformer a group transformer and remove old code with manual IL emit --- src/Avalonia.Base/Platform/AssetLoader.cs | 11 +- .../XamlCompilerTaskExecutor.cs | 139 +----------------- .../AvaloniaXamlIlCompiler.cs | 3 +- .../XamlIncludeGroupTransformer.cs | 133 +++++++++++++++++ .../AvaloniaXamlIlAssetIncludeTransformer.cs | 93 ------------ ...IlConstructorServiceProviderTransformer.cs | 24 ++- .../XamlIl/Runtime/XamlIlRuntimeHelpers.cs | 10 -- 7 files changed, 165 insertions(+), 248 deletions(-) create mode 100644 src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/GroupTransformers/XamlIncludeGroupTransformer.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlAssetIncludeTransformer.cs diff --git a/src/Avalonia.Base/Platform/AssetLoader.cs b/src/Avalonia.Base/Platform/AssetLoader.cs index a74da2a178..8d3576d180 100644 --- a/src/Avalonia.Base/Platform/AssetLoader.cs +++ b/src/Avalonia.Base/Platform/AssetLoader.cs @@ -3,16 +3,22 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; +#if !BUILDTASK using Avalonia.Platform.Internal; using Avalonia.Utilities; +#endif namespace Avalonia.Platform { /// /// Loads assets compiled into the application binary. /// - public class AssetLoader : IAssetLoader + public class AssetLoader +#if !BUILDTASK + : IAssetLoader +#endif { +#if !BUILDTASK private static IAssemblyDescriptorResolver s_assemblyDescriptorResolver = new AssemblyDescriptorResolver(); private AssemblyDescriptor? _defaultResmAssembly; @@ -206,7 +212,8 @@ namespace Avalonia.Platform return null; } - +#endif + public static void RegisterResUriParsers() { if (!UriParser.IsKnownScheme("avares")) diff --git a/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs b/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs index 589472785d..31649fd4b6 100644 --- a/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs +++ b/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs @@ -231,8 +231,6 @@ namespace Avalonia.Build.Tasks }); asm.MainModule.Types.Add(typeDef); var builder = typeSystem.CreateTypeBuilder(typeDef); - - var populateMethodsToTransform = new List<(MethodDefinition populateMethod, string resourceFilePath)>(); IReadOnlyCollection parsedXamlDocuments = new List(); foreach (var res in group.Resources.Where(CheckXamlName).OrderBy(x => x.FilePath.ToLowerInvariant())) @@ -347,23 +345,11 @@ namespace Avalonia.Build.Tasks res.Uri, res ); - var compiledPopulateMethod = typeSystem.GetTypeReference(populateBuilder).Resolve() - .Methods.First(m => m.Name == populateName); - - // Include populate method and all nested methods/closures used in the populate method, - // So we can replace style/resource includes in all of them. - populateMethodsToTransform.Add((compiledPopulateMethod, res.FilePath)); - populateMethodsToTransform.AddRange(compiledPopulateMethod.Body.Instructions - .Where(b => b.OpCode == OpCodes.Call || b.OpCode == OpCodes.Callvirt || b.OpCode == OpCodes.Ldftn) - .Select(b => b.Operand) - .OfType() - .Where(m => compiledPopulateMethod.DeclaringType.NestedTypes.Contains(m.DeclaringType)) - .Select(m => m.Resolve()) - .Where(m => m.HasBody) - .Select(m => (m, res.FilePath))); - if (classTypeDefinition != null) { + var compiledPopulateMethod = typeSystem.GetTypeReference(populateBuilder).Resolve() + .Methods.First(m => m.Name == document.PopulateMethod.Name); + var designLoaderFieldType = typeSystem .GetType("System.Action`1") .MakeGenericType(typeSystem.GetType("System.Object")); @@ -512,14 +498,6 @@ namespace Avalonia.Build.Tasks res.Remove(); } - foreach (var (populateMethod, resourceFilePath) in populateMethodsToTransform) - { - if (!TransformXamlIncludes(engine, typeSystem, populateMethod, resourceFilePath, createRootServiceProviderMethod)) - { - return false; - } - } - // Technically that's a hack, but it fixes corert incompatibility caused by deterministic builds int dupeCounter = 1; foreach (var grp in typeDef.NestedTypes.GroupBy(x => x.Name)) @@ -596,116 +574,5 @@ namespace Avalonia.Build.Tasks return true; } - - private static bool TransformXamlIncludes( - IBuildEngine engine, CecilTypeSystem typeSystem, - MethodDefinition populateMethod, string resourceFilePath, - MethodReference createRootServiceProviderMethod) - { - var asm = typeSystem.TargetAssemblyDefinition; - foreach (var instruction in populateMethod.Body.Instructions.ToArray()) - { - const string resolveStyleIncludeName = "ResolveStyleInclude"; - const string resolveResourceInclude = "ResolveResourceInclude"; - if (instruction.OpCode == OpCodes.Call - && instruction.Operand is MethodReference - { - Name: resolveStyleIncludeName or resolveResourceInclude, - DeclaringType: { Name: "XamlIlRuntimeHelpers" } - }) - { - int lineNumber = 0, linePosition = 0; - bool instructionsModified = false; - try - { - var assetSource = (string)instruction.Previous.Previous.Previous.Operand; - lineNumber = GetConstValue(instruction.Previous.Previous); - linePosition = GetConstValue(instruction.Previous); - - var index = populateMethod.Body.Instructions.IndexOf(instruction); - - assetSource = assetSource.Replace("avares://", ""); - - var assemblyNameSeparator = assetSource.IndexOf('/'); - var fileNameSeparator = assetSource.LastIndexOf('/'); - if (assemblyNameSeparator < 0 || fileNameSeparator < 0) - { - throw new InvalidProgramException( - $"Invalid asset source \"{assetSource}\". It must contain assembly name and relative path."); - } - - var assetAssemblyName = assetSource.Substring(0, assemblyNameSeparator); - var assetAssembly = typeSystem.FindAssembly(assetAssemblyName) - ?? throw new InvalidProgramException( - $"Unable to resolve assembly \"{assetAssemblyName}\""); - - var fileName = Path.GetFileNameWithoutExtension(assetSource.Replace('/', '.')); - if (assetAssembly.FindType(fileName) is { } type - && type.FindConstructor() is { } ctor) - { - var ctorMethod = - asm.MainModule.ImportReference(typeSystem.GetMethodReference(ctor)); - instructionsModified = true; - populateMethod.Body.Instructions[index - 3] = Instruction.Create(OpCodes.Nop); - populateMethod.Body.Instructions[index - 2] = Instruction.Create(OpCodes.Nop); - populateMethod.Body.Instructions[index - 1] = Instruction.Create(OpCodes.Nop); - populateMethod.Body.Instructions[index] = Instruction.Create(OpCodes.Newobj, ctorMethod); - } - else - { - var resources = assetAssembly.FindType("CompiledAvaloniaXaml.!AvaloniaResources") - ?? throw new InvalidOperationException( - $"Unable to resolve \"!AvaloniaResources\" type on \"{assetAssemblyName}\" assembly"); - - var relativeName = "Build:" + assetSource.Substring(assemblyNameSeparator); - var buildMethod = resources.FindMethod(m => m.Name == relativeName) - ?? throw new InvalidOperationException( - $"Unable to resolve build method \"{relativeName}\" resource on the \"{assetAssemblyName}\" assembly"); - - var methodReference = asm.MainModule.ImportReference(typeSystem.GetMethodReference(buildMethod)); - instructionsModified = true; - populateMethod.Body.Instructions[index - 3] = Instruction.Create(OpCodes.Nop); - populateMethod.Body.Instructions[index - 2] = Instruction.Create(OpCodes.Nop); - populateMethod.Body.Instructions[index - 1] = - Instruction.Create(OpCodes.Call, createRootServiceProviderMethod); - populateMethod.Body.Instructions[index] = Instruction.Create(OpCodes.Call, methodReference); - } - } - catch (Exception e) - { - if (instructionsModified) - { - engine.LogErrorEvent(new BuildErrorEventArgs("Avalonia", "XAMLIL", resourceFilePath, - lineNumber, linePosition, lineNumber, linePosition, - e.Message, "", "Avalonia")); - return false; - } - else - { - engine.LogWarningEvent(new BuildWarningEventArgs("Avalonia", "XAMLIL", - resourceFilePath, - lineNumber, linePosition, lineNumber, linePosition, - e.Message, "", "Avalonia")); - } - } - - static int GetConstValue(Instruction instruction) - { - if (instruction.OpCode is { Code : >= Code.Ldc_I4_0 and <= Code.Ldc_I4_8 }) - { - return instruction.OpCode.Code - Code.Ldc_I4_0; - } - if (instruction.Operand is not null) - { - return Convert.ToInt32(instruction.Operand); - } - - return 0; - } - } - } - - return true; - } } } diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlCompiler.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlCompiler.cs index ccda94ff1a..b8350c3f11 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlCompiler.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlCompiler.cs @@ -56,8 +56,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions new AvaloniaXamlIlSetterTransformer(), new AvaloniaXamlIlConstructorServiceProviderTransformer(), new AvaloniaXamlIlTransitionsTypeMetadataTransformer(), - new AvaloniaXamlIlResolveByNameMarkupExtensionReplacer(), - new AvaloniaXamlIlAssetIncludeTransformer() + new AvaloniaXamlIlResolveByNameMarkupExtensionReplacer() ); InsertBefore( new AvaloniaXamlIlOptionMarkupExtensionTransformer()); diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/GroupTransformers/XamlIncludeGroupTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/GroupTransformers/XamlIncludeGroupTransformer.cs new file mode 100644 index 0000000000..2d30cd18b8 --- /dev/null +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/GroupTransformers/XamlIncludeGroupTransformer.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers; +using Avalonia.Platform; +using XamlX; +using XamlX.Ast; +using XamlX.Emit; +using XamlX.IL; +using XamlX.Transform; +using XamlX.Transform.Transformers; +using XamlX.TypeSystem; + +namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.GroupTransformers; + +internal class AvaloniaXamlIncludeTransformer : IXamlAstGroupTransformer +{ + public IXamlAstNode Transform(AstGroupTransformationContext context, IXamlAstNode node) + { + if (node is not XamlValueWithManipulationNode valueNode + || valueNode.Value is not XamlAstNewClrObjectNode objectNode + || (objectNode.Type.GetClrType() != context.GetAvaloniaTypes().StyleInclude + && objectNode.Type.GetClrType() != context.GetAvaloniaTypes().ResourceInclude)) + { + return node; + } + + var nodeTypeName = objectNode.Type.GetClrType().Name; + if (valueNode.Manipulation is not XamlObjectInitializationNode + { + Manipulation: XamlPropertyAssignmentNode { Property: { Name: "Source" } } sourceProperty + }) + { + return context.ParseError($"Source property must be set on the \"{nodeTypeName}\" node.", node); + } + + if (sourceProperty.Values.OfType().FirstOrDefault() is not { } sourceUriNode + || sourceUriNode.Type.GetClrType() != context.GetAvaloniaTypes().Uri + || sourceUriNode.Arguments.FirstOrDefault() is not XamlConstantNode { Constant: string originalAssetPath }) + { + // TODO: make it a compiler warning + // Source value can be set with markup extension instead of the Uri object node, we don't support it here yet. + return node; + } + + if (originalAssetPath.StartsWith("avares://")) + { + } + else if (originalAssetPath.StartsWith("/")) + { + var baseUrl = context.CurrentDocument.Uri ?? throw new InvalidOperationException("CurrentDocument URI is null."); + originalAssetPath = baseUrl.Substring(0, baseUrl.LastIndexOf('/')) + originalAssetPath; + } + else + { + return context.ParseError( + $"Avalonia supports only \"avares://\" sources or relative sources starting with \"/\" on the \"{nodeTypeName}\" node.", + node); + } + + AssetLoader.RegisterResUriParsers(); + + originalAssetPath = Uri.UnescapeDataString(new Uri(originalAssetPath).AbsoluteUri); + var assetPath = originalAssetPath.Replace("avares://", ""); + var assemblyNameSeparator = assetPath.IndexOf('/'); + var assembly = assetPath.Substring(0, assemblyNameSeparator); + var fullTypeName = Path.GetFileNameWithoutExtension(assetPath.Replace('/', '.')); + + if (context.Documents.FirstOrDefault(d => string.Equals(d.Uri, originalAssetPath, StringComparison.InvariantCultureIgnoreCase)) is {} targetDocument) + { + if (targetDocument.ClassType is not null) + { + return FromType(context, targetDocument.ClassType, node); + } + + if (targetDocument.BuildMethod is null) + { + return context.ParseError($"\"{originalAssetPath}\" cannot be instantiated.", node); + } + + return FromMethod(context, targetDocument.BuildMethod, node); + } + + + if (context.Configuration.TypeSystem.FindAssembly(assembly) is not { } assetAssembly) + { + return context.ParseError($"Assembly \"{assembly}\" was not found from the \"{originalAssetPath}\" source.", node); + } + + if (assetAssembly.FindType(fullTypeName) is { } type + && type.FindMethod(m => m.Name == "!XamlIlPopulate") is not null) + { + return FromType(context, type, node); + } + else + { + var avaResType = assetAssembly.FindType("CompiledAvaloniaXaml.!AvaloniaResources"); + if (avaResType is null) + { + return context.ParseError( + $"Unable to resolve \"!AvaloniaResources\" type on \"{assembly}\" assembly.", node); + } + + var relativeName = "Build:" + assetPath.Substring(assemblyNameSeparator); + var buildMethod = avaResType.FindMethod(m => m.Name == relativeName); + if (buildMethod is null) + { + return context.ParseError( + $"Unable to resolve build method \"{relativeName}\" resource on the \"{assembly}\" assembly.", + node); + } + + return FromMethod(context, buildMethod, node); + } + } + + private static IXamlAstNode FromType(AstTransformationContext context, IXamlType type, IXamlLineInfo li) + { + IXamlAstNode newObjNode = new XamlAstObjectNode(li, new XamlAstClrTypeReference(li, type, false)); + newObjNode = new AvaloniaXamlIlConstructorServiceProviderTransformer().Transform(context, newObjNode); + newObjNode = new ConstructableObjectTransformer().Transform(context, newObjNode); + return new NewObjectTransformer().Transform(context, newObjNode); + } + + private static IXamlAstNode FromMethod(AstTransformationContext context, IXamlMethod method, IXamlLineInfo li) + { + var sp = context.Configuration.TypeMappings.ServiceProvider; + return new XamlStaticOrTargetedReturnMethodCallNode(li, method, + new[] { new AvaloniaXamlIlConstructorServiceProviderTransformer.InjectServiceProviderNode(sp, li, false) }); + } +} diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlAssetIncludeTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlAssetIncludeTransformer.cs deleted file mode 100644 index 377a9e72d9..0000000000 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlAssetIncludeTransformer.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System.Linq; -using XamlX; -using XamlX.Ast; -using XamlX.Emit; -using XamlX.IL; -using XamlX.Transform; -using XamlX.TypeSystem; - -namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers; - -internal class AvaloniaXamlIlAssetIncludeTransformer : IXamlAstTransformer -{ - public IXamlAstNode Transform(AstTransformationContext context, IXamlAstNode node) - { - if (node is not XamlAstObjectNode objectNode - || (objectNode.Type.GetClrType() != context.GetAvaloniaTypes().StyleInclude - && objectNode.Type.GetClrType() != context.GetAvaloniaTypes().ResourceInclude)) - { - return node; - } - - var nodeTypeName = objectNode.Type.GetClrType().Name; - - var sourceProperty = objectNode.Children.OfType().FirstOrDefault(n => n.Property.GetClrProperty().Name == "Source"); - var directives = objectNode.Children.OfType().ToList(); - if (sourceProperty is null - || objectNode.Children.Count != (directives.Count + 1)) - { - throw new XamlParseException($"Unexpected property on the {nodeTypeName} node", node); - } - - if (sourceProperty.Values.OfType().FirstOrDefault() is not { } sourceTextNode) - { - // TODO: make it a compiler warning - // Source value can be set with markup extension instead of a text node, we don't support it here yet. - return node; - } - - var originalAssetPath = sourceTextNode.Text; - if (!(originalAssetPath.StartsWith("avares://") || originalAssetPath.StartsWith("/"))) - { - return node; - } - - var runtimeHelpers = context.GetAvaloniaTypes().RuntimeHelpers; - var markerMethodName = "Resolve" + nodeTypeName; - var markerMethod = runtimeHelpers.FindMethod(m => m.Name == markerMethodName && m.Parameters.Count == 3); - if (markerMethod is null) - { - throw new XamlParseException($"Marker method \"{markerMethodName}\" was not found for the \"{nodeTypeName}\" node", node); - } - - return new XamlValueWithManipulationNode( - node, - new AssetIncludeMethodNode(node, markerMethod, originalAssetPath), - new XamlManipulationGroupNode(node, directives)); - } - - private class AssetIncludeMethodNode : XamlAstNode, IXamlAstValueNode, IXamlAstILEmitableNode - { - private readonly IXamlMethod _method; - private readonly string _originalAssetPath; - - public AssetIncludeMethodNode( - IXamlAstNode original, IXamlMethod method, string originalAssetPath) - : base(original) - { - _method = method; - _originalAssetPath = originalAssetPath; - } - - public IXamlAstTypeReference Type => new XamlAstClrTypeReference(this, _method.ReturnType, false); - - public XamlILNodeEmitResult Emit(XamlEmitContext context, IXamlILEmitter codeGen) - { - var absoluteSource = _originalAssetPath; - if (absoluteSource.StartsWith("/")) - { - // Avoid Uri class here to avoid potential problems with escaping. - // Keeping string as close to the original as possible. - var absoluteBaseUrl = context.RuntimeContext.BaseUrl; - absoluteSource = absoluteBaseUrl.Substring(0, absoluteBaseUrl.LastIndexOf('/')) + absoluteSource; - } - - codeGen.Ldstr(absoluteSource); - codeGen.Ldc_I4(Line); - codeGen.Ldc_I4(Position); - codeGen.EmitCall(_method); - - return XamlILNodeEmitResult.Type(0, _method.ReturnType); - } - } -} diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlConstructorServiceProviderTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlConstructorServiceProviderTransformer.cs index 35e2624ff9..de654c4595 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlConstructorServiceProviderTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlConstructorServiceProviderTransformer.cs @@ -21,7 +21,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers c.IsPublic && !c.IsStatic && c.Parameters.Count == 1 && c.Parameters[0] .Equals(sp))) { - on.Arguments.Add(new InjectServiceProviderNode(sp, on)); + on.Arguments.Add(new InjectServiceProviderNode(sp, on, true)); } } } @@ -29,19 +29,33 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers return node; } - class InjectServiceProviderNode : XamlAstNode, IXamlAstValueNode,IXamlAstNodeNeedsParentStack, + internal class InjectServiceProviderNode : XamlAstNode, IXamlAstValueNode,IXamlAstNodeNeedsParentStack, IXamlAstEmitableNode { - public InjectServiceProviderNode(IXamlType type, IXamlLineInfo lineInfo) : base(lineInfo) + private readonly bool _inheritContext; + + public InjectServiceProviderNode(IXamlType type, IXamlLineInfo lineInfo, bool inheritContext) : base(lineInfo) { + _inheritContext = inheritContext; Type = new XamlAstClrTypeReference(lineInfo, type, false); } public IXamlAstTypeReference Type { get; } - public bool NeedsParentStack => true; + public bool NeedsParentStack => _inheritContext; public XamlILNodeEmitResult Emit(XamlEmitContext context, IXamlILEmitter codeGen) { - codeGen.Ldloc(context.ContextLocal); + if (_inheritContext) + { + codeGen.Ldloc(context.ContextLocal); + } + else + { + var method = context.GetAvaloniaTypes().RuntimeHelpers + .FindMethod(m => m.Name == "CreateRootServiceProviderV2"); + codeGen.EmitCall(method); + context.RuntimeContext.Factory(codeGen); + } + return XamlILNodeEmitResult.Type(0, Type.GetClrType()); } } diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs index f547888d6e..d07c354945 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs @@ -17,16 +17,6 @@ namespace Avalonia.Markup.Xaml.XamlIl.Runtime { public static class XamlIlRuntimeHelpers { - public static IStyle ResolveStyleInclude(string absoluteSource, int line, int position) - { - return new StyleInclude((Uri)null) { Source = new Uri(absoluteSource) }.Loaded; - } - - public static IResourceDictionary ResolveResourceInclude(string absoluteSource, int line, int position) - { - return new ResourceInclude((Uri)null) { Source = new Uri(absoluteSource) }.Loaded; - } - public static Func DeferredTransformationFactoryV1(Func builder, IServiceProvider provider) { From c8120fbbe792ea3a42a7f026e59e185099a5e98c Mon Sep 17 00:00:00 2001 From: Max Katz Date: Fri, 25 Nov 2022 01:02:10 -0500 Subject: [PATCH 31/97] Update tests with "LoadGroup" method instead of assetloader hacks --- .../DynamicResourceExtensionTests.cs | 108 +++++----- .../MarkupExtensions/ResourceIncludeTests.cs | 44 +++-- .../StaticResourceExtensionTests.cs | 44 +++-- .../StyleIncludeTests.cs | 51 ----- .../Xaml/BasicTests.cs | 22 +-- .../Xaml/ResourceDictionaryTests.cs | 22 ++- .../Xaml/Style1.xaml | 3 +- .../Xaml/Style2.xaml | 3 +- .../Xaml/StyleIncludeTests.cs | 184 ++++++++++++++++++ .../Xaml/StyleTests.cs | 39 ---- 10 files changed, 306 insertions(+), 214 deletions(-) delete mode 100644 tests/Avalonia.Markup.Xaml.UnitTests/StyleIncludeTests.cs create mode 100644 tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleIncludeTests.cs diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs index 987725c314..f2e1a99006 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs @@ -250,30 +250,32 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions [Fact] public void DynamicResource_Can_Be_Assigned_To_Setter_In_Styles_File() { - var styleXaml = @" + var documents = new[] + { + new RuntimeXamlLoaderDocument(new Uri("avares://Tests/Style.xaml"), @" #ff506070 - -"; - - using (StyledWindow(assets: ("test:style.xaml", styleXaml))) - { - var xaml = @" +"), + new RuntimeXamlLoaderDocument(@" - + -"; - - var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); +") + }; + + using (StyledWindow()) + { + var compiled = AvaloniaRuntimeXamlLoader.LoadGroup(documents); + var window = Assert.IsType(compiled[1]); var border = window.FindControl("border"); var brush = (ISolidColorBrush)border.Background; @@ -284,13 +286,14 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions [Fact] public void DynamicResource_Can_Be_Assigned_To_Property_In_ControlTemplate_In_Styles_File() { - var styleXaml = @" + var documents = new[] + { + new RuntimeXamlLoaderDocument(new Uri("avares://Tests/Style.xaml"), @" #ff506070 - -"; - - using (StyledWindow(assets: ("test:style.xaml", styleXaml))) - { - var xaml = @" +"), + new RuntimeXamlLoaderDocument(@" - + public class StyleInclude : IStyle, IResourceProvider { + private readonly IServiceProvider _serviceProvider; private readonly Uri? _baseUri; private IStyle[]? _loaded; private bool _isLoading; @@ -31,6 +32,7 @@ namespace Avalonia.Markup.Xaml.Styling /// The XAML service provider. public StyleInclude(IServiceProvider serviceProvider) { + _serviceProvider = serviceProvider; _baseUri = serviceProvider.GetContextBaseUri(); } @@ -52,7 +54,7 @@ namespace Avalonia.Markup.Xaml.Styling { _isLoading = true; var source = Source ?? throw new InvalidOperationException("StyleInclude.Source must be set."); - var loaded = (IStyle)AvaloniaXamlLoader.Load(source, _baseUri); + var loaded = (IStyle)AvaloniaXamlLoader.Load(_serviceProvider, source, _baseUri); _loaded = new[] { loaded }; _isLoading = false; } diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs index eec5d62fd3..2ca9a66fdc 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs @@ -167,18 +167,24 @@ namespace Avalonia.Markup.Xaml.XamlIl.Runtime #line hidden public static IServiceProvider CreateRootServiceProviderV2() { - return new RootServiceProvider(new NameScope()); + return new RootServiceProvider(new NameScope(), null); + } + public static IServiceProvider CreateRootServiceProviderV3(IServiceProvider parentServiceProvider) + { + return new RootServiceProvider(new NameScope(), parentServiceProvider); } #line default - class RootServiceProvider : IServiceProvider, IAvaloniaXamlIlParentStackProvider + class RootServiceProvider : IServiceProvider { private readonly INameScope _nameScope; + private readonly IServiceProvider _parentServiceProvider; private readonly IRuntimePlatform _runtimePlatform; - public RootServiceProvider(INameScope nameScope) + public RootServiceProvider(INameScope nameScope, IServiceProvider parentServiceProvider) { _nameScope = nameScope; + _parentServiceProvider = parentServiceProvider; _runtimePlatform = AvaloniaLocator.Current.GetService(); } @@ -187,19 +193,25 @@ namespace Avalonia.Markup.Xaml.XamlIl.Runtime if (serviceType == typeof(INameScope)) return _nameScope; if (serviceType == typeof(IAvaloniaXamlIlParentStackProvider)) - return this; + return _parentServiceProvider?.GetService() + ?? DefaultAvaloniaXamlIlParentStackProvider.Instance; if (serviceType == typeof(IRuntimePlatform)) return _runtimePlatform ?? throw new KeyNotFoundException($"{nameof(IRuntimePlatform)} was not registered"); return null; } - public IEnumerable Parents + private class DefaultAvaloniaXamlIlParentStackProvider : IAvaloniaXamlIlParentStackProvider { - get + public static DefaultAvaloniaXamlIlParentStackProvider Instance { get; } = new(); + + public IEnumerable Parents { - if (Application.Current != null) - yield return Application.Current; + get + { + if (Application.Current != null) + yield return Application.Current; + } } } } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj index bcb4bac457..a9528edc91 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj @@ -30,6 +30,7 @@ + diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleIncludeTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleIncludeTests.cs index 8eed5013a2..f148d95bf9 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleIncludeTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleIncludeTests.cs @@ -2,6 +2,10 @@ using System.Collections.Generic; using System.Linq; using Avalonia.Controls; +using Avalonia.Markup.Xaml.Styling; +using Avalonia.Markup.Xaml.XamlIl.Runtime; +using Avalonia.Media; +using Avalonia.Platform; using Avalonia.Styling; using Avalonia.Themes.Simple; using Avalonia.UnitTests; @@ -265,4 +269,43 @@ public class StyleIncludeTests Assert.IsType(control.Styles[0]); Assert.IsType(control.Styles[1]); } + + [Fact] + public void StyleInclude_From_CodeBehind_Resolves_Compiled() + { + using var locatorScope = AvaloniaLocator.EnterScope(); + AvaloniaLocator.CurrentMutable.BindToSelf(new AssetLoader(GetType().Assembly)); + + var sp = new TestServiceProvider(); + var styleInclude = new StyleInclude(sp) + { + Source = new Uri("avares://Avalonia.Markup.Xaml.UnitTests/Xaml/StyleWithServiceLocator.xaml") + }; + + var loaded = Assert.IsType(styleInclude.Loaded); + + Assert.Equal( + sp.GetService().Parents, + loaded.ServiceProvider.GetService().Parents); + } + + private class TestServiceProvider : IServiceProvider, IUriContext, IAvaloniaXamlIlParentStackProvider + { + private IServiceProvider _root = XamlIlRuntimeHelpers.CreateRootServiceProviderV2(); + public object GetService(Type serviceType) + { + if (serviceType == typeof(IUriContext)) + { + return this; + } + if (serviceType == typeof(IAvaloniaXamlIlParentStackProvider)) + { + return this; + } + return _root.GetService(serviceType); + } + + public Uri BaseUri { get; set; } + public IEnumerable Parents { get; } = new[] { new ContentControl() }; + } } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleWithServiceLocator.xaml b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleWithServiceLocator.xaml new file mode 100644 index 0000000000..987c0f321a --- /dev/null +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleWithServiceLocator.xaml @@ -0,0 +1,5 @@ + diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleWithServiceLocator.xaml.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleWithServiceLocator.xaml.cs new file mode 100644 index 0000000000..ceb122f05c --- /dev/null +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleWithServiceLocator.xaml.cs @@ -0,0 +1,16 @@ +using System; +using Avalonia.Controls; +using Avalonia.Styling; + +namespace Avalonia.Markup.Xaml.UnitTests.Xaml; + +public class StyleWithServiceLocator : Style +{ + public IServiceProvider ServiceProvider { get; } + + public StyleWithServiceLocator(IServiceProvider sp = null) + { + ServiceProvider = sp; + AvaloniaXamlLoader.Load(sp, this); + } +} From afa7c320282734392f04901be46106e3177d99e4 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Wed, 30 Nov 2022 23:27:37 -0500 Subject: [PATCH 61/97] Fix merge conflict --- ...niaXamlIlConstructorServiceProviderTransformer.cs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlConstructorServiceProviderTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlConstructorServiceProviderTransformer.cs index 0304165995..35e2624ff9 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlConstructorServiceProviderTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlConstructorServiceProviderTransformer.cs @@ -41,18 +41,6 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers public bool NeedsParentStack => true; public XamlILNodeEmitResult Emit(XamlEmitContext context, IXamlILEmitter codeGen) { - if (_inheritContext) - { - codeGen.Ldloc(context.ContextLocal); - } - else - { - codeGen.Ldloc(context.ContextLocal); - var method = context.GetAvaloniaTypes().RuntimeHelpers - .FindMethod(m => m.Name == "CreateRootServiceProviderV3"); - codeGen.EmitCall(method); - } - codeGen.Ldloc(context.ContextLocal); return XamlILNodeEmitResult.Type(0, Type.GetClrType()); } From f4898667345648ac27b08a8e77626fcda6971d0f Mon Sep 17 00:00:00 2001 From: zhouzj Date: Thu, 1 Dec 2022 16:28:34 +0800 Subject: [PATCH 62/97] Replace ContentControl to ContentPresenter --- .../Controls/CalendarButton.xaml | 16 ++++++++-------- .../Controls/CalendarButton.xaml | 18 +++++++++--------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/Avalonia.Themes.Fluent/Controls/CalendarButton.xaml b/src/Avalonia.Themes.Fluent/Controls/CalendarButton.xaml index 06b6cf30c2..76b51ca819 100644 --- a/src/Avalonia.Themes.Fluent/Controls/CalendarButton.xaml +++ b/src/Avalonia.Themes.Fluent/Controls/CalendarButton.xaml @@ -35,13 +35,13 @@ - + @@ -70,7 +70,7 @@ - diff --git a/src/Avalonia.Themes.Simple/Controls/CalendarButton.xaml b/src/Avalonia.Themes.Simple/Controls/CalendarButton.xaml index 59fb24663f..9e13e1e996 100644 --- a/src/Avalonia.Themes.Simple/Controls/CalendarButton.xaml +++ b/src/Avalonia.Themes.Simple/Controls/CalendarButton.xaml @@ -32,14 +32,14 @@ Opacity="0.5" /> - + - From 2f3c5ef98fefb19a81f59870cc1fbc7645477469 Mon Sep 17 00:00:00 2001 From: ShadowMarker789 <37165910+ShadowMarker789@users.noreply.github.com> Date: Thu, 1 Dec 2022 17:42:44 +0800 Subject: [PATCH 63/97] Add Support for low-latency Dxgi-swapchain based presentation model (#9572) * Got the swapchain working * Removed unneeded field * Code cleanup * Fixed and added custom control with smiles. * Update DXGI_SWAP_CHAIN_FLAG.cs All of the new members should be internal. Leaving the minimum (handles?) for the interoperability. * > Please, use our COM interop codegen instead. It provides at least some safety with reference tracking / disposal DONE * Code cleanup, using statements for correct disposal, disposing of fields in the render-target. * Further code refactoring, reorganized folder structure under DirectX Co-authored-by: michael.david.howard@outlook.com --- samples/ControlCatalog.NetCore/Program.cs | 9 + .../Properties/launchSettings.json | 11 + samples/ControlCatalog/ControlCatalog.csproj | 10 + .../Converter/DegToRadConverter.cs | 29 + samples/ControlCatalog/MainView.xaml | 3 + .../ControlCatalog/Pages/CustomDrawing.xaml | 107 ++ .../Pages/CustomDrawing.xaml.cs | 67 + .../Pages/CustomDrawingExampleControl.cs | 215 +++ .../Avalonia.Win32/Avalonia.Win32.csproj | 1 + .../Avalonia.Win32/DirectX/DirectXEnums.cs | 139 ++ .../Avalonia.Win32/DirectX/DirectXStructs.cs | 1370 +++++++++++++++++ .../DirectX/DirectXUnmanagedMethods.cs | 29 + .../Avalonia.Win32/DirectX/DxgiConnection.cs | 202 +++ .../DirectX/DxgiRenderTarget.cs | 184 +++ .../DirectX/DxgiSwapchainWindow.cs | 32 + .../Avalonia.Win32/DirectX/directx.idl | 305 ++++ src/Windows/Avalonia.Win32/Win32GlManager.cs | 5 + src/Windows/Avalonia.Win32/Win32Platform.cs | 10 + src/Windows/Avalonia.Win32/WindowImpl.cs | 17 + 19 files changed, 2745 insertions(+) create mode 100644 samples/ControlCatalog.NetCore/Properties/launchSettings.json create mode 100644 samples/ControlCatalog/Converter/DegToRadConverter.cs create mode 100644 samples/ControlCatalog/Pages/CustomDrawing.xaml create mode 100644 samples/ControlCatalog/Pages/CustomDrawing.xaml.cs create mode 100644 samples/ControlCatalog/Pages/CustomDrawingExampleControl.cs create mode 100644 src/Windows/Avalonia.Win32/DirectX/DirectXEnums.cs create mode 100644 src/Windows/Avalonia.Win32/DirectX/DirectXStructs.cs create mode 100644 src/Windows/Avalonia.Win32/DirectX/DirectXUnmanagedMethods.cs create mode 100644 src/Windows/Avalonia.Win32/DirectX/DxgiConnection.cs create mode 100644 src/Windows/Avalonia.Win32/DirectX/DxgiRenderTarget.cs create mode 100644 src/Windows/Avalonia.Win32/DirectX/DxgiSwapchainWindow.cs create mode 100644 src/Windows/Avalonia.Win32/DirectX/directx.idl diff --git a/samples/ControlCatalog.NetCore/Program.cs b/samples/ControlCatalog.NetCore/Program.cs index b1bacc6483..d5e5cb14dc 100644 --- a/samples/ControlCatalog.NetCore/Program.cs +++ b/samples/ControlCatalog.NetCore/Program.cs @@ -99,6 +99,15 @@ namespace ControlCatalog.NetCore SilenceConsole(); return builder.StartLinuxDrm(args, scaling: GetScaling()); } + else if (args.Contains("--dxgi")) + { + builder.With(new Win32PlatformOptions() + { + UseLowLatencyDxgiSwapChain = true, + UseWindowsUIComposition = false + }); + return builder.StartWithClassicDesktopLifetime(args); + } else return builder.StartWithClassicDesktopLifetime(args); } diff --git a/samples/ControlCatalog.NetCore/Properties/launchSettings.json b/samples/ControlCatalog.NetCore/Properties/launchSettings.json new file mode 100644 index 0000000000..5964ca320e --- /dev/null +++ b/samples/ControlCatalog.NetCore/Properties/launchSettings.json @@ -0,0 +1,11 @@ +{ + "profiles": { + "ControlCatalog.NetCore": { + "commandName": "Project" + }, + "Dxgi": { + "commandName": "Project", + "commandLineArgs": "--dxgi" + } + } +} \ No newline at end of file diff --git a/samples/ControlCatalog/ControlCatalog.csproj b/samples/ControlCatalog/ControlCatalog.csproj index 6b550a30be..18f0dd16ba 100644 --- a/samples/ControlCatalog/ControlCatalog.csproj +++ b/samples/ControlCatalog/ControlCatalog.csproj @@ -33,4 +33,14 @@ + + + + + + + + + + diff --git a/samples/ControlCatalog/Converter/DegToRadConverter.cs b/samples/ControlCatalog/Converter/DegToRadConverter.cs new file mode 100644 index 0000000000..b062bcb64a --- /dev/null +++ b/samples/ControlCatalog/Converter/DegToRadConverter.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using Avalonia.Data.Converters; + +namespace ControlCatalog.Converter +{ + public class DegToRadConverter : IValueConverter + { + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is double rad) + { + return rad * 180.0d / Math.PI; + } + return 0.0d; + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is double deg) + { + return deg / 180.0d * Math.PI; + } + return 0.0d; + } + } +} diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml index b5a09b5fbd..b95b455ca4 100644 --- a/samples/ControlCatalog/MainView.xaml +++ b/samples/ControlCatalog/MainView.xaml @@ -66,6 +66,9 @@ + + + diff --git a/samples/ControlCatalog/Pages/CustomDrawing.xaml b/samples/ControlCatalog/Pages/CustomDrawing.xaml new file mode 100644 index 0000000000..04b7fcfea5 --- /dev/null +++ b/samples/ControlCatalog/Pages/CustomDrawing.xaml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +