From c5789f93411a7bf7b6a6509f35f37e17c5b7988e Mon Sep 17 00:00:00 2001 From: DismissedLight <1686188646@qq.com> Date: Fri, 6 Sep 2024 16:17:47 +0800 Subject: [PATCH] avoidUsingContentDialogShowAsyncDescriptor --- .../Snap.Hutao.SourceGeneration.csproj | 2 +- .../UniversalAnalyzer.cs | 34 +++++++++++++------ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration.csproj b/src/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration.csproj index b0434fb..df12e27 100644 --- a/src/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration.csproj +++ b/src/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration.csproj @@ -32,7 +32,7 @@ Snap.Hutao.SourceGeneration - 1.1.15 + 1.1.16 DGP Studio false true diff --git a/src/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration/UniversalAnalyzer.cs b/src/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration/UniversalAnalyzer.cs index 9f214dd..a0f9aeb 100644 --- a/src/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration/UniversalAnalyzer.cs +++ b/src/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration/UniversalAnalyzer.cs @@ -10,9 +10,6 @@ namespace Snap.Hutao.SourceGeneration; -/// -/// 通用分析器 -/// [DiagnosticAnalyzer(LanguageNames.CSharp)] internal sealed class UniversalAnalyzer : DiagnosticAnalyzer { @@ -23,6 +20,8 @@ internal sealed class UniversalAnalyzer : DiagnosticAnalyzer private static readonly DiagnosticDescriptor useIsPatternRecursiveMatchingDescriptor = new("SH006", "Use \"is { } obj\" whenever possible", "Use \"is {{ }} {0}\"", "Quality", DiagnosticSeverity.Info, true); private static readonly DiagnosticDescriptor useArgumentNullExceptionThrowIfNullDescriptor = new("SH007", "Use \"ArgumentNullException.ThrowIfNull()\" instead of \"!\"", "Use \"ArgumentNullException.ThrowIfNull()\"", "Quality", DiagnosticSeverity.Info, true); + private static readonly DiagnosticDescriptor avoidUsingContentDialogShowAsyncDescriptor = new("SH100", "Use \"IContentDialogFactory.EnqueueAndShowAsync\" instead", "Use \"IContentDialogFactory.EnqueueAndShowAsync\" instead", "Quality", DiagnosticSeverity.Warning, true); + public override ImmutableArray SupportedDiagnostics { get @@ -34,7 +33,8 @@ public override ImmutableArray SupportedDiagnostics useIsNotNullPatternMatchingDescriptor, useIsNullPatternMatchingDescriptor, useIsPatternRecursiveMatchingDescriptor, - useArgumentNullExceptionThrowIfNullDescriptor + useArgumentNullExceptionThrowIfNullDescriptor, + avoidUsingContentDialogShowAsyncDescriptor }.ToImmutableArray(); } } @@ -49,14 +49,13 @@ public override void Initialize(AnalysisContext context) private static void CompilationStart(CompilationStartAnalysisContext context) { - SyntaxKind[] commonTypes = [SyntaxKind.ClassDeclaration, SyntaxKind.InterfaceDeclaration, SyntaxKind.StructDeclaration, SyntaxKind.EnumDeclaration,]; - context.RegisterSyntaxNodeAction(HandleTypeShouldBeInternal, commonTypes); + context.RegisterSyntaxNodeAction(HandleTypeShouldBeInternal, SyntaxKind.ClassDeclaration, SyntaxKind.InterfaceDeclaration, SyntaxKind.StructDeclaration, SyntaxKind.EnumDeclaration); context.RegisterSyntaxNodeAction(HandleMethodReturnTypeShouldUseValueTaskInsteadOfTask, SyntaxKind.MethodDeclaration); - - SyntaxKind[] expressions = [SyntaxKind.EqualsExpression, SyntaxKind.NotEqualsExpression,]; - context.RegisterSyntaxNodeAction(HandleEqualsAndNotEqualsExpressionShouldUsePatternMatching, expressions); + context.RegisterSyntaxNodeAction(HandleEqualsAndNotEqualsExpressionShouldUsePatternMatching, SyntaxKind.EqualsExpression, SyntaxKind.NotEqualsExpression); context.RegisterSyntaxNodeAction(HandleIsPatternShouldUseRecursivePattern, SyntaxKind.IsPatternExpression); context.RegisterSyntaxNodeAction(HandleArgumentNullExceptionThrowIfNull, SyntaxKind.SuppressNullableWarningExpression); + + context.RegisterSyntaxNodeAction(HandleContentDialogShowAsyncAccess, SyntaxKind.SimpleMemberAccessExpression); } private static void HandleTypeShouldBeInternal(SyntaxNodeAnalysisContext context) @@ -118,7 +117,7 @@ private static void HandleMethodReturnTypeShouldUseValueTaskInsteadOfTask(Syntax } } - public static void HandleEqualsAndNotEqualsExpressionShouldUsePatternMatching(SyntaxNodeAnalysisContext context) + private static void HandleEqualsAndNotEqualsExpressionShouldUsePatternMatching(SyntaxNodeAnalysisContext context) { BinaryExpressionSyntax syntax = (BinaryExpressionSyntax)context.Node; if (syntax.IsKind(SyntaxKind.NotEqualsExpression) && syntax.Right.IsKind(SyntaxKind.NullLiteralExpression)) @@ -173,4 +172,19 @@ private static void HandleArgumentNullExceptionThrowIfNull(SyntaxNodeAnalysisCon Diagnostic diagnostic = Diagnostic.Create(useArgumentNullExceptionThrowIfNullDescriptor, location); context.ReportDiagnostic(diagnostic); } + + private static void HandleContentDialogShowAsyncAccess(SyntaxNodeAnalysisContext context) + { + MemberAccessExpressionSyntax syntax = (MemberAccessExpressionSyntax)context.Node; + if (syntax.Name.Identifier.Text == "ShowAsync") + { + ITypeSymbol? type = context.SemanticModel.GetTypeInfo(syntax.Expression).Type; + if (type?.ToDisplayString() == "Microsoft.UI.Xaml.Controls.ContentDialog") + { + Location location = syntax.GetLocation(); + Diagnostic diagnostic = Diagnostic.Create(avoidUsingContentDialogShowAsyncDescriptor, location); + context.ReportDiagnostic(diagnostic); + } + } + } } \ No newline at end of file