From 83c7af72bf970c021bb15918c8f2b5b839806bc1 Mon Sep 17 00:00:00 2001 From: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com> Date: Fri, 28 Apr 2023 17:02:50 +0300 Subject: [PATCH] Downgrade target Roslyn version in analyzers Closes #135 --- CliFx.Analyzers/CliFx.Analyzers.csproj | 5 +++-- .../OptionMustBeRequiredIfPropertyRequiredAnalyzer.cs | 2 +- CliFx.Analyzers/OptionMustHaveUniqueNameAnalyzer.cs | 2 +- .../OptionMustHaveUniqueShortNameAnalyzer.cs | 2 +- .../ParameterMustBeLastIfNonRequiredAnalyzer.cs | 2 +- .../ParameterMustBeLastIfNonScalarAnalyzer.cs | 2 +- ...rameterMustBeRequiredIfPropertyRequiredAnalyzer.cs | 2 +- .../ParameterMustBeSingleIfNonRequiredAnalyzer.cs | 2 +- .../ParameterMustBeSingleIfNonScalarAnalyzer.cs | 2 +- .../ParameterMustHaveUniqueNameAnalyzer.cs | 2 +- .../ParameterMustHaveUniqueOrderAnalyzer.cs | 2 +- CliFx.Analyzers/Utils/Extensions/RoslynExtensions.cs | 11 +++++++++++ 12 files changed, 24 insertions(+), 12 deletions(-) diff --git a/CliFx.Analyzers/CliFx.Analyzers.csproj b/CliFx.Analyzers/CliFx.Analyzers.csproj index ce178d7..90a2f04 100644 --- a/CliFx.Analyzers/CliFx.Analyzers.csproj +++ b/CliFx.Analyzers/CliFx.Analyzers.csproj @@ -17,8 +17,9 @@ - - + + + diff --git a/CliFx.Analyzers/OptionMustBeRequiredIfPropertyRequiredAnalyzer.cs b/CliFx.Analyzers/OptionMustBeRequiredIfPropertyRequiredAnalyzer.cs index 5971c58..866d231 100644 --- a/CliFx.Analyzers/OptionMustBeRequiredIfPropertyRequiredAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustBeRequiredIfPropertyRequiredAnalyzer.cs @@ -24,7 +24,7 @@ public class OptionMustBeRequiredIfPropertyRequiredAnalyzer : AnalyzerBase if (property.ContainingType is null) return; - if (!property.IsRequired) + if (!property.IsRequired()) return; var option = CommandOptionSymbol.TryResolve(property); diff --git a/CliFx.Analyzers/OptionMustHaveUniqueNameAnalyzer.cs b/CliFx.Analyzers/OptionMustHaveUniqueNameAnalyzer.cs index 22841d1..f99a1a3 100644 --- a/CliFx.Analyzers/OptionMustHaveUniqueNameAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustHaveUniqueNameAnalyzer.cs @@ -39,7 +39,7 @@ public class OptionMustHaveUniqueNameAnalyzer : AnalyzerBase .ContainingType .GetMembers() .OfType() - .Where(m => !m.Equals(property, SymbolEqualityComparer.Default)) + .Where(m => !m.Equals(property)) .ToArray(); foreach (var otherProperty in otherProperties) diff --git a/CliFx.Analyzers/OptionMustHaveUniqueShortNameAnalyzer.cs b/CliFx.Analyzers/OptionMustHaveUniqueShortNameAnalyzer.cs index 2c06d93..a60ef0a 100644 --- a/CliFx.Analyzers/OptionMustHaveUniqueShortNameAnalyzer.cs +++ b/CliFx.Analyzers/OptionMustHaveUniqueShortNameAnalyzer.cs @@ -38,7 +38,7 @@ public class OptionMustHaveUniqueShortNameAnalyzer : AnalyzerBase .ContainingType .GetMembers() .OfType() - .Where(m => !m.Equals(property, SymbolEqualityComparer.Default)) + .Where(m => !m.Equals(property)) .ToArray(); foreach (var otherProperty in otherProperties) diff --git a/CliFx.Analyzers/ParameterMustBeLastIfNonRequiredAnalyzer.cs b/CliFx.Analyzers/ParameterMustBeLastIfNonRequiredAnalyzer.cs index 4508227..29a5764 100644 --- a/CliFx.Analyzers/ParameterMustBeLastIfNonRequiredAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustBeLastIfNonRequiredAnalyzer.cs @@ -37,7 +37,7 @@ public class ParameterMustBeLastIfNonRequiredAnalyzer : AnalyzerBase .ContainingType .GetMembers() .OfType() - .Where(m => !m.Equals(property, SymbolEqualityComparer.Default)) + .Where(m => !m.Equals(property)) .ToArray(); foreach (var otherProperty in otherProperties) diff --git a/CliFx.Analyzers/ParameterMustBeLastIfNonScalarAnalyzer.cs b/CliFx.Analyzers/ParameterMustBeLastIfNonScalarAnalyzer.cs index 985b56e..7c634b8 100644 --- a/CliFx.Analyzers/ParameterMustBeLastIfNonScalarAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustBeLastIfNonScalarAnalyzer.cs @@ -37,7 +37,7 @@ public class ParameterMustBeLastIfNonScalarAnalyzer : AnalyzerBase .ContainingType .GetMembers() .OfType() - .Where(m => !m.Equals(property, SymbolEqualityComparer.Default)) + .Where(m => !m.Equals(property)) .ToArray(); foreach (var otherProperty in otherProperties) diff --git a/CliFx.Analyzers/ParameterMustBeRequiredIfPropertyRequiredAnalyzer.cs b/CliFx.Analyzers/ParameterMustBeRequiredIfPropertyRequiredAnalyzer.cs index 3fc6311..c4ad97e 100644 --- a/CliFx.Analyzers/ParameterMustBeRequiredIfPropertyRequiredAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustBeRequiredIfPropertyRequiredAnalyzer.cs @@ -24,7 +24,7 @@ public class ParameterMustBeRequiredIfPropertyRequiredAnalyzer : AnalyzerBase if (property.ContainingType is null) return; - if (!property.IsRequired) + if (!property.IsRequired()) return; var parameter = CommandParameterSymbol.TryResolve(property); diff --git a/CliFx.Analyzers/ParameterMustBeSingleIfNonRequiredAnalyzer.cs b/CliFx.Analyzers/ParameterMustBeSingleIfNonRequiredAnalyzer.cs index 832b90e..3b29950 100644 --- a/CliFx.Analyzers/ParameterMustBeSingleIfNonRequiredAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustBeSingleIfNonRequiredAnalyzer.cs @@ -37,7 +37,7 @@ public class ParameterMustBeSingleIfNonRequiredAnalyzer : AnalyzerBase .ContainingType .GetMembers() .OfType() - .Where(m => !m.Equals(property, SymbolEqualityComparer.Default)) + .Where(m => !m.Equals(property)) .ToArray(); foreach (var otherProperty in otherProperties) diff --git a/CliFx.Analyzers/ParameterMustBeSingleIfNonScalarAnalyzer.cs b/CliFx.Analyzers/ParameterMustBeSingleIfNonScalarAnalyzer.cs index be66a4a..b4d928c 100644 --- a/CliFx.Analyzers/ParameterMustBeSingleIfNonScalarAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustBeSingleIfNonScalarAnalyzer.cs @@ -37,7 +37,7 @@ public class ParameterMustBeSingleIfNonScalarAnalyzer : AnalyzerBase .ContainingType .GetMembers() .OfType() - .Where(m => !m.Equals(property, SymbolEqualityComparer.Default)) + .Where(m => !m.Equals(property)) .ToArray(); foreach (var otherProperty in otherProperties) diff --git a/CliFx.Analyzers/ParameterMustHaveUniqueNameAnalyzer.cs b/CliFx.Analyzers/ParameterMustHaveUniqueNameAnalyzer.cs index d23121e..62d8292 100644 --- a/CliFx.Analyzers/ParameterMustHaveUniqueNameAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustHaveUniqueNameAnalyzer.cs @@ -39,7 +39,7 @@ public class ParameterMustHaveUniqueNameAnalyzer : AnalyzerBase .ContainingType .GetMembers() .OfType() - .Where(m => !m.Equals(property, SymbolEqualityComparer.Default)) + .Where(m => !m.Equals(property)) .ToArray(); foreach (var otherProperty in otherProperties) diff --git a/CliFx.Analyzers/ParameterMustHaveUniqueOrderAnalyzer.cs b/CliFx.Analyzers/ParameterMustHaveUniqueOrderAnalyzer.cs index 2caa3d3..9ef2411 100644 --- a/CliFx.Analyzers/ParameterMustHaveUniqueOrderAnalyzer.cs +++ b/CliFx.Analyzers/ParameterMustHaveUniqueOrderAnalyzer.cs @@ -35,7 +35,7 @@ public class ParameterMustHaveUniqueOrderAnalyzer : AnalyzerBase .ContainingType .GetMembers() .OfType() - .Where(m => !m.Equals(property, SymbolEqualityComparer.Default)) + .Where(m => !m.Equals(property)) .ToArray(); foreach (var otherProperty in otherProperties) diff --git a/CliFx.Analyzers/Utils/Extensions/RoslynExtensions.cs b/CliFx.Analyzers/Utils/Extensions/RoslynExtensions.cs index d386014..202e72f 100644 --- a/CliFx.Analyzers/Utils/Extensions/RoslynExtensions.cs +++ b/CliFx.Analyzers/Utils/Extensions/RoslynExtensions.cs @@ -34,6 +34,17 @@ internal static class RoslynExtensions .FirstOrDefault(i => i.ConstructedFrom.SpecialType == SpecialType.System_Collections_Generic_IEnumerable_T)? .TypeArguments[0]; + // Detect if the property is required through roundabout means so as to not have to take dependency + // on higher versions of the C# compiler. + public static bool IsRequired(this IPropertySymbol property) => property + // Can't rely on the RequiredMemberAttribute because it's generated by the compiler, not added by the user, + // so we have to check for the presence of the `required` modifier in the syntax tree instead. + .DeclaringSyntaxReferences + .Select(r => r.GetSyntax()) + .OfType() + .SelectMany(p => p.Modifiers) + .Any(m => m.IsKind((SyntaxKind)8447)); + public static bool IsAssignable(this Compilation compilation, ITypeSymbol source, ITypeSymbol destination) => compilation.ClassifyConversion(source, destination).Exists;