diff --git a/CliFx.Analyzers/OptionMustBeInsideCommandAnalyzer.cs b/CliFx.Analyzers/OptionMustBeInsideCommandAnalyzer.cs index 25cebf1..fb1395f 100644 --- a/CliFx.Analyzers/OptionMustBeInsideCommandAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustBeInsideCommandAnalyzer.cs @@ -22,6 +22,9 @@ namespace CliFx.Analyzers PropertyDeclarationSyntax propertyDeclaration, IPropertySymbol property) { + if (property.ContainingType is null) + return; + if (property.ContainingType.IsAbstract) return; diff --git a/CliFx.Analyzers/OptionMustHaveUniqueNameAnalyzer.cs b/CliFx.Analyzers/OptionMustHaveUniqueNameAnalyzer.cs index 02a5528..e46934c 100644 --- a/CliFx.Analyzers/OptionMustHaveUniqueNameAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustHaveUniqueNameAnalyzer.cs @@ -23,6 +23,9 @@ namespace CliFx.Analyzers PropertyDeclarationSyntax propertyDeclaration, IPropertySymbol property) { + if (property.ContainingType is null) + return; + var option = CommandOptionSymbol.TryResolve(property); if (option is null) return; diff --git a/CliFx.Analyzers/OptionMustHaveUniqueShortNameAnalyzer.cs b/CliFx.Analyzers/OptionMustHaveUniqueShortNameAnalyzer.cs index 9202c48..b629216 100644 --- a/CliFx.Analyzers/OptionMustHaveUniqueShortNameAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustHaveUniqueShortNameAnalyzer.cs @@ -22,6 +22,9 @@ namespace CliFx.Analyzers PropertyDeclarationSyntax propertyDeclaration, IPropertySymbol property) { + if (property.ContainingType is null) + return; + var option = CommandOptionSymbol.TryResolve(property); if (option is null) return; diff --git a/CliFx.Analyzers/ParameterMustBeInsideCommandAnalyzer.cs b/CliFx.Analyzers/ParameterMustBeInsideCommandAnalyzer.cs index 3bffa06..ba45b2b 100644 --- a/CliFx.Analyzers/ParameterMustBeInsideCommandAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustBeInsideCommandAnalyzer.cs @@ -22,6 +22,9 @@ namespace CliFx.Analyzers PropertyDeclarationSyntax propertyDeclaration, IPropertySymbol property) { + if (property.ContainingType is null) + return; + if (property.ContainingType.IsAbstract) return; diff --git a/CliFx.Analyzers/ParameterMustBeLastIfNonScalarAnalyzer.cs b/CliFx.Analyzers/ParameterMustBeLastIfNonScalarAnalyzer.cs index 5cf3a25..36186ca 100644 --- a/CliFx.Analyzers/ParameterMustBeLastIfNonScalarAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustBeLastIfNonScalarAnalyzer.cs @@ -29,6 +29,9 @@ namespace CliFx.Analyzers PropertyDeclarationSyntax propertyDeclaration, IPropertySymbol property) { + if (property.ContainingType is null) + return; + if (IsScalar(property.Type)) return; diff --git a/CliFx.Analyzers/ParameterMustBeSingleIfNonScalarAnalyzer.cs b/CliFx.Analyzers/ParameterMustBeSingleIfNonScalarAnalyzer.cs index 62881bf..704d278 100644 --- a/CliFx.Analyzers/ParameterMustBeSingleIfNonScalarAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustBeSingleIfNonScalarAnalyzer.cs @@ -29,6 +29,9 @@ namespace CliFx.Analyzers PropertyDeclarationSyntax propertyDeclaration, IPropertySymbol property) { + if (property.ContainingType is null) + return; + if (!CommandParameterSymbol.IsParameterProperty(property)) return; diff --git a/CliFx.Analyzers/ParameterMustHaveUniqueNameAnalyzer.cs b/CliFx.Analyzers/ParameterMustHaveUniqueNameAnalyzer.cs index 6ab1d16..83d0bf3 100644 --- a/CliFx.Analyzers/ParameterMustHaveUniqueNameAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustHaveUniqueNameAnalyzer.cs @@ -23,6 +23,9 @@ namespace CliFx.Analyzers PropertyDeclarationSyntax propertyDeclaration, IPropertySymbol property) { + if (property.ContainingType is null) + return; + var parameter = CommandParameterSymbol.TryResolve(property); if (parameter is null) return; diff --git a/CliFx.Analyzers/ParameterMustHaveUniqueOrderAnalyzer.cs b/CliFx.Analyzers/ParameterMustHaveUniqueOrderAnalyzer.cs index 38b6076..fa41b52 100644 --- a/CliFx.Analyzers/ParameterMustHaveUniqueOrderAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustHaveUniqueOrderAnalyzer.cs @@ -22,6 +22,9 @@ namespace CliFx.Analyzers PropertyDeclarationSyntax propertyDeclaration, IPropertySymbol property) { + if (property.ContainingType is null) + return; + var parameter = CommandParameterSymbol.TryResolve(property); if (parameter is null) return; diff --git a/CliFx.Analyzers/SystemConsoleShouldBeAvoidedAnalyzer.cs b/CliFx.Analyzers/SystemConsoleShouldBeAvoidedAnalyzer.cs index a06aa30..db63900 100644 --- a/CliFx.Analyzers/SystemConsoleShouldBeAvoidedAnalyzer.cs +++ b/CliFx.Analyzers/SystemConsoleShouldBeAvoidedAnalyzer.cs @@ -27,9 +27,9 @@ namespace CliFx.Analyzers while (currentNode is MemberAccessExpressionSyntax memberAccess) { - var symbol = context.SemanticModel.GetSymbolInfo(memberAccess).Symbol; + var member = context.SemanticModel.GetSymbolInfo(memberAccess).Symbol; - if (symbol is not null && symbol.ContainingType.DisplayNameMatches("System.Console")) + if (member?.ContainingType?.DisplayNameMatches("System.Console") == true) { return memberAccess; } diff --git a/CliFx.Analyzers/Utils/Extensions/RoslynExtensions.cs b/CliFx.Analyzers/Utils/Extensions/RoslynExtensions.cs index d20809e..92e93f1 100644 --- a/CliFx.Analyzers/Utils/Extensions/RoslynExtensions.cs +++ b/CliFx.Analyzers/Utils/Extensions/RoslynExtensions.cs @@ -9,11 +9,16 @@ namespace CliFx.Analyzers.Utils.Extensions internal static class RoslynExtensions { public static bool DisplayNameMatches(this ISymbol symbol, string name) => - string.Equals(symbol.ToDisplayString(), name, StringComparison.Ordinal); + string.Equals( + // Fully qualified name, without `global::` + symbol.ToDisplayString(SymbolDisplayFormat.CSharpErrorMessageFormat), + name, + StringComparison.Ordinal + ); public static void HandleClassDeclaration( this AnalysisContext analysisContext, - Action handler) + Action analyze) { analysisContext.RegisterSyntaxNodeAction(ctx => { @@ -24,13 +29,13 @@ namespace CliFx.Analyzers.Utils.Extensions if (type is null) return; - handler(ctx, classDeclaration, type); + analyze(ctx, classDeclaration, type); }, SyntaxKind.ClassDeclaration); } public static void HandlePropertyDeclaration( this AnalysisContext analysisContext, - Action handler) + Action analyze) { analysisContext.RegisterSyntaxNodeAction(ctx => { @@ -41,7 +46,7 @@ namespace CliFx.Analyzers.Utils.Extensions if (property is null) return; - handler(ctx, propertyDeclaration, property); + analyze(ctx, propertyDeclaration, property); }, SyntaxKind.PropertyDeclaration); } }