From 983f9b8fe8f4129cd451ecd8882f1f43a40dac2c Mon Sep 17 00:00:00 2001 From: Owen Smith Date: Mon, 20 Nov 2023 15:49:48 -0500 Subject: [PATCH] JsonParamBinderAnalyzer optimizations (#934) --- .../JsonParamBinderAnalyzer.cs | 44 +++++-------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/src/D2L.CodeStyle.Analyzers/ApiUsage/JsonParamBinderAttribute/JsonParamBinderAnalyzer.cs b/src/D2L.CodeStyle.Analyzers/ApiUsage/JsonParamBinderAttribute/JsonParamBinderAnalyzer.cs index 83bbc951..5f022f0e 100644 --- a/src/D2L.CodeStyle.Analyzers/ApiUsage/JsonParamBinderAttribute/JsonParamBinderAnalyzer.cs +++ b/src/D2L.CodeStyle.Analyzers/ApiUsage/JsonParamBinderAttribute/JsonParamBinderAnalyzer.cs @@ -1,9 +1,8 @@ using System.Collections.Immutable; using D2L.CodeStyle.Analyzers.Helpers; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; +using Microsoft.CodeAnalysis.Operations; namespace D2L.CodeStyle.Analyzers.ApiUsage.JsonParamBinderAttribute { @@ -35,9 +34,9 @@ private void RegisterAnalysis( CompilationStartAnalysisContext context ) { analyzerOptions: context.Options ); - context.RegisterSyntaxNodeAction( + context.RegisterOperationAction( ctx => AnalyzeAttribute( ctx, attributeType, allowedTypeList ), - SyntaxKind.Attribute + OperationKind.Attribute ); context.RegisterSymbolAction( @@ -51,36 +50,29 @@ private void RegisterAnalysis( CompilationStartAnalysisContext context ) { } private static void AnalyzeAttribute( - SyntaxNodeAnalysisContext context, + OperationAnalysisContext context, INamedTypeSymbol jsonParamBinderT, AllowedTypeList allowedList ) { - if( !( context.Node is AttributeSyntax attribute ) ) { - return; - } + IAttributeOperation operation = ( IAttributeOperation )context.Operation; - if( !AttributeIsOfDisallowedType( context.SemanticModel, jsonParamBinderT, attribute ) ) { + if( operation.Operation is not IObjectCreationOperation attributeCreationOperation ) { return; } - ISymbol? methodSymbol = context.ContainingSymbol; - if( methodSymbol == null ) { + if( !SymbolEqualityComparer.Default.Equals( jsonParamBinderT, attributeCreationOperation.Type ) ) { return; } - if( methodSymbol.Kind != SymbolKind.Method ) { + if( context.ContainingSymbol.ContainingType is not INamedTypeSymbol containingType ) { return; } - if( !( methodSymbol.ContainingType is INamedTypeSymbol classSymbol ) ) { + if( allowedList.Contains( containingType ) ) { return; } - if( allowedList.Contains( classSymbol ) ) { - return; - } - - Location location = attribute.GetLocation(); + Location location = operation.Syntax.GetLocation(); context.ReportDiagnostic( Diagnostics.ObsoleteJsonParamBinder, @@ -88,22 +80,6 @@ AllowedTypeList allowedList ); } - private static bool AttributeIsOfDisallowedType( - SemanticModel model, - INamedTypeSymbol jsonParamBinderT, - AttributeSyntax syntax - ) { - if( !( model.GetTypeInfo( syntax ).Type is INamedTypeSymbol actualType ) ) { - return false; - } - - if( !actualType.Equals( jsonParamBinderT, SymbolEqualityComparer.Default ) ) { - return false; - } - - return true; - } - } }