Skip to content

Commit 9ce5cc6

Browse files
committed
Registrable: generify the API + improvements
1 parent 45d4043 commit 9ce5cc6

10 files changed

+116
-44
lines changed

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

+10-14
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,28 @@
33

44
namespace CppSharp.Generators.Registrable.Lua.Sol
55
{
6-
public class LuaSolGenerator : Generator
6+
public class LuaSolGenerator : RegistrableGenerator<LuaSolGeneratorOptions, LuaSolHeaders, LuaSolSources>
77
{
88
public const string Id = "Lua::Sol";
99
public static readonly GeneratorKind Kind = new(Id, "lua::sol", typeof(LuaSolGenerator), typeof(LuaSolTypePrinter), new[] { "lua::sol" });
1010

11-
public LuaSolGeneratorOptions GeneratorOptions
11+
public LuaSolGenerator(BindingContext context) : base(context)
1212
{
13-
get;
1413
}
1514

16-
public LuaSolGenerator(BindingContext context) : base(context)
15+
protected override LuaSolGeneratorOptions CreateOptions(RegistrableGenerator<LuaSolGeneratorOptions, LuaSolHeaders, LuaSolSources> generator)
1716
{
18-
GeneratorOptions = new LuaSolGeneratorOptions(this);
17+
return new LuaSolGeneratorOptions(this);
1918
}
2019

21-
public override List<CodeGenerator> Generate(IEnumerable<TranslationUnit> units)
20+
protected override LuaSolHeaders CreateHeader(RegistrableGenerator<LuaSolGeneratorOptions, LuaSolHeaders, LuaSolSources> generator, IEnumerable<TranslationUnit> units)
2221
{
23-
var outputs = new List<CodeGenerator>();
24-
25-
var header = new LuaSolHeaders(this, units);
26-
outputs.Add(header);
27-
28-
var source = new LuaSolSources(this, units);
29-
outputs.Add(source);
22+
return new LuaSolHeaders(this, units);
23+
}
3024

31-
return outputs;
25+
protected override LuaSolSources CreateSource(RegistrableGenerator<LuaSolGeneratorOptions, LuaSolHeaders, LuaSolSources> generator, IEnumerable<TranslationUnit> units)
26+
{
27+
return new LuaSolSources(this, units);
3228
}
3329

3430
public override bool SetupPasses() => true;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
namespace CppSharp.Generators.Registrable.Lua.Sol
22
{
3-
public class LuaSolGeneratorOptions : RegistrableGeneratorOptions
3+
public class LuaSolGeneratorOptions : RegistrableGeneratorOptions<LuaSolGenerator>
44
{
55
public LuaSolNamingStrategy NamingStrategy;
66

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

+2-13
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,11 @@ public override void Process()
2727

2828
#region TranslationUnit
2929

30-
public override void GenerateTranslationUnitNamespaceBegin(TranslationUnit translationUnit)
31-
{
32-
PushBlock(BlockKind.Namespace);
33-
WriteLine($"namespace {TranslationUnit.Module.OutputNamespace} {{");
34-
}
35-
36-
public override void GenerateTranslationUnitNamespaceEnd(TranslationUnit translationUnit)
37-
{
38-
WriteLine($"}} // namespace {TranslationUnit.Module.OutputNamespace}");
39-
PopBlock();
40-
}
41-
4230
public virtual void GenerateTranslationUnitRegistrationFunctionDeclaration(TranslationUnit translationUnit)
4331
{
4432
NewLine();
45-
WriteLine(GetTranslationUnitRegistrationFunctionSignature(translationUnit));
33+
GenerateTranslationUnitRegistrationFunctionSignature(translationUnit);
34+
WriteLine(";");
4635
NewLine();
4736
}
4837

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

+11-13
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,14 @@
66

77
namespace CppSharp.Generators.Registrable.Lua.Sol
88
{
9-
public class LuaSolSources : CodeGenerator
9+
public class LuaSolSources : RegistrableSources<LuaSolGenerator>
1010
{
11-
protected LuaSolGenerator Generator { get; }
1211
protected LuaSolGenerationContext GenerationContext { get; }
1312
protected LuaSolNamingStrategy NamingStrategy => Generator.GeneratorOptions.NamingStrategy;
1413

1514
public LuaSolSources(LuaSolGenerator generator, IEnumerable<TranslationUnit> units)
16-
: base(generator.Context, units)
15+
: base(generator, units)
1716
{
18-
Generator = generator;
1917
GenerationContext = new LuaSolGenerationContext();
2018
}
2119

@@ -72,13 +70,12 @@ public virtual void GenerateDeclarationContainerList(DeclarationContext declarat
7270

7371
#region TranslationUnit
7472

75-
public virtual string GetTranslationUnitRegistrationFunctionSignature(TranslationUnit translationUnit)
73+
public virtual void GenerateTranslationUnitRegistrationFunctionSignature(TranslationUnit translationUnit)
7674
{
77-
StringBuilder builder = new StringBuilder();
78-
builder.Append("void ");
79-
builder.Append(Generator.GeneratorOptions.NamingStrategy.GetRegistrationFunctionName(translationUnit));
80-
builder.Append("(::sol::state_view& state) {");
81-
return builder.ToString();
75+
var generatorOptions = Generator.GeneratorOptions;
76+
Write("void ");
77+
Write(generatorOptions.NamingStrategy.GetRegistrationFunctionName(translationUnit));
78+
Write($"({generatorOptions.RootContextType} {generatorOptions.RootContextName})");
8279
}
8380

8481
public virtual void GenerateTranslationUnitNamespaceBegin(TranslationUnit translationUnit)
@@ -97,7 +94,8 @@ public virtual void GenerateTranslationUnitRegistrationFunctionBegin(Translation
9794
{
9895
PushBlock(BlockKind.Function);
9996
NewLine();
100-
WriteLine(GetTranslationUnitRegistrationFunctionSignature(translationUnit));
97+
GenerateTranslationUnitRegistrationFunctionSignature(translationUnit);
98+
WriteLine(" {");
10199
Indent();
102100
}
103101

@@ -1194,7 +1192,7 @@ public virtual void GenerateMethod(Class @class, Method method)
11941192
Write("static_cast<");
11951193
Write(method.ReturnType.Visit(new CppTypePrinter(Context)));
11961194
Write("(");
1197-
Write("*)");
1195+
Write($"{NamingStrategy.GetMembershipScopeName(method, GenerationContext)}*)");
11981196
Write("(");
11991197
var needsComma = false;
12001198
foreach (var parameter in method.Parameters)
@@ -1259,7 +1257,7 @@ public virtual void GenerateTypedefNameDecl(TypedefNameDecl typedef)
12591257
string typedefBindingContext = NamingStrategy.GetBindingContext(typedef, GenerationContext);
12601258
string typedefRootContextName = NamingStrategy.GetRootContextName(GenerationContext);
12611259

1262-
WriteLine($"global{typedefRegistrationFunctionName}{{}}({typedefRootContextName}, {typedefBindingContext}, {typedefNameQuoted}); /* directly */");
1260+
WriteLine($"//TODO: global{typedefRegistrationFunctionName}{{}}({typedefRootContextName}, {typedefBindingContext}, {typedefNameQuoted}); /* directly */");
12631261
}
12641262
}
12651263

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using CppSharp.AST;
2+
using System.Collections.Generic;
3+
4+
namespace CppSharp.Generators.Registrable
5+
{
6+
public abstract class RegistrableCodeGenerator<TGenerator> : CodeGenerator
7+
where TGenerator : Generator
8+
{
9+
public TGenerator Generator { get; set; }
10+
11+
public RegistrableCodeGenerator(TGenerator generator, IEnumerable<TranslationUnit> units) : base(generator.Context, units)
12+
{
13+
Generator = generator;
14+
}
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using CppSharp.AST;
2+
using System.Collections.Generic;
3+
4+
namespace CppSharp.Generators.Registrable
5+
{
6+
public abstract class RegistrableGenerator<TOptions, THeader, TSource> : Generator
7+
where THeader : CodeGenerator
8+
where TSource : CodeGenerator
9+
{
10+
public TOptions GeneratorOptions { get; }
11+
12+
public RegistrableGenerator(BindingContext context) : base(context)
13+
{
14+
GeneratorOptions = CreateOptions(this);
15+
}
16+
17+
protected abstract TOptions CreateOptions(RegistrableGenerator<TOptions, THeader, TSource> generator);
18+
19+
protected abstract THeader CreateHeader(RegistrableGenerator<TOptions, THeader, TSource> generator, IEnumerable<TranslationUnit> units);
20+
21+
protected abstract TSource CreateSource(RegistrableGenerator<TOptions, THeader, TSource> generator, IEnumerable<TranslationUnit> units);
22+
23+
public override List<CodeGenerator> Generate(IEnumerable<TranslationUnit> units)
24+
{
25+
return new List<CodeGenerator>
26+
{
27+
CreateHeader(this, units),
28+
CreateSource(this, units)
29+
};
30+
}
31+
32+
public override bool SetupPasses() => true;
33+
}
34+
}

src/Generator/Generators/Registrable/RegistrableGeneratorOptions.cs

+4-3
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ public enum ImportedClassTemplateMode
99
Import
1010
}
1111

12-
public abstract class RegistrableGeneratorOptions
12+
public abstract class RegistrableGeneratorOptions<TGenerator>
13+
where TGenerator : Generator
1314
{
1415
public delegate string Delegate(string name);
1516

16-
protected Generator Generator;
17+
public TGenerator Generator { get; set; }
1718

1819
public virtual string OutputSubDir { get; }
1920
public virtual string RootContextType { get; }
@@ -59,7 +60,7 @@ public abstract class RegistrableGeneratorOptions
5960
public virtual string DefaultStaticCastFunctionTemplateFullyQualifiedName => null;
6061
public virtual string DefaultDynamicCastFunctionTemplateFullyQualifiedName => null;
6162

62-
public RegistrableGeneratorOptions(Generator generator)
63+
public RegistrableGeneratorOptions(TGenerator generator)
6364
{
6465
Generator = generator;
6566
OutputSubDir = DefaultOutputSubdir;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using CppSharp.AST;
2+
using System.Collections.Generic;
3+
4+
namespace CppSharp.Generators.Registrable
5+
{
6+
public abstract class RegistrableHeaders<TGenerator> : RegistrableCodeGenerator<TGenerator>
7+
where TGenerator : Generator
8+
{
9+
public RegistrableHeaders(TGenerator generator, IEnumerable<TranslationUnit> units) : base(generator, units)
10+
{
11+
}
12+
}
13+
}

src/Generator/Generators/Registrable/RegistrableNamingStrategy.cs

+12
Original file line numberDiff line numberDiff line change
@@ -397,5 +397,17 @@ public virtual string GetCppContext(Declaration entity, RegistrableGeneratorCont
397397
}
398398
return GetFullyQualifiedName(entity.OriginalNamespace, option);
399399
}
400+
401+
public virtual string GetMembershipScopeName(Function function, RegistrableGeneratorContext context)
402+
{
403+
if (function is Method method)
404+
{
405+
return GetCppContext(method, context, new FQNOption()
406+
{
407+
IgnoreTemplateTypenameKeyword = true
408+
}) + "::";
409+
}
410+
return "";
411+
}
400412
}
401413
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using CppSharp.AST;
2+
using System.Collections.Generic;
3+
4+
namespace CppSharp.Generators.Registrable
5+
{
6+
public abstract class RegistrableSources<TGenerator> : RegistrableCodeGenerator<TGenerator>
7+
where TGenerator : Generator
8+
{
9+
public RegistrableSources(TGenerator generator, IEnumerable<TranslationUnit> units) : base(generator, units)
10+
{
11+
}
12+
}
13+
}

0 commit comments

Comments
 (0)