From 9ce5cc631f56f343912e6f238fdcc90c733cf474 Mon Sep 17 00:00:00 2001 From: Deadlocklogic Date: Fri, 15 Dec 2023 13:50:40 +0200 Subject: [PATCH] Registrable: generify the API + improvements --- .../Registrable/Lua/Sol/LuaSolGenerator.cs | 24 ++++++------- .../Lua/Sol/LuaSolGeneratorOptions.cs | 2 +- .../Registrable/Lua/Sol/LuaSolHeaders.cs | 15 ++------ .../Registrable/Lua/Sol/LuaSolSources.cs | 24 ++++++------- .../Registrable/RegistrableCodeGenerator.cs | 16 +++++++++ .../Registrable/RegistrableGenerator.cs | 34 +++++++++++++++++++ .../RegistrableGeneratorOptions.cs | 7 ++-- .../Registrable/RegistrableHeaders.cs | 13 +++++++ .../Registrable/RegistrableNamingStrategy.cs | 12 +++++++ .../Registrable/RegistrableSources.cs | 13 +++++++ 10 files changed, 116 insertions(+), 44 deletions(-) create mode 100644 src/Generator/Generators/Registrable/RegistrableCodeGenerator.cs create mode 100644 src/Generator/Generators/Registrable/RegistrableGenerator.cs create mode 100644 src/Generator/Generators/Registrable/RegistrableHeaders.cs create mode 100644 src/Generator/Generators/Registrable/RegistrableSources.cs diff --git a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGenerator.cs b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGenerator.cs index 596a4c4b..ff55e533 100644 --- a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGenerator.cs +++ b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGenerator.cs @@ -3,32 +3,28 @@ using System.Collections.Generic; namespace CppSharp.Generators.Registrable.Lua.Sol { - public class LuaSolGenerator : Generator + public class LuaSolGenerator : RegistrableGenerator { public const string Id = "Lua::Sol"; public static readonly GeneratorKind Kind = new(Id, "lua::sol", typeof(LuaSolGenerator), typeof(LuaSolTypePrinter), new[] { "lua::sol" }); - public LuaSolGeneratorOptions GeneratorOptions + public LuaSolGenerator(BindingContext context) : base(context) { - get; } - public LuaSolGenerator(BindingContext context) : base(context) + protected override LuaSolGeneratorOptions CreateOptions(RegistrableGenerator generator) { - GeneratorOptions = new LuaSolGeneratorOptions(this); + return new LuaSolGeneratorOptions(this); } - public override List Generate(IEnumerable units) + protected override LuaSolHeaders CreateHeader(RegistrableGenerator generator, IEnumerable units) { - var outputs = new List(); - - var header = new LuaSolHeaders(this, units); - outputs.Add(header); - - var source = new LuaSolSources(this, units); - outputs.Add(source); + return new LuaSolHeaders(this, units); + } - return outputs; + protected override LuaSolSources CreateSource(RegistrableGenerator generator, IEnumerable units) + { + return new LuaSolSources(this, units); } public override bool SetupPasses() => true; diff --git a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGeneratorOptions.cs b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGeneratorOptions.cs index 5eb17f8c..1948b7d1 100644 --- a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGeneratorOptions.cs +++ b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGeneratorOptions.cs @@ -1,6 +1,6 @@ namespace CppSharp.Generators.Registrable.Lua.Sol { - public class LuaSolGeneratorOptions : RegistrableGeneratorOptions + public class LuaSolGeneratorOptions : RegistrableGeneratorOptions { public LuaSolNamingStrategy NamingStrategy; diff --git a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs index 971a6fd5..2c648652 100644 --- a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs +++ b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs @@ -27,22 +27,11 @@ namespace CppSharp.Generators.Registrable.Lua.Sol #region TranslationUnit - public override void GenerateTranslationUnitNamespaceBegin(TranslationUnit translationUnit) - { - PushBlock(BlockKind.Namespace); - WriteLine($"namespace {TranslationUnit.Module.OutputNamespace} {{"); - } - - public override void GenerateTranslationUnitNamespaceEnd(TranslationUnit translationUnit) - { - WriteLine($"}} // namespace {TranslationUnit.Module.OutputNamespace}"); - PopBlock(); - } - public virtual void GenerateTranslationUnitRegistrationFunctionDeclaration(TranslationUnit translationUnit) { NewLine(); - WriteLine(GetTranslationUnitRegistrationFunctionSignature(translationUnit)); + GenerateTranslationUnitRegistrationFunctionSignature(translationUnit); + WriteLine(";"); NewLine(); } diff --git a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs index 03f965e7..1e8691d0 100644 --- a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs +++ b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs @@ -6,16 +6,14 @@ using System.Text; namespace CppSharp.Generators.Registrable.Lua.Sol { - public class LuaSolSources : CodeGenerator + public class LuaSolSources : RegistrableSources { - protected LuaSolGenerator Generator { get; } protected LuaSolGenerationContext GenerationContext { get; } protected LuaSolNamingStrategy NamingStrategy => Generator.GeneratorOptions.NamingStrategy; public LuaSolSources(LuaSolGenerator generator, IEnumerable units) - : base(generator.Context, units) + : base(generator, units) { - Generator = generator; GenerationContext = new LuaSolGenerationContext(); } @@ -72,13 +70,12 @@ namespace CppSharp.Generators.Registrable.Lua.Sol #region TranslationUnit - public virtual string GetTranslationUnitRegistrationFunctionSignature(TranslationUnit translationUnit) + public virtual void GenerateTranslationUnitRegistrationFunctionSignature(TranslationUnit translationUnit) { - StringBuilder builder = new StringBuilder(); - builder.Append("void "); - builder.Append(Generator.GeneratorOptions.NamingStrategy.GetRegistrationFunctionName(translationUnit)); - builder.Append("(::sol::state_view& state) {"); - return builder.ToString(); + var generatorOptions = Generator.GeneratorOptions; + Write("void "); + Write(generatorOptions.NamingStrategy.GetRegistrationFunctionName(translationUnit)); + Write($"({generatorOptions.RootContextType} {generatorOptions.RootContextName})"); } public virtual void GenerateTranslationUnitNamespaceBegin(TranslationUnit translationUnit) @@ -97,7 +94,8 @@ namespace CppSharp.Generators.Registrable.Lua.Sol { PushBlock(BlockKind.Function); NewLine(); - WriteLine(GetTranslationUnitRegistrationFunctionSignature(translationUnit)); + GenerateTranslationUnitRegistrationFunctionSignature(translationUnit); + WriteLine(" {"); Indent(); } @@ -1194,7 +1192,7 @@ namespace CppSharp.Generators.Registrable.Lua.Sol Write("static_cast<"); Write(method.ReturnType.Visit(new CppTypePrinter(Context))); Write("("); - Write("*)"); + Write($"{NamingStrategy.GetMembershipScopeName(method, GenerationContext)}*)"); Write("("); var needsComma = false; foreach (var parameter in method.Parameters) @@ -1259,7 +1257,7 @@ namespace CppSharp.Generators.Registrable.Lua.Sol string typedefBindingContext = NamingStrategy.GetBindingContext(typedef, GenerationContext); string typedefRootContextName = NamingStrategy.GetRootContextName(GenerationContext); - WriteLine($"global{typedefRegistrationFunctionName}{{}}({typedefRootContextName}, {typedefBindingContext}, {typedefNameQuoted}); /* directly */"); + WriteLine($"//TODO: global{typedefRegistrationFunctionName}{{}}({typedefRootContextName}, {typedefBindingContext}, {typedefNameQuoted}); /* directly */"); } } diff --git a/src/Generator/Generators/Registrable/RegistrableCodeGenerator.cs b/src/Generator/Generators/Registrable/RegistrableCodeGenerator.cs new file mode 100644 index 00000000..b537d9fe --- /dev/null +++ b/src/Generator/Generators/Registrable/RegistrableCodeGenerator.cs @@ -0,0 +1,16 @@ +using CppSharp.AST; +using System.Collections.Generic; + +namespace CppSharp.Generators.Registrable +{ + public abstract class RegistrableCodeGenerator : CodeGenerator + where TGenerator : Generator + { + public TGenerator Generator { get; set; } + + public RegistrableCodeGenerator(TGenerator generator, IEnumerable units) : base(generator.Context, units) + { + Generator = generator; + } + } +} diff --git a/src/Generator/Generators/Registrable/RegistrableGenerator.cs b/src/Generator/Generators/Registrable/RegistrableGenerator.cs new file mode 100644 index 00000000..670e111c --- /dev/null +++ b/src/Generator/Generators/Registrable/RegistrableGenerator.cs @@ -0,0 +1,34 @@ +using CppSharp.AST; +using System.Collections.Generic; + +namespace CppSharp.Generators.Registrable +{ + public abstract class RegistrableGenerator : Generator + where THeader : CodeGenerator + where TSource : CodeGenerator + { + public TOptions GeneratorOptions { get; } + + public RegistrableGenerator(BindingContext context) : base(context) + { + GeneratorOptions = CreateOptions(this); + } + + protected abstract TOptions CreateOptions(RegistrableGenerator generator); + + protected abstract THeader CreateHeader(RegistrableGenerator generator, IEnumerable units); + + protected abstract TSource CreateSource(RegistrableGenerator generator, IEnumerable units); + + public override List Generate(IEnumerable units) + { + return new List + { + CreateHeader(this, units), + CreateSource(this, units) + }; + } + + public override bool SetupPasses() => true; + } +} diff --git a/src/Generator/Generators/Registrable/RegistrableGeneratorOptions.cs b/src/Generator/Generators/Registrable/RegistrableGeneratorOptions.cs index 597b1fa0..04dfb892 100644 --- a/src/Generator/Generators/Registrable/RegistrableGeneratorOptions.cs +++ b/src/Generator/Generators/Registrable/RegistrableGeneratorOptions.cs @@ -9,11 +9,12 @@ namespace CppSharp.Generators.Registrable Import } - public abstract class RegistrableGeneratorOptions + public abstract class RegistrableGeneratorOptions + where TGenerator : Generator { public delegate string Delegate(string name); - protected Generator Generator; + public TGenerator Generator { get; set; } public virtual string OutputSubDir { get; } public virtual string RootContextType { get; } @@ -59,7 +60,7 @@ namespace CppSharp.Generators.Registrable public virtual string DefaultStaticCastFunctionTemplateFullyQualifiedName => null; public virtual string DefaultDynamicCastFunctionTemplateFullyQualifiedName => null; - public RegistrableGeneratorOptions(Generator generator) + public RegistrableGeneratorOptions(TGenerator generator) { Generator = generator; OutputSubDir = DefaultOutputSubdir; diff --git a/src/Generator/Generators/Registrable/RegistrableHeaders.cs b/src/Generator/Generators/Registrable/RegistrableHeaders.cs new file mode 100644 index 00000000..7ee159fb --- /dev/null +++ b/src/Generator/Generators/Registrable/RegistrableHeaders.cs @@ -0,0 +1,13 @@ +using CppSharp.AST; +using System.Collections.Generic; + +namespace CppSharp.Generators.Registrable +{ + public abstract class RegistrableHeaders : RegistrableCodeGenerator + where TGenerator : Generator + { + public RegistrableHeaders(TGenerator generator, IEnumerable units) : base(generator, units) + { + } + } +} diff --git a/src/Generator/Generators/Registrable/RegistrableNamingStrategy.cs b/src/Generator/Generators/Registrable/RegistrableNamingStrategy.cs index b23e4654..037fea4e 100644 --- a/src/Generator/Generators/Registrable/RegistrableNamingStrategy.cs +++ b/src/Generator/Generators/Registrable/RegistrableNamingStrategy.cs @@ -397,5 +397,17 @@ namespace CppSharp.Generators.Registrable } return GetFullyQualifiedName(entity.OriginalNamespace, option); } + + public virtual string GetMembershipScopeName(Function function, RegistrableGeneratorContext context) + { + if (function is Method method) + { + return GetCppContext(method, context, new FQNOption() + { + IgnoreTemplateTypenameKeyword = true + }) + "::"; + } + return ""; + } } } diff --git a/src/Generator/Generators/Registrable/RegistrableSources.cs b/src/Generator/Generators/Registrable/RegistrableSources.cs new file mode 100644 index 00000000..31c2811c --- /dev/null +++ b/src/Generator/Generators/Registrable/RegistrableSources.cs @@ -0,0 +1,13 @@ +using CppSharp.AST; +using System.Collections.Generic; + +namespace CppSharp.Generators.Registrable +{ + public abstract class RegistrableSources : RegistrableCodeGenerator + where TGenerator : Generator + { + public RegistrableSources(TGenerator generator, IEnumerable units) : base(generator, units) + { + } + } +}