Skip to content

Commit

Permalink
JsonParamBinderAnalyzer optimizations (#934)
Browse files Browse the repository at this point in the history
  • Loading branch information
omsmith authored Nov 20, 2023
1 parent e344a88 commit 983f9b8
Showing 1 changed file with 10 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -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 {

Expand Down Expand Up @@ -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(
Expand All @@ -51,59 +50,36 @@ 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,
location
);
}

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;
}

}

}

0 comments on commit 983f9b8

Please sign in to comment.