diff --git a/CliFx.Analyzers/CommandMustBeAnnotatedAnalyzer.cs b/CliFx.Analyzers/CommandMustBeAnnotatedAnalyzer.cs index ef9e9f9..bc8ebad 100644 --- a/CliFx.Analyzers/CommandMustBeAnnotatedAnalyzer.cs +++ b/CliFx.Analyzers/CommandMustBeAnnotatedAnalyzer.cs @@ -2,7 +2,6 @@ using CliFx.Analyzers.ObjectModel; using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -18,15 +17,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + ClassDeclarationSyntax classDeclaration, + ITypeSymbol type) { - if (context.Node is not ClassDeclarationSyntax classDeclaration) - return; - - var type = context.SemanticModel.GetDeclaredSymbol(classDeclaration); - if (type is null) - return; - // Ignore abstract classes, because they may be used to define // base implementations for commands, in which case the command // attribute doesn't make sense. @@ -53,7 +48,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.ClassDeclaration); + context.HandleClassDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/CommandMustImplementInterfaceAnalyzer.cs b/CliFx.Analyzers/CommandMustImplementInterfaceAnalyzer.cs index ab98a5d..9404ca8 100644 --- a/CliFx.Analyzers/CommandMustImplementInterfaceAnalyzer.cs +++ b/CliFx.Analyzers/CommandMustImplementInterfaceAnalyzer.cs @@ -2,7 +2,6 @@ using CliFx.Analyzers.ObjectModel; using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -18,15 +17,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + ClassDeclarationSyntax classDeclaration, + ITypeSymbol type) { - if (context.Node is not ClassDeclarationSyntax classDeclaration) - return; - - var type = context.SemanticModel.GetDeclaredSymbol(classDeclaration); - if (type is null) - return; - var hasCommandAttribute = type .GetAttributes() .Select(a => a.AttributeClass) @@ -47,7 +42,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.ClassDeclaration); + context.HandleClassDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/OptionMustBeInsideCommandAnalyzer.cs b/CliFx.Analyzers/OptionMustBeInsideCommandAnalyzer.cs index a46caf4..25cebf1 100644 --- a/CliFx.Analyzers/OptionMustBeInsideCommandAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustBeInsideCommandAnalyzer.cs @@ -2,7 +2,6 @@ using CliFx.Analyzers.ObjectModel; using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -18,15 +17,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - if (property.ContainingType.IsAbstract) return; @@ -47,7 +42,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/OptionMustHaveNameOrShortNameAnalyzer.cs b/CliFx.Analyzers/OptionMustHaveNameOrShortNameAnalyzer.cs index 24ce9b6..d28387e 100644 --- a/CliFx.Analyzers/OptionMustHaveNameOrShortNameAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustHaveNameOrShortNameAnalyzer.cs @@ -1,6 +1,6 @@ using CliFx.Analyzers.ObjectModel; +using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -16,15 +16,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - var option = CommandOptionSymbol.TryResolve(property); if (option is null) return; @@ -38,7 +34,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/OptionMustHaveUniqueNameAnalyzer.cs b/CliFx.Analyzers/OptionMustHaveUniqueNameAnalyzer.cs index 948e59d..02a5528 100644 --- a/CliFx.Analyzers/OptionMustHaveUniqueNameAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustHaveUniqueNameAnalyzer.cs @@ -1,8 +1,8 @@ using System; using System.Linq; using CliFx.Analyzers.ObjectModel; +using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -18,15 +18,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - var option = CommandOptionSymbol.TryResolve(property); if (option is null) return; @@ -60,7 +56,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/OptionMustHaveUniqueShortNameAnalyzer.cs b/CliFx.Analyzers/OptionMustHaveUniqueShortNameAnalyzer.cs index 2dab96a..9202c48 100644 --- a/CliFx.Analyzers/OptionMustHaveUniqueShortNameAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustHaveUniqueShortNameAnalyzer.cs @@ -1,7 +1,7 @@ using System.Linq; using CliFx.Analyzers.ObjectModel; +using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -17,15 +17,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - var option = CommandOptionSymbol.TryResolve(property); if (option is null) return; @@ -59,7 +55,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/OptionMustHaveValidConverterAnalyzer.cs b/CliFx.Analyzers/OptionMustHaveValidConverterAnalyzer.cs index 9a4f104..179a322 100644 --- a/CliFx.Analyzers/OptionMustHaveValidConverterAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustHaveValidConverterAnalyzer.cs @@ -2,7 +2,6 @@ using CliFx.Analyzers.ObjectModel; using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -18,15 +17,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - var option = CommandOptionSymbol.TryResolve(property); if (option is null) return; @@ -49,7 +44,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/OptionMustHaveValidNameAnalyzer.cs b/CliFx.Analyzers/OptionMustHaveValidNameAnalyzer.cs index c056838..6931a3f 100644 --- a/CliFx.Analyzers/OptionMustHaveValidNameAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustHaveValidNameAnalyzer.cs @@ -1,6 +1,6 @@ using CliFx.Analyzers.ObjectModel; +using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -16,15 +16,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - var option = CommandOptionSymbol.TryResolve(property); if (option is null) return; @@ -41,7 +37,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/OptionMustHaveValidShortNameAnalyzer.cs b/CliFx.Analyzers/OptionMustHaveValidShortNameAnalyzer.cs index dfeabee..7a7008d 100644 --- a/CliFx.Analyzers/OptionMustHaveValidShortNameAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustHaveValidShortNameAnalyzer.cs @@ -1,6 +1,6 @@ using CliFx.Analyzers.ObjectModel; +using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -16,15 +16,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - var option = CommandOptionSymbol.TryResolve(property); if (option is null) return; @@ -41,7 +37,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/OptionMustHaveValidValidatorsAnalyzer.cs b/CliFx.Analyzers/OptionMustHaveValidValidatorsAnalyzer.cs index 390bb74..e463510 100644 --- a/CliFx.Analyzers/OptionMustHaveValidValidatorsAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustHaveValidValidatorsAnalyzer.cs @@ -2,7 +2,6 @@ using CliFx.Analyzers.ObjectModel; using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -18,15 +17,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - var option = CommandOptionSymbol.TryResolve(property); if (option is null) return; @@ -51,7 +46,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/ParameterMustBeInsideCommandAnalyzer.cs b/CliFx.Analyzers/ParameterMustBeInsideCommandAnalyzer.cs index 9116674..3bffa06 100644 --- a/CliFx.Analyzers/ParameterMustBeInsideCommandAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustBeInsideCommandAnalyzer.cs @@ -2,7 +2,6 @@ using CliFx.Analyzers.ObjectModel; using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -18,15 +17,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - if (property.ContainingType.IsAbstract) return; @@ -47,7 +42,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/ParameterMustBeLastIfNonScalarAnalyzer.cs b/CliFx.Analyzers/ParameterMustBeLastIfNonScalarAnalyzer.cs index 10e3f17..5cf3a25 100644 --- a/CliFx.Analyzers/ParameterMustBeLastIfNonScalarAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustBeLastIfNonScalarAnalyzer.cs @@ -2,7 +2,6 @@ using CliFx.Analyzers.ObjectModel; using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -25,15 +24,11 @@ namespace CliFx.Analyzers .Select(i => i.ConstructedFrom) .Any(s => s.DisplayNameMatches("System.Collections.Generic.IEnumerable")); - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - if (IsScalar(property.Type)) return; @@ -64,7 +59,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/ParameterMustBeSingleIfNonScalarAnalyzer.cs b/CliFx.Analyzers/ParameterMustBeSingleIfNonScalarAnalyzer.cs index 13bbe34..62881bf 100644 --- a/CliFx.Analyzers/ParameterMustBeSingleIfNonScalarAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustBeSingleIfNonScalarAnalyzer.cs @@ -2,7 +2,6 @@ using CliFx.Analyzers.ObjectModel; using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -25,15 +24,11 @@ namespace CliFx.Analyzers .Select(i => i.ConstructedFrom) .Any(s => s.DisplayNameMatches("System.Collections.Generic.IEnumerable")); - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - if (!CommandParameterSymbol.IsParameterProperty(property)) return; @@ -62,7 +57,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/ParameterMustHaveUniqueNameAnalyzer.cs b/CliFx.Analyzers/ParameterMustHaveUniqueNameAnalyzer.cs index 6387561..6ab1d16 100644 --- a/CliFx.Analyzers/ParameterMustHaveUniqueNameAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustHaveUniqueNameAnalyzer.cs @@ -1,8 +1,8 @@ using System; using System.Linq; using CliFx.Analyzers.ObjectModel; +using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -18,15 +18,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - var parameter = CommandParameterSymbol.TryResolve(property); if (parameter is null) return; @@ -60,7 +56,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/ParameterMustHaveUniqueOrderAnalyzer.cs b/CliFx.Analyzers/ParameterMustHaveUniqueOrderAnalyzer.cs index 1a78d79..38b6076 100644 --- a/CliFx.Analyzers/ParameterMustHaveUniqueOrderAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustHaveUniqueOrderAnalyzer.cs @@ -1,7 +1,7 @@ using System.Linq; using CliFx.Analyzers.ObjectModel; +using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -17,15 +17,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - var parameter = CommandParameterSymbol.TryResolve(property); if (parameter is null) return; @@ -53,7 +49,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/ParameterMustHaveValidConverterAnalyzer.cs b/CliFx.Analyzers/ParameterMustHaveValidConverterAnalyzer.cs index 54a2607..69e3df9 100644 --- a/CliFx.Analyzers/ParameterMustHaveValidConverterAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustHaveValidConverterAnalyzer.cs @@ -2,7 +2,6 @@ using CliFx.Analyzers.ObjectModel; using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -18,15 +17,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - var parameter = CommandParameterSymbol.TryResolve(property); if (parameter is null) return; @@ -49,7 +44,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/ParameterMustHaveValidValidatorsAnalyzer.cs b/CliFx.Analyzers/ParameterMustHaveValidValidatorsAnalyzer.cs index fe6e481..cafec83 100644 --- a/CliFx.Analyzers/ParameterMustHaveValidValidatorsAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustHaveValidValidatorsAnalyzer.cs @@ -2,7 +2,6 @@ using CliFx.Analyzers.ObjectModel; using CliFx.Analyzers.Utils.Extensions; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; @@ -18,15 +17,11 @@ namespace CliFx.Analyzers { } - private void Analyze(SyntaxNodeAnalysisContext context) + private void Analyze( + SyntaxNodeAnalysisContext context, + PropertyDeclarationSyntax propertyDeclaration, + IPropertySymbol property) { - if (context.Node is not PropertyDeclarationSyntax propertyDeclaration) - return; - - var property = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration); - if (property is null) - return; - var parameter = CommandParameterSymbol.TryResolve(property); if (parameter is null) return; @@ -51,7 +46,7 @@ namespace CliFx.Analyzers public override void Initialize(AnalysisContext context) { base.Initialize(context); - context.RegisterSyntaxNodeAction(Analyze, SyntaxKind.PropertyDeclaration); + context.HandlePropertyDeclaration(Analyze); } } } \ No newline at end of file diff --git a/CliFx.Analyzers/Utils/Extensions/RoslynExtensions.cs b/CliFx.Analyzers/Utils/Extensions/RoslynExtensions.cs index adfb210..d20809e 100644 --- a/CliFx.Analyzers/Utils/Extensions/RoslynExtensions.cs +++ b/CliFx.Analyzers/Utils/Extensions/RoslynExtensions.cs @@ -1,5 +1,8 @@ using System; using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; namespace CliFx.Analyzers.Utils.Extensions { @@ -7,5 +10,39 @@ namespace CliFx.Analyzers.Utils.Extensions { public static bool DisplayNameMatches(this ISymbol symbol, string name) => string.Equals(symbol.ToDisplayString(), name, StringComparison.Ordinal); + + public static void HandleClassDeclaration( + this AnalysisContext analysisContext, + Action handler) + { + analysisContext.RegisterSyntaxNodeAction(ctx => + { + if (ctx.Node is not ClassDeclarationSyntax classDeclaration) + return; + + var type = ctx.SemanticModel.GetDeclaredSymbol(classDeclaration); + if (type is null) + return; + + handler(ctx, classDeclaration, type); + }, SyntaxKind.ClassDeclaration); + } + + public static void HandlePropertyDeclaration( + this AnalysisContext analysisContext, + Action handler) + { + analysisContext.RegisterSyntaxNodeAction(ctx => + { + if (ctx.Node is not PropertyDeclarationSyntax propertyDeclaration) + return; + + var property = ctx.SemanticModel.GetDeclaredSymbol(propertyDeclaration); + if (property is null) + return; + + handler(ctx, propertyDeclaration, property); + }, SyntaxKind.PropertyDeclaration); + } } } \ No newline at end of file