Esempio n. 1
0
        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 { })