From eafb84d531f54ecd78095eee932c8bd9e73fcf03 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Sat, 5 Nov 2022 11:12:06 +0100 Subject: [PATCH 1/4] feat: Enable Rule CA1304 --- .editorconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.editorconfig b/.editorconfig index 9ae52b8bbd..2a15dff59c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -137,6 +137,8 @@ space_within_single_line_array_initializer_braces = true #Net Analyzer dotnet_analyzer_diagnostic.category-Performance.severity = none #error - Uncomment when all violations are fixed. +# CA1304: Specify CultureInfo +dotnet_diagnostic.CA1304.severity = warning # CA1802: Use literals where appropriate dotnet_diagnostic.CA1802.severity = warning # CA1820: Test for empty strings using string length From 5405e97602d799481ec3fcef764ccbe240868bba Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Thu, 1 Dec 2022 17:49:54 +0100 Subject: [PATCH 2/4] feat: Address Rule CA1304 --- src/Avalonia.Base/Input/AccessKeyHandler.cs | 7 ++++--- src/Avalonia.Base/Input/KeyGesture.cs | 3 ++- src/Avalonia.Controls/MenuItemAccessKeyHandler.cs | 10 +++++----- src/Avalonia.Remote.Protocol/MetsysBson.cs | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Avalonia.Base/Input/AccessKeyHandler.cs b/src/Avalonia.Base/Input/AccessKeyHandler.cs index 5695d27153..ec8da92ad2 100644 --- a/src/Avalonia.Base/Input/AccessKeyHandler.cs +++ b/src/Avalonia.Base/Input/AccessKeyHandler.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using Avalonia.Interactivity; using Avalonia.VisualTree; @@ -113,7 +114,7 @@ namespace Avalonia.Input _registered.Remove(existing); } - _registered.Add(Tuple.Create(accessKey.ToString().ToUpper(), element)); + _registered.Add(Tuple.Create(accessKey.ToString(CultureInfo.InvariantCulture).ToUpperInvariant(), element)); } /// @@ -180,9 +181,9 @@ namespace Avalonia.Input { // If any other key is pressed with the Alt key held down, or the main menu is open, // find all controls who have registered that access key. - var text = e.Key.ToString().ToUpper(); + var text = e.Key.ToString(); var matches = _registered - .Where(x => x.Item1 == text && ((Visual)x.Item2).IsEffectivelyVisible) + .Where(x => string.Equals( x.Item1 , text, StringComparison.OrdinalIgnoreCase) && ((Visual)x.Item2).IsEffectivelyVisible) .Select(x => x.Item2); // If the menu is open, only match controls in the menu's visual tree. diff --git a/src/Avalonia.Base/Input/KeyGesture.cs b/src/Avalonia.Base/Input/KeyGesture.cs index 1a6372d346..56edc76f22 100644 --- a/src/Avalonia.Base/Input/KeyGesture.cs +++ b/src/Avalonia.Base/Input/KeyGesture.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Text; using Avalonia.Utilities; @@ -143,7 +144,7 @@ namespace Avalonia.Input // TODO: Move that to external key parser private static Key ParseKey(string key) { - if (s_keySynonyms.TryGetValue(key.ToLower(), out Key rv)) + if (s_keySynonyms.TryGetValue(key.ToLower(CultureInfo.InvariantCulture), out Key rv)) return rv; return EnumHelper.Parse(key, true); diff --git a/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs b/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs index 4cc6a20082..5f50ce64df 100644 --- a/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs +++ b/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs @@ -14,7 +14,7 @@ namespace Avalonia.Controls /// /// The registered access keys. /// - private readonly List> _registered = new List>(); + private readonly List<(string AccessKey, IInputElement Element)> _registered = new(); /// /// The window to which the handler belongs. @@ -59,12 +59,12 @@ namespace Avalonia.Controls { var existing = _registered.FirstOrDefault(x => x.Item2 == element); - if (existing != null) + if (existing != default) { _registered.Remove(existing); } - _registered.Add(Tuple.Create(accessKey.ToString().ToUpper(), element)); + _registered.Add((accessKey.ToString().ToUpperInvariant(), element)); } /// @@ -88,9 +88,9 @@ namespace Avalonia.Controls { if (!string.IsNullOrWhiteSpace(e.Text)) { - var text = e.Text.ToUpper(); + var text = e.Text.ToUpperInvariant(); var focus = _registered - .FirstOrDefault(x => x.Item1 == text && x.Item2.IsEffectivelyVisible)?.Item2; + .FirstOrDefault(x => x.Element.IsEffectivelyVisible && x.Item1 == text).Element; focus?.RaiseEvent(new RoutedEventArgs(AccessKeyHandler.AccessKeyPressedEvent)); diff --git a/src/Avalonia.Remote.Protocol/MetsysBson.cs b/src/Avalonia.Remote.Protocol/MetsysBson.cs index 6abece6bf3..8aaab933e9 100644 --- a/src/Avalonia.Remote.Protocol/MetsysBson.cs +++ b/src/Avalonia.Remote.Protocol/MetsysBson.cs @@ -562,7 +562,7 @@ namespace Metsys.Bson { if (_string == null && Value != null) { - _string = BitConverter.ToString(Value).Replace("-", string.Empty).ToLower(); + _string = BitConverter.ToString(Value).Replace("-", string.Empty).ToLowerInvariant(); } return _string; From 44c9f2578a5bb6dd0de0c964f16f1c64bea67373 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 2 Dec 2022 09:41:14 +0100 Subject: [PATCH 3/4] fix: Address review --- src/Avalonia.Base/Input/AccessKeyHandler.cs | 15 ++++++++------- src/Avalonia.Controls/MenuItemAccessKeyHandler.cs | 5 +++-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/Avalonia.Base/Input/AccessKeyHandler.cs b/src/Avalonia.Base/Input/AccessKeyHandler.cs index ec8da92ad2..239fb53a9f 100644 --- a/src/Avalonia.Base/Input/AccessKeyHandler.cs +++ b/src/Avalonia.Base/Input/AccessKeyHandler.cs @@ -24,7 +24,7 @@ namespace Avalonia.Input /// /// The registered access keys. /// - private readonly List> _registered = new List>(); + private readonly List<(string AccessKey, IInputElement Element)> _registered = new(); /// /// The window to which the handler belongs. @@ -109,12 +109,12 @@ namespace Avalonia.Input { var existing = _registered.FirstOrDefault(x => x.Item2 == element); - if (existing != null) + if (existing != default) { _registered.Remove(existing); } - _registered.Add(Tuple.Create(accessKey.ToString(CultureInfo.InvariantCulture).ToUpperInvariant(), element)); + _registered.Add((accessKey.ToString().ToUpperInvariant(), element)); } /// @@ -144,7 +144,7 @@ namespace Avalonia.Input { // TODO: Use FocusScopes to store the current element and restore it when context menu is closed. // Save currently focused input element. - _restoreFocusElement = FocusManager.Instance?.Current; + _restoreFocusElement = FocusManager.Instance?.Current; // When Alt is pressed without a main menu, or with a closed main menu, show // access key markers in the window (i.e. "_File"). @@ -183,8 +183,9 @@ namespace Avalonia.Input // find all controls who have registered that access key. var text = e.Key.ToString(); var matches = _registered - .Where(x => string.Equals( x.Item1 , text, StringComparison.OrdinalIgnoreCase) && ((Visual)x.Item2).IsEffectivelyVisible) - .Select(x => x.Item2); + .Where(x => x.Element.IsEffectivelyVisible + && string.Equals(x.AccessKey , text, StringComparison.OrdinalIgnoreCase) ) + .Select(x => x.Element); // If the menu is open, only match controls in the menu's visual tree. if (menuIsOpen) @@ -195,7 +196,7 @@ namespace Avalonia.Input var match = matches.FirstOrDefault(); // If there was a match, raise the AccessKeyPressed event on it. - if (match != null) + if (match is not null) { match.RaiseEvent(new RoutedEventArgs(AccessKeyPressedEvent)); e.Handled = true; diff --git a/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs b/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs index 5f50ce64df..7e36633c11 100644 --- a/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs +++ b/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs @@ -88,9 +88,10 @@ namespace Avalonia.Controls { if (!string.IsNullOrWhiteSpace(e.Text)) { - var text = e.Text.ToUpperInvariant(); + var text = e.Text; var focus = _registered - .FirstOrDefault(x => x.Element.IsEffectivelyVisible && x.Item1 == text).Element; + .FirstOrDefault(x => x.Element.IsEffectivelyVisible + && string.Equals(x.AccessKey, text, StringComparison.OrdinalIgnoreCase)).Element; focus?.RaiseEvent(new RoutedEventArgs(AccessKeyHandler.AccessKeyPressedEvent)); From 6b1160b76d3962b6e8f3e2ea41de3d1e36cbfc1c Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Sat, 3 Dec 2022 12:44:40 +0100 Subject: [PATCH 4/4] fix: Address review --- src/Avalonia.Base/Input/AccessKeyHandler.cs | 4 ++-- src/Avalonia.Controls/MenuItemAccessKeyHandler.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Base/Input/AccessKeyHandler.cs b/src/Avalonia.Base/Input/AccessKeyHandler.cs index 239fb53a9f..59c66ed505 100644 --- a/src/Avalonia.Base/Input/AccessKeyHandler.cs +++ b/src/Avalonia.Base/Input/AccessKeyHandler.cs @@ -183,8 +183,8 @@ namespace Avalonia.Input // find all controls who have registered that access key. var text = e.Key.ToString(); var matches = _registered - .Where(x => x.Element.IsEffectivelyVisible - && string.Equals(x.AccessKey , text, StringComparison.OrdinalIgnoreCase) ) + .Where(x => string.Equals(x.AccessKey, text, StringComparison.OrdinalIgnoreCase) + && x.Element.IsEffectivelyVisible) .Select(x => x.Element); // If the menu is open, only match controls in the menu's visual tree. diff --git a/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs b/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs index 7e36633c11..381f1799d4 100644 --- a/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs +++ b/src/Avalonia.Controls/MenuItemAccessKeyHandler.cs @@ -90,8 +90,8 @@ namespace Avalonia.Controls { var text = e.Text; var focus = _registered - .FirstOrDefault(x => x.Element.IsEffectivelyVisible - && string.Equals(x.AccessKey, text, StringComparison.OrdinalIgnoreCase)).Element; + .FirstOrDefault(x => string.Equals(x.AccessKey, text, StringComparison.OrdinalIgnoreCase) + && x.Element.IsEffectivelyVisible).Element; focus?.RaiseEvent(new RoutedEventArgs(AccessKeyHandler.AccessKeyPressedEvent));