Browse Source

Major refactoring: refactor GeneratorKind enum into a class

pull/1794/head
Deadlocklogic 3 years ago
parent
commit
48e060bb57
  1. 6
      src/CLI/Generator.cs
  2. 8
      src/CppParser/Bootstrap/Bootstrap.cs
  3. 16
      src/Generator/Driver.cs
  4. 18
      src/Generator/Generator.cs
  5. 102
      src/Generator/GeneratorKind.cs
  6. 4
      src/Generator/Generators/ExtensionMethods.cs
  7. 16
      src/Generator/Passes/CheckDuplicatedNamesPass.cs
  8. 7
      src/Generator/Passes/ValidateOperatorsPass.cs
  9. 2
      src/Generator/Types/DeclMap.cs
  10. 2
      src/Generator/Types/DeclMapDatabase.cs
  11. 26
      src/Generator/Types/Std/Stdlib.CLI.cs
  12. 28
      src/Generator/Types/Std/Stdlib.CSharp.cs
  13. 7
      src/Generator/Types/TypeIgnoreChecker.cs
  14. 32
      src/Generator/Types/TypeMap.cs
  15. 4
      src/Generator/Types/TypeMapDatabase.cs

6
src/CLI/Generator.cs

@ -230,11 +230,11 @@ namespace CppSharp
{ {
switch (kind) switch (kind)
{ {
case GeneratorKind.CLI: case var _ when ReferenceEquals(kind, GeneratorKind.CLI):
return "C++/CLI"; return "C++/CLI";
case GeneratorKind.CSharp: case var _ when ReferenceEquals(kind, GeneratorKind.CSharp):
return "C#"; return "C#";
case GeneratorKind.NAPI: case var _ when ReferenceEquals(kind, GeneratorKind.NAPI):
return "N-API"; return "N-API";
default: default:
return kind.ToString(); return kind.ToString();

8
src/CppParser/Bootstrap/Bootstrap.cs

@ -1778,8 +1778,7 @@ namespace CppSharp
return qualifiedName; return qualifiedName;
} }
public static string GetDeclName(Declaration decl, public static string GetDeclName(Declaration decl, GeneratorKind kind)
GeneratorKind kind = GeneratorKind.CPlusPlus)
{ {
string name = decl.Name; string name = decl.Name;
@ -1811,6 +1810,11 @@ namespace CppSharp
return name; return name;
} }
public static string GetDeclName(Declaration decl)
{
return GetDeclName(decl, GeneratorKind.CPlusPlus);
}
public static AST.Type GetDeclType(AST.Type type, public static AST.Type GetDeclType(AST.Type type,
TypePrinter typePrinter) TypePrinter typePrinter)
{ {

16
src/Generator/Driver.cs

@ -36,21 +36,21 @@ namespace CppSharp
{ {
switch (kind) switch (kind)
{ {
case GeneratorKind.C: case var _ when ReferenceEquals(kind, GeneratorKind.C):
return new CGenerator(Context); return new CGenerator(Context);
case GeneratorKind.CPlusPlus: case var _ when ReferenceEquals(kind, GeneratorKind.CPlusPlus):
return new CppGenerator(Context); return new CppGenerator(Context);
case GeneratorKind.CLI: case var _ when ReferenceEquals(kind, GeneratorKind.CLI):
return new CLIGenerator(Context); return new CLIGenerator(Context);
case GeneratorKind.CSharp: case var _ when ReferenceEquals(kind, GeneratorKind.CSharp):
return new CSharpGenerator(Context); return new CSharpGenerator(Context);
case GeneratorKind.Emscripten: case var _ when ReferenceEquals(kind, GeneratorKind.Emscripten):
return new EmscriptenGenerator(Context); return new EmscriptenGenerator(Context);
case GeneratorKind.QuickJS: case var _ when ReferenceEquals(kind, GeneratorKind.QuickJS):
return new QuickJSGenerator(Context); return new QuickJSGenerator(Context);
case GeneratorKind.NAPI: case var _ when ReferenceEquals(kind, GeneratorKind.NAPI):
return new NAPIGenerator(Context); return new NAPIGenerator(Context);
case GeneratorKind.TypeScript: case var _ when ReferenceEquals(kind, GeneratorKind.TypeScript):
return new TSGenerator(Context); return new TSGenerator(Context);
} }

18
src/Generator/Generator.cs

@ -5,24 +5,6 @@ using CppSharp.AST;
namespace CppSharp.Generators namespace CppSharp.Generators
{ {
/// <summary>
/// Kinds of language generators.
/// </summary>
public enum GeneratorKind
{
CLI = 1,
CSharp = 2,
C,
CPlusPlus,
Emscripten,
ObjectiveC,
Java,
Swift,
QuickJS,
NAPI,
TypeScript
}
/// <summary> /// <summary>
/// Output generated by each backend generator. /// Output generated by each backend generator.
/// </summary> /// </summary>

102
src/Generator/GeneratorKind.cs

@ -0,0 +1,102 @@
using System;
using System.Collections.Generic;
using System.Linq;
using CppSharp.AST;
namespace CppSharp.Generators
{
/// <summary>
/// Kinds of language generators.
/// </summary>
public class GeneratorKind : IEquatable<GeneratorKind>
{
private static HashSet<string> 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);
}
}

4
src/Generator/Generators/ExtensionMethods.cs

@ -65,9 +65,9 @@ namespace CppSharp.Generators
switch (generatorKind) switch (generatorKind)
{ {
case GeneratorKind.CLI: case var _ when ReferenceEquals(generatorKind, GeneratorKind.CLI):
return typeMap.CLISignatureType(typePrinterContext).Desugar(); return typeMap.CLISignatureType(typePrinterContext).Desugar();
case GeneratorKind.CSharp: case var _ when ReferenceEquals(generatorKind, GeneratorKind.CSharp):
return typeMap.CSharpSignatureType(typePrinterContext).Desugar(); return typeMap.CSharpSignatureType(typePrinterContext).Desugar();
} }
} }

16
src/Generator/Passes/CheckDuplicatedNamesPass.cs

@ -202,22 +202,22 @@ namespace CppSharp.Passes
TypePrinter typePrinter; TypePrinter typePrinter;
switch (kind) switch (kind)
{ {
case GeneratorKind.C: case var _ when ReferenceEquals(kind, GeneratorKind.C):
typePrinter = new CppTypePrinter(Context) { PrintFlavorKind = CppTypePrintFlavorKind.C }; typePrinter = new CppTypePrinter(Context) { PrintFlavorKind = CppTypePrintFlavorKind.C };
break; break;
case GeneratorKind.Emscripten: case var _ when ReferenceEquals(kind, GeneratorKind.Emscripten):
typePrinter = new EmscriptenTypePrinter(Context); typePrinter = new EmscriptenTypePrinter(Context);
break;; break;;
case GeneratorKind.CPlusPlus: case var _ when ReferenceEquals(kind, GeneratorKind.CPlusPlus):
case GeneratorKind.QuickJS: case var _ when ReferenceEquals(kind, GeneratorKind.QuickJS):
case GeneratorKind.NAPI: case var _ when ReferenceEquals(kind, GeneratorKind.NAPI):
case GeneratorKind.TypeScript: case var _ when ReferenceEquals(kind, GeneratorKind.TypeScript):
typePrinter = new CppTypePrinter(Context); typePrinter = new CppTypePrinter(Context);
break; break;
case GeneratorKind.CLI: case var _ when ReferenceEquals(kind, GeneratorKind.CLI):
typePrinter = new CLITypePrinter(Context); typePrinter = new CLITypePrinter(Context);
break; break;
case GeneratorKind.CSharp: case var _ when ReferenceEquals(kind, GeneratorKind.CSharp):
typePrinter = new CSharpTypePrinter(Context); typePrinter = new CSharpTypePrinter(Context);
break; break;
default: default:

7
src/Generator/Passes/ValidateOperatorsPass.cs

@ -83,11 +83,12 @@ namespace CppSharp.Passes
{ {
Parameter parameter = @operator.Parameters.Last(); Parameter parameter = @operator.Parameters.Last();
Type type = parameter.Type.Desugar(); 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); return type.IsPrimitiveType(PrimitiveType.Int);
case GeneratorKind.CSharp: case var _ when ReferenceEquals(kind, GeneratorKind.CSharp):
Types.TypeMap typeMap; Types.TypeMap typeMap;
if (Context.TypeMaps.FindTypeMap(type, out typeMap)) if (Context.TypeMaps.FindTypeMap(type, out typeMap))
{ {

2
src/Generator/Types/DeclMap.cs

@ -35,7 +35,7 @@ namespace CppSharp.Types
{ {
public GeneratorKind GeneratorKind { get; set; } public GeneratorKind GeneratorKind { get; set; }
public DeclMapAttribute() : this(0) public DeclMapAttribute()
{ {
} }

2
src/Generator/Types/DeclMapDatabase.cs

@ -41,7 +41,7 @@ namespace CppSharp.Types
var attrs = type.GetCustomAttributes(typeof(DeclMapAttribute), true); var attrs = type.GetCustomAttributes(typeof(DeclMapAttribute), true);
foreach (DeclMapAttribute attr in attrs) foreach (DeclMapAttribute attr in attrs)
{ {
if (attr.GeneratorKind == 0 || if (attr.GeneratorKind == null ||
attr.GeneratorKind == bindingContext.Options.GeneratorKind) attr.GeneratorKind == bindingContext.Options.GeneratorKind)
{ {
var declMap = (DeclMap)Activator.CreateInstance(type); var declMap = (DeclMap)Activator.CreateInstance(type);

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

@ -9,7 +9,7 @@ using CppSharp.Generators.CSharp;
namespace CppSharp.Types.Std namespace CppSharp.Types.Std
{ {
[TypeMap("const char*", GeneratorKind = GeneratorKind.CLI)] [TypeMap("const char*", GeneratorKindID = GeneratorKind.CLI_ID)]
public partial class ConstCharPointer : TypeMap public partial class ConstCharPointer : TypeMap
{ {
public override Type CLISignatureType(TypePrinterContext ctx) 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 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 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 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 public partial class ConstChar32TPointer : ConstCharPointer
{ {
} }
[TypeMap("basic_string<char, char_traits<char>, allocator<char>>", GeneratorKind = GeneratorKind.CLI)] [TypeMap("basic_string<char, char_traits<char>, allocator<char>>", GeneratorKindID = GeneratorKind.CLI_ID)]
public partial class String : TypeMap public partial class String : TypeMap
{ {
public override Type CLISignatureType(TypePrinterContext ctx) 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 partial class WString : TypeMap
{ {
public override Type CLISignatureType(TypePrinterContext ctx) 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 partial class Vector : TypeMap
{ {
public override bool IsIgnored 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 partial class Map : TypeMap
{ {
public override bool IsIgnored { get { return true; } } 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 partial class List : TypeMap
{ {
public override bool IsIgnored { get { return true; } } 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 partial class SharedPtr : TypeMap
{ {
public override bool IsIgnored { get { return true; } } public override bool IsIgnored { get { return true; } }
} }
[TypeMap("basic_ostream<char, char_traits<char>>", GeneratorKind.CLI)] [TypeMap("basic_ostream<char, char_traits<char>>", GeneratorKind.CLI_ID)]
public partial class OStream : TypeMap public partial class OStream : TypeMap
{ {
public override Type CLISignatureType(TypePrinterContext ctx) 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 partial class NullPtr : TypeMap
{ {
public override bool DoesMarshalling { get { return false; } } public override bool DoesMarshalling { get { return false; } }

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

@ -11,35 +11,35 @@ using Type = CppSharp.AST.Type;
namespace CppSharp.Types.Std namespace CppSharp.Types.Std
{ {
[TypeMap("int", GeneratorKind = GeneratorKind.CSharp)] [TypeMap("int", GeneratorKindID = GeneratorKind.CSharp_ID)]
public partial class Int : TypeMap public partial class Int : TypeMap
{ {
public override Type CSharpSignatureType(TypePrinterContext ctx) => public override Type CSharpSignatureType(TypePrinterContext ctx) =>
CSharpTypePrinter.GetSignedType(Context.TargetInfo.IntWidth); CSharpTypePrinter.GetSignedType(Context.TargetInfo.IntWidth);
} }
[TypeMap("unsigned int", GeneratorKind = GeneratorKind.CSharp)] [TypeMap("unsigned int", GeneratorKindID = GeneratorKind.CSharp_ID)]
public partial class UnsignedInt : TypeMap public partial class UnsignedInt : TypeMap
{ {
public override Type CSharpSignatureType(TypePrinterContext ctx) => public override Type CSharpSignatureType(TypePrinterContext ctx) =>
CSharpTypePrinter.GetUnsignedType(Context.TargetInfo.IntWidth); CSharpTypePrinter.GetUnsignedType(Context.TargetInfo.IntWidth);
} }
[TypeMap("long", GeneratorKind = GeneratorKind.CSharp)] [TypeMap("long", GeneratorKindID = GeneratorKind.CSharp_ID)]
public partial class Long : TypeMap public partial class Long : TypeMap
{ {
public override Type CSharpSignatureType(TypePrinterContext ctx) => public override Type CSharpSignatureType(TypePrinterContext ctx) =>
CSharpTypePrinter.GetSignedType(Context.TargetInfo.LongWidth); CSharpTypePrinter.GetSignedType(Context.TargetInfo.LongWidth);
} }
[TypeMap("unsigned long", GeneratorKind = GeneratorKind.CSharp)] [TypeMap("unsigned long", GeneratorKindID = GeneratorKind.CSharp_ID)]
public partial class UnsignedLong : TypeMap public partial class UnsignedLong : TypeMap
{ {
public override Type CSharpSignatureType(TypePrinterContext ctx) => public override Type CSharpSignatureType(TypePrinterContext ctx) =>
CSharpTypePrinter.GetUnsignedType(Context.TargetInfo.LongWidth); CSharpTypePrinter.GetUnsignedType(Context.TargetInfo.LongWidth);
} }
[TypeMap("char", GeneratorKind = GeneratorKind.CSharp)] [TypeMap("char", GeneratorKindID = GeneratorKind.CSharp_ID)]
public partial class Char : TypeMap public partial class Char : TypeMap
{ {
public override Type CSharpSignatureType(TypePrinterContext ctx) 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 partial class Char16T : TypeMap
{ {
public override Type CSharpSignatureType(TypePrinterContext ctx) 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 partial class WCharT : TypeMap
{ {
public override Type CSharpSignatureType(TypePrinterContext ctx) 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 partial class ConstCharPointer : TypeMap
{ {
public override Type CSharpSignatureType(TypePrinterContext ctx) 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 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 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 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 public partial class ConstChar32TPointer : ConstCharPointer
{ {
} }
[TypeMap("basic_string<char, char_traits<char>, allocator<char>>", GeneratorKind = GeneratorKind.CSharp)] [TypeMap("basic_string<char, char_traits<char>, allocator<char>>", GeneratorKindID = GeneratorKind.CSharp_ID)]
public partial class String : TypeMap public partial class String : TypeMap
{ {
public override Type CSharpSignatureType(TypePrinterContext ctx) 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 partial class FILE : TypeMap
{ {
public override Type CSharpSignatureType(TypePrinterContext ctx) public override Type CSharpSignatureType(TypePrinterContext ctx)

7
src/Generator/Types/TypeIgnoreChecker.cs

@ -13,14 +13,17 @@ namespace CppSharp
ITypeMapDatabase TypeMapDatabase { get; } ITypeMapDatabase TypeMapDatabase { get; }
public bool IsIgnored; public bool IsIgnored;
public TypeIgnoreChecker(ITypeMapDatabase database, public TypeIgnoreChecker(ITypeMapDatabase database, GeneratorKind generatorKind)
GeneratorKind generatorKind = GeneratorKind.CSharp)
{ {
TypeMapDatabase = database; TypeMapDatabase = database;
VisitOptions.ClearFlags(VisitFlags.ClassBases | VisitFlags.TemplateArguments); VisitOptions.ClearFlags(VisitFlags.ClassBases | VisitFlags.TemplateArguments);
this.generatorKind = generatorKind; this.generatorKind = generatorKind;
} }
public TypeIgnoreChecker(ITypeMapDatabase database) : this(database, GeneratorKind.CSharp)
{
}
void Ignore() void Ignore()
{ {
IsIgnored = true; IsIgnored = true;

32
src/Generator/Types/TypeMap.cs

@ -15,17 +15,17 @@ namespace CppSharp.Types
public class TypeMapAttribute : Attribute public class TypeMapAttribute : Attribute
{ {
public string Type { get; } 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; Type = type;
} }
public TypeMapAttribute(string type, GeneratorKind generatorKind) public TypeMapAttribute(string type, string generatorKindID)
{ {
Type = type; Type = type;
GeneratorKind = generatorKind; GeneratorKindID = generatorKindID;
} }
} }
@ -55,12 +55,12 @@ namespace CppSharp.Types
{ {
switch (kind) switch (kind)
{ {
case GeneratorKind.C: case var _ when ReferenceEquals(kind, GeneratorKind.C):
case GeneratorKind.CPlusPlus: case var _ when ReferenceEquals(kind, GeneratorKind.CPlusPlus):
return CppSignatureType(ctx); return CppSignatureType(ctx);
case GeneratorKind.CLI: case var _ when ReferenceEquals(kind, GeneratorKind.CLI):
return CLISignatureType(ctx); return CLISignatureType(ctx);
case GeneratorKind.CSharp: case var _ when ReferenceEquals(kind, GeneratorKind.CSharp):
return CSharpSignatureType(ctx); return CSharpSignatureType(ctx);
default: default:
throw new System.NotImplementedException(); throw new System.NotImplementedException();
@ -71,14 +71,14 @@ namespace CppSharp.Types
{ {
switch (kind) switch (kind)
{ {
case GeneratorKind.C: case var _ when ReferenceEquals(kind, GeneratorKind.C):
case GeneratorKind.CPlusPlus: case var _ when ReferenceEquals(kind, GeneratorKind.CPlusPlus):
CppMarshalToNative(ctx); CppMarshalToNative(ctx);
return; return;
case GeneratorKind.CLI: case var _ when ReferenceEquals(kind, GeneratorKind.CLI):
CLIMarshalToNative(ctx); CLIMarshalToNative(ctx);
return; return;
case GeneratorKind.CSharp: case var _ when ReferenceEquals(kind, GeneratorKind.CSharp):
CSharpMarshalToNative(ctx as CSharpMarshalContext); CSharpMarshalToNative(ctx as CSharpMarshalContext);
return; return;
default: default:
@ -90,14 +90,14 @@ namespace CppSharp.Types
{ {
switch (kind) switch (kind)
{ {
case GeneratorKind.C: case var _ when ReferenceEquals(kind, GeneratorKind.C):
case GeneratorKind.CPlusPlus: case var _ when ReferenceEquals(kind, GeneratorKind.CPlusPlus):
CppMarshalToManaged(ctx); CppMarshalToManaged(ctx);
return; return;
case GeneratorKind.CLI: case var _ when ReferenceEquals(kind, GeneratorKind.CLI):
CLIMarshalToManaged(ctx); CLIMarshalToManaged(ctx);
return; return;
case GeneratorKind.CSharp: case var _ when ReferenceEquals(kind, GeneratorKind.CSharp):
CSharpMarshalToManaged(ctx as CSharpMarshalContext); CSharpMarshalToManaged(ctx as CSharpMarshalContext);
return; return;
default: default:

4
src/Generator/Types/TypeMapDatabase.cs

@ -40,8 +40,8 @@ namespace CppSharp.Types
var attrs = type.GetCustomAttributes(typeof(TypeMapAttribute), true); var attrs = type.GetCustomAttributes(typeof(TypeMapAttribute), true);
foreach (TypeMapAttribute attr in attrs) foreach (TypeMapAttribute attr in attrs)
{ {
if (attr.GeneratorKind == 0 || if (string.IsNullOrEmpty(attr.GeneratorKindID) ||
attr.GeneratorKind == bindingContext.Options.GeneratorKind) attr.GeneratorKindID == bindingContext.Options.GeneratorKind.ID)
{ {
var typeMap = (TypeMap)Activator.CreateInstance(type); var typeMap = (TypeMap)Activator.CreateInstance(type);
typeMap.Context = bindingContext; typeMap.Context = bindingContext;

Loading…
Cancel
Save