From 174c2bbbc366ad57c225f451b196ad435a2efcf2 Mon Sep 17 00:00:00 2001 From: ds5678 <49847914+ds5678@users.noreply.github.com> Date: Tue, 28 Oct 2025 12:24:50 -0700 Subject: [PATCH 1/4] Improve method naming for conversions to pointers --- .../ClangSharp.PInvokeGenerator/PInvokeGenerator.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs b/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs index 0d2fc680..e9386946 100644 --- a/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs +++ b/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs @@ -6581,9 +6581,20 @@ private bool TryRemapOperatorName(ref string name, FunctionDecl functionDecl) if (functionDecl is CXXConversionDecl) { var returnType = functionDecl.ReturnType; + var pointerIndirectionLevel = 0; + while (returnType is PointerType pointerType) + { + pointerIndirectionLevel++; + returnType = pointerType.PointeeType; + } var returnTypeName = GetRemappedTypeName(cursor: null, context: null, returnType, out _, skipUsing: true); - name = $"To{returnTypeName}"; + var pointerSuffix = ""; + if (pointerIndirectionLevel > 0) + { + pointerSuffix = string.Concat(Enumerable.Repeat("Pointer", pointerIndirectionLevel)); + } + name = $"To{returnTypeName}{pointerSuffix}"; return true; } From 8d14e325d3eb3cd0c89721364cc6b6a9c90ea221 Mon Sep 17 00:00:00 2001 From: ds5678 <49847914+ds5678@users.noreply.github.com> Date: Tue, 28 Oct 2025 13:34:26 -0700 Subject: [PATCH 2/4] Use more efficient name creation and update testing framework --- .../ClangSharp.PInvokeGenerator/PInvokeGenerator.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs b/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs index e9386946..8a5c5f3b 100644 --- a/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs +++ b/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs @@ -6589,12 +6589,11 @@ private bool TryRemapOperatorName(ref string name, FunctionDecl functionDecl) } var returnTypeName = GetRemappedTypeName(cursor: null, context: null, returnType, out _, skipUsing: true); - var pointerSuffix = ""; - if (pointerIndirectionLevel > 0) - { - pointerSuffix = string.Concat(Enumerable.Repeat("Pointer", pointerIndirectionLevel)); - } - name = $"To{returnTypeName}{pointerSuffix}"; + name = pointerIndirectionLevel switch { + 0 => $"To{returnTypeName}", + 1 => $"To{returnTypeName}Pointer", + _ => $"To{returnTypeName}Pointer{pointerIndirectionLevel}" + }; return true; } From e044126abf33d4042242b9419accc1c22eab7e9f Mon Sep 17 00:00:00 2001 From: ds5678 <49847914+ds5678@users.noreply.github.com> Date: Sat, 1 Nov 2025 21:27:24 -0700 Subject: [PATCH 3/4] Reimplement test --- .../Base/CXXMethodDeclarationCSharpTest.cs | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/tests/ClangSharp.PInvokeGenerator.UnitTests/Base/CXXMethodDeclarationCSharpTest.cs b/tests/ClangSharp.PInvokeGenerator.UnitTests/Base/CXXMethodDeclarationCSharpTest.cs index a187c518..54d7a8cb 100644 --- a/tests/ClangSharp.PInvokeGenerator.UnitTests/Base/CXXMethodDeclarationCSharpTest.cs +++ b/tests/ClangSharp.PInvokeGenerator.UnitTests/Base/CXXMethodDeclarationCSharpTest.cs @@ -96,24 +96,47 @@ protected override Task ConversionTestImpl() var inputContents = @"struct MyStruct { int value; - + int* pointer; + int** pointer2; operator int() { return value; } + operator int*() + { + return pointer; + } + operator int**() + { + return pointer2; + } }; "; var expectedOutputContents = @"namespace ClangSharp.Test { - public partial struct MyStruct + public unsafe partial struct MyStruct { public int value; + public int* pointer; + + public int** pointer2; + public int ToInt32() { return value; } + + public int* ToInt32Pointer() + { + return pointer; + } + + public int** ToInt32Pointer2() + { + return pointer2; + } } } "; From c59edc7f3d87f14ae0b893a604d2d817046a169e Mon Sep 17 00:00:00 2001 From: ds5678 <49847914+ds5678@users.noreply.github.com> Date: Wed, 12 Nov 2025 11:01:31 -0800 Subject: [PATCH 4/4] Address feedback --- .../PInvokeGenerator.cs | 3 ++- .../Base/CXXMethodDeclarationCSharpTest.cs | 14 +++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs b/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs index 8a5c5f3b..80485071 100644 --- a/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs +++ b/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs @@ -6592,7 +6592,8 @@ private bool TryRemapOperatorName(ref string name, FunctionDecl functionDecl) name = pointerIndirectionLevel switch { 0 => $"To{returnTypeName}", 1 => $"To{returnTypeName}Pointer", - _ => $"To{returnTypeName}Pointer{pointerIndirectionLevel}" + 2 => $"To{returnTypeName}PointerPointer", + _ => $"To{returnTypeName}{string.Concat(Enumerable.Repeat("Pointer", pointerIndirectionLevel))}" }; return true; } diff --git a/tests/ClangSharp.PInvokeGenerator.UnitTests/Base/CXXMethodDeclarationCSharpTest.cs b/tests/ClangSharp.PInvokeGenerator.UnitTests/Base/CXXMethodDeclarationCSharpTest.cs index 54d7a8cb..13730c79 100644 --- a/tests/ClangSharp.PInvokeGenerator.UnitTests/Base/CXXMethodDeclarationCSharpTest.cs +++ b/tests/ClangSharp.PInvokeGenerator.UnitTests/Base/CXXMethodDeclarationCSharpTest.cs @@ -98,6 +98,7 @@ protected override Task ConversionTestImpl() int value; int* pointer; int** pointer2; + int*** pointer3; operator int() { return value; @@ -110,6 +111,10 @@ operator int() { return pointer2; } + operator int***() + { + return pointer3; + } }; "; @@ -123,6 +128,8 @@ public unsafe partial struct MyStruct public int** pointer2; + public int*** pointer3; + public int ToInt32() { return value; @@ -133,10 +140,15 @@ public int ToInt32() return pointer; } - public int** ToInt32Pointer2() + public int** ToInt32PointerPointer() { return pointer2; } + + public int*** ToInt32PointerPointerPointer() + { + return pointer3; + } } } ";