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;
namespace CppSharp.Generators.Registrable.Lua.Sol namespace CppSharp.Generators.Registrable.Lua.Sol
{ {
public class LuaSolGenerator : Generator public class LuaSolGenerator : RegistrableGenerator<LuaSolGeneratorOptions, LuaSolHeaders, LuaSolSources>
{ {
public const string Id = "Lua::Sol"; public const string Id = "Lua::Sol";
public static readonly GeneratorKind Kind = new(Id, "lua::sol", typeof(LuaSolGenerator), typeof(LuaSolTypePrinter), new[] { "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>(); return new LuaSolHeaders(this, units);
}
var header = new LuaSolHeaders(this, units);
outputs.Add(header);
var source = new LuaSolSources(this, units);
outputs.Add(source);
return outputs; protected override LuaSolSources CreateSource(RegistrableGenerator<LuaSolGeneratorOptions, LuaSolHeaders, LuaSolSources> generator, IEnumerable<TranslationUnit> units)
{
return new LuaSolSources(this, units);
} }
public override bool SetupPasses() => true; public override bool SetupPasses() => true;

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

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

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

@ -27,22 +27,11 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
#region TranslationUnit #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) public virtual void GenerateTranslationUnitRegistrationFunctionDeclaration(TranslationUnit translationUnit)
{ {
NewLine(); NewLine();
WriteLine(GetTranslationUnitRegistrationFunctionSignature(translationUnit)); GenerateTranslationUnitRegistrationFunctionSignature(translationUnit);
WriteLine(";");
NewLine(); NewLine();
} }

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

@ -6,16 +6,14 @@ using System.Text;
namespace CppSharp.Generators.Registrable.Lua.Sol namespace CppSharp.Generators.Registrable.Lua.Sol
{ {
public class LuaSolSources : CodeGenerator public class LuaSolSources : RegistrableSources<LuaSolGenerator>
{ {
protected LuaSolGenerator Generator { get; }
protected LuaSolGenerationContext GenerationContext { get; } protected LuaSolGenerationContext GenerationContext { get; }
protected LuaSolNamingStrategy NamingStrategy => Generator.GeneratorOptions.NamingStrategy; protected LuaSolNamingStrategy NamingStrategy => Generator.GeneratorOptions.NamingStrategy;
public LuaSolSources(LuaSolGenerator generator, IEnumerable<TranslationUnit> units) public LuaSolSources(LuaSolGenerator generator, IEnumerable<TranslationUnit> units)
: base(generator.Context, units) : base(generator, units)
{ {
Generator = generator;
GenerationContext = new LuaSolGenerationContext(); GenerationContext = new LuaSolGenerationContext();
} }
@ -72,13 +70,12 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
#region TranslationUnit #region TranslationUnit
public virtual string GetTranslationUnitRegistrationFunctionSignature(TranslationUnit translationUnit) public virtual void GenerateTranslationUnitRegistrationFunctionSignature(TranslationUnit translationUnit)
{ {
StringBuilder builder = new StringBuilder(); var generatorOptions = Generator.GeneratorOptions;
builder.Append("void "); Write("void ");
builder.Append(Generator.GeneratorOptions.NamingStrategy.GetRegistrationFunctionName(translationUnit)); Write(generatorOptions.NamingStrategy.GetRegistrationFunctionName(translationUnit));
builder.Append("(::sol::state_view& state) {"); Write($"({generatorOptions.RootContextType} {generatorOptions.RootContextName})");
return builder.ToString();
} }
public virtual void GenerateTranslationUnitNamespaceBegin(TranslationUnit translationUnit) public virtual void GenerateTranslationUnitNamespaceBegin(TranslationUnit translationUnit)
@ -97,7 +94,8 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
{ {
PushBlock(BlockKind.Function); PushBlock(BlockKind.Function);
NewLine(); NewLine();
WriteLine(GetTranslationUnitRegistrationFunctionSignature(translationUnit)); GenerateTranslationUnitRegistrationFunctionSignature(translationUnit);
WriteLine(" {");
Indent(); Indent();
} }
@ -1194,7 +1192,7 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
Write("static_cast<"); Write("static_cast<");
Write(method.ReturnType.Visit(new CppTypePrinter(Context))); Write(method.ReturnType.Visit(new CppTypePrinter(Context)));
Write("("); Write("(");
Write("*)"); Write($"{NamingStrategy.GetMembershipScopeName(method, GenerationContext)}*)");
Write("("); Write("(");
var needsComma = false; var needsComma = false;
foreach (var parameter in method.Parameters) foreach (var parameter in method.Parameters)
@ -1259,7 +1257,7 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
string typedefBindingContext = NamingStrategy.GetBindingContext(typedef, GenerationContext); string typedefBindingContext = NamingStrategy.GetBindingContext(typedef, GenerationContext);
string typedefRootContextName = NamingStrategy.GetRootContextName(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 @@
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 @@
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
Import Import
} }
public abstract class RegistrableGeneratorOptions public abstract class RegistrableGeneratorOptions<TGenerator>
where TGenerator : Generator
{ {
public delegate string Delegate(string name); public delegate string Delegate(string name);
protected Generator Generator; public TGenerator Generator { get; set; }
public virtual string OutputSubDir { get; } public virtual string OutputSubDir { get; }
public virtual string RootContextType { get; } public virtual string RootContextType { get; }
@ -59,7 +60,7 @@ namespace CppSharp.Generators.Registrable
public virtual string DefaultStaticCastFunctionTemplateFullyQualifiedName => null; public virtual string DefaultStaticCastFunctionTemplateFullyQualifiedName => null;
public virtual string DefaultDynamicCastFunctionTemplateFullyQualifiedName => null; public virtual string DefaultDynamicCastFunctionTemplateFullyQualifiedName => null;
public RegistrableGeneratorOptions(Generator generator) public RegistrableGeneratorOptions(TGenerator generator)
{ {
Generator = generator; Generator = generator;
OutputSubDir = DefaultOutputSubdir; OutputSubDir = DefaultOutputSubdir;

13
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<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
} }
return GetFullyQualifiedName(entity.OriginalNamespace, option); 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 @@
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