Skip to content

Commit d87d95a

Browse files
committed
Registrable: add support for method
1 parent 736531b commit d87d95a

File tree

1 file changed

+126
-4
lines changed

1 file changed

+126
-4
lines changed

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

Lines changed: 126 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,12 @@ public virtual void GenerateClassDeclDeclarationList(Class @class, DetachmentOpt
520520
if (detachment == DetachmentOption.Off)
521521
{
522522
GenerateConstructors(@class, @class.Constructors);
523+
524+
var methods = @class.Methods.Where(method => !(method.IsConstructor || method.IsDestructor || method.IsOperator));
525+
var uniqueMethods = methods.GroupBy(m => m.Name);
526+
foreach (var group in uniqueMethods)
527+
GenerateMethods(@class, group.ToList());
528+
523529
GenerateClassDeclFunctions(@class);
524530
GenerateClassDeclVariables(@class);
525531
}
@@ -906,21 +912,21 @@ public virtual void GenerateConstructors(Class @class, IEnumerable<Method> const
906912
}
907913
}
908914

909-
public virtual bool CanGenerateConstructor(Method method)
915+
public virtual bool CanGenerateConstructor(Method constructor)
910916
{
911-
if (AlreadyVisited(method))
917+
if (AlreadyVisited(constructor))
912918
{
913919
return false;
914920
}
915-
else if (method.Access != AccessSpecifier.Public)
921+
else if (constructor.Access != AccessSpecifier.Public)
916922
{
917923
return false;
918924
}
919925
else if (!NonTemplateAllowed)
920926
{
921927
return false;
922928
}
923-
return method.IsGenerated;
929+
return constructor.IsGenerated;
924930
}
925931

926932
public virtual void GenerateConstructor(Class @class, Method constructor, bool doExpand)
@@ -959,5 +965,121 @@ public virtual void GenerateConstructor(Class @class, Method constructor, bool d
959965
}
960966

961967
#endregion
968+
969+
#region Method
970+
971+
public virtual bool NeedExpansionForMethods(Class @class, IEnumerable<Method> methods)
972+
{
973+
return false;
974+
}
975+
976+
public virtual void GenerateMethods(Class @class, IEnumerable<Method> methods)
977+
{
978+
var isDetach = GenerationContext.PeekIsDetach();
979+
980+
List<Method> filteredMethods = methods.Where((method) => CanGenerateMethod(method)).ToList();
981+
if (filteredMethods.Any())
982+
{
983+
Method method = filteredMethods.First();
984+
string methodName = method.Name;
985+
string methodNameQuoted = $"\"{methodName}\"";
986+
string methodBindingContext = NamingStrategy.GetBindingContext(method, GenerationContext);
987+
string methodContextualName = NamingStrategy.GetContextualName(method, GenerationContext, FQNOption.IgnoreNone);
988+
989+
if (isDetach == DetachmentOption.Forced || isDetach == Utils.FindDetachmentOption(method))
990+
{
991+
992+
if (isDetach != DetachmentOption.Off)
993+
{
994+
Write($"{methodBindingContext}[{methodNameQuoted}] = ");
995+
}
996+
else
997+
{
998+
WriteLine(",");
999+
Write($"{methodNameQuoted}, ");
1000+
}
1001+
if (filteredMethods.Count == 1)
1002+
{
1003+
GenerateMethod(@class, filteredMethods.First());
1004+
}
1005+
else
1006+
{
1007+
Write("::sol::overload(");
1008+
Indent();
1009+
for (int i = 0; i < filteredMethods.Count; i++)
1010+
{
1011+
if (i > 0)
1012+
{
1013+
Write(",");
1014+
}
1015+
NewLine();
1016+
GenerateMethod(@class, filteredMethods[i]);
1017+
}
1018+
Unindent();
1019+
NewLine();
1020+
Write(")");
1021+
}
1022+
if (isDetach != DetachmentOption.Off)
1023+
{
1024+
WriteLine(";");
1025+
}
1026+
}
1027+
}
1028+
}
1029+
1030+
public virtual bool CanGenerateMethod(Method method)
1031+
{
1032+
if (AlreadyVisited(method))
1033+
{
1034+
return false;
1035+
}
1036+
else if (method.Access != AccessSpecifier.Public)
1037+
{
1038+
return false;
1039+
}
1040+
else if (!NonTemplateAllowed)
1041+
{
1042+
return false;
1043+
}
1044+
return method.IsGenerated;
1045+
}
1046+
1047+
public virtual void GenerateMethod(Class @class, Method method)
1048+
{
1049+
{
1050+
Write("static_cast<");
1051+
Write(method.ReturnType.Visit(new CppTypePrinter(Context)));
1052+
Write("(");
1053+
Write("*)");
1054+
Write("(");
1055+
var needsComma = false;
1056+
foreach (var parameter in method.Parameters)
1057+
{
1058+
if (needsComma)
1059+
{
1060+
Write(", ");
1061+
}
1062+
else
1063+
{
1064+
needsComma = true;
1065+
}
1066+
Write(parameter.Type.Visit(new CppTypePrinter(Context)));
1067+
}
1068+
if (method.IsVariadic)
1069+
{
1070+
if (needsComma)
1071+
{
1072+
Write(", ");
1073+
}
1074+
Write("...");
1075+
}
1076+
Write(")");
1077+
Write(">(&");
1078+
Write(NamingStrategy.GetContextualName(method, GenerationContext, FQNOption.IgnoreNone));
1079+
Write(")");
1080+
}
1081+
}
1082+
1083+
#endregion
9621084
}
9631085
}

0 commit comments

Comments
 (0)