private static void Handle(SyntaxNodeAnalysisContext context) { if (context.Node is InvocationExpressionSyntax invocation && context.SemanticModel.TryGetSymbol(invocation, context.CancellationToken, out var method)) { if (method.ContainingType == KnownSymbols.RoslynAssert) { foreach (var parameter in method.Parameters) { if (parameter.Name == "before" || (parameter.Name == "code" && method.Name == "Diagnostics")) { if (StringArgument.TrySingle(invocation, parameter, context.SemanticModel, context.CancellationToken, out var single)) { Handle(single, ImmutableArray <StringArgument> .Empty); } else if (StringArgument.TryMany(invocation, parameter, context.SemanticModel, context.CancellationToken, out var stringArgs)) { foreach (var arg in stringArgs) { Handle(arg, stringArgs); } } void Handle(StringArgument stringArg, ImmutableArray <StringArgument> args) { if (ShouldIndicatePosition() && stringArg.Value is { }) { context.ReportDiagnostic( Diagnostic.Create( Descriptors.GURA02IndicateErrorPosition, stringArg.Value.GetLocation())); } if (stringArg.Symbol is { } symbol) { if (stringArg.TryGetNameFromCode(out var codeName) && ShouldRename(stringArg.Symbol, codeName, out codeName)) { context.ReportDiagnostic( Diagnostic.Create( Descriptors.GURA03NameShouldMatchCode, stringArg.SymbolIdentifier.GetLocation(), ImmutableDictionary <string, string> .Empty.Add(nameof(IdentifierNameSyntax), codeName), symbol.Name, codeName)); } if (stringArg.Symbol.Kind == SymbolKind.Local && stringArg.HasPosition == true && args.TrySingle(x => x.HasPosition == true, out _) && ShouldRename(symbol, parameter.Name, out var parameterName)) { context.ReportDiagnostic( Diagnostic.Create( Descriptors.GURA01NameShouldMatchParameter, stringArg.Expression.GetLocation(), ImmutableDictionary <string, string> .Empty.Add(nameof(IdentifierNameSyntax), parameterName), symbol.Name, parameterName)); } if (stringArg.Symbol.IsEitherKind(SymbolKind.Field, SymbolKind.Property) && stringArg.Value is { })