From f183c31ef34a5dc37e4849de1348a11ee3af8f18 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 9 Sep 2022 10:36:03 +0200 Subject: [PATCH 1/3] fix(DevAnalyzer): RS1030 --- .../OnPropertyChangedOverrideAnalyzer.cs | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/tools/DevAnalyzers/OnPropertyChangedOverrideAnalyzer.cs b/src/tools/DevAnalyzers/OnPropertyChangedOverrideAnalyzer.cs index a16542fdc0..8534ed4a66 100644 --- a/src/tools/DevAnalyzers/OnPropertyChangedOverrideAnalyzer.cs +++ b/src/tools/DevAnalyzers/OnPropertyChangedOverrideAnalyzer.cs @@ -1,6 +1,7 @@ using System.Collections.Immutable; using System.Linq; using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -26,37 +27,32 @@ namespace DevAnalyzers { context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); context.EnableConcurrentExecution(); - context.RegisterSymbolAction(AnalyzeMethod, SymbolKind.Method); + context.RegisterSyntaxNodeAction(AnalyzeMethod, SyntaxKind.MethodDeclaration); } - private static void AnalyzeMethod(SymbolAnalysisContext context) + private static void AnalyzeMethod(SyntaxNodeAnalysisContext context) { - if (context.Symbol is IMethodSymbol currentMethod + var method = (MethodDeclarationSyntax)context.Node; + if (context.SemanticModel.GetDeclaredSymbol(method, context.CancellationToken) is IMethodSymbol currentMethod && currentMethod.Name == "OnPropertyChanged" && currentMethod.OverriddenMethod is IMethodSymbol originalMethod) { - var declaration = currentMethod.DeclaringSyntaxReferences.FirstOrDefault() - ?.GetSyntax(context.CancellationToken); - if (declaration is not null && context.Compilation.GetSemanticModel(declaration!.SyntaxTree) is { } semanticModel) + var baseInvocations = method.Body?.DescendantNodes().OfType(); + if (baseInvocations?.Any() == true) { - if (declaration.SyntaxTree.TryGetRoot(out var root)) + foreach (var baseInvocation in baseInvocations) { - var baseInvocations = root.DescendantNodes().OfType(); - if (baseInvocations.Any()) + if (baseInvocation.Parent is SyntaxNode parent) { - foreach (var baseInvocation in baseInvocations) + var targetSymbol = context.SemanticModel.GetSymbolInfo(parent, context.CancellationToken); + if (SymbolEqualityComparer.Default.Equals(targetSymbol.Symbol, originalMethod)) { - var parent = baseInvocation.Parent; - var targetSymbol = semanticModel.GetSymbolInfo(parent, context.CancellationToken); - if (SymbolEqualityComparer.Default.Equals(targetSymbol.Symbol, originalMethod)) - { - return; - } + return; } } - context.ReportDiagnostic(Diagnostic.Create(Rule, currentMethod.Locations[0], currentMethod.Name)); } } + context.ReportDiagnostic(Diagnostic.Create(Rule, currentMethod.Locations[0], currentMethod.Name)); } } From a428085b5e1fe3eb151c91653caa02f8d6f51ccb Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 9 Sep 2022 10:39:31 +0200 Subject: [PATCH 2/3] fix: throw compilation error on AVADEV2001 --- .editorconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.editorconfig b/.editorconfig index 30edee1633..128b6f1712 100644 --- a/.editorconfig +++ b/.editorconfig @@ -137,6 +137,9 @@ space_within_single_line_array_initializer_braces = true # Wrapping preferences csharp_wrap_before_ternary_opsigns = false +# Avalonia DevAnalyzer preferences +dotnet_diagnostic.AVADEV2001.severity = error + # Xaml files [*.{xaml,axaml}] indent_size = 2 From 5ced53112ec4c2199eeebc660a99608eab741f7d Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 9 Sep 2022 10:58:55 +0200 Subject: [PATCH 3/3] fix: missing invoke of base.OnPropertyChanged --- src/Avalonia.Base/Layout/StackLayout.cs | 1 + src/Avalonia.Base/Layout/UniformGridLayout.cs | 1 + src/Avalonia.Base/Rotate3DTransform.cs | 1 + src/Avalonia.Controls/Primitives/Popup.cs | 1 + src/Avalonia.Controls/SplitButton/ToggleSplitButton.cs | 1 + 5 files changed, 5 insertions(+) diff --git a/src/Avalonia.Base/Layout/StackLayout.cs b/src/Avalonia.Base/Layout/StackLayout.cs index 00ac4a37f0..e3c2ab3817 100644 --- a/src/Avalonia.Base/Layout/StackLayout.cs +++ b/src/Avalonia.Base/Layout/StackLayout.cs @@ -322,6 +322,7 @@ namespace Avalonia.Layout protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { + base.OnPropertyChanged(change); if (change.Property == OrientationProperty) { var orientation = change.GetNewValue(); diff --git a/src/Avalonia.Base/Layout/UniformGridLayout.cs b/src/Avalonia.Base/Layout/UniformGridLayout.cs index 47c994a350..a7880a1545 100644 --- a/src/Avalonia.Base/Layout/UniformGridLayout.cs +++ b/src/Avalonia.Base/Layout/UniformGridLayout.cs @@ -473,6 +473,7 @@ namespace Avalonia.Layout protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { + base.OnPropertyChanged(change); if (change.Property == OrientationProperty) { var orientation = change.GetNewValue(); diff --git a/src/Avalonia.Base/Rotate3DTransform.cs b/src/Avalonia.Base/Rotate3DTransform.cs index 2c4e515861..2de33889c8 100644 --- a/src/Avalonia.Base/Rotate3DTransform.cs +++ b/src/Avalonia.Base/Rotate3DTransform.cs @@ -205,6 +205,7 @@ public class Rotate3DTransform : Transform protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { + base.OnPropertyChanged(change); if (!_isInitializing) RaiseChanged(); } } diff --git a/src/Avalonia.Controls/Primitives/Popup.cs b/src/Avalonia.Controls/Primitives/Popup.cs index f71a0c6f48..ccb81ba276 100644 --- a/src/Avalonia.Controls/Primitives/Popup.cs +++ b/src/Avalonia.Controls/Primitives/Popup.cs @@ -524,6 +524,7 @@ namespace Avalonia.Controls.Primitives protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { + base.OnPropertyChanged(change); if (_openState is not null) { if (change.Property == WidthProperty || diff --git a/src/Avalonia.Controls/SplitButton/ToggleSplitButton.cs b/src/Avalonia.Controls/SplitButton/ToggleSplitButton.cs index cd34f8060a..83bc9851c1 100644 --- a/src/Avalonia.Controls/SplitButton/ToggleSplitButton.cs +++ b/src/Avalonia.Controls/SplitButton/ToggleSplitButton.cs @@ -92,6 +92,7 @@ namespace Avalonia.Controls /// protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs e) { + base.OnPropertyChanged(e); if (e.Property == IsCheckedProperty) { OnIsCheckedChanged();