diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9fe6a4da..2b4dc296 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,7 +7,9 @@ on: push: branches: [ "main" ] pull_request: + branches: [ "*" ] paths: + - "**" - "!**.md" jobs: diff --git a/CodeGenerator/CodeGenerator.cs b/CodeGenerator/CodeGenerator.cs index b45be9da..4c9b2f07 100644 --- a/CodeGenerator/CodeGenerator.cs +++ b/CodeGenerator/CodeGenerator.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; +using Grpc.Core; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Plugin; @@ -12,7 +14,7 @@ namespace SqlcGenCsharp; -public class CodeGenerator +public class CodeGenerator: CodegenService.CodegenServiceBase { private static readonly char[] Separator = ['/']; @@ -23,35 +25,68 @@ public class CodeGenerator "NotAccessedPositionalProperty.Global" ]; - public CodeGenerator(GenerateRequest generateRequest) + private string? _namespaceName; + private Options? _options; + private DbDriver? _dbDriver; + private DataClassesGen? _dataClassesGen; + private RootGen? _rootGen; + private UtilsGen? _utilsGen; + private CsprojGen? _csprojGen; + + private void InitGenerators(GenerateRequest generateRequest) { - GenerateRequest = generateRequest; - Options = new Options(GenerateRequest); - NamespaceName = GenerateNamespace(GenerateRequest); + Options = new Options(generateRequest); + NamespaceName = GenerateNamespace(generateRequest); DbDriver = InstantiateDriver(); // initialize file generators - CsprojGen = new CsprojGen(GenerateRequest.Settings.Codegen.Out, Options); + CsprojGen = new CsprojGen(generateRequest.Settings.Codegen.Out, Options); RootGen = new RootGen(Options); UtilsGen = new UtilsGen(NamespaceName, Options); DataClassesGen = new DataClassesGen(DbDriver); } - private GenerateRequest GenerateRequest { get; } - - private string NamespaceName { get; } + private string NamespaceName + { + get => _namespaceName!; + set => _namespaceName = value; + } - private Options Options { get; } + private Options Options + { + get => _options!; + set => _options = value; + } - private DbDriver DbDriver { get; } + private DbDriver DbDriver + { + get => _dbDriver!; + set => _dbDriver = value; + } - private DataClassesGen DataClassesGen { get; } + private DataClassesGen DataClassesGen + { + get => _dataClassesGen!; + set => _dataClassesGen = value; + } - private RootGen RootGen { get; } + private RootGen RootGen + { + get => _rootGen!; + set => _rootGen = value; + } - private UtilsGen UtilsGen { get; } + private UtilsGen UtilsGen + { + get => _utilsGen!; + set => _utilsGen = value; + } - private CsprojGen CsprojGen { get; } + private CsprojGen CsprojGen + { + get => _csprojGen!; + set => _csprojGen = value; + } private DbDriver InstantiateDriver() { @@ -63,19 +98,20 @@ private DbDriver InstantiateDriver() }; } - public GenerateResponse Generate() + public override Task Generate(GenerateRequest generateRequest, ServerCallContext? context) { + InitGenerators(generateRequest); // the request is necessary in order to know which generators are needed var fileQueries = GetFileQueries(); var files = fileQueries - .Select(fq => GenerateFile(NamespaceName, fq.Value, fq.Key)) + .Select(fq => GenerateFile(fq.Value, fq.Key)) .Append(UtilsGen.GenerateFile()) .AppendIf(CsprojGen.GenerateFile(), Options.GenerateCsproj); - return new GenerateResponse { Files = { files } }; + return Task.FromResult(new GenerateResponse { Files = { files } }); Dictionary GetFileQueries() { - return GenerateRequest.Queries + return generateRequest.Queries .GroupBy(query => Options.FilePerQuery ? $"{query.Name}Query" @@ -100,11 +136,11 @@ private string GenerateNamespace(GenerateRequest generateRequest) return parts.Length > 0 ? parts[0] : "GeneratedNamespace"; } - private File GenerateFile(string namespaceName, IEnumerable queries, string className) + private File GenerateFile(IEnumerable queries, string className) { var (usingDirectives, classDeclaration) = GenerateClass(queries, className); var root = RootGen.CompilationRootGen( - IdentifierName(namespaceName), usingDirectives, classDeclaration); + IdentifierName(NamespaceName), usingDirectives, classDeclaration); root = AddResharperDisables(root); root = root.AddCommentOnTop(Consts.AutoGeneratedComment); diff --git a/SqlcGenCsharp/PluginRunner.cs b/SqlcGenCsharp/PluginRunner.cs index 1122a3b5..a12db96e 100644 --- a/SqlcGenCsharp/PluginRunner.cs +++ b/SqlcGenCsharp/PluginRunner.cs @@ -8,9 +8,9 @@ public static class PluginRunner public static void Run() { var generateRequest = ReadInput(); - var codeGenerator = new CodeGenerator(generateRequest); - var generateResponse = codeGenerator.Generate(); - WriteOutput(generateResponse); + var codeGenerator = new CodeGenerator(); + var generateResponse = codeGenerator.Generate(generateRequest, null); + WriteOutput(generateResponse.Result); } private static GenerateRequest ReadInput()