Browse Source

TypeMap: refactor CSharp backend into common methods + migration

pull/1802/head
Deadlocklogic 2 years ago
parent
commit
15ecf3bbbd
  1. 2
      src/Generator/AST/Utils.cs
  2. 4
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  3. 2
      src/Generator/Generators/CSharp/CSharpSources.cs
  4. 20
      src/Generator/Generators/CSharp/CSharpTypePrinter.cs
  5. 5
      src/Generator/Generators/ExtensionMethods.cs
  6. 12
      src/Generator/Passes/ExpressionHelper.cs
  7. 4
      src/Generator/Passes/ValidateOperatorsPass.cs
  8. 35
      src/Generator/Types/Std/Stdlib.CLI.cs
  9. 82
      src/Generator/Types/Std/Stdlib.CSharp.cs
  10. 26
      src/Generator/Types/TypeMap.cs
  11. 36
      tests/dotnet/CSharp/CSharp.Gen.cs
  12. 14
      tests/dotnet/Common/Common.Gen.cs

2
src/Generator/AST/Utils.cs

@ -207,7 +207,7 @@ namespace CppSharp.AST @@ -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() ||

4
src/Generator/Generators/CSharp/CSharpMarshal.cs

@ -45,7 +45,7 @@ namespace CppSharp.Generators.CSharp @@ -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 @@ -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;
}

2
src/Generator/Generators/CSharp/CSharpSources.cs

@ -3158,7 +3158,7 @@ internal static{(@new ? " new" : string.Empty)} {printedClass} __GetInstance({Ty @@ -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

20
src/Generator/Generators/CSharp/CSharpTypePrinter.cs

@ -36,7 +36,7 @@ namespace CppSharp.Generators.CSharp @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -330,7 +330,7 @@ namespace CppSharp.Generators.CSharp
MarshalKind = MarshalKind
};
return typeMap.CSharpSignatureType(typePrinterContext).ToString();
return typeMap.SignatureType(typePrinterContext).ToString();
}
public override TypePrinterResult VisitDependentTemplateSpecializationType(

5
src/Generator/Generators/ExtensionMethods.cs

@ -63,12 +63,9 @@ namespace CppSharp.Generators @@ -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();
}
}

12
src/Generator/Passes/ExpressionHelper.cs

@ -68,9 +68,9 @@ namespace CppSharp.Internal @@ -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 @@ -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 @@ -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 @@ -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 @@ -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))

4
src/Generator/Passes/ValidateOperatorsPass.cs

@ -90,9 +90,9 @@ namespace CppSharp.Passes @@ -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,

35
src/Generator/Types/Std/Stdlib.CLI.cs

@ -5,12 +5,11 @@ using CppSharp.Generators; @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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; } }

82
src/Generator/Types/Std/Stdlib.CSharp.cs

@ -9,46 +9,46 @@ using CppSharp.Generators; @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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));
}

26
src/Generator/Types/TypeMap.cs

@ -63,9 +63,8 @@ namespace CppSharp.Types @@ -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 @@ -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 @@ -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 @@ -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>

36
tests/dotnet/CSharp/CSharp.Gen.cs

@ -120,17 +120,17 @@ namespace CppSharp.Tests @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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\"");
}

14
tests/dotnet/Common/Common.Gen.cs

@ -6,9 +6,11 @@ using CppSharp.Types; @@ -6,9 +6,11 @@ using CppSharp.Types;
using CppSharp.Utils;
namespace CppSharp.Tests
{
namespace CLI
{
[TypeMap("TypeMappedIndex", GeneratorKindID = GeneratorKind.CLI_ID)]
public class CLITypeMappedIndex : TypeMap
public class TypeMappedIndex : TypeMap
{
public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
{
@ -25,25 +27,29 @@ namespace CppSharp.Tests @@ -25,25 +27,29 @@ namespace CppSharp.Tests
ctx.Return.Write("::TypeMappedIndex()");
}
}
}
namespace CSharp
{
[TypeMap("TypeMappedIndex", GeneratorKindID = GeneratorKind.CSharp_ID)]
public class TypeMappedIndex : TypeMap
{
public override Type CSharpSignatureType(TypePrinterContext ctx)
public override Type SignatureType(TypePrinterContext ctx, GeneratorKind kind)
{
return new BuiltinType(PrimitiveType.UShort);
}
public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
public override void MarshalToManaged(MarshalContext ctx, GeneratorKind kind)
{
ctx.Return.Write(ctx.ReturnVarName);
}
public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
public override void MarshalToNative(MarshalContext ctx, GeneratorKind kind)
{
ctx.Return.Write("IntPtr.Zero");
}
}
}
public class CommonTestsGenerator : GeneratorTest
{

Loading…
Cancel
Save