Browse Source

Registrable: generify the API + improvements

pull/1808/head
Deadlocklogic 2 years ago
parent
commit
9ce5cc631f
  1. 24
      src/Generator/Generators/Registrable/Lua/Sol/LuaSolGenerator.cs
  2. 2
      src/Generator/Generators/Registrable/Lua/Sol/LuaSolGeneratorOptions.cs
  3. 15
      src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs
  4. 24
      src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs
  5. 16
      src/Generator/Generators/Registrable/RegistrableCodeGenerator.cs
  6. 34
      src/Generator/Generators/Registrable/RegistrableGenerator.cs
  7. 7
      src/Generator/Generators/Registrable/RegistrableGeneratorOptions.cs
  8. 13
      src/Generator/Generators/Registrable/RegistrableHeaders.cs
  9. 12
      src/Generator/Generators/Registrable/RegistrableNamingStrategy.cs
  10. 13
      src/Generator/Generators/Registrable/RegistrableSources.cs

24
src/Generator/Generators/Registrable/Lua/Sol/LuaSolGenerator.cs

@ -3,32 +3,28 @@ using System.Collections.Generic; @@ -3,32 +3,28 @@ using System.Collections.Generic;
namespace CppSharp.Generators.Registrable.Lua.Sol
{
public class LuaSolGenerator : Generator
public class LuaSolGenerator : RegistrableGenerator<LuaSolGeneratorOptions, LuaSolHeaders, LuaSolSources>
{
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<LuaSolGeneratorOptions, LuaSolHeaders, LuaSolSources> generator)
{
GeneratorOptions = new LuaSolGeneratorOptions(this);
return new LuaSolGeneratorOptions(this);
}
public override List<CodeGenerator> Generate(IEnumerable<TranslationUnit> units)
protected override LuaSolHeaders CreateHeader(RegistrableGenerator<LuaSolGeneratorOptions, LuaSolHeaders, LuaSolSources> generator, IEnumerable<TranslationUnit> units)
{
var outputs = new List<CodeGenerator>();
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<LuaSolGeneratorOptions, LuaSolHeaders, LuaSolSources> generator, IEnumerable<TranslationUnit> units)
{
return new LuaSolSources(this, units);
}
public override bool SetupPasses() => true;

2
src/Generator/Generators/Registrable/Lua/Sol/LuaSolGeneratorOptions.cs

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
namespace CppSharp.Generators.Registrable.Lua.Sol
{
public class LuaSolGeneratorOptions : RegistrableGeneratorOptions
public class LuaSolGeneratorOptions : RegistrableGeneratorOptions<LuaSolGenerator>
{
public LuaSolNamingStrategy NamingStrategy;

15
src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs

@ -27,22 +27,11 @@ namespace CppSharp.Generators.Registrable.Lua.Sol @@ -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();
}

24
src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs

@ -6,16 +6,14 @@ using System.Text; @@ -6,16 +6,14 @@ using System.Text;
namespace CppSharp.Generators.Registrable.Lua.Sol
{
public class LuaSolSources : CodeGenerator
public class LuaSolSources : RegistrableSources<LuaSolGenerator>
{
protected LuaSolGenerator Generator { get; }
protected LuaSolGenerationContext GenerationContext { get; }
protected LuaSolNamingStrategy NamingStrategy => Generator.GeneratorOptions.NamingStrategy;
public LuaSolSources(LuaSolGenerator generator, IEnumerable<TranslationUnit> units)
: base(generator.Context, units)
: base(generator, units)
{
Generator = generator;
GenerationContext = new LuaSolGenerationContext();
}
@ -72,13 +70,12 @@ namespace CppSharp.Generators.Registrable.Lua.Sol @@ -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 @@ -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 @@ -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 @@ -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 */");
}
}

16
src/Generator/Generators/Registrable/RegistrableCodeGenerator.cs

@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
using CppSharp.AST;
using System.Collections.Generic;
namespace CppSharp.Generators.Registrable
{
public abstract class RegistrableCodeGenerator<TGenerator> : CodeGenerator
where TGenerator : Generator
{
public TGenerator Generator { get; set; }
public RegistrableCodeGenerator(TGenerator generator, IEnumerable<TranslationUnit> units) : base(generator.Context, units)
{
Generator = generator;
}
}
}

34
src/Generator/Generators/Registrable/RegistrableGenerator.cs

@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
using CppSharp.AST;
using System.Collections.Generic;
namespace CppSharp.Generators.Registrable
{
public abstract class RegistrableGenerator<TOptions, THeader, TSource> : 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<TOptions, THeader, TSource> generator);
protected abstract THeader CreateHeader(RegistrableGenerator<TOptions, THeader, TSource> generator, IEnumerable<TranslationUnit> units);
protected abstract TSource CreateSource(RegistrableGenerator<TOptions, THeader, TSource> generator, IEnumerable<TranslationUnit> units);
public override List<CodeGenerator> Generate(IEnumerable<TranslationUnit> units)
{
return new List<CodeGenerator>
{
CreateHeader(this, units),
CreateSource(this, units)
};
}
public override bool SetupPasses() => true;
}
}

7
src/Generator/Generators/Registrable/RegistrableGeneratorOptions.cs

@ -9,11 +9,12 @@ namespace CppSharp.Generators.Registrable @@ -9,11 +9,12 @@ namespace CppSharp.Generators.Registrable
Import
}
public abstract class RegistrableGeneratorOptions
public abstract class RegistrableGeneratorOptions<TGenerator>
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 @@ -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;

13
src/Generator/Generators/Registrable/RegistrableHeaders.cs

@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
using CppSharp.AST;
using System.Collections.Generic;
namespace CppSharp.Generators.Registrable
{
public abstract class RegistrableHeaders<TGenerator> : RegistrableCodeGenerator<TGenerator>
where TGenerator : Generator
{
public RegistrableHeaders(TGenerator generator, IEnumerable<TranslationUnit> units) : base(generator, units)
{
}
}
}

12
src/Generator/Generators/Registrable/RegistrableNamingStrategy.cs

@ -397,5 +397,17 @@ namespace CppSharp.Generators.Registrable @@ -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 "";
}
}
}

13
src/Generator/Generators/Registrable/RegistrableSources.cs

@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
using CppSharp.AST;
using System.Collections.Generic;
namespace CppSharp.Generators.Registrable
{
public abstract class RegistrableSources<TGenerator> : RegistrableCodeGenerator<TGenerator>
where TGenerator : Generator
{
public RegistrableSources(TGenerator generator, IEnumerable<TranslationUnit> units) : base(generator, units)
{
}
}
}
Loading…
Cancel
Save