Skip to content

Commit 5f4f49c

Browse files
committed
BUGFIX: WPF0092 allow RoutedEventHandler
1 parent 47c850a commit 5f4f49c

3 files changed

Lines changed: 11 additions & 2 deletions

File tree

WpfAnalyzers.Test/WPF0092RegisterClassHandlerDelegateType/Valid.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,11 @@ static void OnPasswordChanged(object sender, RoutedEventArgs e)
3737
}
3838

3939
[TestCase("new KeyEventHandler(OnKeyDown)")]
40+
[TestCase("new RoutedEventHandler(On)")]
4041
[TestCase("new KeyEventHandler((sender, e) => { })")]
42+
[TestCase("new RoutedEventHandler((sender, e) => { })")]
4143
[TestCase("new KeyEventHandler((sender, e) => OnKeyDown(sender, e))")]
44+
[TestCase("new RoutedEventHandler((sender, e) => On(sender, e))")]
4245
public static void RegisterClassHandlerKeyDownEvent(string expression)
4346
{
4447
var code = @"
@@ -50,17 +53,21 @@ namespace N;
5053
5154
public static class C
5255
{
56+
#pragma warning disable CS8321, WPF0090
5357
static C()
5458
{
5559
EventManager.RegisterClassHandler(
5660
typeof(TextBox),
5761
TextBox.KeyDownEvent,
5862
new KeyEventHandler(OnKeyDown));
5963
60-
#pragma warning disable CS8321
6164
static void OnKeyDown(object sender, KeyEventArgs e)
6265
{
6366
}
67+
68+
static void On(object sender, RoutedEventArgs e)
69+
{
70+
}
6471
}
6572
}".AssertReplace("new KeyEventHandler(OnKeyDown)", expression);
6673
RoslynAssert.Valid(Analyzer, code);

WpfAnalyzers/Analyzers/RoutedEventCallbackAnalyzer.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,8 @@ private static void Handle(SyntaxNodeAnalysisContext context)
142142
routedSymbol.Name.EndsWith("Event", StringComparison.Ordinal) &&
143143
routedSymbol.ContainingType.TryFindEvent(routedSymbol.Name.Substring(0, routedSymbol.Name.Length - 5), out var accessor) &&
144144
context.SemanticModel.GetType(callbackArg.Expression, context.CancellationToken) is { } actualType &&
145-
!TypeSymbolComparer.Equal(actualType, accessor.Type))
145+
!TypeSymbolComparer.Equal(actualType, accessor.Type) &&
146+
actualType != KnownSymbols.RoutedEventHandler)
146147
{
147148
return ImmutableDictionary<string, string?>.Empty.Add(nameof(ITypeSymbol), accessor.Type.MetadataName);
148149
}

WpfAnalyzers/Helpers/KnownSymbols/KnownSymbols.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ internal static class KnownSymbols
2121
internal static readonly QualifiedType FrameworkPropertyMetadata = Create("System.Windows.FrameworkPropertyMetadata");
2222
internal static readonly QualifiedType DependencyPropertyChangedEventArgs = Create("System.Windows.DependencyPropertyChangedEventArgs");
2323
internal static readonly QualifiedType RoutedEvent = Create("System.Windows.RoutedEvent");
24+
internal static readonly QualifiedType RoutedEventHandler = Create("System.Windows.RoutedEventHandler");
2425
internal static readonly QualifiedType Style = Create("System.Windows.Style");
2526
internal static readonly QualifiedType TemplatePartAttribute = Create("System.Windows.TemplatePartAttribute");
2627
internal static readonly QualifiedType AttachedPropertyBrowsableForTypeAttribute = Create("System.Windows.AttachedPropertyBrowsableForTypeAttribute");

0 commit comments

Comments
 (0)