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;
if (methodDeclaration.ParameterList?.Parameters.Count > 2)
{
foreach (var parameter in methodDeclaration.ParameterList.Parameters)
{
if (!parameter.Modifiers.Any(SyntaxKind.ParamsKeyword) && !parameter.Identifier.IsKind(SyntaxKind.IdentifierToken))
{
var diagnostic = Diagnostic.Create(Rule, parameter.GetLocation(), "Evite parâmetros sem nome em métodos com mais de dois parâmetros.");
context.ReportDiagnostic(diagnostic);
}
}
}
}
}