Skip to content

Commit 263898f

Browse files
committed
Streamlined the generator.
1 parent 67cc400 commit 263898f

35 files changed

+1208
-1665
lines changed

HexaGen/CsCodeGenerator.Functions.cs

Lines changed: 17 additions & 231 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
using CppAst;
44
using HexaGen.Core;
55
using HexaGen.Core.CSharp;
6+
using HexaGen.FunctionGeneration;
7+
using HexaGen.FunctionGeneration.ParameterWriters;
68
using System.Collections.Generic;
79
using System.IO;
810
using System.Text;
@@ -270,7 +272,7 @@ protected virtual void GenerateFunctions(CppCompilation compilation, string outp
270272

271273
overload.Modifiers.Add("public");
272274
overload.Modifiers.Add("static");
273-
funcGen.GenerateVariations(cppFunction.Parameters, overload);
275+
GenerateVariations(cppFunction, overload);
274276
WriteFunctions(context, DefinedVariationsFunctions, function, overload, WriteFunctionFlags.None, "public static");
275277
}
276278
}
@@ -301,6 +303,11 @@ protected virtual void GenerateFunctions(CppCompilation compilation, string outp
301303
}
302304
}
303305

306+
protected virtual void GenerateVariations(CppFunction cppFunction, CsFunctionOverload overload)
307+
{
308+
funcGen.GenerateVariations(cppFunction.Parameters, overload);
309+
}
310+
304311
protected virtual void WriteFunctions(GenContext context, HashSet<string> definedFunctions, CsFunction csFunction, CsFunctionOverload overload, WriteFunctionFlags flags, params string[] modifiers)
305312
{
306313
for (int j = 0; j < overload.Variations.Count; j++)
@@ -369,226 +376,7 @@ protected virtual string BuildFunctionHeader(CsFunctionVariation variation, CsTy
369376
return $"{csReturnType.Name} {variation.Name}({signature})";
370377
}
371378

372-
protected virtual void WriteFunction(GenContext context, HashSet<string> definedFunctions, CsFunction function, CsFunctionOverload overload, CsFunctionVariation variation, WriteFunctionFlags flags, params string[] modifiers)
373-
{
374-
var writer = context.Writer;
375-
CsType csReturnType = variation.ReturnType;
376-
PrepareArgs(variation, csReturnType);
377-
378-
string header = BuildFunctionHeader(variation, csReturnType, flags, config.GenerateMetadata);
379-
string id = BuildFunctionHeaderId(variation, flags);
380-
381-
if (FilterFunction(context, definedFunctions, id))
382-
{
383-
return;
384-
}
385-
386-
ClassifyParameters(overload, variation, csReturnType, out bool firstParamReturn, out int offset, out bool hasManaged);
387-
388-
LogInfo("defined function " + header);
389-
390-
writer.WriteLines(overload.Comment);
391-
if (config.GenerateMetadata)
392-
{
393-
writer.WriteLines(overload.Attributes);
394-
}
395-
using (writer.PushBlock($"{string.Join(" ", modifiers)} {header}"))
396-
{
397-
StringBuilder sb = new();
398-
399-
if (!firstParamReturn && (!csReturnType.IsVoid || csReturnType.IsVoid && csReturnType.IsPointer))
400-
{
401-
if (csReturnType.IsBool && !csReturnType.IsPointer && !hasManaged)
402-
{
403-
sb.Append($"{config.GetBoolType()} ret = ");
404-
}
405-
else
406-
{
407-
sb.Append($"{csReturnType.Name} ret = ");
408-
}
409-
}
410-
411-
if (csReturnType.IsString)
412-
{
413-
WriteStringConvertToManaged(sb, variation.ReturnType);
414-
}
415-
416-
if (flags != WriteFunctionFlags.None)
417-
{
418-
sb.Append($"{config.ApiName}.");
419-
}
420-
421-
if (hasManaged)
422-
{
423-
sb.Append($"{overload.Name}(");
424-
}
425-
else if (firstParamReturn)
426-
{
427-
sb.Append($"{overload.Name}Native(&ret" + (overload.Parameters.Count > 1 ? ", " : ""));
428-
}
429-
else
430-
{
431-
sb.Append($"{overload.Name}Native(");
432-
}
433-
434-
Stack<(string, CsParameterInfo, string)> strings = new();
435-
Stack<string> stringArrays = new();
436-
int stringCounter = 0;
437-
int blockCounter = 0;
438-
439-
for (int i = 0; i < overload.Parameters.Count - offset; i++)
440-
{
441-
var cppParameter = overload.Parameters[i + offset];
442-
var paramFlags = ParameterFlags.None;
443-
444-
if (variation.TryGetParameter(cppParameter.Name, out var param))
445-
{
446-
paramFlags = param.Flags;
447-
cppParameter = param;
448-
}
449-
450-
if (flags.HasFlag(WriteFunctionFlags.UseHandle) && i == 0)
451-
{
452-
sb.Append("Handle");
453-
}
454-
else if (flags.HasFlag(WriteFunctionFlags.UseThis) && i == 0 && overload.Parameters[i].Type.IsPointer)
455-
{
456-
writer.BeginBlock($"fixed ({overload.Parameters[i].Type.Name} @this = &this)");
457-
sb.Append("@this");
458-
blockCounter++;
459-
}
460-
else if (flags.HasFlag(WriteFunctionFlags.UseThis) && i == 0)
461-
{
462-
sb.Append("this");
463-
}
464-
else if (paramFlags.HasFlag(ParameterFlags.Default))
465-
{
466-
var rootParam = overload.Parameters[i + offset];
467-
var paramCsDefault = cppParameter.DefaultValue;
468-
if (cppParameter.Type.IsString || paramCsDefault.StartsWith("\"") && paramCsDefault.EndsWith("\""))
469-
{
470-
sb.Append($"(string){paramCsDefault}");
471-
}
472-
else if (cppParameter.Type.IsBool && !cppParameter.Type.IsPointer && !cppParameter.Type.IsArray)
473-
{
474-
sb.Append($"({config.GetBoolType()})({paramCsDefault})");
475-
}
476-
else if (rootParam.Type.IsEnum || cppParameter.Type.IsPrimitive || cppParameter.Type.IsPointer || cppParameter.Type.IsArray)
477-
{
478-
sb.Append($"({rootParam.Type.Name})({paramCsDefault})");
479-
}
480-
else
481-
{
482-
sb.Append($"{paramCsDefault}");
483-
}
484-
}
485-
else if (paramFlags.HasFlag(ParameterFlags.String))
486-
{
487-
if (paramFlags.HasFlag(ParameterFlags.Array))
488-
{
489-
WriteStringArrayConvertToUnmanaged(writer, cppParameter.Type, cppParameter.Name, stringArrays.Count);
490-
sb.Append($"pStrArray{stringArrays.Count}");
491-
stringArrays.Push(cppParameter.Name);
492-
}
493-
else
494-
{
495-
if (paramFlags.HasFlag(ParameterFlags.Ref))
496-
{
497-
strings.Push((cppParameter.Name, cppParameter, $"pStr{stringCounter}"));
498-
}
499-
500-
WriteStringConvertToUnmanaged(writer, cppParameter.Type, cppParameter.Name, stringCounter);
501-
sb.Append($"pStr{stringCounter}");
502-
stringCounter++;
503-
}
504-
}
505-
else if (paramFlags.HasFlag(ParameterFlags.Ref))
506-
{
507-
writer.BeginBlock($"fixed ({cppParameter.Type.CleanName}* p{cppParameter.CleanName} = &{cppParameter.Name})");
508-
sb.Append($"({overload.Parameters[i + offset].Type.Name})p{cppParameter.CleanName}");
509-
blockCounter++;
510-
}
511-
else if (paramFlags.HasFlag(ParameterFlags.Span))
512-
{
513-
writer.BeginBlock($"fixed ({cppParameter.Type.CleanName}* p{cppParameter.CleanName} = {cppParameter.Name})");
514-
sb.Append($"({overload.Parameters[i + offset].Type.Name})p{cppParameter.CleanName}");
515-
blockCounter++;
516-
}
517-
else if (paramFlags.HasFlag(ParameterFlags.Array))
518-
{
519-
writer.BeginBlock($"fixed ({cppParameter.Type.CleanName}* p{cppParameter.CleanName} = {cppParameter.Name})");
520-
sb.Append($"({overload.Parameters[i + offset].Type.Name})p{cppParameter.CleanName}");
521-
blockCounter++;
522-
}
523-
else if (paramFlags.HasFlag(ParameterFlags.Bool) && !paramFlags.HasFlag(ParameterFlags.Ref) && !paramFlags.HasFlag(ParameterFlags.Pointer))
524-
{
525-
sb.Append($"{cppParameter.Name} ? ({config.GetBoolType()})1 : ({config.GetBoolType()})0");
526-
}
527-
else
528-
{
529-
sb.Append(cppParameter.Name);
530-
}
531-
532-
if (i != overload.Parameters.Count - 1 - offset)
533-
{
534-
sb.Append(", ");
535-
}
536-
}
537-
538-
if (csReturnType.IsString)
539-
{
540-
sb.Append("));");
541-
}
542-
else
543-
{
544-
sb.Append(");");
545-
}
546-
547-
if (firstParamReturn)
548-
{
549-
writer.WriteLine($"{csReturnType.Name} ret;");
550-
}
551-
writer.WriteLine(sb.ToString());
552-
553-
while (strings.TryPop(out var stackItem))
554-
{
555-
WriteStringConvertToManaged(writer, stackItem.Item2.Type, stackItem.Item1, stackItem.Item3);
556-
}
557-
558-
while (stringArrays.TryPop(out var arrayName))
559-
{
560-
WriteFreeUnmanagedStringArray(writer, arrayName, stringArrays.Count);
561-
}
562-
563-
while (stringCounter > 0)
564-
{
565-
stringCounter--;
566-
WriteFreeString(writer, stringCounter);
567-
}
568-
569-
if (firstParamReturn || !csReturnType.IsVoid || csReturnType.IsVoid && csReturnType.IsPointer)
570-
{
571-
if (csReturnType.IsBool && !csReturnType.IsPointer && !hasManaged)
572-
{
573-
writer.WriteLine("return ret != 0;");
574-
}
575-
else
576-
{
577-
writer.WriteLine("return ret;");
578-
}
579-
}
580-
581-
while (blockCounter > 0)
582-
{
583-
blockCounter--;
584-
writer.EndBlock();
585-
}
586-
}
587-
588-
writer.WriteLine();
589-
}
590-
591-
private readonly List<IParameterWriter> parameterWriters =
379+
public virtual List<IParameterWriter> ParameterWriters { get; } =
592380
[
593381
new HandleParameterWriter(),
594382
new UseThisParameterWriter(),
@@ -601,31 +389,29 @@ protected virtual void WriteFunction(GenContext context, HashSet<string> defined
601389
new FallthroughParameterWriter(),
602390
];
603391

604-
public IReadOnlyList<IParameterWriter> ParameterWriters => parameterWriters;
605-
606392
public void AddParamterWriter(IParameterWriter writer)
607393
{
608-
parameterWriters.Add(writer);
609-
parameterWriters.Sort(new ParameterPriorityComparer());
394+
ParameterWriters.Add(writer);
395+
ParameterWriters.Sort(new ParameterPriorityComparer());
610396
}
611397

612398
public void RemoveParamterWriter(IParameterWriter writer)
613399
{
614-
parameterWriters.Remove(writer);
400+
ParameterWriters.Remove(writer);
615401
}
616402

617403
public void OverwriteParameterWriter<T>(IParameterWriter newWriter) where T : IParameterWriter
618404
{
619-
for (int i = 0; i < parameterWriters.Count; i++)
405+
for (int i = 0; i < ParameterWriters.Count; i++)
620406
{
621-
var writer = parameterWriters[i];
407+
var writer = ParameterWriters[i];
622408
if (writer is T)
623409
{
624-
parameterWriters[i] = newWriter;
410+
ParameterWriters[i] = newWriter;
625411
break;
626412
}
627413
}
628-
parameterWriters.Sort(new ParameterPriorityComparer());
414+
ParameterWriters.Sort(new ParameterPriorityComparer());
629415
}
630416

631417
protected virtual void WriteFunctionEx(GenContext context, HashSet<string> definedFunctions, CsFunction function, CsFunctionOverload overload, CsFunctionVariation variation, WriteFunctionFlags flags, params string[] modifiers)
@@ -703,7 +489,7 @@ protected virtual void WriteFunctionEx(GenContext context, HashSet<string> defin
703489
cppParameter = param;
704490
}
705491

706-
foreach (var parameterWriter in parameterWriters)
492+
foreach (var parameterWriter in ParameterWriters)
707493
{
708494
if (parameterWriter.CanWrite(writerContext, overload.Parameters[i + offset], cppParameter, paramFlags, i, offset))
709495
{

HexaGen/CsCodeGenerator.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using CppAst;
44
using HexaGen.Core.CSharp;
55
using HexaGen.Core.Logging;
6+
using HexaGen.FunctionGeneration;
67
using HexaGen.Metadata;
78
using HexaGen.Patching;
89
using System.Text.Json;
@@ -19,7 +20,7 @@ public static CsCodeGenerator Create(string configPath)
1920
return new(CsCodeGeneratorConfig.Load(configPath));
2021
}
2122

22-
public CsCodeGenerator(CsCodeGeneratorConfig config) : this(config, new(config))
23+
public CsCodeGenerator(CsCodeGeneratorConfig config) : this(config, FunctionGenerator.CreateDefault(config))
2324
{
2425
}
2526

HexaGen/CsComCodeGenerator.Extensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ protected virtual void WriteExtensionsForCOMObject(GenContext context, CppClass
129129
var csName = config.GetExtensionName(csFunctionName, extensionPrefix);
130130

131131
CreateCsFunction(cppFunction, CsFunctionKind.Extension, csName, commands, out var overload);
132-
funcGen.GenerateCOMVariations(cppFunction.Parameters, overload);
132+
funcGen.GenerateVariations(cppFunction.Parameters, overload);
133133

134134
if (!MemberFunctions.TryGetValue(targetClass.Name, out var definedExtensions))
135135
{

0 commit comments

Comments
 (0)