Skip to content

Commit 7e49136

Browse files
committed
Improvements.
1 parent cb5fabc commit 7e49136

File tree

8 files changed

+64
-16
lines changed

8 files changed

+64
-16
lines changed

HexaGen/CsCodeGenerator.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,20 @@ public virtual bool Generate(List<string> headerFiles, string outputPath)
116116
return Generate(compilation, headerFiles, outputPath);
117117
}
118118

119+
public virtual bool Generate(CppParserOptions parserOptions, string headerFile, string outputPath)
120+
{
121+
var compilation = CppParser.ParseFile(headerFile, parserOptions);
122+
123+
return Generate(compilation, [headerFile], outputPath);
124+
}
125+
126+
public virtual bool Generate(CppParserOptions parserOptions, List<string> headerFiles, string outputPath)
127+
{
128+
var compilation = CppParser.ParseFiles(headerFiles, parserOptions);
129+
130+
return Generate(compilation, headerFiles, outputPath);
131+
}
132+
119133
public virtual bool Generate(CppCompilation compilation, List<string> headerFiles, string outputPath)
120134
{
121135
metadata = new();

HexaGen/CsCodeGeneratorConfig.Types.cs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,16 +369,31 @@ private string GetCsTypeNameInternal(CppPointerType pointerType)
369369
return GetCsTypeNameInternal(pointerType.ElementType, true);
370370
}
371371

372-
public string MakeDelegatePointer(CppFunctionType functionType)
372+
public string MakeDelegatePointer(CppFunctionType functionType, bool withConvention=false)
373373
{
374-
if (functionType.Parameters.Count == 0)
374+
if (withConvention)
375375
{
376-
return $"delegate*<{GetCsTypeNameInternal(functionType.ReturnType)}>";
376+
if (functionType.Parameters.Count == 0)
377+
{
378+
return $"delegate* unmanaged[{functionType.CallingConvention.GetCallingConventionDelegate()}]<{GetCsTypeNameInternal(functionType.ReturnType)}>";
379+
}
380+
else
381+
{
382+
return $"delegate* unmanaged[{functionType.CallingConvention.GetCallingConventionDelegate()}]<{GetNamelessParameterSignature(functionType.Parameters, false, true)}, {GetCsTypeNameInternal(functionType.ReturnType)}>";
383+
}
377384
}
378385
else
379386
{
380-
return $"delegate*<{GetNamelessParameterSignature(functionType.Parameters, false, true)}, {GetCsTypeNameInternal(functionType.ReturnType)}>";
387+
if (functionType.Parameters.Count == 0)
388+
{
389+
return $"delegate*<{GetCsTypeNameInternal(functionType.ReturnType)}>";
390+
}
391+
else
392+
{
393+
return $"delegate*<{GetNamelessParameterSignature(functionType.Parameters, false, true)}, {GetCsTypeNameInternal(functionType.ReturnType)}>";
394+
}
381395
}
396+
382397
}
383398

384399
private string GetCsTypeNameInternal(CppPrimitiveType primitiveType, bool isPointer)

HexaGen/FormatHelper.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,11 @@ public static bool IsString(this CppType cppType, bool isPointer = false)
327327
return IsString(qualified.ElementType, isPointer);
328328
}
329329

330+
if (cppType is CppTypedef typedef)
331+
{
332+
return IsString(typedef.ElementType, isPointer);
333+
}
334+
330335
if (isPointer && cppType is CppPrimitiveType primitive)
331336
{
332337
return primitive.Kind == CppPrimitiveKind.WChar || primitive.Kind == CppPrimitiveKind.Char;
@@ -418,6 +423,11 @@ public static CppPrimitiveKind GetPrimitiveKind(this CppType cppType, bool isPoi
418423
return GetPrimitiveKind(qualified.ElementType, isPointer);
419424
}
420425

426+
if (cppType is CppTypedef typedef)
427+
{
428+
return GetPrimitiveKind(typedef.ElementType, isPointer);
429+
}
430+
421431
if (isPointer && cppType is CppPrimitiveType primitive)
422432
{
423433
return primitive.Kind;

HexaGen/FunctionGeneration/FunctionGenerator.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,14 @@ public virtual void GenerateVariations(IList<CppParameter> parameters, CsFunctio
253253
}
254254
}
255255

256-
foreach (var valueVariation in GenerateAdditionalOverloads(function.Name, parameterLists))
256+
if (settings.GenerateAdditionalOverloads)
257257
{
258-
if (function.TryAddVariation(valueVariation, out var variation))
258+
foreach (var valueVariation in GenerateAdditionalOverloads(function.Name, parameterLists))
259259
{
260-
ApplySteps(function, variation);
260+
if (function.TryAddVariation(valueVariation, out var variation))
261+
{
262+
ApplySteps(function, variation);
263+
}
261264
}
262265
}
263266

HexaGen/GenerationSteps/FunctionGenerationStep.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public override void Generate(CppCompilation compilation, string outputPath, CsC
167167
bool boolReturn = returnCsName == "bool";
168168
bool canUseOut = OutReturnFunctions.Contains(cppFunction.Name);
169169
var argumentsString = config.GetParameterSignature(cppFunction.Parameters, canUseOut, config.GenerateMetadata);
170-
var headerId = $"{csName}({config.GetParameterSignature(cppFunction.Parameters, canUseOut, false)})";
170+
var headerId = $"{csName}({config.GetParameterSignature(cppFunction.Parameters, canUseOut, false, false)})";
171171
var header = $"{returnCsName} {csName}Native({argumentsString})";
172172

173173
if (FilterNativeFunction(context, cppFunction, headerId))

HexaGen/GenerationSteps/TypeGenerationStep.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -480,15 +480,18 @@ protected virtual void WriteConstructor(GenContext context, HashSet<string> defi
480480
}
481481
}
482482
}
483-
else if (cppField.Type.IsDelegate())
483+
else if (cppField.Type.IsDelegate(out var cppFunction))
484484
{
485+
int depth = 0;
486+
cppField.Type.IsPointer(ref depth);
487+
string delegateType = $"({config.MakeDelegatePointer(cppFunction, false)}{new string('*', depth)})";
485488
if (cppParameter.Type.Name.StartsWith("delegate*<"))
486-
{
487-
writer.WriteLine($"{fieldName} = (void*){cppParameter.Name};");
489+
{
490+
writer.WriteLine($"{fieldName} = {delegateType}{cppParameter.Name};");
488491
}
489492
else
490493
{
491-
writer.WriteLine($"{fieldName} = (void*)Marshal.GetFunctionPointerForDelegate({cppParameter.Name});");
494+
writer.WriteLine($"{fieldName} = {delegateType}Marshal.GetFunctionPointerForDelegate({cppParameter.Name});");
492495
}
493496
}
494497
else if (paramFlags.HasFlag(ParameterFlags.Bool) && !paramFlags.HasFlag(ParameterFlags.Ref) && !paramFlags.HasFlag(ParameterFlags.Pointer))

HexaGen/HexaGen.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
88

99
<AssemblyVersion>1.1.1</AssemblyVersion>
10-
<PackageVersion>1.1.10</PackageVersion>
10+
<PackageVersion>1.1.12-rc3</PackageVersion>
1111
<Description></Description>
1212
<PackageTags></PackageTags>
1313
<Authors>Juna Meinhold</Authors>

HexaGen/Patching/ConstantsToEnumPatch.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ protected override void PatchCompilation(CsCodeGeneratorConfig settings, CppComp
3131
{
3232
keyEnums.Add(macro);
3333
itemNames.Add(macro.Name);
34-
settings.IgnoredConstants.Add(macro.Name);
3534
}
3635
}
3736

@@ -45,9 +44,12 @@ protected override void PatchCompilation(CsCodeGeneratorConfig settings, CppComp
4544
var itemName = settings.GetEnumName(macro.Name, prefix);
4645

4746
string csValue = macro.Value;
48-
if (csValue.IsNumeric(NumberParseOptions.All))
47+
if (csValue.IsNumeric(out var numberType, NumberParseOptions.All))
4948
{
50-
// nothing to do.
49+
if (numberType == NumberType.AnyFloat)
50+
{
51+
continue;
52+
}
5153
}
5254
else if (csValue.IsConstantExpression())
5355
{
@@ -76,6 +78,7 @@ protected override void PatchCompilation(CsCodeGeneratorConfig settings, CppComp
7678

7779
CsEnumItemMetadata itemMeta = new(macro.Name, macro.Value, itemName, csValue, [], null);
7880
metadata.Items.Add(itemMeta);
81+
settings.IgnoredConstants.Add(macro.Name);
7982
}
8083
settings.CustomEnums.Add(metadata);
8184
}

0 commit comments

Comments
 (0)