Skip to main content

Exemplo

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Diagnostics;
using System.Collections.Immutable;
using System.Linq;

[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class ParameterAnalyzer : DiagnosticAnalyzer
{
public const string DiagnosticId = "CustomAnalyzer";
internal static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(
DiagnosticId,
"Evite métodos com mais de dois parâmetros sem usar parâmetros nomeados.",
"Evite métodos com mais de dois parâmetros sem usar parâmetros nomeados.",
"Naming",
DiagnosticSeverity.Warning,
isEnabledByDefault: true);

public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } }

public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(AnalyzeMethodDeclaration, SyntaxKind.MethodDeclaration);
}

private static void AnalyzeMethodDeclaration(SyntaxNodeAnalysisContext context)
{
var methodDeclaration = (MethodDeclarationSyntax)context.Node;

// Verificar se o método tem mais de dois parâmetros
if (methodDeclaration.ParameterList?.Parameters.Count > 2)
{
// Verificar se os parâmetros não são usados como parâmetros nomeados
foreach (var parameter in methodDeclaration.ParameterList.Parameters)
{
if (!parameter.Modifiers.Any(SyntaxKind.ParamsKeyword) && !parameter.Identifier.IsKind(SyntaxKind.IdentifierToken))
{
// Emitir um aviso
var diagnostic = Diagnostic.Create(Rule, parameter.GetLocation(), "Evite parâmetros sem nome em métodos com mais de dois parâmetros.");
context.ReportDiagnostic(diagnostic);
}
}
}
}
}