diff --git a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs index 2c648652e..acc9fe919 100644 --- a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs +++ b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolHeaders.cs @@ -38,6 +38,7 @@ public virtual void GenerateTranslationUnitRegistrationFunctionDeclaration(Trans public override void GenerateTranslationUnit(TranslationUnit translationUnit) { GenerateTranslationUnitNamespaceBegin(translationUnit); + GenerateTranslationUnitRegistrationFunctionBody(translationUnit); GenerateTranslationUnitRegistrationFunctionDeclaration(translationUnit); GenerateTranslationUnitNamespaceEnd(translationUnit); } diff --git a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs index 1e8691d06..84a468376 100644 --- a/src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs +++ b/src/Generator/Generators/Registrable/Lua/Sol/LuaSolSources.cs @@ -2,7 +2,6 @@ using CppSharp.Generators.C; using System.Collections.Generic; using System.Linq; -using System.Text; namespace CppSharp.Generators.Registrable.Lua.Sol { @@ -60,12 +59,121 @@ public virtual void GenerateDeclarationGlobalStateRegistration(Declaration decla public virtual void GenerateDeclarationContainerList(DeclarationContext declaration) { - List declarations = declaration.Declarations.Where(declaration => declaration is Namespace || declaration is Class || declaration is Enumeration).ToList(); - declarations.Sort((x, y) => x.LineNumberStart.CompareTo(y.LineNumberStart)); - foreach (var item in declarations) + List containerList = declaration.Declarations.Where(declaration => + { + if (declaration is Namespace || declaration is Enumeration) + { + return true; + } + else if (declaration is Class) + { + return Utils.FindDescribedTemplate(declaration) == null; + } + return false; + }).ToList(); + containerList.Sort((x, y) => x.LineNumberStart.CompareTo(y.LineNumberStart)); + foreach (var item in containerList) { item.Visit(this); }; + + if (NonTemplateAllowed) + { + List classTemplateList = declaration.Templates.Where(template => template is ClassTemplate).Cast().ToList(); + classTemplateList.Sort((x, y) => x.LineNumberStart.CompareTo(y.LineNumberStart)); + foreach (var classTemplate in classTemplateList) + { + if (Utils.IsDefaultTemplateParameterList(classTemplate.Parameters)) + { + Write(string.Format("{0}<>{{}}({1}", + NamingStrategy.GetClassTemplateName(classTemplate), + NamingStrategy.GetRootContextName(GenerationContext) + )); + if (classTemplate.OriginalName != classTemplate.Name) + { + Write(", "); + Write(NamingStrategy.GetRootContextName(GenerationContext)); + Write(", "); + Write(classTemplate.Name); + } + WriteLine(");"); + } + + foreach (var classTemplateSpecialization in classTemplate.Specializations) + { + if (classTemplateSpecialization is not ClassTemplatePartialSpecialization) + { + if (classTemplateSpecialization.SpecializationKind == TemplateSpecializationKind.ExplicitSpecialization) + { + Write(string.Format("{0}<{1}>{{}}({2}", + NamingStrategy.GetClassTemplateName(classTemplateSpecialization), + NamingStrategy.PrintClassTemplateSpecializationArguments(classTemplateSpecialization.Arguments, false), + NamingStrategy.GetRootContextName(GenerationContext) + )); + if (classTemplateSpecialization.OriginalName != classTemplateSpecialization.Name) + { + Write(", "); + Write(NamingStrategy.GetRootContextName(GenerationContext)); + Write(", "); + Write(classTemplateSpecialization.Name); + } + WriteLine(");"); + } + } + } + }; + } + } + + public virtual void GenerateDeclarationTemplateList(DeclarationContext declaration) + { + if (!TemplateAllowed) + { + return; + } + + List containerList = declaration.Declarations.Where(declaration => + { + if (declaration is Namespace || declaration is Enumeration) + { + return true; + } + else if (declaration is Class) + { + return Utils.FindDescribedTemplate(declaration) == null; + } + return false; + }).ToList(); + containerList.Sort((x, y) => x.LineNumberStart.CompareTo(y.LineNumberStart)); + foreach (var item in containerList) + { + if (item.Access == AccessSpecifier.Protected) + { + item.Visit(this); + } + else + { + GenerateDeclarationTemplateList((DeclarationContext)item); + } + }; + + List classTemplateList = declaration.Templates.Where(template => template is ClassTemplate).Cast().ToList(); + classTemplateList.Sort((x, y) => x.LineNumberStart.CompareTo(y.LineNumberStart)); + foreach (var classTemplate in classTemplateList) + { + classTemplate.Visit(this); + foreach (var classTemplateSpecialization in classTemplate.Specializations) + { + classTemplateSpecialization.Visit(this); + } + }; + + //List