From 337cd622b53cf2f6937b2f70382fd1312564f68e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20D=C3=BAi=20Bolinder?= Date: Tue, 11 Jan 2022 11:10:16 +0100 Subject: [PATCH] Using MikaelDui.CodeAnalysis.CSharp.Extensions & added package retention policy (#21) * Create github-package-retention.yml * Stop spamming NuGet.org * Keep spamming NuGet.org No where close to 350 packages/hour. * Now using MikaelDui.CodeAnalysis.CSharp.Extensions * Update github-package-retention.yml --- .../workflows/github-package-retention.yml | 9 +++ .../CodeAnalysisHelpers.cs | 36 ++++----- .../Extensions/CodeAnalysisExtensions.cs | 75 ++----------------- .../RiotGames.Client.CodeGeneration.csproj | 1 + 4 files changed, 32 insertions(+), 89 deletions(-) create mode 100644 .github/workflows/github-package-retention.yml diff --git a/.github/workflows/github-package-retention.yml b/.github/workflows/github-package-retention.yml new file mode 100644 index 0000000..2d844f1 --- /dev/null +++ b/.github/workflows/github-package-retention.yml @@ -0,0 +1,9 @@ +name: GitHub Packages Retention +on: + schedule: + # * is a special character in YAML so you have to quote this string + - cron: '30 5,17 * * *' +jobs: + retention: + name: "Package Retention" + uses: mikaeldui/actions/.github/workflows/github-packages-retention.yml@main diff --git a/RiotGames.Client.CodeGeneration/CodeAnalysisHelpers.cs b/RiotGames.Client.CodeGeneration/CodeAnalysisHelpers.cs index b689ce3..656710b 100644 --- a/RiotGames.Client.CodeGeneration/CodeAnalysisHelpers.cs +++ b/RiotGames.Client.CodeGeneration/CodeAnalysisHelpers.cs @@ -20,13 +20,13 @@ internal static class CodeAnalysisHelper SF.NamespaceDeclaration(ParseName(string.Join('.', @namespace))).NormalizeWhitespace(); public static ClassDeclarationSyntax PublicClassDeclaration(string identifier) => - ClassDeclaration(identifier).AddModifiers(Token(SyntaxKind.PublicKeyword)); + ClassDeclaration(identifier).WithModifier(SyntaxKind.PublicKeyword); public static ClassDeclarationSyntax PublicPartialClassDeclaration(string identifier) => - ClassDeclaration(identifier).AddModifiers(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.PartialKeyword)); + ClassDeclaration(identifier).WithModifiers(SyntaxKind.PublicKeyword, SyntaxKind.PartialKeyword); public static ClassDeclarationSyntax PublicClassDeclarationWithBaseType(string identifier, string baseTypeName) => - PublicClassDeclaration(identifier).AddBaseType(baseTypeName); + PublicClassDeclaration(identifier).WithBaseType(baseTypeName); public static ConstructorDeclarationSyntax ConstructorDeclaration(string identifier, string parameterType, string parameterIdentifier) => SF.ConstructorDeclaration(identifier).WithParameter(parameterType, parameterIdentifier); @@ -36,12 +36,11 @@ internal static class CodeAnalysisHelper public static ConstructorDeclarationSyntax InternalConstructorDeclaration(string identifier, string parameterType, string parameterIdentifier, string fieldIdentifier, string? parameterProperty = null) => ConstructorDeclaration(identifier, parameterType, parameterIdentifier) - .WithBody($"{fieldIdentifier} = {parameterIdentifier + (parameterProperty == null ? null : '.' + parameterProperty)};") - .AddModifiers(Token(SyntaxKind.InternalKeyword)); + .WithModifier(SyntaxKind.InternalKeyword) + .WithBody($"{fieldIdentifier} = {parameterIdentifier + (parameterProperty == null ? null : '.' + parameterProperty)};"); public static EnumDeclarationSyntax PublicEnumDeclaration(string identifier, params string[] members) => - EnumDeclaration(Identifier(identifier)) - .AddModifiers(Token(SyntaxKind.PublicKeyword)) + EnumDeclaration(Identifier(identifier)).WithModifiers(SyntaxKind.PublicKeyword.ToTokenList()) .AddMembers(members.Select(m => EnumMemberDeclaration(Identifier(m))).ToArray()); public static AttributeSyntax Attribute(string identifier) => @@ -58,42 +57,37 @@ internal static class CodeAnalysisHelper )); public static FieldDeclarationSyntax PrivateFieldDeclaration(string typeName, string identifier) => - FieldDeclaration(typeName, identifier.StartWith("_")).AddModifier(SyntaxKind.PrivateKeyword); + FieldDeclaration(typeName, identifier.StartWith("_")).WithModifier(SyntaxKind.PrivateKeyword); public static FieldDeclarationSyntax PrivateReadOnlyFieldDeclaration(string typeName, string identifier) => PrivateFieldDeclaration(typeName, identifier).AddModifier(SyntaxKind.ReadOnlyKeyword); public static FieldDeclarationSyntax InternalFieldDeclaration(string typeName, string identifier) => - FieldDeclaration(typeName, identifier).AddModifier(SyntaxKind.InternalKeyword); + FieldDeclaration(typeName, identifier).WithModifier(SyntaxKind.InternalKeyword); public static FieldDeclarationSyntax InternalReadOnlyFieldDeclaration(string typeName, string identifier) => InternalFieldDeclaration(typeName, identifier).AddModifier(SyntaxKind.ReadOnlyKeyword); public static PropertyDeclarationSyntax PublicPropertyDeclaration(string typeName, string identifier) => PropertyDeclaration(ParseTypeName(typeName), identifier) - .AddModifiers(Token(SyntaxKind.PublicKeyword)) + .WithModifier(SyntaxKind.PublicKeyword) .AddAccessorListAccessors( AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(Token(SyntaxKind.SemicolonToken)), AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(Token(SyntaxKind.SemicolonToken))); public static PropertyDeclarationSyntax FieldBackedPublicReadOnlyPropertyDeclaration(string typeName, string identifier, string fieldIdentifier, string? typeConstructorArgument = null) => PropertyDeclaration(ParseTypeName(typeName), Identifier(identifier)) - .AddModifiers(Token(SyntaxKind.PublicKeyword)) - .AddAccessorListAccessors( - AccessorDeclaration( - SyntaxKind.GetAccessorDeclaration, - Block(ParseStatement($"if ({fieldIdentifier} == null)\n{fieldIdentifier} = new {typeName}({typeConstructorArgument});\n\nreturn {fieldIdentifier};")))); + .WithModifier(SyntaxKind.PublicKeyword) + .WithAccessor(SyntaxKind.GetAccessorDeclaration, $"if ({fieldIdentifier} == null)\n{fieldIdentifier} = new {typeName}({typeConstructorArgument});\n\nreturn {fieldIdentifier};"); public static MethodDeclarationSyntax PublicAsyncTaskDeclaration(string returnType, string methodName, StatementSyntax bodyStatement, Dictionary? parameters = null) { - var methodDeclaration = MethodDeclaration( - ParseTypeName("Task" + TypeArgumentStatement(returnType)), - methodName.EndWith("Async")) - .AddModifiers(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.AsyncKeyword)) - .WithBody(Block(bodyStatement)); + var methodDeclaration = MethodDeclaration(ParseTypeName("Task" + TypeArgumentStatement(returnType)), methodName.EndWith("Async")) + .WithModifiers(SyntaxKind.PublicKeyword, SyntaxKind.AsyncKeyword) + .WithBody(bodyStatement.ToBlock()); if (parameters != null) - methodDeclaration = methodDeclaration.AddParameterListParameters(parameters.ToParameters()); + methodDeclaration = methodDeclaration.AddParameterListParameters(parameters.ToParameters().ToArray()); return methodDeclaration; } diff --git a/RiotGames.Client.CodeGeneration/Extensions/CodeAnalysisExtensions.cs b/RiotGames.Client.CodeGeneration/Extensions/CodeAnalysisExtensions.cs index 5b2bcf6..d3759ee 100644 --- a/RiotGames.Client.CodeGeneration/Extensions/CodeAnalysisExtensions.cs +++ b/RiotGames.Client.CodeGeneration/Extensions/CodeAnalysisExtensions.cs @@ -7,89 +7,28 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; -using static RiotGames.Client.CodeGeneration.CodeAnalysisHelper; - namespace RiotGames.Client.CodeGeneration { - using SF = SyntaxFactory; + using static SyntaxFactory; + using static CodeAnalysisHelper; + [DebuggerStepThrough] internal static class CodeAnalysisExtensions { - #region Namespace - - public static NamespaceDeclarationSyntax AddUsing(this NamespaceDeclarationSyntax @namespace, string usingNamespace) => - @namespace.AddUsings(SF.UsingDirective(SF.ParseName(usingNamespace))); - public static NamespaceDeclarationSyntax AddSystemTextJsonSerializationUsing(this NamespaceDeclarationSyntax @namespace) => @namespace.AddUsing("System.Text.Json.Serialization"); public static NamespaceDeclarationSyntax AddSystemDynamicUsing(this NamespaceDeclarationSyntax @namespace) => @namespace.AddUsing("System.Dynamic"); - #endregion Namespace - - #region Class - public static ClassDeclarationSyntax AddPublicAsyncTask(this ClassDeclarationSyntax classDeclaration, string returnType, string methodIdentifier, StatementSyntax bodyStatement, Dictionary? parameters = null) => - classDeclaration.AddMembers(PublicAsyncTaskDeclaration(returnType, methodIdentifier, bodyStatement, parameters)); - - public static ClassDeclarationSyntax AddBaseType(this ClassDeclarationSyntax classDeclaration, string baseTypeName) => - classDeclaration.AddBaseListTypes(SF.SimpleBaseType(SF.ParseTypeName(baseTypeName))); - - #endregion Class - - #region Constructor - - public static ConstructorDeclarationSyntax WithParameter(this ConstructorDeclarationSyntax constructor, string parameterType, string parameterIdentifier) => - constructor.AddParameterListParameters(Parameter(parameterType, parameterIdentifier)); - - public static ConstructorDeclarationSyntax WithBody(this ConstructorDeclarationSyntax constructor, string bodyStatement) => - constructor.WithBody(SF.Block(SF.ParseStatement(bodyStatement))); - - public static ConstructorDeclarationSyntax WithBaseConstructorInitializer(this ConstructorDeclarationSyntax constructor, params string[] argumentIdentifiers) => - constructor.WithInitializer(SF.ConstructorInitializer(SyntaxKind.BaseConstructorInitializer) - .AddArgumentListArguments(argumentIdentifiers.Select(ai => SF.Argument(SF.IdentifierName(ai))).ToArray())); - - public static ConstructorDeclarationSyntax WithModifier(this ConstructorDeclarationSyntax constructor, SyntaxKind modifier) => - constructor.AddModifiers(Token(modifier)); - - #endregion Constructor - - #region Enum - public static EnumDeclarationSyntax AddJsonStringEnumAttribute(this EnumDeclarationSyntax @enum) => - @enum.AddAttribute(Attribute("JsonStringEnum")); - - #endregion Enum - - #region Attribute - - public static T AddAttribute(this T member, AttributeSyntax attribute) where T : MemberDeclarationSyntax => - (T)member.AddAttributeLists(SF.AttributeList(SF.SingletonSeparatedList(attribute))); - - #endregion Attribute - - #region Property + @enum.AddAttribute("JsonStringEnum"); public static PropertyDeclarationSyntax AddJsonPropertyNameAttribute(this PropertyDeclarationSyntax property, string name) => - property.AddAttribute(Attribute("JsonPropertyName", name)); - - #endregion Property - - #region Field - - public static FieldDeclarationSyntax AddModifier(this FieldDeclarationSyntax fieldDeclaration, SyntaxKind modifier) => - fieldDeclaration.AddModifiers(SF.Token(modifier)); - - #endregion Field - - #region Parameter - - public static ParameterSyntax[] ToParameters(this IEnumerable> parameters) => - parameters.Select(p => Parameter(p.Value, p.Key)).ToArray(); - - #endregion Parameter + property.AddAttribute("JsonPropertyName", name); + public static ClassDeclarationSyntax AddPublicAsyncTask(this ClassDeclarationSyntax @class, string returnType, string methodIdentifier, StatementSyntax bodyStatement, Dictionary? parameters = null) => + @class.AddMembers(PublicAsyncTaskDeclaration(returnType, methodIdentifier, bodyStatement, parameters)); } } diff --git a/RiotGames.Client.CodeGeneration/RiotGames.Client.CodeGeneration.csproj b/RiotGames.Client.CodeGeneration/RiotGames.Client.CodeGeneration.csproj index c217b98..a031f2e 100644 --- a/RiotGames.Client.CodeGeneration/RiotGames.Client.CodeGeneration.csproj +++ b/RiotGames.Client.CodeGeneration/RiotGames.Client.CodeGeneration.csproj @@ -12,6 +12,7 @@ +