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;