From 15ecf3bbbd9109e9ca59435b7e25968ebec839d9 Mon Sep 17 00:00:00 2001
From: Deadlocklogic <deadlocklogic@gmail.com>
Date: Tue, 5 Dec 2023 07:53:44 +0200
Subject: [PATCH] TypeMap: refactor CSharp backend into common methods +
 migration

---
 src/Generator/AST/Utils.cs                    |  2 +-
 .../Generators/CSharp/CSharpMarshal.cs        |  4 +-
 .../Generators/CSharp/CSharpSources.cs        |  2 +-
 .../Generators/CSharp/CSharpTypePrinter.cs    | 20 ++---
 src/Generator/Generators/ExtensionMethods.cs  |  7 +-
 src/Generator/Passes/ExpressionHelper.cs      | 12 +--
 src/Generator/Passes/ValidateOperatorsPass.cs |  4 +-
 src/Generator/Types/Std/Stdlib.CLI.cs         | 35 ++++----
 src/Generator/Types/Std/Stdlib.CSharp.cs      | 82 +++++++++----------
 src/Generator/Types/TypeMap.cs                | 26 +-----
 tests/dotnet/CSharp/CSharp.Gen.cs             | 36 ++++----
 tests/dotnet/Common/Common.Gen.cs             | 62 +++++++-------
 12 files changed, 132 insertions(+), 160 deletions(-)

diff --git a/src/Generator/AST/Utils.cs b/src/Generator/AST/Utils.cs
index 9074614a..e5a31070 100644
--- a/src/Generator/AST/Utils.cs
+++ b/src/Generator/AST/Utils.cs
@@ -207,7 +207,7 @@ namespace CppSharp.AST
                 return false;
 
             var typePrinterContext = new TypePrinterContext { Type = type };
-            var mappedTo = typeMap.CSharpSignatureType(typePrinterContext);
+            var mappedTo = typeMap.SignatureType(typePrinterContext);
             mappedTo = mappedTo.Desugar();
             mappedTo = (mappedTo.GetFinalPointee() ?? mappedTo).Desugar();
             return (mappedTo.IsPrimitiveType() ||
diff --git a/src/Generator/Generators/CSharp/CSharpMarshal.cs b/src/Generator/Generators/CSharp/CSharpMarshal.cs
index 09ced7d1..3dfbd1e8 100644
--- a/src/Generator/Generators/CSharp/CSharpMarshal.cs
+++ b/src/Generator/Generators/CSharp/CSharpMarshal.cs
@@ -45,7 +45,7 @@ namespace CppSharp.Generators.CSharp
             TypeMap typeMap;
             if (Context.Context.TypeMaps.FindTypeMap(type, out typeMap) && typeMap.DoesMarshalling)
             {
-                typeMap.CSharpMarshalToManaged(Context);
+                typeMap.MarshalToManaged(Context);
                 return false;
             }
 
@@ -471,7 +471,7 @@ namespace CppSharp.Generators.CSharp
             TypeMap typeMap;
             if (Context.Context.TypeMaps.FindTypeMap(type, out typeMap) && typeMap.DoesMarshalling)
             {
-                typeMap.CSharpMarshalToNative(Context);
+                typeMap.MarshalToNative(Context);
                 return false;
             }
 
diff --git a/src/Generator/Generators/CSharp/CSharpSources.cs b/src/Generator/Generators/CSharp/CSharpSources.cs
index 8623ad3c..d8152864 100644
--- a/src/Generator/Generators/CSharp/CSharpSources.cs
+++ b/src/Generator/Generators/CSharp/CSharpSources.cs
@@ -3158,7 +3158,7 @@ internal static{(@new ? " new" : string.Empty)} {printedClass} __GetInstance({Ty
                             Type = indirectRetType.Type.Desugar()
                         };
 
-                        WriteLine("{0} {1};", typeMap.CSharpSignatureType(typePrinterContext),
+                        WriteLine("{0} {1};", typeMap.SignatureType(typePrinterContext),
                             Helpers.ReturnIdentifier);
                     }
                     else
diff --git a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs
index 1453adb1..9b1b8553 100644
--- a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs
+++ b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs
@@ -36,7 +36,7 @@ namespace CppSharp.Generators.CSharp
                 return string.Empty;
 
             TypeMap typeMap;
-            if (TypeMapDatabase.FindTypeMap(tag, out typeMap))
+            if (TypeMapDatabase.FindTypeMap(tag, GeneratorKind.CSharp, out typeMap))
             {
                 typeMap.Type = tag;
 
@@ -47,7 +47,7 @@ namespace CppSharp.Generators.CSharp
                     Type = tag
                 };
 
-                return typeMap.CSharpSignatureType(typePrinterContext).ToString();
+                return typeMap.SignatureType(typePrinterContext).ToString();
             }
 
             return base.VisitTagType(tag, quals);
@@ -150,7 +150,7 @@ namespace CppSharp.Generators.CSharp
         public override TypePrinterResult VisitBuiltinType(BuiltinType builtin, TypeQualifiers quals)
         {
             TypeMap typeMap;
-            if (TypeMapDatabase.FindTypeMap(builtin, out typeMap))
+            if (TypeMapDatabase.FindTypeMap(builtin, GeneratorKind.CSharp, out typeMap))
             {
                 var typePrinterContext = new TypePrinterContext()
                 {
@@ -159,7 +159,7 @@ namespace CppSharp.Generators.CSharp
                     Type = builtin,
                     Parameter = Parameter
                 };
-                return typeMap.CSharpSignatureType(typePrinterContext).Visit(this);
+                return typeMap.SignatureType(typePrinterContext).Visit(this);
             }
             return base.VisitBuiltinType(builtin, quals);
         }
@@ -183,7 +183,7 @@ namespace CppSharp.Generators.CSharp
             if (allowStrings && pointer.IsConstCharString())
             {
                 TypeMap typeMap;
-                TypeMapDatabase.FindTypeMap(pointer, out typeMap);
+                TypeMapDatabase.FindTypeMap(pointer, GeneratorKind.CSharp, out typeMap);
                 var typePrinterContext = new TypePrinterContext()
                 {
                     Kind = ContextKind,
@@ -191,7 +191,7 @@ namespace CppSharp.Generators.CSharp
                     Type = pointer.Pointee,
                     Parameter = Parameter
                 };
-                return typeMap.CSharpSignatureType(typePrinterContext).Visit(this);
+                return typeMap.SignatureType(typePrinterContext).Visit(this);
             }
 
             var pointee = pointer.Pointee.Desugar();
@@ -258,7 +258,7 @@ namespace CppSharp.Generators.CSharp
             var decl = typedef.Declaration;
 
             TypeMap typeMap;
-            if (TypeMapDatabase.FindTypeMap(typedef, out typeMap))
+            if (TypeMapDatabase.FindTypeMap(typedef, GeneratorKind.CSharp, out typeMap))
             {
                 typeMap.Type = typedef;
 
@@ -270,7 +270,7 @@ namespace CppSharp.Generators.CSharp
                     Parameter = Parameter
                 };
 
-                return typeMap.CSharpSignatureType(typePrinterContext).ToString();
+                return typeMap.SignatureType(typePrinterContext).ToString();
             }
 
             FunctionType func;
@@ -299,7 +299,7 @@ namespace CppSharp.Generators.CSharp
                 template.Template.TemplatedDecl;
 
             TypeMap typeMap;
-            if (!TypeMapDatabase.FindTypeMap(template, out typeMap))
+            if (!TypeMapDatabase.FindTypeMap(template, GeneratorKind.CSharp, out typeMap))
             {
                 if (ContextKind == TypePrinterContextKind.Managed &&
                     decl == template.Template.TemplatedDecl &&
@@ -330,7 +330,7 @@ namespace CppSharp.Generators.CSharp
                 MarshalKind = MarshalKind
             };
 
-            return typeMap.CSharpSignatureType(typePrinterContext).ToString();
+            return typeMap.SignatureType(typePrinterContext).ToString();
         }
 
         public override TypePrinterResult VisitDependentTemplateSpecializationType(
diff --git a/src/Generator/Generators/ExtensionMethods.cs b/src/Generator/Generators/ExtensionMethods.cs
index 3e4e9e27..c24a4703 100644
--- a/src/Generator/Generators/ExtensionMethods.cs
+++ b/src/Generator/Generators/ExtensionMethods.cs
@@ -63,12 +63,9 @@ namespace CppSharp.Generators
                     Type = typeMap.Type
                 };
 
-                switch (generatorKind)
+                if (generatorKind == GeneratorKind.CLI || generatorKind == GeneratorKind.CSharp)
                 {
-                    case var _ when ReferenceEquals(generatorKind, GeneratorKind.CLI):
-                        return typeMap.SignatureType(typePrinterContext).Desugar();
-                    case var _ when ReferenceEquals(generatorKind, GeneratorKind.CSharp):
-                        return typeMap.CSharpSignatureType(typePrinterContext).Desugar();
+                    return typeMap.SignatureType(typePrinterContext).Desugar();
                 }
             }
 
diff --git a/src/Generator/Passes/ExpressionHelper.cs b/src/Generator/Passes/ExpressionHelper.cs
index 435dbcf6..be5e924d 100644
--- a/src/Generator/Passes/ExpressionHelper.cs
+++ b/src/Generator/Passes/ExpressionHelper.cs
@@ -68,9 +68,9 @@ namespace CppSharp.Internal
 
         public static System.Type GetSystemType(BindingContext context, Type type)
         {
-            if (context.TypeMaps.FindTypeMap(type, out TypeMap typeMap))
+            if (context.TypeMaps.FindTypeMap(type, GeneratorKind.CSharp, out TypeMap typeMap))
             {
-                var cilType = typeMap.CSharpSignatureType(new TypePrinterContext { Type = type, Kind = TypePrinterContextKind.Managed }) as CILType;
+                var cilType = typeMap.SignatureType(new TypePrinterContext { Type = type, Kind = TypePrinterContextKind.Managed }) as CILType;
                 if (cilType != null)
                     return cilType.Type;
             }
@@ -239,7 +239,7 @@ namespace CppSharp.Internal
             var typePrinterResult = type.Visit(typePrinter);
 
             TypeMap typeMap;
-            if (context.TypeMaps.FindTypeMap(type, out typeMap))
+            if (context.TypeMaps.FindTypeMap(type, GeneratorKind.CSharp, out typeMap))
             {
                 var typePrinterContext = new TypePrinterContext()
                 {
@@ -248,7 +248,7 @@ namespace CppSharp.Internal
                     Type = type
                 };
 
-                var typeInSignature = typeMap.CSharpSignatureType(typePrinterContext)
+                var typeInSignature = typeMap.SignatureType(typePrinterContext)
                     .SkipPointerRefs().Desugar();
 
                 Enumeration @enum;
@@ -413,7 +413,7 @@ namespace CppSharp.Internal
 
         private static bool CheckForString(BindingContext context, Type desugared, ref string result)
         {
-            if (context.TypeMaps.FindTypeMap(desugared, out TypeMap typeMap))
+            if (context.TypeMaps.FindTypeMap(desugared, GeneratorKind.CSharp, out TypeMap typeMap))
             {
                 var typePrinterContext = new TypePrinterContext()
                 {
@@ -422,7 +422,7 @@ namespace CppSharp.Internal
                     Type = desugared
                 };
 
-                var typeInSignature = typeMap.CSharpSignatureType(typePrinterContext)
+                var typeInSignature = typeMap.SignatureType(typePrinterContext)
                     .SkipPointerRefs().Desugar();
 
                 if (typeInSignature is CILType managed && managed.Type == typeof(string))
diff --git a/src/Generator/Passes/ValidateOperatorsPass.cs b/src/Generator/Passes/ValidateOperatorsPass.cs
index 49fe8d01..690bb092 100644
--- a/src/Generator/Passes/ValidateOperatorsPass.cs
+++ b/src/Generator/Passes/ValidateOperatorsPass.cs
@@ -90,9 +90,9 @@ namespace CppSharp.Passes
                                 return type.IsPrimitiveType(PrimitiveType.Int);
                             case var _ when ReferenceEquals(kind, GeneratorKind.CSharp):
                                 Types.TypeMap typeMap;
-                                if (Context.TypeMaps.FindTypeMap(type, out typeMap))
+                                if (Context.TypeMaps.FindTypeMap(type, GeneratorKind.CSharp, out typeMap))
                                 {
-                                    var mappedTo = typeMap.CSharpSignatureType(
+                                    var mappedTo = typeMap.SignatureType(
                                         new TypePrinterContext
                                         {
                                             Parameter = parameter,
diff --git a/src/Generator/Types/Std/Stdlib.CLI.cs b/src/Generator/Types/Std/Stdlib.CLI.cs
index 554ae09b..454a4523 100644
--- a/src/Generator/Types/Std/Stdlib.CLI.cs
+++ b/src/Generator/Types/Std/Stdlib.CLI.cs
@@ -5,12 +5,11 @@ using CppSharp.Generators;
 using CppSharp.Generators.AST;
 using CppSharp.Generators.C;
 using CppSharp.Generators.CLI;
-using CppSharp.Generators.CSharp;
 
-namespace CppSharp.Types.Std
+namespace CppSharp.Types.Std.CLI
 {
     [TypeMap("const char*", GeneratorKindID = GeneratorKind.CLI_ID)]
-    public partial class ConstCharPointer : TypeMap
+    public class ConstCharPointer : TypeMap
     {
         public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
@@ -57,33 +56,32 @@ namespace CppSharp.Types.Std
                     $"{Context.Options.Encoding.EncodingName} is not supported yet.");
 
             ctx.Return.Write(
-                $@"({ctx.ReturnVarName} == 0 ? nullptr : clix::marshalString<clix::{
-                    param}>({ctx.ReturnVarName}))");
+                $@"({ctx.ReturnVarName} == 0 ? nullptr : clix::marshalString<clix::{param}>({ctx.ReturnVarName}))");
         }
     }
 
     [TypeMap("const char[]", GeneratorKindID = GeneratorKind.CLI_ID)]
-    public partial class ConstCharArray : ConstCharPointer
+    public class ConstCharArray : ConstCharPointer
     {
     }
 
     [TypeMap("const wchar_t*", GeneratorKindID = GeneratorKind.CLI_ID)]
-    public partial class ConstWCharTPointer : ConstCharPointer
+    public class ConstWCharTPointer : ConstCharPointer
     {
     }
 
     [TypeMap("const char16_t*", GeneratorKindID = GeneratorKind.CLI_ID)]
-    public partial class ConstChar16TPointer : ConstCharPointer
+    public class ConstChar16TPointer : ConstCharPointer
     {
     }
 
     [TypeMap("const char32_t*", GeneratorKindID = GeneratorKind.CLI_ID)]
-    public partial class ConstChar32TPointer : ConstCharPointer
+    public class ConstChar32TPointer : ConstCharPointer
     {
     }
 
     [TypeMap("basic_string<char, char_traits<char>, allocator<char>>", GeneratorKindID = GeneratorKind.CLI_ID)]
-    public partial class String : TypeMap
+    public class String : TypeMap
     {
         public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
@@ -104,7 +102,7 @@ namespace CppSharp.Types.Std
     }
 
     [TypeMap("std::wstring", GeneratorKindID = GeneratorKind.CLI_ID)]
-    public partial class WString : TypeMap
+    public class WString : TypeMap
     {
         public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
@@ -125,7 +123,7 @@ namespace CppSharp.Types.Std
     }
 
     [TypeMap("std::vector", GeneratorKindID = GeneratorKind.CLI_ID)]
-    public partial class Vector : TypeMap
+    public class Vector : TypeMap
     {
         public override bool IsIgnored
         {
@@ -259,7 +257,7 @@ namespace CppSharp.Types.Std
     }
 
     [TypeMap("std::map", GeneratorKindID = GeneratorKind.CLI_ID)]
-    public partial class Map : TypeMap
+    public class Map : TypeMap
     {
         public override bool IsIgnored { get { return true; } }
 
@@ -267,8 +265,7 @@ namespace CppSharp.Types.Std
         {
             var type = Type as TemplateSpecializationType;
             return new CustomType(
-                $@"::System::Collections::Generic::Dictionary<{
-                    type.Arguments[0].Type}, {type.Arguments[1].Type}>^");
+                $@"::System::Collections::Generic::Dictionary<{type.Arguments[0].Type}, {type.Arguments[1].Type}>^");
         }
 
         public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
@@ -283,19 +280,19 @@ namespace CppSharp.Types.Std
     }
 
     [TypeMap("std::list", GeneratorKindID = GeneratorKind.CLI_ID)]
-    public partial class List : TypeMap
+    public class List : TypeMap
     {
         public override bool IsIgnored { get { return true; } }
     }
 
     [TypeMap("std::shared_ptr", GeneratorKindID = GeneratorKind.CLI_ID)]
-    public partial class SharedPtr : TypeMap
+    public class SharedPtr : TypeMap
     {
         public override bool IsIgnored { get { return true; } }
     }
 
     [TypeMap("basic_ostream<char, char_traits<char>>", GeneratorKind.CLI_ID)]
-    public partial class OStream : TypeMap
+    public class OStream : TypeMap
     {
         public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
@@ -315,7 +312,7 @@ namespace CppSharp.Types.Std
     }
 
     [TypeMap("std::nullptr_t", GeneratorKindID = GeneratorKind.CLI_ID)]
-    public partial class NullPtr : TypeMap
+    public class NullPtr : TypeMap
     {
         public override bool DoesMarshalling { get { return false; } }
 
diff --git a/src/Generator/Types/Std/Stdlib.CSharp.cs b/src/Generator/Types/Std/Stdlib.CSharp.cs
index a3c3d6d5..45990513 100644
--- a/src/Generator/Types/Std/Stdlib.CSharp.cs
+++ b/src/Generator/Types/Std/Stdlib.CSharp.cs
@@ -9,46 +9,46 @@ using CppSharp.Generators;
 using CppSharp.Generators.CSharp;
 using Type = CppSharp.AST.Type;
 
-namespace CppSharp.Types.Std
+namespace CppSharp.Types.Std.CSharp
 {
     [TypeMap("int", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class Int : TypeMap
+    public class Int : TypeMap
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx) =>
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind) =>
             CSharpTypePrinter.GetSignedType(Context.TargetInfo.IntWidth);
     }
 
     [TypeMap("unsigned int", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class UnsignedInt : TypeMap
+    public class UnsignedInt : TypeMap
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx) =>
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind) =>
             CSharpTypePrinter.GetUnsignedType(Context.TargetInfo.IntWidth);
     }
 
     [TypeMap("long", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class Long : TypeMap
+    public class Long : TypeMap
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx) =>
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind) =>
             CSharpTypePrinter.GetSignedType(Context.TargetInfo.LongWidth);
     }
 
     [TypeMap("unsigned long", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class UnsignedLong : TypeMap
+    public class UnsignedLong : TypeMap
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx) =>
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind) =>
             CSharpTypePrinter.GetUnsignedType(Context.TargetInfo.LongWidth);
     }
 
     [TypeMap("char", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class Char : TypeMap
+    public class Char : TypeMap
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx)
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
             return new CILType(ctx.Kind == TypePrinterContextKind.Native ||
                 !Context.Options.MarshalCharAsManagedChar ? typeof(sbyte) : typeof(char));
         }
 
-        public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
+        public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
         {
             if (Context.Options.MarshalCharAsManagedChar)
                 ctx.Return.Write("global::System.Convert.ToSByte({0})",
@@ -57,7 +57,7 @@ namespace CppSharp.Types.Std
                 ctx.Return.Write(ctx.Parameter.Name);
         }
 
-        public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
+        public override void MarshalToManaged(MarshalContext ctx, GeneratorKind kind)
         {
             if (Context.Options.MarshalCharAsManagedChar)
                 ctx.Return.Write("global::System.Convert.ToChar({0})",
@@ -68,27 +68,27 @@ namespace CppSharp.Types.Std
     }
 
     [TypeMap("char16_t", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class Char16T : TypeMap
+    public class Char16T : TypeMap
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx)
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
             return new CILType(typeof(char));
         }
     }
 
     [TypeMap("wchar_t", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class WCharT : TypeMap
+    public class WCharT : TypeMap
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx)
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
             return new CILType(typeof(char));
         }
     }
 
     [TypeMap("const char*", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class ConstCharPointer : TypeMap
+    public class ConstCharPointer : TypeMap
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx)
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
             if (ctx.Kind == TypePrinterContextKind.Managed)
                 return new CILType(typeof(string));
@@ -117,7 +117,7 @@ namespace CppSharp.Types.Std
                 $"{Context.Options.Encoding.EncodingName} is not supported yet.");
         }
 
-        public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
+        public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
         {
             string param = ctx.Parameter.Name;
             if (ctx.Parameter.Usage == ParameterUsage.Unknown &&
@@ -194,7 +194,7 @@ namespace CppSharp.Types.Std
             ctx.Return.Write($"{bytePtr}");
         }
 
-        public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
+        public override void MarshalToManaged(MarshalContext ctx, GeneratorKind kind)
         {
             if (ctx.Parameter != null && !ctx.Parameter.IsOut &&
                 !ctx.Parameter.IsInOut)
@@ -282,29 +282,29 @@ namespace CppSharp.Types.Std
     }
 
     [TypeMap("const char[]", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class ConstCharArray : ConstCharPointer
+    public class ConstCharArray : ConstCharPointer
     {
     }
 
     [TypeMap("const wchar_t*", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class ConstWCharTPointer : ConstCharPointer
+    public class ConstWCharTPointer : ConstCharPointer
     {
     }
 
     [TypeMap("const char16_t*", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class ConstChar16TPointer : ConstCharPointer
+    public class ConstChar16TPointer : ConstCharPointer
     {
     }
 
     [TypeMap("const char32_t*", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class ConstChar32TPointer : ConstCharPointer
+    public class ConstChar32TPointer : ConstCharPointer
     {
     }
 
     [TypeMap("basic_string<char, char_traits<char>, allocator<char>>", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class String : TypeMap
+    public class String : TypeMap
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx)
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
             if (ctx.Kind == TypePrinterContextKind.Managed)
                 return new CILType(typeof(string));
@@ -316,7 +316,7 @@ namespace CppSharp.Types.Std
             return new CustomType(basicString.Visit(typePrinter).Type);
         }
 
-        public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
+        public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
         {
             Type type = ctx.Parameter.Type.Desugar();
             ClassTemplateSpecialization basicString = GetBasicString(type);
@@ -334,15 +334,13 @@ namespace CppSharp.Types.Std
                     var = Generator.GeneratedIdentifier(ctx.ArgName);
                     ctx.Before.WriteLine($"fixed (void* {var} = &{ctx.ReturnVarName})");
                     ctx.Before.WriteOpenBraceAndIndent();
-                    ctx.HasCodeBlock = true;
+                    (ctx as CSharpMarshalContext).HasCodeBlock = true;
                 }
                 else
                 {
                     var = $"&{ctx.ReturnVarName}";
                 }
-                ctx.Return.Write($@"{qualifiedBasicString}Extensions.{
-                    Helpers.InternalStruct}.{assign.Name}(new {
-                    typePrinter.IntPtrType}({var}), ");
+                ctx.Return.Write($@"{qualifiedBasicString}Extensions.{Helpers.InternalStruct}.{assign.Name}(new {typePrinter.IntPtrType}({var}), ");
                 if (ctx.Parameter.Type.IsTemplateParameterType())
                     ctx.Return.Write("(string) (object) ");
                 ctx.Return.Write($"{ctx.Parameter.Name})");
@@ -351,22 +349,19 @@ namespace CppSharp.Types.Std
             else
             {
                 var varBasicString = $"__basicString{ctx.ParameterIndex}";
-                ctx.Before.WriteLine($@"var {varBasicString} = new {
-                    basicString.Visit(typePrinter)}();");
+                ctx.Before.WriteLine($@"var {varBasicString} = new {basicString.Visit(typePrinter)}();");
 
-                ctx.Before.Write($@"{qualifiedBasicString}Extensions.{
-                    assign.Name}({varBasicString}, ");
+                ctx.Before.Write($@"{qualifiedBasicString}Extensions.{assign.Name}({varBasicString}, ");
                 if (ctx.Parameter.Type.IsTemplateParameterType())
                     ctx.Before.Write("(string) (object) ");
                 ctx.Before.WriteLine($"{ctx.Parameter.Name});");
 
                 ctx.Return.Write($"{varBasicString}.{Helpers.InstanceIdentifier}");
-                ctx.Cleanup.WriteLine($@"{varBasicString}.Dispose({
-                    (!Type.IsAddress() || ctx.Parameter?.IsIndirect == true ? "disposing: true, callNativeDtor:false" : string.Empty)});");
+                ctx.Cleanup.WriteLine($@"{varBasicString}.Dispose({(!Type.IsAddress() || ctx.Parameter?.IsIndirect == true ? "disposing: true, callNativeDtor:false" : string.Empty)});");
             }
         }
 
-        public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
+        public override void MarshalToManaged(MarshalContext ctx, GeneratorKind kind)
         {
             var type = Type.Desugar(resolveTemplateSubstitution: false);
             ClassTemplateSpecialization basicString = GetBasicString(type);
@@ -376,10 +371,7 @@ namespace CppSharp.Types.Std
             string varBasicString = $"__basicStringRet{ctx.ParameterIndex}";
             bool usePointer = type.IsAddress() || ctx.MarshalKind == MarshalKind.NativeField ||
                 ctx.MarshalKind == MarshalKind.ReturnVariableArray;
-            ctx.Before.WriteLine($@"var {varBasicString} = {
-                basicString.Visit(typePrinter)}.{Helpers.CreateInstanceIdentifier}({
-                (usePointer ? string.Empty : $"new {typePrinter.IntPtrType}(&")}{
-                 ctx.ReturnVarName}{(usePointer ? string.Empty : ")")});");
+            ctx.Before.WriteLine($@"var {varBasicString} = {basicString.Visit(typePrinter)}.{Helpers.CreateInstanceIdentifier}({(usePointer ? string.Empty : $"new {typePrinter.IntPtrType}(&")}{ctx.ReturnVarName}{(usePointer ? string.Empty : ")")});");
             string @string = $"{qualifiedBasicString}Extensions.{data.Name}({varBasicString})";
             if (usePointer)
             {
@@ -421,9 +413,9 @@ namespace CppSharp.Types.Std
     }
 
     [TypeMap("FILE", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public partial class FILE : TypeMap
+    public class FILE : TypeMap
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx)
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
             return new CILType(typeof(System.IntPtr));
         }
diff --git a/src/Generator/Types/TypeMap.cs b/src/Generator/Types/TypeMap.cs
index 65dc8568..4506ad7f 100644
--- a/src/Generator/Types/TypeMap.cs
+++ b/src/Generator/Types/TypeMap.cs
@@ -63,9 +63,8 @@ namespace CppSharp.Types
                 case var _ when ReferenceEquals(kind, GeneratorKind.C):
                 case var _ when ReferenceEquals(kind, GeneratorKind.CPlusPlus):
                 case var _ when ReferenceEquals(kind, GeneratorKind.CLI):
-                    return new CILType(typeof(object));
                 case var _ when ReferenceEquals(kind, GeneratorKind.CSharp):
-                    return CSharpSignatureType(ctx);
+                    return new CILType(typeof(object));
                 default:
                     throw new System.NotImplementedException();
             }
@@ -84,10 +83,8 @@ namespace CppSharp.Types
                 case var _ when ReferenceEquals(kind, GeneratorKind.C):
                 case var _ when ReferenceEquals(kind, GeneratorKind.CPlusPlus):
                 case var _ when ReferenceEquals(kind, GeneratorKind.CLI):
-                    ctx.Return.Write(ctx.Parameter.Name);
-                    return;
                 case var _ when ReferenceEquals(kind, GeneratorKind.CSharp):
-                    CSharpMarshalToNative(ctx as CSharpMarshalContext);
+                    ctx.Return.Write(ctx.Parameter.Name);
                     return;
                 default:
                     throw new System.NotImplementedException();
@@ -106,10 +103,8 @@ namespace CppSharp.Types
                 case var _ when ReferenceEquals(kind, GeneratorKind.C):
                 case var _ when ReferenceEquals(kind, GeneratorKind.CPlusPlus):
                 case var _ when ReferenceEquals(kind, GeneratorKind.CLI):
-                    ctx.Return.Write(ctx.ReturnVarName);
-                    return;
                 case var _ when ReferenceEquals(kind, GeneratorKind.CSharp):
-                    CSharpMarshalToManaged(ctx as CSharpMarshalContext);
+                    ctx.Return.Write(ctx.ReturnVarName);
                     return;
                 default:
                     throw new System.NotImplementedException();
@@ -118,21 +113,6 @@ namespace CppSharp.Types
 
         #region C# backend
 
-        public virtual Type CSharpSignatureType(TypePrinterContext ctx)
-        {
-            return new CILType(typeof(object));
-        }
-
-        public virtual void CSharpMarshalToNative(CSharpMarshalContext ctx)
-        {
-            ctx.Return.Write(ctx.Parameter.Name);
-        }
-
-        public virtual void CSharpMarshalToManaged(CSharpMarshalContext ctx)
-        {
-            ctx.Return.Write(ctx.ReturnVarName);
-        }
-
         /// <summary>
         /// Used to construct a new instance of the mapped type.
         /// </summary>
diff --git a/tests/dotnet/CSharp/CSharp.Gen.cs b/tests/dotnet/CSharp/CSharp.Gen.cs
index 38c2e5d6..362b8cdb 100644
--- a/tests/dotnet/CSharp/CSharp.Gen.cs
+++ b/tests/dotnet/CSharp/CSharp.Gen.cs
@@ -120,17 +120,17 @@ namespace CppSharp.Tests
     [TypeMap("boolean_t")]
     public class BooleanTypeMap : TypeMap
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx)
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
             return new BuiltinType(PrimitiveType.Bool);
         }
 
-        public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
+        public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
         {
             ctx.Return.Write(ctx.Parameter.Name);
         }
 
-        public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
+        public override void MarshalToManaged(MarshalContext ctx, GeneratorKind kind)
         {
             ctx.Return.Write(ctx.ReturnVarName);
         }
@@ -144,12 +144,12 @@ namespace CppSharp.Tests
             return string.Empty;
         }
 
-        public override Type CSharpSignatureType(TypePrinterContext ctx)
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
             return GetEnumType(ctx.Type);
         }
 
-        public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
+        public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
         {
             if (ctx.Parameter.Type.Desugar().IsAddress())
                 ctx.Return.Write("new global::System.IntPtr(&{0})", ctx.Parameter.Name);
@@ -157,7 +157,7 @@ namespace CppSharp.Tests
                 ctx.Return.Write(ctx.Parameter.Name);
         }
 
-        public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
+        public override void MarshalToManaged(MarshalContext ctx, GeneratorKind kind)
         {
             if (ctx.ReturnType.Type.Desugar().IsAddress())
             {
@@ -196,17 +196,17 @@ namespace CppSharp.Tests
             return string.Empty;
         }
 
-        public override Type CSharpSignatureType(TypePrinterContext ctx)
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
             return new TagType(flags ?? (flags = Context.ASTContext.FindEnum("Flags").First()));
         }
 
-        public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
+        public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
         {
             ctx.Return.Write(ctx.Parameter.Name);
         }
 
-        public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
+        public override void MarshalToManaged(MarshalContext ctx, GeneratorKind kind)
         {
             ctx.Return.Write(ctx.ReturnVarName);
         }
@@ -229,7 +229,7 @@ namespace CppSharp.Tests
             }
         }
 
-        public override Type CSharpSignatureType(TypePrinterContext ctx)
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
             if (ctx.Kind == TypePrinterContextKind.Native)
             {
@@ -249,7 +249,7 @@ namespace CppSharp.Tests
                     ctx.GetTemplateParameterList()}>");
         }
 
-        public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
+        public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
         {
             // pointless, put just so that the generated code compiles
             var type = (TemplateSpecializationType)ctx.Parameter.Type.Desugar();
@@ -259,7 +259,7 @@ namespace CppSharp.Tests
             ctx.Return.Write("new {0}()", specialization.Visit(typePrinter));
         }
 
-        public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
+        public override void MarshalToManaged(MarshalContext ctx, GeneratorKind kind)
         {
             ctx.Return.Write(ctx.ReturnVarName);
         }
@@ -268,18 +268,18 @@ namespace CppSharp.Tests
     [TypeMap("TypeMappedWithOperator")]
     public class TypeMappedWithOperator : TypeMap
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx)
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
             // doesn't matter, we just need it to compile
             return new BuiltinType(PrimitiveType.Int);
         }
 
-        public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
+        public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
         {
             ctx.Return.Write(ctx.Parameter.Name);
         }
 
-        public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
+        public override void MarshalToManaged(MarshalContext ctx, GeneratorKind kind)
         {
             ctx.Return.Write(ctx.ReturnVarName);
         }
@@ -288,7 +288,7 @@ namespace CppSharp.Tests
     [TypeMap("QString")]
     public class QString : TypeMap
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx)
+        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
         {
             if (ctx.Kind == TypePrinterContextKind.Native)
             {
@@ -299,13 +299,13 @@ namespace CppSharp.Tests
             return new CILType(typeof(string));
         }
 
-        public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
+        public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
         {
             ctx.Return.Write(ctx.Parameter.Type.Desugar().IsAddress() ?
                 "global::System.IntPtr.Zero" : "\"test\"");
         }
 
-        public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
+        public override void MarshalToManaged(MarshalContext ctx, GeneratorKind kind)
         {
             ctx.Return.Write("\"test\"");
         }
diff --git a/tests/dotnet/Common/Common.Gen.cs b/tests/dotnet/Common/Common.Gen.cs
index 7ab6cbea..338f01b3 100644
--- a/tests/dotnet/Common/Common.Gen.cs
+++ b/tests/dotnet/Common/Common.Gen.cs
@@ -7,41 +7,47 @@ using CppSharp.Utils;
 
 namespace CppSharp.Tests
 {
-    [TypeMap("TypeMappedIndex", GeneratorKindID = GeneratorKind.CLI_ID)]
-    public class CLITypeMappedIndex : TypeMap
+    namespace CLI
     {
-        public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
+        [TypeMap("TypeMappedIndex", GeneratorKindID = GeneratorKind.CLI_ID)]
+        public class TypeMappedIndex : TypeMap
         {
-            return new BuiltinType(PrimitiveType.UShort);
-        }
-
-        public override void MarshalToManaged(MarshalContext ctx, GeneratorKind kind)
-        {
-            ctx.Return.Write(ctx.ReturnVarName);
-        }
-
-        public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
-        {
-            ctx.Return.Write("::TypeMappedIndex()");
+            public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
+            {
+                return new BuiltinType(PrimitiveType.UShort);
+            }
+
+            public override void MarshalToManaged(MarshalContext ctx, GeneratorKind kind)
+            {
+                ctx.Return.Write(ctx.ReturnVarName);
+            }
+
+            public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
+            {
+                ctx.Return.Write("::TypeMappedIndex()");
+            }
         }
     }
 
-    [TypeMap("TypeMappedIndex", GeneratorKindID = GeneratorKind.CSharp_ID)]
-    public class TypeMappedIndex : TypeMap
+    namespace CSharp
     {
-        public override Type CSharpSignatureType(TypePrinterContext ctx)
-        {
-            return new BuiltinType(PrimitiveType.UShort);
-        }
-
-        public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
-        {
-            ctx.Return.Write(ctx.ReturnVarName);
-        }
-
-        public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
+        [TypeMap("TypeMappedIndex", GeneratorKindID = GeneratorKind.CSharp_ID)]
+        public class TypeMappedIndex : TypeMap
         {
-            ctx.Return.Write("IntPtr.Zero");
+            public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
+            {
+                return new BuiltinType(PrimitiveType.UShort);
+            }
+
+            public override void MarshalToManaged(MarshalContext ctx, GeneratorKind kind)
+            {
+                ctx.Return.Write(ctx.ReturnVarName);
+            }
+
+            public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
+            {
+                ctx.Return.Write("IntPtr.Zero");
+            }
         }
     }