private static void AnalyzeAttributeClassName(SyntaxNodeAnalysisContext context) { var attribute = context.Node as AttributeSyntax; if (SyntaxNodeUtils.IsEntityTriggerAttribute(attribute)) { if (SyntaxNodeUtils.TryGetFunctionNameParameterNode(attribute, out SyntaxNode attributeArgument)) { var functionName = attributeArgument.ToString().Trim('"'); if (SyntaxNodeUtils.TryGetClassSymbol(attribute, context.SemanticModel, out INamedTypeSymbol classSymbol)) { var className = classSymbol.Name.ToString(); if (!ClassNameMatchesFunctionName(classSymbol, functionName)) { var diagnosticClassName = Diagnostic.Create(Rule, classSymbol.Locations[0], className, functionName); var diagnosticAttribute = Diagnostic.Create(Rule, attributeArgument.GetLocation(), className, functionName); context.ReportDiagnostic(diagnosticClassName); context.ReportDiagnostic(diagnosticAttribute); } } } } }
private void AnalyzeDispatchEntityName(SyntaxNodeAnalysisContext context) { var expression = context.Node as MemberAccessExpressionSyntax; if (expression != null) { var name = expression.Name; if (name.ToString().StartsWith("DispatchAsync")) { if (SyntaxNodeUtils.TryGetTypeArgumentIdentifierNode(expression, out SyntaxNode identifierNode)) { if (SyntaxNodeUtils.TryGetClassSymbol(expression, context.SemanticModel, out INamedTypeSymbol classSymbol)) { var className = classSymbol.Name.ToString(); if (!string.Equals(className, identifierNode.ToString())) { var diagnostic = Diagnostic.Create(Rule, identifierNode.GetLocation(), identifierNode, className); context.ReportDiagnostic(diagnostic); } } } } } }
public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) { var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); var diagnostic = context.Diagnostics.First(); var diagnosticSpan = diagnostic.Location.SourceSpan; var identifierNode = root.FindNode(diagnosticSpan); SemanticModel semanticModel = await context.Document.GetSemanticModelAsync(); if (SyntaxNodeUtils.TryGetClassSymbol(identifierNode, semanticModel, out INamedTypeSymbol classSymbol)) { var className = "nameof(" + classSymbol.Name.ToString() + ")"; context.RegisterCodeFix( CodeAction.Create(FixEntityFunctionName.ToString(), cancellationToken => ReplaceAttributeArgumentAsync(context.Document, identifierNode, cancellationToken, className), nameof(ClassNameCodeFixProvider)), diagnostic); } }