| using Microsoft.CodeAnalysis; |
| using Microsoft.CodeAnalysis.CSharp; |
| using Microsoft.CodeAnalysis.CSharp.Syntax; |
| using Microsoft.CodeAnalysis.Diagnostics; |
| using System.Collections.Immutable; |
| |
| namespace Lucene.Net.CodeAnalysis.Dev |
| { |
| [DiagnosticAnalyzer(LanguageNames.CSharp)] |
| public class LuceneDev1003_ArrayMethodParameterCSCodeAnalyzer : DiagnosticAnalyzer |
| { |
| public const string DiagnosticId = "LuceneDev1003"; |
| |
| // You can change these strings in the Resources.resx file. If you do not want your analyzer to be localize-able, you can use regular strings for Title and MessageFormat. |
| // See https://github.com/dotnet/roslyn/blob/main/docs/analyzers/Localizing%20Analyzers.md for more on localization |
| private static readonly LocalizableString Title = new LocalizableResourceString(nameof(Resources.LuceneDev1003_AnalyzerTitle), Resources.ResourceManager, typeof(Resources)); |
| private static readonly LocalizableString MessageFormat = new LocalizableResourceString(nameof(Resources.LuceneDev1003_AnalyzerMessageFormat), Resources.ResourceManager, typeof(Resources)); |
| private static readonly LocalizableString Description = new LocalizableResourceString(nameof(Resources.LuceneDev1003_AnalyzerDescription), Resources.ResourceManager, typeof(Resources)); |
| private const string Category = "Design"; |
| |
| private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description); |
| |
| public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } } |
| |
| public override void Initialize(AnalysisContext context) |
| { |
| context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze); |
| context.EnableConcurrentExecution(); |
| |
| // TODO: Consider registering other actions that act on syntax instead of or in addition to symbols |
| // See https://github.com/dotnet/roslyn/blob/main/docs/analyzers/Analyzer%20Actions%20Semantics.md for more information |
| context.RegisterSyntaxNodeAction(AnalyzeNodeCS, SyntaxKind.MethodDeclaration, SyntaxKind.ParameterList, SyntaxKind.Parameter, SyntaxKind.ArrayType, SyntaxKind.PredefinedType); |
| } |
| |
| private static void AnalyzeNodeCS(SyntaxNodeAnalysisContext context) |
| { |
| if (context.Node is Microsoft.CodeAnalysis.CSharp.Syntax.MethodDeclarationSyntax methodDeclaration) |
| { |
| foreach (var parameter in methodDeclaration.ParameterList.Parameters) |
| { |
| if (parameter.Type is ArrayTypeSyntax arrayTypeSyntax) |
| { |
| if (arrayTypeSyntax.ElementType is PredefinedTypeSyntax predefinedTypeSyntax) |
| { |
| if (predefinedTypeSyntax.Keyword.ValueText != "char") |
| context.ReportDiagnostic(Diagnostic.Create(Rule, parameter.GetLocation(), parameter.ToString())); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |