diff --git a/DisCatSharp.Attributes/DeprecatedAttribute.cs b/DisCatSharp.Attributes/DeprecatedAttribute.cs index 8a3cb972f..d0758cea1 100644 --- a/DisCatSharp.Attributes/DeprecatedAttribute.cs +++ b/DisCatSharp.Attributes/DeprecatedAttribute.cs @@ -1,4 +1,3 @@ - using System; namespace DisCatSharp.Attributes; diff --git a/DisCatSharp.Attributes/DiscordDeprecatedAttribute.cs b/DisCatSharp.Attributes/DiscordDeprecatedAttribute.cs index ac595b1ef..c51d37e83 100644 --- a/DisCatSharp.Attributes/DiscordDeprecatedAttribute.cs +++ b/DisCatSharp.Attributes/DiscordDeprecatedAttribute.cs @@ -1,4 +1,3 @@ - using System; namespace DisCatSharp.Attributes; diff --git a/DisCatSharp.Attributes/DiscordInExperimentAttribute.cs b/DisCatSharp.Attributes/DiscordInExperimentAttribute.cs index f26656a24..cac91f3b8 100644 --- a/DisCatSharp.Attributes/DiscordInExperimentAttribute.cs +++ b/DisCatSharp.Attributes/DiscordInExperimentAttribute.cs @@ -1,4 +1,3 @@ - using System; namespace DisCatSharp.Attributes; diff --git a/DisCatSharp.Attributes/DiscordUnreleasedAttribute.cs b/DisCatSharp.Attributes/DiscordUnreleasedAttribute.cs index 2586300c6..6374c5743 100644 --- a/DisCatSharp.Attributes/DiscordUnreleasedAttribute.cs +++ b/DisCatSharp.Attributes/DiscordUnreleasedAttribute.cs @@ -1,4 +1,3 @@ - using System; namespace DisCatSharp.Attributes; diff --git a/DisCatSharp.Attributes/ExperimentalAttribute.cs b/DisCatSharp.Attributes/ExperimentalAttribute.cs index 5ff222e14..c6a99a5ad 100644 --- a/DisCatSharp.Attributes/ExperimentalAttribute.cs +++ b/DisCatSharp.Attributes/ExperimentalAttribute.cs @@ -1,4 +1,3 @@ - using System; namespace DisCatSharp.Attributes; diff --git a/DisCatSharp.Attributes/Features.cs b/DisCatSharp.Attributes/Features.cs index d579f958e..57ac9d82d 100644 --- a/DisCatSharp.Attributes/Features.cs +++ b/DisCatSharp.Attributes/Features.cs @@ -1,4 +1,3 @@ - using System; namespace DisCatSharp.Attributes; diff --git a/DisCatSharp.Attributes/Properties/AssemblyProperties.cs b/DisCatSharp.Attributes/Properties/AssemblyProperties.cs index 0d5cb60ed..8c6b93f3c 100644 --- a/DisCatSharp.Attributes/Properties/AssemblyProperties.cs +++ b/DisCatSharp.Attributes/Properties/AssemblyProperties.cs @@ -1,4 +1,3 @@ - using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("DisCatSharp")] diff --git a/DisCatSharp.Attributes/RequiresFeatureAttribute.cs b/DisCatSharp.Attributes/RequiresFeatureAttribute.cs index b53615678..023b73a91 100644 --- a/DisCatSharp.Attributes/RequiresFeatureAttribute.cs +++ b/DisCatSharp.Attributes/RequiresFeatureAttribute.cs @@ -1,4 +1,3 @@ - using System; namespace DisCatSharp.Attributes; diff --git a/DisCatSharp.Tools.sln b/DisCatSharp.Tools.sln index 778f0f984..9416df2a1 100644 --- a/DisCatSharp.Tools.sln +++ b/DisCatSharp.Tools.sln @@ -13,6 +13,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisCatSharp.Experimental", EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6CBDA593-E86C-44F3-9F22-BB5F32D7D48E}" ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig DisCatSharp.Tools\DisCatSharp.ruleset = DisCatSharp.Tools\DisCatSharp.ruleset EndProjectSection EndProject diff --git a/DisCatSharp.Tools/DisCatSharp.Analyzer/DisCatSharp.Analyzer/AttributeAnalyzer.cs b/DisCatSharp.Tools/DisCatSharp.Analyzer/DisCatSharp.Analyzer/AttributeAnalyzer.cs index c9896efdd..5310a4fd9 100644 --- a/DisCatSharp.Tools/DisCatSharp.Analyzer/DisCatSharp.Analyzer/AttributeAnalyzer.cs +++ b/DisCatSharp.Tools/DisCatSharp.Analyzer/DisCatSharp.Analyzer/AttributeAnalyzer.cs @@ -1,10 +1,11 @@ - using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Reflection; + using DisCatSharp.Attributes; + using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Diagnostics; @@ -67,6 +68,7 @@ public override void Initialize(AnalysisContext context) context.RegisterSyntaxNodeAction(StatusAnalyzer, SyntaxKind.ElementAccessExpression); context.RegisterSyntaxNodeAction(StatusAnalyzer, SyntaxKind.SimpleMemberAccessExpression); } + private static void StatusAnalyzer(SyntaxNodeAnalysisContext context) { var invocation = context.Node; @@ -76,6 +78,7 @@ private static void StatusAnalyzer(SyntaxNodeAnalysisContext context) Console.WriteLine("Faulty"); return; } + var attributes = declaration.GetAttributes(); var name = declaration.Name; @@ -85,6 +88,7 @@ private static void StatusAnalyzer(SyntaxNodeAnalysisContext context) name = declaration.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); kind = "Constructor"; } + var experimentalAttributeData = attributes.FirstOrDefault(attr => IsRequiredAttribute(context.SemanticModel, attr, typeof(ExperimentalAttribute))); var deprecatedAttributeData = attributes.FirstOrDefault(attr => IsRequiredAttribute(context.SemanticModel, attr, typeof(DeprecatedAttribute))); var discordInExperimentAttributeData = attributes.FirstOrDefault(attr => IsRequiredAttribute(context.SemanticModel, attr, typeof(DiscordInExperimentAttribute))); @@ -97,31 +101,37 @@ private static void StatusAnalyzer(SyntaxNodeAnalysisContext context) var message = GetMessage(experimentalAttributeData); context.ReportDiagnostic(Diagnostic.Create(s_experimentalRule, invocation.GetLocation(), kind, name, message)); } + if (deprecatedAttributeData != null) { var message = GetMessage(deprecatedAttributeData); context.ReportDiagnostic(Diagnostic.Create(s_deprecatedRule, invocation.GetLocation(), kind, name, message)); } + if (discordInExperimentAttributeData != null) { var message = GetMessage(discordInExperimentAttributeData); context.ReportDiagnostic(Diagnostic.Create(s_discordInExperimentRule, invocation.GetLocation(), kind, name, message)); } + if (discordDeprecatedAttributeData != null) { var message = GetMessage(discordDeprecatedAttributeData); context.ReportDiagnostic(Diagnostic.Create(s_discordDeprecatedRule, invocation.GetLocation(), kind, name, message)); } + if (discordUnreleasedAttributeData != null) { var message = GetMessage(discordUnreleasedAttributeData); context.ReportDiagnostic(Diagnostic.Create(s_discordUnreleasedRule, invocation.GetLocation(), kind, name, message)); } + if (requiresFeatureAttributeData != null) { var message = GetFeatureMessage(requiresFeatureAttributeData); context.ReportDiagnostic(Diagnostic.Create(s_requiresFeatureRule, invocation.GetLocation(), kind, name, message)); } + return; } @@ -129,14 +139,15 @@ private static void ExperimentalAnalyzer(SymbolAnalysisContext context) { Console.WriteLine("Handling " + context.Symbol.Kind.ToString()); var syntaxTrees = from x in context.Symbol.Locations - where x.IsInSource - select x.SourceTree; + where x.IsInSource + select x.SourceTree; var declaration = context.Symbol; if (null == declaration) { Console.WriteLine("Faulty"); return; } + var attributes = declaration.GetAttributes(); var name = declaration.Name; @@ -147,9 +158,8 @@ where x.IsInSource kind = "Constructor"; } else if (kind == "NamedType") - { kind = "Class"; - } + var model = context.Compilation.GetSemanticModel(syntaxTrees.First(), true); var experimentalAttributeData = attributes.FirstOrDefault(attr => IsRequiredAttribute(model, attr, typeof(ExperimentalAttribute))); @@ -164,35 +174,41 @@ where x.IsInSource var message = GetMessage(experimentalAttributeData); context.ReportDiagnostic(Diagnostic.Create(s_experimentalRule, context.Symbol.Locations.First(x => x.IsInSource), kind, name, message)); } + if (deprecatedAttributeData != null) { var message = GetMessage(deprecatedAttributeData); context.ReportDiagnostic(Diagnostic.Create(s_deprecatedRule, context.Symbol.Locations.First(x => x.IsInSource), kind, name, message)); } + if (discordInExperimentAttributeData != null) { var message = GetMessage(discordInExperimentAttributeData); context.ReportDiagnostic(Diagnostic.Create(s_discordInExperimentRule, context.Symbol.Locations.First(x => x.IsInSource), kind, name, message)); } + if (discordDeprecatedAttributeData != null) { var message = GetMessage(discordDeprecatedAttributeData); context.ReportDiagnostic(Diagnostic.Create(s_discordDeprecatedRule, context.Symbol.Locations.First(x => x.IsInSource), kind, name, message)); } + if (discordUnreleasedAttributeData != null) { var message = GetMessage(discordUnreleasedAttributeData); context.ReportDiagnostic(Diagnostic.Create(s_discordUnreleasedRule, context.Symbol.Locations.First(x => x.IsInSource), kind, name, message)); } + if (requiresFeatureAttributeData != null) { var message = GetFeatureMessage(requiresFeatureAttributeData); context.ReportDiagnostic(Diagnostic.Create(s_requiresFeatureRule, context.Symbol.Locations.First(x => x.IsInSource), kind, name, message)); } + return; } - static bool IsRequiredAttribute(SemanticModel semanticModel, AttributeData attribute, Type desiredAttributeType) + private static bool IsRequiredAttribute(SemanticModel semanticModel, AttributeData attribute, Type desiredAttributeType) { var desiredTypeNamedSymbol = semanticModel.Compilation.GetTypeByMetadataName(desiredAttributeType.FullName); @@ -200,10 +216,10 @@ static bool IsRequiredAttribute(SemanticModel semanticModel, AttributeData attri return result; } - static string GetMessage(AttributeData attribute) + private static string GetMessage(AttributeData attribute) => attribute.ConstructorArguments.Length < 1 ? "Do not use in production." : attribute.ConstructorArguments[0].Value as string; - static string GetFeatureMessage(AttributeData attribute) + private static string GetFeatureMessage(AttributeData attribute) { var featureReqEnum = (Features)attribute.ConstructorArguments[0].Value; var description = attribute.ConstructorArguments.Length > 1 @@ -237,7 +253,7 @@ static Helpers() public static string ToFeaturesString(this Features features) { var strs = FeaturesStrings - .Where(xkvp =>(features & xkvp.Key) == xkvp.Key) + .Where(xkvp => (features & xkvp.Key) == xkvp.Key) .Select(xkvp => xkvp.Value); return string.Join(", ", strs.OrderBy(xs => xs)); diff --git a/DisCatSharp.Tools/DisCatSharp.Analyzer/DisCatSharp.Analyzer/DisCatSharp.Analyzer.csproj b/DisCatSharp.Tools/DisCatSharp.Analyzer/DisCatSharp.Analyzer/DisCatSharp.Analyzer.csproj index 17a2bfde2..ce0b42513 100644 --- a/DisCatSharp.Tools/DisCatSharp.Analyzer/DisCatSharp.Analyzer/DisCatSharp.Analyzer.csproj +++ b/DisCatSharp.Tools/DisCatSharp.Analyzer/DisCatSharp.Analyzer/DisCatSharp.Analyzer.csproj @@ -38,7 +38,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - +