diff --git a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGenerator.cs b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGenerator.cs index db7766ad..596a4c4b 100644 --- a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGenerator.cs +++ b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGenerator.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; namespace CppSharp.Generators.Registrable.Lua.Sol { - public class LuaSolGenerator : Generator { public const string Id = "Lua::Sol"; diff --git a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGeneratorOptions.cs b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGeneratorOptions.cs index 158cb47b..bf5169eb 100644 --- a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGeneratorOptions.cs +++ b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolGeneratorOptions.cs @@ -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"; } } diff --git a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs index 78599525..971a6fd5 100644 --- a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs +++ b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs @@ -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 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 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 #endregion - // - public virtual void GenerateMain() { VisitNamespace(TranslationUnit); @@ -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; } } } diff --git a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs index 661905db..03f965e7 100644 --- a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs +++ b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs @@ -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 { GenerateFunctions(@namespace, overload.ToList()); } + + foreach (var typedef in @namespace.Typedefs) + { + typedef.Visit(this); + } }); } @@ -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 } #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 } } diff --git a/src/Generator/Generators/Registrable/RegistrableGeneratorOptions.cs b/src/Generator/Generators/Registrable/RegistrableGeneratorOptions.cs index 7e7e82d1..83650e65 100644 --- a/src/Generator/Generators/Registrable/RegistrableGeneratorOptions.cs +++ b/src/Generator/Generators/Registrable/RegistrableGeneratorOptions.cs @@ -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 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(); - 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; } } } diff --git a/src/Generator/Generators/Registrable/RegistrableNamingStrategy.cs b/src/Generator/Generators/Registrable/RegistrableNamingStrategy.cs index fe7a4537..3faeca9d 100644 --- a/src/Generator/Generators/Registrable/RegistrableNamingStrategy.cs +++ b/src/Generator/Generators/Registrable/RegistrableNamingStrategy.cs @@ -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 return builder.ToString(); } - public virtual string PrintClassTemplateParameters(ClassTemplate classTemplate, bool includeEnclosingBrackets, TemplateParameterOption option) + public virtual string PrintClassTemplateParameters(List 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 return templateArgument.Type.Type.Visit(new CppTypePrinter(Generator.Context)); } - public virtual string PrintClassTemplateSpecializationArguments(ClassTemplateSpecialization classTemplateSpecialization, bool includeEnclosingBrackets) + public virtual string PrintClassTemplateSpecializationArguments(List 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 { if (!option.IgnoreTemplateParameters) { - name = ($"{name}{PrintClassTemplateSpecializationArguments(specialization, true)}"); + name = ($"{name}{PrintClassTemplateSpecializationArguments(specialization.Arguments, true)}"); } } else @@ -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 { needsTypename = true; } - currentName.Append(PrintClassTemplateSpecializationArguments(specialization, true)); + currentName.Append(PrintClassTemplateSpecializationArguments(specialization.Arguments, true)); } } else @@ -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 var parentList = new List(); while (true) { - if (currentDeclaration != null || currentDeclaration is TranslationUnit) + if (currentDeclaration == null || currentDeclaration is TranslationUnit) { break; }