Browse Source

Registrable: cleanup + improvements

pull/1808/head
Deadlocklogic 2 years ago
parent
commit
9fb03a0a07
  1. 1
      src/Generator/Generators/Registrable/Lua/Sol/LuaSolGenerator.cs
  2. 12
      src/Generator/Generators/Registrable/Lua/Sol/LuaSolGeneratorOptions.cs
  3. 87
      src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs
  4. 73
      src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs
  5. 98
      src/Generator/Generators/Registrable/RegistrableGeneratorOptions.cs
  6. 24
      src/Generator/Generators/Registrable/RegistrableNamingStrategy.cs

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

@ -3,7 +3,6 @@ using System.Collections.Generic; @@ -3,7 +3,6 @@ using System.Collections.Generic;
namespace CppSharp.Generators.Registrable.Lua.Sol
{
public class LuaSolGenerator : Generator
{
public const string Id = "Lua::Sol";

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

@ -8,5 +8,17 @@ @@ -8,5 +8,17 @@
{
NamingStrategy = new LuaSolNamingStrategy(generator);
}
public override string DefaultRootContextType => "::sol::state_view&";
public override string DefaultRootContextName => "state";
public override string DefaultTemplateContextDefaultType => "::sol::table";
public override string DefaultTemplateContextDefaultValue => "::sol::nil";
public override string DefaultCmakeVariableHeader => "LUA_SOL_BINDINGS_HEADER";
public override string DefaultCmakeVariableSource => "LUA_SOL_BINDINGS_SOURCE";
}
}

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

@ -12,6 +12,8 @@ namespace CppSharp.Generators.Registrable.Lua.Sol @@ -12,6 +12,8 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
public override string FileExtension => "h";
protected override bool TemplateAllowed { get { return true; } }
public override void Process()
{
GenerateFilePreamble(CommentKind.BCPL);
@ -20,32 +22,18 @@ namespace CppSharp.Generators.Registrable.Lua.Sol @@ -20,32 +22,18 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
WriteLine("#pragma once");
PopBlock(NewLineKind.BeforeNextBlock);
//NewLine();
//PushBlock(BlockKind.Includes);
//GenerateIncludes();
//PopBlock(NewLineKind.BeforeNextBlock);
TranslationUnit.Visit(this);
//PushBlock(BlockKind.Footer);
//PopBlock();
//PushBlock(BlockKind.Class);
//PopBlock(NewLineKind.IfNotEmpty);
//RegistrableGeneratorContext mycontext = new RegistrableGeneratorContext();
//string a = (string)mycontext[new InfoEntry("")].Pop();
}
#region TranslationUnit
public virtual void GenerateTranslationUnitNamespaceBegin(TranslationUnit translationUnit)
public override void GenerateTranslationUnitNamespaceBegin(TranslationUnit translationUnit)
{
PushBlock(BlockKind.Namespace);
WriteLine($"namespace {TranslationUnit.Module.OutputNamespace} {{");
}
public virtual void GenerateTranslationUnitNamespaceEnd(TranslationUnit translationUnit)
public override void GenerateTranslationUnitNamespaceEnd(TranslationUnit translationUnit)
{
WriteLine($"}} // namespace {TranslationUnit.Module.OutputNamespace}");
PopBlock();
@ -58,14 +46,14 @@ namespace CppSharp.Generators.Registrable.Lua.Sol @@ -58,14 +46,14 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
NewLine();
}
public virtual void GenerateTranslationUnit(TranslationUnit translationUnit)
public override void GenerateTranslationUnit(TranslationUnit translationUnit)
{
GenerateTranslationUnitNamespaceBegin(translationUnit);
GenerateTranslationUnitRegistrationFunctionDeclaration(translationUnit);
GenerateTranslationUnitNamespaceEnd(translationUnit);
}
public virtual bool CanGenerateTranslationUnit(TranslationUnit unit)
public override bool CanGenerateTranslationUnit(TranslationUnit unit)
{
if (AlreadyVisited(unit))
{
@ -88,8 +76,6 @@ namespace CppSharp.Generators.Registrable.Lua.Sol @@ -88,8 +76,6 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
#endregion
//
public virtual void GenerateMain()
{
VisitNamespace(TranslationUnit);
@ -97,67 +83,10 @@ namespace CppSharp.Generators.Registrable.Lua.Sol @@ -97,67 +83,10 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
public virtual void GenerateIncludes()
{
foreach (var include in Generator.GeneratorOptions.CommonIncludes)
{
WriteLineIndent(include.ToString());
}
}
//public override bool VisitNamespace(Namespace @namespace)
//{
// base.VisitNamespace(@namespace);
// return true;
//}
public override bool VisitMethodDecl(Method method)
{
return true;
}
public override bool VisitFunctionDecl(Function function)
{
//if (FunctionIsTemplate(function))
//{
// Console.WriteLine("test");
//}
return true;
}
public override bool VisitClassTemplateDecl(ClassTemplate template)
{
return true;
}
public override bool VisitVariableDecl(Variable variable)
{
return true;
}
public override bool VisitTypeAliasTemplateDecl(TypeAliasTemplate typeAliasTemplate)
{
return true;
}
public override bool VisitTypedefNameDecl(TypedefNameDecl typedef)
{
return true;
}
public override bool VisitFunctionTemplateDecl(FunctionTemplate template)
{
return true;
}
public static bool FunctionIsTemplate(Function function)
{
foreach (var template in function.Namespace.Templates)
if (Generator.GeneratorOptions.BaseInclude != null)
{
if (template.TemplatedDecl == function)
{
return true;
}
WriteLineIndent(Generator.GeneratorOptions.BaseInclude.ToString());
}
return false;
}
}
}

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

@ -118,6 +118,11 @@ namespace CppSharp.Generators.Registrable.Lua.Sol @@ -118,6 +118,11 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
{
GenerateFunctions(translationUnit, overload.ToList());
}
foreach (var typedef in translationUnit.Typedefs)
{
typedef.Visit(this);
}
});
}
@ -205,6 +210,11 @@ namespace CppSharp.Generators.Registrable.Lua.Sol @@ -205,6 +210,11 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
{
GenerateFunctions(@namespace, overload.ToList());
}
foreach (var typedef in @namespace.Typedefs)
{
typedef.Visit(this);
}
});
}
@ -235,7 +245,7 @@ namespace CppSharp.Generators.Registrable.Lua.Sol @@ -235,7 +245,7 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
public virtual void GenerateNamespaceEnd(Namespace @namespace)
{
GenerateNamespaceDeclarationList(@namespace, DetachmentOption.On);
//GenerateNamespaceDeclarationList(@namespace, DetachmentOption.On);
}
public virtual void GenerateNamespaceGlobalStateRegistration(Namespace @namespace)
@ -1215,5 +1225,66 @@ namespace CppSharp.Generators.Registrable.Lua.Sol @@ -1215,5 +1225,66 @@ namespace CppSharp.Generators.Registrable.Lua.Sol
}
#endregion
#region Typedef
public virtual bool CanGenerateTypedefNameDecl(TypedefNameDecl typedef)
{
if (AlreadyVisited(typedef))
{
return false;
}
else if (typedef.Access != AccessSpecifier.Public)
{
return false;
}
else if (!NonTemplateAllowed)
{
return false;
}
return typedef.IsGenerated;
}
public virtual void GenerateTypedefNameDecl(TypedefNameDecl typedef)
{
var type = typedef.Type;
if (type is TemplateSpecializationType templateSpecializationType)
{
string typedefName = typedef.Name;
string typedefNameQuoted = $"\"{typedefName}\"";
string typedefRegistrationFunctionName = NamingStrategy.GetFullyQualifiedName(templateSpecializationType.GetClassTemplateSpecialization(), new FQNOption()
{
IgnoreTemplateTypenameKeyword = true
});
string typedefBindingContext = NamingStrategy.GetBindingContext(typedef, GenerationContext);
string typedefRootContextName = NamingStrategy.GetRootContextName(GenerationContext);
WriteLine($"global{typedefRegistrationFunctionName}{{}}({typedefRootContextName}, {typedefBindingContext}, {typedefNameQuoted}); /* directly */");
}
}
public override bool VisitTypedefNameDecl(TypedefNameDecl typedef)
{
if (!CanGenerateTypedefNameDecl(typedef))
{
return false;
}
GenerateTypedefNameDecl(typedef);
return true;
}
public override bool VisitTypedefDecl(TypedefDecl typedef)
{
return VisitTypedefNameDecl(typedef);
}
public override bool VisitTypeAliasDecl(TypeAlias typeAlias)
{
return VisitTypedefNameDecl(typeAlias);
}
#endregion
}
}

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

@ -1,50 +1,86 @@ @@ -1,50 +1,86 @@
using CppSharp.Generators.C;
using System.Collections.Generic;
namespace CppSharp.Generators.Registrable
{
public enum ImportedClassTemplateMode
{
Direct,
Indirect,
Import
}
public abstract class RegistrableGeneratorOptions
{
public delegate string Delegate(string name);
protected Generator generator;
public virtual ISet<CInclude> CommonIncludes { get; }
public virtual string OutputSubDir { get; }
public virtual string RootContextType { get; }
public virtual string RootContextName { get; }
public virtual string RegisterFunctionName { get; }
public virtual CInclude? BaseInclude { get; }
public Delegate BindingIdNamePredicate { get; }
public Delegate BindingIdValuePredicate { get; }
public Delegate BindingNamePredicate { get; }
public string TemplateTypenameState { get; }
public string TemplateTypenameContext { get; }
public string TemplateIdentifierState { get; }
public string TemplateIdentifierContext { get; }
public string TemplateContextDefaultType { get; }
public string TemplateContextDefaultValue { get; }
public ImportedClassTemplateMode ImportedTemplateMode { get; }
public string CppValidatorFileName { get; }
public string CmakeVariableHeader { get; }
public string CmakeVariableSource { get; }
public string EqualityFunctionTemplateFullyQualifiedName { get; }
public string StaticCastFunctionTemplateFullyQualifiedName { get; }
public string DynamicCastFunctionTemplateFullyQualifiedName { get; }
public RegistrableGeneratorOptions()
{
CommonIncludes = new HashSet<CInclude>();
OutputSubDir = null;
BindingIdNamePredicate = DefaultBindingIdNamePredicate();
BindingIdValuePredicate = DefaultBindingIdValuePredicate();
BindingNamePredicate = DefaultBindingNamePredicate();
}
public virtual string DefaultOutputSubdir => "";
public abstract string DefaultRootContextType { get; }
public abstract string DefaultRootContextName { get; }
public virtual string DefaultRegisterFunctionName => "register_";
public virtual CInclude? DefaultBaseInclude => null;
public virtual Delegate DefaultBindingIdNamePredicate => (string name) => $"_cppbind_id_{name}";
public virtual Delegate DefaultBindingIdValuePredicate => (string name) => $"typeid({name}).name()";
public virtual Delegate DefaultBindingNamePredicate => (string name) => $"_cppbind_{name}";
public virtual string DefaultTemplateTypenameState => "CppBindState";
public virtual string DefaultTemplateTypenameContext => "CppBindContext";
public virtual string DefaultTemplateIdentifierState => "cpp_bind_state";
public virtual string DefaultTemplateIdentifierContext => "cpp_bind_context";
public abstract string DefaultTemplateContextDefaultType { get; }
public abstract string DefaultTemplateContextDefaultValue { get; }
public virtual ImportedClassTemplateMode DefaultImportedTemplateMode => ImportedClassTemplateMode.Indirect;
public virtual string DefaulCppValidatorFileName => "_cppbind_validator_";
public virtual string DefaultCmakeVariableHeader => "BINDINGS_HEADER";
public virtual string DefaultCmakeVariableSource => "BINDINGS_SOURCE";
public virtual string DefaultEqualityFunctionTemplateFullyQualifiedName => null;
public virtual string DefaultStaticCastFunctionTemplateFullyQualifiedName => null;
public virtual string DefaultDynamicCastFunctionTemplateFullyQualifiedName => null;
public virtual Delegate DefaultBindingIdNamePredicate()
{
return (string name) =>
{
return $"_cppbind_id_{name}";
};
}
public virtual Delegate DefaultBindingIdValuePredicate()
{
return (string name) =>
{
return $"typeid({name}).name()";
};
}
public virtual Delegate DefaultBindingNamePredicate()
public RegistrableGeneratorOptions()
{
return (string name) =>
{
return $"_cppbind_{name}";
};
OutputSubDir = DefaultOutputSubdir;
RootContextType = DefaultRootContextType;
RootContextName = DefaultRootContextName;
RegisterFunctionName = DefaultRegisterFunctionName;
BaseInclude = DefaultBaseInclude;
BindingIdNamePredicate = DefaultBindingIdNamePredicate;
BindingIdValuePredicate = DefaultBindingIdValuePredicate;
BindingNamePredicate = DefaultBindingNamePredicate;
TemplateTypenameState = DefaultTemplateTypenameState;
TemplateTypenameContext = DefaultTemplateTypenameContext;
TemplateIdentifierState = DefaultTemplateIdentifierState;
TemplateIdentifierContext = DefaultTemplateIdentifierContext;
TemplateContextDefaultType = DefaultTemplateContextDefaultType;
TemplateContextDefaultValue = DefaultTemplateContextDefaultValue;
ImportedTemplateMode = DefaultImportedTemplateMode;
CppValidatorFileName = DefaulCppValidatorFileName;
CmakeVariableHeader = DefaultCmakeVariableHeader;
CmakeVariableSource = DefaultCmakeVariableSource;
EqualityFunctionTemplateFullyQualifiedName = DefaultEqualityFunctionTemplateFullyQualifiedName;
StaticCastFunctionTemplateFullyQualifiedName = DefaultStaticCastFunctionTemplateFullyQualifiedName;
DynamicCastFunctionTemplateFullyQualifiedName = DefaultDynamicCastFunctionTemplateFullyQualifiedName;
}
}
}

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

@ -22,7 +22,7 @@ namespace CppSharp.Generators.Registrable @@ -22,7 +22,7 @@ namespace CppSharp.Generators.Registrable
while (true)
{
currentDeclaration = currentDeclaration.OriginalNamespace;
if (currentDeclaration != null || currentDeclaration is TranslationUnit)
if (currentDeclaration == null || currentDeclaration is TranslationUnit)
{
break;
}
@ -122,17 +122,17 @@ namespace CppSharp.Generators.Registrable @@ -122,17 +122,17 @@ namespace CppSharp.Generators.Registrable
return builder.ToString();
}
public virtual string PrintClassTemplateParameters(ClassTemplate classTemplate, bool includeEnclosingBrackets, TemplateParameterOption option)
public virtual string PrintClassTemplateParameters(List<Declaration> parameters, bool includeEnclosingBrackets, TemplateParameterOption option)
{
var builder = new StringBuilder();
builder.Append('<');
for (int i = 0; i < classTemplate.Parameters.Count; i++)
for (int i = 0; i < parameters.Count; i++)
{
if (i > 0)
{
builder.Append(", ");
}
builder.Append(PrintClassTemplateParameter(classTemplate.Parameters[i], option));
builder.Append(PrintClassTemplateParameter(parameters[i], option));
}
builder.Append('>');
return builder.ToString();
@ -147,17 +147,17 @@ namespace CppSharp.Generators.Registrable @@ -147,17 +147,17 @@ namespace CppSharp.Generators.Registrable
return templateArgument.Type.Type.Visit(new CppTypePrinter(Generator.Context));
}
public virtual string PrintClassTemplateSpecializationArguments(ClassTemplateSpecialization classTemplateSpecialization, bool includeEnclosingBrackets)
public virtual string PrintClassTemplateSpecializationArguments(List<TemplateArgument> arguments, bool includeEnclosingBrackets)
{
var builder = new StringBuilder();
builder.Append('<');
for (int i = 0; i < classTemplateSpecialization.Arguments.Count; i++)
for (int i = 0; i < arguments.Count; i++)
{
if (i > 0)
{
builder.Append(", ");
}
builder.Append(PrintClassTemplateSpecializationArgument(classTemplateSpecialization.Arguments[i]));
builder.Append(PrintClassTemplateSpecializationArgument(arguments[i]));
}
builder.Append('>');
return builder.ToString();
@ -177,7 +177,7 @@ namespace CppSharp.Generators.Registrable @@ -177,7 +177,7 @@ namespace CppSharp.Generators.Registrable
{
if (!option.IgnoreTemplateParameters)
{
name = ($"{name}{PrintClassTemplateSpecializationArguments(specialization, true)}");
name = ($"{name}{PrintClassTemplateSpecializationArguments(specialization.Arguments, true)}");
}
}
else
@ -190,7 +190,7 @@ namespace CppSharp.Generators.Registrable @@ -190,7 +190,7 @@ namespace CppSharp.Generators.Registrable
{
if (!option.IgnoreTemplateParameters)
{
name = ($"{name}{PrintClassTemplateParameters(template, true, TemplateParameterOption.AsArgument)}");
name = ($"{name}{PrintClassTemplateParameters(template.Parameters, true, TemplateParameterOption.AsArgument)}");
}
}
}
@ -235,7 +235,7 @@ namespace CppSharp.Generators.Registrable @@ -235,7 +235,7 @@ namespace CppSharp.Generators.Registrable
{
needsTypename = true;
}
currentName.Append(PrintClassTemplateSpecializationArguments(specialization, true));
currentName.Append(PrintClassTemplateSpecializationArguments(specialization.Arguments, true));
}
}
else
@ -259,7 +259,7 @@ namespace CppSharp.Generators.Registrable @@ -259,7 +259,7 @@ namespace CppSharp.Generators.Registrable
{
needsTypename = true;
}
currentName.Append($"{name}{PrintClassTemplateParameters(template, true, TemplateParameterOption.AsArgument)}");
currentName.Append($"{name}{PrintClassTemplateParameters(template.Parameters, true, TemplateParameterOption.AsArgument)}");
}
}
}
@ -371,7 +371,7 @@ namespace CppSharp.Generators.Registrable @@ -371,7 +371,7 @@ namespace CppSharp.Generators.Registrable
var parentList = new List<Declaration>();
while (true)
{
if (currentDeclaration != null || currentDeclaration is TranslationUnit)
if (currentDeclaration == null || currentDeclaration is TranslationUnit)
{
break;
}

Loading…
Cancel
Save