From 48e060bb57e4018de72a76e5ffed1aa1b7b0ff08 Mon Sep 17 00:00:00 2001 From: Deadlocklogic Date: Sat, 11 Nov 2023 16:41:57 +0200 Subject: [PATCH] Major refactoring: refactor GeneratorKind enum into a class --- src/CLI/Generator.cs | 6 +- src/CppParser/Bootstrap/Bootstrap.cs | 8 +- src/Generator/Driver.cs | 16 +-- src/Generator/Generator.cs | 18 ---- src/Generator/GeneratorKind.cs | 102 ++++++++++++++++++ src/Generator/Generators/ExtensionMethods.cs | 4 +- .../Passes/CheckDuplicatedNamesPass.cs | 16 +-- src/Generator/Passes/ValidateOperatorsPass.cs | 7 +- src/Generator/Types/DeclMap.cs | 2 +- src/Generator/Types/DeclMapDatabase.cs | 2 +- src/Generator/Types/Std/Stdlib.CLI.cs | 26 ++--- src/Generator/Types/Std/Stdlib.CSharp.cs | 28 ++--- src/Generator/Types/TypeIgnoreChecker.cs | 7 +- src/Generator/Types/TypeMap.cs | 32 +++--- src/Generator/Types/TypeMapDatabase.cs | 4 +- 15 files changed, 185 insertions(+), 93 deletions(-) create mode 100644 src/Generator/GeneratorKind.cs diff --git a/src/CLI/Generator.cs b/src/CLI/Generator.cs index 58db9ac7..a1b584ce 100644 --- a/src/CLI/Generator.cs +++ b/src/CLI/Generator.cs @@ -230,11 +230,11 @@ namespace CppSharp { switch (kind) { - case GeneratorKind.CLI: + case var _ when ReferenceEquals(kind, GeneratorKind.CLI): return "C++/CLI"; - case GeneratorKind.CSharp: + case var _ when ReferenceEquals(kind, GeneratorKind.CSharp): return "C#"; - case GeneratorKind.NAPI: + case var _ when ReferenceEquals(kind, GeneratorKind.NAPI): return "N-API"; default: return kind.ToString(); diff --git a/src/CppParser/Bootstrap/Bootstrap.cs b/src/CppParser/Bootstrap/Bootstrap.cs index 2e8b4d63..a19db6c5 100644 --- a/src/CppParser/Bootstrap/Bootstrap.cs +++ b/src/CppParser/Bootstrap/Bootstrap.cs @@ -1778,8 +1778,7 @@ namespace CppSharp return qualifiedName; } - public static string GetDeclName(Declaration decl, - GeneratorKind kind = GeneratorKind.CPlusPlus) + public static string GetDeclName(Declaration decl, GeneratorKind kind) { string name = decl.Name; @@ -1811,6 +1810,11 @@ namespace CppSharp return name; } + public static string GetDeclName(Declaration decl) + { + return GetDeclName(decl, GeneratorKind.CPlusPlus); + } + public static AST.Type GetDeclType(AST.Type type, TypePrinter typePrinter) { diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs index 0751fa1c..9c779add 100644 --- a/src/Generator/Driver.cs +++ b/src/Generator/Driver.cs @@ -36,21 +36,21 @@ namespace CppSharp { switch (kind) { - case GeneratorKind.C: + case var _ when ReferenceEquals(kind, GeneratorKind.C): return new CGenerator(Context); - case GeneratorKind.CPlusPlus: + case var _ when ReferenceEquals(kind, GeneratorKind.CPlusPlus): return new CppGenerator(Context); - case GeneratorKind.CLI: + case var _ when ReferenceEquals(kind, GeneratorKind.CLI): return new CLIGenerator(Context); - case GeneratorKind.CSharp: + case var _ when ReferenceEquals(kind, GeneratorKind.CSharp): return new CSharpGenerator(Context); - case GeneratorKind.Emscripten: + case var _ when ReferenceEquals(kind, GeneratorKind.Emscripten): return new EmscriptenGenerator(Context); - case GeneratorKind.QuickJS: + case var _ when ReferenceEquals(kind, GeneratorKind.QuickJS): return new QuickJSGenerator(Context); - case GeneratorKind.NAPI: + case var _ when ReferenceEquals(kind, GeneratorKind.NAPI): return new NAPIGenerator(Context); - case GeneratorKind.TypeScript: + case var _ when ReferenceEquals(kind, GeneratorKind.TypeScript): return new TSGenerator(Context); } diff --git a/src/Generator/Generator.cs b/src/Generator/Generator.cs index cf414b48..1593a855 100644 --- a/src/Generator/Generator.cs +++ b/src/Generator/Generator.cs @@ -5,24 +5,6 @@ using CppSharp.AST; namespace CppSharp.Generators { - /// - /// Kinds of language generators. - /// - public enum GeneratorKind - { - CLI = 1, - CSharp = 2, - C, - CPlusPlus, - Emscripten, - ObjectiveC, - Java, - Swift, - QuickJS, - NAPI, - TypeScript - } - /// /// Output generated by each backend generator. /// diff --git a/src/Generator/GeneratorKind.cs b/src/Generator/GeneratorKind.cs new file mode 100644 index 00000000..e6130ebf --- /dev/null +++ b/src/Generator/GeneratorKind.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using CppSharp.AST; + +namespace CppSharp.Generators +{ + /// + /// Kinds of language generators. + /// + public class GeneratorKind : IEquatable + { + private static HashSet s_registeredIDSet = new(); + + public string ID { get; } + + public GeneratorKind(string id) + { + if (s_registeredIDSet.Contains(id)) + { + throw new Exception($"GeneratorKind has an already registered ID: {ID}"); + } + ID = id; + s_registeredIDSet.Add(id); + } + + public static bool operator ==(GeneratorKind obj1, GeneratorKind obj2) + { + if (ReferenceEquals(obj1, obj2)) + { + return true; + } + if (obj1 is null) + { + return false; + } + if (obj2 is null) + { + return false; + } + return obj1.Equals(obj2); + } + + public static bool operator !=(GeneratorKind obj1, GeneratorKind obj2) => !(obj1 == obj2); + + public bool Equals(GeneratorKind? other) + { + if (other is null) + { + return false; + } + if (ReferenceEquals(this, other)) + { + return true; + } + return ID.Equals(other.ID); + } + + public override bool Equals(object? obj) => Equals(obj as GeneratorKind); + + public override int GetHashCode() + { + unchecked + { + return ID.GetHashCode(); + } + } + + public const string CLI_ID = "CLI"; + public static readonly GeneratorKind CLI = new(CLI_ID); + + public const string CSharp_ID = "CSharp"; + public static readonly GeneratorKind CSharp = new(CSharp_ID); + + public const string C_ID = "C"; + public static readonly GeneratorKind C = new(C_ID); + + public const string CPlusPlus_ID = "CPlusPlus"; + public static readonly GeneratorKind CPlusPlus = new(CPlusPlus_ID); + + public const string Emscripten_ID = "Emscripten"; + public static readonly GeneratorKind Emscripten = new(Emscripten_ID); + + public const string ObjectiveC_ID = "ObjectiveC"; + public static readonly GeneratorKind ObjectiveC = new(ObjectiveC_ID); + + public const string Java_ID = "Java"; + public static readonly GeneratorKind Java = new(Java_ID); + + public const string Swift_ID = "Swift"; + public static readonly GeneratorKind Swift = new(Swift_ID); + + public const string QuickJS_ID = "QuickJS"; + public static readonly GeneratorKind QuickJS = new(QuickJS_ID); + + public const string NAPI_ID = "NAPI"; + public static readonly GeneratorKind NAPI = new(NAPI_ID); + + public const string TypeScript_ID = "TypeScript"; + public static readonly GeneratorKind TypeScript = new(TypeScript_ID); + } +} \ No newline at end of file diff --git a/src/Generator/Generators/ExtensionMethods.cs b/src/Generator/Generators/ExtensionMethods.cs index eb4d621a..ee4b1054 100644 --- a/src/Generator/Generators/ExtensionMethods.cs +++ b/src/Generator/Generators/ExtensionMethods.cs @@ -65,9 +65,9 @@ namespace CppSharp.Generators switch (generatorKind) { - case GeneratorKind.CLI: + case var _ when ReferenceEquals(generatorKind, GeneratorKind.CLI): return typeMap.CLISignatureType(typePrinterContext).Desugar(); - case GeneratorKind.CSharp: + case var _ when ReferenceEquals(generatorKind, GeneratorKind.CSharp): return typeMap.CSharpSignatureType(typePrinterContext).Desugar(); } } diff --git a/src/Generator/Passes/CheckDuplicatedNamesPass.cs b/src/Generator/Passes/CheckDuplicatedNamesPass.cs index 0a2d7622..0a520be2 100644 --- a/src/Generator/Passes/CheckDuplicatedNamesPass.cs +++ b/src/Generator/Passes/CheckDuplicatedNamesPass.cs @@ -202,22 +202,22 @@ namespace CppSharp.Passes TypePrinter typePrinter; switch (kind) { - case GeneratorKind.C: + case var _ when ReferenceEquals(kind, GeneratorKind.C): typePrinter = new CppTypePrinter(Context) { PrintFlavorKind = CppTypePrintFlavorKind.C }; break; - case GeneratorKind.Emscripten: + case var _ when ReferenceEquals(kind, GeneratorKind.Emscripten): typePrinter = new EmscriptenTypePrinter(Context); break;; - case GeneratorKind.CPlusPlus: - case GeneratorKind.QuickJS: - case GeneratorKind.NAPI: - case GeneratorKind.TypeScript: + case var _ when ReferenceEquals(kind, GeneratorKind.CPlusPlus): + case var _ when ReferenceEquals(kind, GeneratorKind.QuickJS): + case var _ when ReferenceEquals(kind, GeneratorKind.NAPI): + case var _ when ReferenceEquals(kind, GeneratorKind.TypeScript): typePrinter = new CppTypePrinter(Context); break; - case GeneratorKind.CLI: + case var _ when ReferenceEquals(kind, GeneratorKind.CLI): typePrinter = new CLITypePrinter(Context); break; - case GeneratorKind.CSharp: + case var _ when ReferenceEquals(kind, GeneratorKind.CSharp): typePrinter = new CSharpTypePrinter(Context); break; default: diff --git a/src/Generator/Passes/ValidateOperatorsPass.cs b/src/Generator/Passes/ValidateOperatorsPass.cs index b1f86db1..49fe8d01 100644 --- a/src/Generator/Passes/ValidateOperatorsPass.cs +++ b/src/Generator/Passes/ValidateOperatorsPass.cs @@ -83,11 +83,12 @@ namespace CppSharp.Passes { Parameter parameter = @operator.Parameters.Last(); Type type = parameter.Type.Desugar(); - switch (Options.GeneratorKind) + var kind = Options.GeneratorKind; + switch (kind) { - case GeneratorKind.CLI: + case var _ when ReferenceEquals(kind, GeneratorKind.CLI): return type.IsPrimitiveType(PrimitiveType.Int); - case GeneratorKind.CSharp: + case var _ when ReferenceEquals(kind, GeneratorKind.CSharp): Types.TypeMap typeMap; if (Context.TypeMaps.FindTypeMap(type, out typeMap)) { diff --git a/src/Generator/Types/DeclMap.cs b/src/Generator/Types/DeclMap.cs index 5028466c..d1e9b63f 100644 --- a/src/Generator/Types/DeclMap.cs +++ b/src/Generator/Types/DeclMap.cs @@ -35,7 +35,7 @@ namespace CppSharp.Types { public GeneratorKind GeneratorKind { get; set; } - public DeclMapAttribute() : this(0) + public DeclMapAttribute() { } diff --git a/src/Generator/Types/DeclMapDatabase.cs b/src/Generator/Types/DeclMapDatabase.cs index 7cb891c3..2bdc7b09 100644 --- a/src/Generator/Types/DeclMapDatabase.cs +++ b/src/Generator/Types/DeclMapDatabase.cs @@ -41,7 +41,7 @@ namespace CppSharp.Types var attrs = type.GetCustomAttributes(typeof(DeclMapAttribute), true); foreach (DeclMapAttribute attr in attrs) { - if (attr.GeneratorKind == 0 || + if (attr.GeneratorKind == null || attr.GeneratorKind == bindingContext.Options.GeneratorKind) { var declMap = (DeclMap)Activator.CreateInstance(type); diff --git a/src/Generator/Types/Std/Stdlib.CLI.cs b/src/Generator/Types/Std/Stdlib.CLI.cs index d067c958..8db2058f 100644 --- a/src/Generator/Types/Std/Stdlib.CLI.cs +++ b/src/Generator/Types/Std/Stdlib.CLI.cs @@ -9,7 +9,7 @@ using CppSharp.Generators.CSharp; namespace CppSharp.Types.Std { - [TypeMap("const char*", GeneratorKind = GeneratorKind.CLI)] + [TypeMap("const char*", GeneratorKindID = GeneratorKind.CLI_ID)] public partial class ConstCharPointer : TypeMap { public override Type CLISignatureType(TypePrinterContext ctx) @@ -62,27 +62,27 @@ namespace CppSharp.Types.Std } } - [TypeMap("const char[]", GeneratorKind = GeneratorKind.CLI)] + [TypeMap("const char[]", GeneratorKindID = GeneratorKind.CLI_ID)] public partial class ConstCharArray : ConstCharPointer { } - [TypeMap("const wchar_t*", GeneratorKind = GeneratorKind.CLI)] + [TypeMap("const wchar_t*", GeneratorKindID = GeneratorKind.CLI_ID)] public partial class ConstWCharTPointer : ConstCharPointer { } - [TypeMap("const char16_t*", GeneratorKind = GeneratorKind.CLI)] + [TypeMap("const char16_t*", GeneratorKindID = GeneratorKind.CLI_ID)] public partial class ConstChar16TPointer : ConstCharPointer { } - [TypeMap("const char32_t*", GeneratorKind = GeneratorKind.CLI)] + [TypeMap("const char32_t*", GeneratorKindID = GeneratorKind.CLI_ID)] public partial class ConstChar32TPointer : ConstCharPointer { } - [TypeMap("basic_string, allocator>", GeneratorKind = GeneratorKind.CLI)] + [TypeMap("basic_string, allocator>", GeneratorKindID = GeneratorKind.CLI_ID)] public partial class String : TypeMap { public override Type CLISignatureType(TypePrinterContext ctx) @@ -103,7 +103,7 @@ namespace CppSharp.Types.Std } } - [TypeMap("std::wstring", GeneratorKind = GeneratorKind.CLI)] + [TypeMap("std::wstring", GeneratorKindID = GeneratorKind.CLI_ID)] public partial class WString : TypeMap { public override Type CLISignatureType(TypePrinterContext ctx) @@ -124,7 +124,7 @@ namespace CppSharp.Types.Std } } - [TypeMap("std::vector", GeneratorKind = GeneratorKind.CLI)] + [TypeMap("std::vector", GeneratorKindID = GeneratorKind.CLI_ID)] public partial class Vector : TypeMap { public override bool IsIgnored @@ -258,7 +258,7 @@ namespace CppSharp.Types.Std } } - [TypeMap("std::map", GeneratorKind = GeneratorKind.CLI)] + [TypeMap("std::map", GeneratorKindID = GeneratorKind.CLI_ID)] public partial class Map : TypeMap { public override bool IsIgnored { get { return true; } } @@ -293,19 +293,19 @@ namespace CppSharp.Types.Std } } - [TypeMap("std::list", GeneratorKind = GeneratorKind.CLI)] + [TypeMap("std::list", GeneratorKindID = GeneratorKind.CLI_ID)] public partial class List : TypeMap { public override bool IsIgnored { get { return true; } } } - [TypeMap("std::shared_ptr", GeneratorKind = GeneratorKind.CLI)] + [TypeMap("std::shared_ptr", GeneratorKindID = GeneratorKind.CLI_ID)] public partial class SharedPtr : TypeMap { public override bool IsIgnored { get { return true; } } } - [TypeMap("basic_ostream>", GeneratorKind.CLI)] + [TypeMap("basic_ostream>", GeneratorKind.CLI_ID)] public partial class OStream : TypeMap { public override Type CLISignatureType(TypePrinterContext ctx) @@ -325,7 +325,7 @@ namespace CppSharp.Types.Std } } - [TypeMap("std::nullptr_t", GeneratorKind = GeneratorKind.CLI)] + [TypeMap("std::nullptr_t", GeneratorKindID = GeneratorKind.CLI_ID)] public partial 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 e394c40c..a3c3d6d5 100644 --- a/src/Generator/Types/Std/Stdlib.CSharp.cs +++ b/src/Generator/Types/Std/Stdlib.CSharp.cs @@ -11,35 +11,35 @@ using Type = CppSharp.AST.Type; namespace CppSharp.Types.Std { - [TypeMap("int", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("int", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class Int : TypeMap { public override Type CSharpSignatureType(TypePrinterContext ctx) => CSharpTypePrinter.GetSignedType(Context.TargetInfo.IntWidth); } - [TypeMap("unsigned int", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("unsigned int", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class UnsignedInt : TypeMap { public override Type CSharpSignatureType(TypePrinterContext ctx) => CSharpTypePrinter.GetUnsignedType(Context.TargetInfo.IntWidth); } - [TypeMap("long", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("long", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class Long : TypeMap { public override Type CSharpSignatureType(TypePrinterContext ctx) => CSharpTypePrinter.GetSignedType(Context.TargetInfo.LongWidth); } - [TypeMap("unsigned long", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("unsigned long", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class UnsignedLong : TypeMap { public override Type CSharpSignatureType(TypePrinterContext ctx) => CSharpTypePrinter.GetUnsignedType(Context.TargetInfo.LongWidth); } - [TypeMap("char", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("char", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class Char : TypeMap { public override Type CSharpSignatureType(TypePrinterContext ctx) @@ -67,7 +67,7 @@ namespace CppSharp.Types.Std } } - [TypeMap("char16_t", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("char16_t", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class Char16T : TypeMap { public override Type CSharpSignatureType(TypePrinterContext ctx) @@ -76,7 +76,7 @@ namespace CppSharp.Types.Std } } - [TypeMap("wchar_t", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("wchar_t", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class WCharT : TypeMap { public override Type CSharpSignatureType(TypePrinterContext ctx) @@ -85,7 +85,7 @@ namespace CppSharp.Types.Std } } - [TypeMap("const char*", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("const char*", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class ConstCharPointer : TypeMap { public override Type CSharpSignatureType(TypePrinterContext ctx) @@ -281,27 +281,27 @@ namespace CppSharp.Types.Std } } - [TypeMap("const char[]", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("const char[]", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class ConstCharArray : ConstCharPointer { } - [TypeMap("const wchar_t*", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("const wchar_t*", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class ConstWCharTPointer : ConstCharPointer { } - [TypeMap("const char16_t*", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("const char16_t*", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class ConstChar16TPointer : ConstCharPointer { } - [TypeMap("const char32_t*", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("const char32_t*", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class ConstChar32TPointer : ConstCharPointer { } - [TypeMap("basic_string, allocator>", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("basic_string, allocator>", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class String : TypeMap { public override Type CSharpSignatureType(TypePrinterContext ctx) @@ -420,7 +420,7 @@ namespace CppSharp.Types.Std } } - [TypeMap("FILE", GeneratorKind = GeneratorKind.CSharp)] + [TypeMap("FILE", GeneratorKindID = GeneratorKind.CSharp_ID)] public partial class FILE : TypeMap { public override Type CSharpSignatureType(TypePrinterContext ctx) diff --git a/src/Generator/Types/TypeIgnoreChecker.cs b/src/Generator/Types/TypeIgnoreChecker.cs index f06612c7..707a1677 100644 --- a/src/Generator/Types/TypeIgnoreChecker.cs +++ b/src/Generator/Types/TypeIgnoreChecker.cs @@ -13,14 +13,17 @@ namespace CppSharp ITypeMapDatabase TypeMapDatabase { get; } public bool IsIgnored; - public TypeIgnoreChecker(ITypeMapDatabase database, - GeneratorKind generatorKind = GeneratorKind.CSharp) + public TypeIgnoreChecker(ITypeMapDatabase database, GeneratorKind generatorKind) { TypeMapDatabase = database; VisitOptions.ClearFlags(VisitFlags.ClassBases | VisitFlags.TemplateArguments); this.generatorKind = generatorKind; } + public TypeIgnoreChecker(ITypeMapDatabase database) : this(database, GeneratorKind.CSharp) + { + } + void Ignore() { IsIgnored = true; diff --git a/src/Generator/Types/TypeMap.cs b/src/Generator/Types/TypeMap.cs index 54d5cfa4..e7060192 100644 --- a/src/Generator/Types/TypeMap.cs +++ b/src/Generator/Types/TypeMap.cs @@ -15,17 +15,17 @@ namespace CppSharp.Types public class TypeMapAttribute : Attribute { public string Type { get; } - public GeneratorKind GeneratorKind { get; set; } + public string GeneratorKindID { get; set; } - public TypeMapAttribute(string type) : this(type, 0) + public TypeMapAttribute(string type) : this(type, null) { Type = type; } - public TypeMapAttribute(string type, GeneratorKind generatorKind) + public TypeMapAttribute(string type, string generatorKindID) { Type = type; - GeneratorKind = generatorKind; + GeneratorKindID = generatorKindID; } } @@ -55,12 +55,12 @@ namespace CppSharp.Types { switch (kind) { - case GeneratorKind.C: - case GeneratorKind.CPlusPlus: + case var _ when ReferenceEquals(kind, GeneratorKind.C): + case var _ when ReferenceEquals(kind, GeneratorKind.CPlusPlus): return CppSignatureType(ctx); - case GeneratorKind.CLI: + case var _ when ReferenceEquals(kind, GeneratorKind.CLI): return CLISignatureType(ctx); - case GeneratorKind.CSharp: + case var _ when ReferenceEquals(kind, GeneratorKind.CSharp): return CSharpSignatureType(ctx); default: throw new System.NotImplementedException(); @@ -71,14 +71,14 @@ namespace CppSharp.Types { switch (kind) { - case GeneratorKind.C: - case GeneratorKind.CPlusPlus: + case var _ when ReferenceEquals(kind, GeneratorKind.C): + case var _ when ReferenceEquals(kind, GeneratorKind.CPlusPlus): CppMarshalToNative(ctx); return; - case GeneratorKind.CLI: + case var _ when ReferenceEquals(kind, GeneratorKind.CLI): CLIMarshalToNative(ctx); return; - case GeneratorKind.CSharp: + case var _ when ReferenceEquals(kind, GeneratorKind.CSharp): CSharpMarshalToNative(ctx as CSharpMarshalContext); return; default: @@ -90,14 +90,14 @@ namespace CppSharp.Types { switch (kind) { - case GeneratorKind.C: - case GeneratorKind.CPlusPlus: + case var _ when ReferenceEquals(kind, GeneratorKind.C): + case var _ when ReferenceEquals(kind, GeneratorKind.CPlusPlus): CppMarshalToManaged(ctx); return; - case GeneratorKind.CLI: + case var _ when ReferenceEquals(kind, GeneratorKind.CLI): CLIMarshalToManaged(ctx); return; - case GeneratorKind.CSharp: + case var _ when ReferenceEquals(kind, GeneratorKind.CSharp): CSharpMarshalToManaged(ctx as CSharpMarshalContext); return; default: diff --git a/src/Generator/Types/TypeMapDatabase.cs b/src/Generator/Types/TypeMapDatabase.cs index fef279ab..96711ae6 100644 --- a/src/Generator/Types/TypeMapDatabase.cs +++ b/src/Generator/Types/TypeMapDatabase.cs @@ -40,8 +40,8 @@ namespace CppSharp.Types var attrs = type.GetCustomAttributes(typeof(TypeMapAttribute), true); foreach (TypeMapAttribute attr in attrs) { - if (attr.GeneratorKind == 0 || - attr.GeneratorKind == bindingContext.Options.GeneratorKind) + if (string.IsNullOrEmpty(attr.GeneratorKindID) || + attr.GeneratorKindID == bindingContext.Options.GeneratorKind.ID) { var typeMap = (TypeMap)Activator.CreateInstance(type); typeMap.Context = bindingContext;