From fc87fb6ee938993c2a32f8d798ba518d98e82d6c Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Tue, 12 Jul 2016 23:26:22 +0300 Subject: [PATCH] Added the desugared type, if any, of DependentNameType, to the AST. Signed-off-by: Dimitar Dobrev --- src/AST/Type.cs | 2 ++ src/Core/Parser/ASTConverter.cs | 10 ++++--- src/CppParser/AST.cpp | 2 +- src/CppParser/AST.h | 1 + src/CppParser/Bindings/CLI/AST.cpp | 10 +++++++ src/CppParser/Bindings/CLI/AST.h | 6 ++++ .../CppSharp.CppParser.cs | 29 ++++++++++++++++--- .../i686-pc-win32-msvc/CppSharp.CppParser.cs | 29 ++++++++++++++++--- .../CppSharp.CppParser.cs | 29 ++++++++++++++++--- .../CppSharp.CppParser.cs | 29 ++++++++++++++++--- .../x86_64-linux-gnu/CppSharp.CppParser.cs | 29 ++++++++++++++++--- .../CppSharp.CppParser.cs | 29 ++++++++++++++++--- src/CppParser/Parser.cpp | 2 ++ .../Generators/CLI/CLITypePrinter.cs | 2 +- .../Generators/CSharp/CSharpTypePrinter.cs | 2 +- src/Generator/Types/CppTypePrinter.cs | 2 +- 16 files changed, 181 insertions(+), 32 deletions(-) diff --git a/src/AST/Type.cs b/src/AST/Type.cs index 384c8f94..7210a8e1 100644 --- a/src/AST/Type.cs +++ b/src/AST/Type.cs @@ -896,6 +896,8 @@ namespace CppSharp.AST { } + public Type Desugared { get; set; } + public override T Visit(ITypeVisitor visitor, TypeQualifiers quals = new TypeQualifiers()) { diff --git a/src/Core/Parser/ASTConverter.cs b/src/Core/Parser/ASTConverter.cs index 22185842..52539678 100644 --- a/src/Core/Parser/ASTConverter.cs +++ b/src/Core/Parser/ASTConverter.cs @@ -620,7 +620,7 @@ namespace CppSharp public override AST.Type VisitTemplateParameterSubstitution(TemplateParameterSubstitutionType type) { - var _type = new CppSharp.AST.TemplateParameterSubstitutionType(); + var _type = new AST.TemplateParameterSubstitutionType(); _type.Replacement = VisitQualified(type.Replacement); VisitType(type, _type); return _type; @@ -628,7 +628,7 @@ namespace CppSharp public override AST.Type VisitInjectedClassName(InjectedClassNameType type) { - var _type = new CppSharp.AST.InjectedClassNameType(); + var _type = new AST.InjectedClassNameType(); _type.Class = declConverter.Visit(type.Class) as AST.Class; _type.InjectedSpecializationType = VisitQualified(type.InjectedSpecializationType); VisitType(type, _type); @@ -637,14 +637,16 @@ namespace CppSharp public override AST.Type VisitDependentName(DependentNameType type) { - var _type = new CppSharp.AST.DependentNameType(); + var _type = new AST.DependentNameType(); VisitType(type, _type); + if (type.Desugared != null) + _type.Desugared = Visit(type.Desugared); return _type; } public override AST.Type VisitBuiltin(BuiltinType type) { - var _type = new CppSharp.AST.BuiltinType(); + var _type = new AST.BuiltinType(); _type.Type = VisitPrimitive(type.Type); VisitType(type, _type); return _type; diff --git a/src/CppParser/AST.cpp b/src/CppParser/AST.cpp index e15054d4..98ba88f7 100644 --- a/src/CppParser/AST.cpp +++ b/src/CppParser/AST.cpp @@ -179,7 +179,7 @@ InjectedClassNameType::InjectedClassNameType() { } -DependentNameType::DependentNameType() : Type(TypeKind::DependentName) {} +DependentNameType::DependentNameType() : Type(TypeKind::DependentName), Desugared(0) {} PackExpansionType::PackExpansionType() : Type(TypeKind::PackExpansion) {} diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index 412d8e9b..82da6349 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -240,6 +240,7 @@ class CS_API DependentNameType : public Type { public: DECLARE_TYPE_KIND(DependentName) + Type* Desugared; }; class CS_API PackExpansionType : public Type diff --git a/src/CppParser/Bindings/CLI/AST.cpp b/src/CppParser/Bindings/CLI/AST.cpp index 50f8d0a0..4b61d378 100644 --- a/src/CppParser/Bindings/CLI/AST.cpp +++ b/src/CppParser/Bindings/CLI/AST.cpp @@ -1074,6 +1074,16 @@ CppSharp::Parser::AST::DependentNameType::DependentNameType(CppSharp::Parser::AS NativePtr = new ::CppSharp::CppParser::AST::DependentNameType(__arg0); } +CppSharp::Parser::AST::Type^ CppSharp::Parser::AST::DependentNameType::Desugared::get() +{ + return (((::CppSharp::CppParser::AST::DependentNameType*)NativePtr)->Desugared == nullptr) ? nullptr : gcnew CppSharp::Parser::AST::Type((::CppSharp::CppParser::AST::Type*)((::CppSharp::CppParser::AST::DependentNameType*)NativePtr)->Desugared); +} + +void CppSharp::Parser::AST::DependentNameType::Desugared::set(CppSharp::Parser::AST::Type^ value) +{ + ((::CppSharp::CppParser::AST::DependentNameType*)NativePtr)->Desugared = (::CppSharp::CppParser::AST::Type*)value->NativePtr; +} + CppSharp::Parser::AST::PackExpansionType::PackExpansionType(::CppSharp::CppParser::AST::PackExpansionType* native) : CppSharp::Parser::AST::Type((::CppSharp::CppParser::AST::Type*)native) { diff --git a/src/CppParser/Bindings/CLI/AST.h b/src/CppParser/Bindings/CLI/AST.h index f6a7a0a5..644abe98 100644 --- a/src/CppParser/Bindings/CLI/AST.h +++ b/src/CppParser/Bindings/CLI/AST.h @@ -910,6 +910,12 @@ namespace CppSharp DependentNameType(CppSharp::Parser::AST::DependentNameType^ _0); ~DependentNameType(); + + property CppSharp::Parser::AST::Type^ Desugared + { + CppSharp::Parser::AST::Type^ get(); + void set(CppSharp::Parser::AST::Type^); + } }; public ref class PackExpansionType : CppSharp::Parser::AST::Type diff --git a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs index d2d5107f..86536f21 100644 --- a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs +++ b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs @@ -2466,7 +2466,7 @@ namespace CppSharp public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 8)] + [StructLayout(LayoutKind.Explicit, Size = 12)] public new partial struct Internal { [FieldOffset(0)] @@ -2475,6 +2475,9 @@ namespace CppSharp [FieldOffset(4)] public byte IsDependent; + [FieldOffset(8)] + public global::System.IntPtr Desugared; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2Ev")] @@ -2498,7 +2501,7 @@ namespace CppSharp private static void* __CopyValue(DependentNameType.Internal native) { - var ret = Marshal.AllocHGlobal(8); + var ret = Marshal.AllocHGlobal(12); global::CppSharp.Parser.AST.DependentNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native)); return ret.ToPointer(); } @@ -2522,7 +2525,7 @@ namespace CppSharp public DependentNameType() : this((void*) null) { - __Instance = Marshal.AllocHGlobal(8); + __Instance = Marshal.AllocHGlobal(12); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; Internal.ctor_0((__Instance + __PointerAdjustment)); @@ -2531,7 +2534,7 @@ namespace CppSharp public DependentNameType(global::CppSharp.Parser.AST.DependentNameType _0) : this((void*) null) { - __Instance = Marshal.AllocHGlobal(8); + __Instance = Marshal.AllocHGlobal(12); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; if (ReferenceEquals(_0, null)) @@ -2539,6 +2542,24 @@ namespace CppSharp var __arg0 = _0.__Instance; Internal.cctor_2((__Instance + __PointerAdjustment), __arg0); } + + public global::CppSharp.Parser.AST.Type Desugared + { + get + { + global::CppSharp.Parser.AST.Type __result0; + if (((Internal*) __Instance)->Desugared == IntPtr.Zero) __result0 = null; + else if (global::CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Desugared)) + __result0 = (global::CppSharp.Parser.AST.Type) global::CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Desugared]; + else __result0 = global::CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Desugared); + return __result0; + } + + set + { + ((Internal*) __Instance)->Desugared = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class PackExpansionType : global::CppSharp.Parser.AST.Type, IDisposable diff --git a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs index 6b1c4132..b0cc2fdb 100644 --- a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs +++ b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs @@ -2466,7 +2466,7 @@ namespace CppSharp public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 8)] + [StructLayout(LayoutKind.Explicit, Size = 12)] public new partial struct Internal { [FieldOffset(0)] @@ -2475,6 +2475,9 @@ namespace CppSharp [FieldOffset(4)] public byte IsDependent; + [FieldOffset(8)] + public global::System.IntPtr Desugared; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, EntryPoint="??0DependentNameType@AST@CppParser@CppSharp@@QAE@XZ")] @@ -2498,7 +2501,7 @@ namespace CppSharp private static void* __CopyValue(DependentNameType.Internal native) { - var ret = Marshal.AllocHGlobal(8); + var ret = Marshal.AllocHGlobal(12); global::CppSharp.Parser.AST.DependentNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native)); return ret.ToPointer(); } @@ -2522,7 +2525,7 @@ namespace CppSharp public DependentNameType() : this((void*) null) { - __Instance = Marshal.AllocHGlobal(8); + __Instance = Marshal.AllocHGlobal(12); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; Internal.ctor_0((__Instance + __PointerAdjustment)); @@ -2531,7 +2534,7 @@ namespace CppSharp public DependentNameType(global::CppSharp.Parser.AST.DependentNameType _0) : this((void*) null) { - __Instance = Marshal.AllocHGlobal(8); + __Instance = Marshal.AllocHGlobal(12); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; if (ReferenceEquals(_0, null)) @@ -2539,6 +2542,24 @@ namespace CppSharp var __arg0 = _0.__Instance; Internal.cctor_2((__Instance + __PointerAdjustment), __arg0); } + + public global::CppSharp.Parser.AST.Type Desugared + { + get + { + global::CppSharp.Parser.AST.Type __result0; + if (((Internal*) __Instance)->Desugared == IntPtr.Zero) __result0 = null; + else if (global::CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Desugared)) + __result0 = (global::CppSharp.Parser.AST.Type) global::CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Desugared]; + else __result0 = global::CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Desugared); + return __result0; + } + + set + { + ((Internal*) __Instance)->Desugared = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class PackExpansionType : global::CppSharp.Parser.AST.Type, IDisposable diff --git a/src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/CppSharp.CppParser.cs index 1da768b3..3d0870b8 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/CppSharp.CppParser.cs +++ b/src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/CppSharp.CppParser.cs @@ -2466,7 +2466,7 @@ namespace CppSharp public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 8)] + [StructLayout(LayoutKind.Explicit, Size = 16)] public new partial struct Internal { [FieldOffset(0)] @@ -2475,6 +2475,9 @@ namespace CppSharp [FieldOffset(4)] public byte IsDependent; + [FieldOffset(8)] + public global::System.IntPtr Desugared; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2Ev")] @@ -2498,7 +2501,7 @@ namespace CppSharp private static void* __CopyValue(DependentNameType.Internal native) { - var ret = Marshal.AllocHGlobal(8); + var ret = Marshal.AllocHGlobal(16); global::CppSharp.Parser.AST.DependentNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native)); return ret.ToPointer(); } @@ -2522,7 +2525,7 @@ namespace CppSharp public DependentNameType() : this((void*) null) { - __Instance = Marshal.AllocHGlobal(8); + __Instance = Marshal.AllocHGlobal(16); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; Internal.ctor_0((__Instance + __PointerAdjustment)); @@ -2531,7 +2534,7 @@ namespace CppSharp public DependentNameType(global::CppSharp.Parser.AST.DependentNameType _0) : this((void*) null) { - __Instance = Marshal.AllocHGlobal(8); + __Instance = Marshal.AllocHGlobal(16); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; if (ReferenceEquals(_0, null)) @@ -2539,6 +2542,24 @@ namespace CppSharp var __arg0 = _0.__Instance; Internal.cctor_2((__Instance + __PointerAdjustment), __arg0); } + + public global::CppSharp.Parser.AST.Type Desugared + { + get + { + global::CppSharp.Parser.AST.Type __result0; + if (((Internal*) __Instance)->Desugared == IntPtr.Zero) __result0 = null; + else if (global::CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Desugared)) + __result0 = (global::CppSharp.Parser.AST.Type) global::CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Desugared]; + else __result0 = global::CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Desugared); + return __result0; + } + + set + { + ((Internal*) __Instance)->Desugared = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class PackExpansionType : global::CppSharp.Parser.AST.Type, IDisposable diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.cs index b3a4a36b..cabceac0 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.cs +++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.cs @@ -2466,7 +2466,7 @@ namespace CppSharp public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 8)] + [StructLayout(LayoutKind.Explicit, Size = 16)] public new partial struct Internal { [FieldOffset(0)] @@ -2475,6 +2475,9 @@ namespace CppSharp [FieldOffset(4)] public byte IsDependent; + [FieldOffset(8)] + public global::System.IntPtr Desugared; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2Ev")] @@ -2498,7 +2501,7 @@ namespace CppSharp private static void* __CopyValue(DependentNameType.Internal native) { - var ret = Marshal.AllocHGlobal(8); + var ret = Marshal.AllocHGlobal(16); global::CppSharp.Parser.AST.DependentNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native)); return ret.ToPointer(); } @@ -2522,7 +2525,7 @@ namespace CppSharp public DependentNameType() : this((void*) null) { - __Instance = Marshal.AllocHGlobal(8); + __Instance = Marshal.AllocHGlobal(16); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; Internal.ctor_0((__Instance + __PointerAdjustment)); @@ -2531,7 +2534,7 @@ namespace CppSharp public DependentNameType(global::CppSharp.Parser.AST.DependentNameType _0) : this((void*) null) { - __Instance = Marshal.AllocHGlobal(8); + __Instance = Marshal.AllocHGlobal(16); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; if (ReferenceEquals(_0, null)) @@ -2539,6 +2542,24 @@ namespace CppSharp var __arg0 = _0.__Instance; Internal.cctor_2((__Instance + __PointerAdjustment), __arg0); } + + public global::CppSharp.Parser.AST.Type Desugared + { + get + { + global::CppSharp.Parser.AST.Type __result0; + if (((Internal*) __Instance)->Desugared == IntPtr.Zero) __result0 = null; + else if (global::CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Desugared)) + __result0 = (global::CppSharp.Parser.AST.Type) global::CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Desugared]; + else __result0 = global::CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Desugared); + return __result0; + } + + set + { + ((Internal*) __Instance)->Desugared = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class PackExpansionType : global::CppSharp.Parser.AST.Type, IDisposable diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/CppSharp.CppParser.cs index b3a4a36b..cabceac0 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/CppSharp.CppParser.cs +++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/CppSharp.CppParser.cs @@ -2466,7 +2466,7 @@ namespace CppSharp public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 8)] + [StructLayout(LayoutKind.Explicit, Size = 16)] public new partial struct Internal { [FieldOffset(0)] @@ -2475,6 +2475,9 @@ namespace CppSharp [FieldOffset(4)] public byte IsDependent; + [FieldOffset(8)] + public global::System.IntPtr Desugared; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2Ev")] @@ -2498,7 +2501,7 @@ namespace CppSharp private static void* __CopyValue(DependentNameType.Internal native) { - var ret = Marshal.AllocHGlobal(8); + var ret = Marshal.AllocHGlobal(16); global::CppSharp.Parser.AST.DependentNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native)); return ret.ToPointer(); } @@ -2522,7 +2525,7 @@ namespace CppSharp public DependentNameType() : this((void*) null) { - __Instance = Marshal.AllocHGlobal(8); + __Instance = Marshal.AllocHGlobal(16); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; Internal.ctor_0((__Instance + __PointerAdjustment)); @@ -2531,7 +2534,7 @@ namespace CppSharp public DependentNameType(global::CppSharp.Parser.AST.DependentNameType _0) : this((void*) null) { - __Instance = Marshal.AllocHGlobal(8); + __Instance = Marshal.AllocHGlobal(16); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; if (ReferenceEquals(_0, null)) @@ -2539,6 +2542,24 @@ namespace CppSharp var __arg0 = _0.__Instance; Internal.cctor_2((__Instance + __PointerAdjustment), __arg0); } + + public global::CppSharp.Parser.AST.Type Desugared + { + get + { + global::CppSharp.Parser.AST.Type __result0; + if (((Internal*) __Instance)->Desugared == IntPtr.Zero) __result0 = null; + else if (global::CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Desugared)) + __result0 = (global::CppSharp.Parser.AST.Type) global::CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Desugared]; + else __result0 = global::CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Desugared); + return __result0; + } + + set + { + ((Internal*) __Instance)->Desugared = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class PackExpansionType : global::CppSharp.Parser.AST.Type, IDisposable diff --git a/src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs index 05aa8420..1fca3ba5 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs +++ b/src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs @@ -2466,7 +2466,7 @@ namespace CppSharp public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 8)] + [StructLayout(LayoutKind.Explicit, Size = 16)] public new partial struct Internal { [FieldOffset(0)] @@ -2475,6 +2475,9 @@ namespace CppSharp [FieldOffset(4)] public byte IsDependent; + [FieldOffset(8)] + public global::System.IntPtr Desugared; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="??0DependentNameType@AST@CppParser@CppSharp@@QEAA@XZ")] @@ -2498,7 +2501,7 @@ namespace CppSharp private static void* __CopyValue(DependentNameType.Internal native) { - var ret = Marshal.AllocHGlobal(8); + var ret = Marshal.AllocHGlobal(16); global::CppSharp.Parser.AST.DependentNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native)); return ret.ToPointer(); } @@ -2522,7 +2525,7 @@ namespace CppSharp public DependentNameType() : this((void*) null) { - __Instance = Marshal.AllocHGlobal(8); + __Instance = Marshal.AllocHGlobal(16); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; Internal.ctor_0((__Instance + __PointerAdjustment)); @@ -2531,7 +2534,7 @@ namespace CppSharp public DependentNameType(global::CppSharp.Parser.AST.DependentNameType _0) : this((void*) null) { - __Instance = Marshal.AllocHGlobal(8); + __Instance = Marshal.AllocHGlobal(16); __ownsNativeInstance = true; NativeToManagedMap[__Instance] = this; if (ReferenceEquals(_0, null)) @@ -2539,6 +2542,24 @@ namespace CppSharp var __arg0 = _0.__Instance; Internal.cctor_2((__Instance + __PointerAdjustment), __arg0); } + + public global::CppSharp.Parser.AST.Type Desugared + { + get + { + global::CppSharp.Parser.AST.Type __result0; + if (((Internal*) __Instance)->Desugared == IntPtr.Zero) __result0 = null; + else if (global::CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Desugared)) + __result0 = (global::CppSharp.Parser.AST.Type) global::CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Desugared]; + else __result0 = global::CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Desugared); + return __result0; + } + + set + { + ((Internal*) __Instance)->Desugared = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class PackExpansionType : global::CppSharp.Parser.AST.Type, IDisposable diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 8a2f6b99..284414fd 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -2357,6 +2357,8 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL, { auto DN = Type->getAs(); auto DNT = new DependentNameType(); + if (DN->isSugared()) + DNT->Desugared = WalkType(DN->desugar(), TL); Ty = DNT; break; diff --git a/src/Generator/Generators/CLI/CLITypePrinter.cs b/src/Generator/Generators/CLI/CLITypePrinter.cs index 1a7956bc..3a80ea14 100644 --- a/src/Generator/Generators/CLI/CLITypePrinter.cs +++ b/src/Generator/Generators/CLI/CLITypePrinter.cs @@ -304,7 +304,7 @@ namespace CppSharp.Generators.CLI public string VisitDependentNameType(DependentNameType dependent, TypeQualifiers quals) { - return string.Empty; + return dependent.Desugared != null ? dependent.Desugared.Visit(this) : string.Empty; } public string VisitPackExpansionType(PackExpansionType packExpansionType, TypeQualifiers quals) diff --git a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs index 592289ea..dcf88132 100644 --- a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs +++ b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs @@ -461,7 +461,7 @@ namespace CppSharp.Generators.CSharp public CSharpTypePrinterResult VisitDependentNameType(DependentNameType dependent, TypeQualifiers quals) { - throw new NotImplementedException(); + return dependent.Desugared != null ? dependent.Desugared.Visit(this) : string.Empty; } public CSharpTypePrinterResult VisitPackExpansionType(PackExpansionType type, diff --git a/src/Generator/Types/CppTypePrinter.cs b/src/Generator/Types/CppTypePrinter.cs index 630aabb9..fc44f250 100644 --- a/src/Generator/Types/CppTypePrinter.cs +++ b/src/Generator/Types/CppTypePrinter.cs @@ -187,7 +187,7 @@ namespace CppSharp.Types public string VisitDependentNameType(DependentNameType dependent, TypeQualifiers quals) { - return string.Empty; + return dependent.Desugared != null ? dependent.Desugared.Visit(this) : string.Empty; } public string VisitPackExpansionType(PackExpansionType packExpansionType, TypeQualifiers quals)