diff --git a/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs b/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs index 0d2fc680..80485071 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}"; + name = pointerIndirectionLevel switch { + 0 => $"To{returnTypeName}", + 1 => $"To{returnTypeName}Pointer", + 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 a187c518..13730c79 100644 --- a/tests/ClangSharp.PInvokeGenerator.UnitTests/Base/CXXMethodDeclarationCSharpTest.cs +++ b/tests/ClangSharp.PInvokeGenerator.UnitTests/Base/CXXMethodDeclarationCSharpTest.cs @@ -96,24 +96,59 @@ protected override Task ConversionTestImpl() var inputContents = @"struct MyStruct { int value; - + int* pointer; + int** pointer2; + int*** pointer3; operator int() { return value; } + operator int*() + { + return pointer; + } + operator int**() + { + return pointer2; + } + operator int***() + { + return pointer3; + } }; "; 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*** pointer3; + public int ToInt32() { return value; } + + public int* ToInt32Pointer() + { + return pointer; + } + + public int** ToInt32PointerPointer() + { + return pointer2; + } + + public int*** ToInt32PointerPointerPointer() + { + return pointer3; + } } } ";