File: IRemoteJsonServiceParameterAnalyzer.cs
Web Access
Project: src\src\Razor\src\Analyzers\Razor.Diagnostics.Analyzers\Razor.Diagnostics.Analyzers.csproj (Razor.Diagnostics.Analyzers)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Diagnostics;
using static Razor.Diagnostics.Analyzers.Resources;
 
namespace Razor.Diagnostics.Analyzers;
 
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class IRemoteJsonServiceParameterAnalyzer : DiagnosticAnalyzer
{
    internal static readonly DiagnosticDescriptor Rule = new(
        DiagnosticIds.IRemoteJsonServiceParameter,
        CreateLocalizableResourceString(nameof(IRemoteJsonServiceParameterTitle)),
        CreateLocalizableResourceString(nameof(IRemoteJsonServiceParameterMessage)),
        DiagnosticCategory.Reliability,
        DiagnosticSeverity.Error,
        isEnabledByDefault: true,
        description: CreateLocalizableResourceString(nameof(IRemoteJsonServiceParameterDescription)));
 
    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
 
    public override void Initialize(AnalysisContext context)
    {
        context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
        context.EnableConcurrentExecution();
        context.RegisterSymbolAction(AnalyzeSymbol, SymbolKind.NamedType);
    }
 
    private static void AnalyzeSymbol(SymbolAnalysisContext context)
    {
        var namedTypeSymbol = (INamedTypeSymbol)context.Symbol;
 
        if (namedTypeSymbol.TypeKind == TypeKind.Interface &&
            namedTypeSymbol.AllInterfaces.Any(i => i.ToDisplayString() == WellKnownTypeNames.IRemoteJsonService))
        {
            foreach (var method in namedTypeSymbol.GetMembers().OfType<IMethodSymbol>())
            {
                foreach (var parameter in method.Parameters)
                {
                    if (parameter.Type.ToDisplayString() is
                        WellKnownTypeNames.RazorPinnedSolutionInfoWrapper or
                        WellKnownTypeNames.DocumentId)
                    {
                        var diagnostic = Diagnostic.Create(
                            Rule,
                            parameter.Locations.FirstOrDefault(),
                            parameter.Name,
                            namedTypeSymbol.Name,
                            method.Name,
                            parameter.Type.Name);
                        context.ReportDiagnostic(diagnostic);
                    }
                }
            }
        }
    }
}