From 9dbcc3cc2cb4ccea71a62f38d3b82d701177c158 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Sun, 23 Apr 2017 23:55:20 +0300 Subject: [PATCH] Completed the support for dependent type names. Signed-off-by: Dimitar Dobrev --- src/AST/Type.cs | 2 + src/CppParser/AST.cpp | 4 ++ src/CppParser/AST.h | 2 + src/CppParser/Bindings/CLI/AST.cpp | 20 ++++++++ src/CppParser/Bindings/CLI/AST.h | 6 +++ .../CppSharp.CppParser.cs | 50 +++++++++++++++++-- .../i686-pc-win32-msvc/CppSharp.CppParser.cs | 44 +++++++++++++++- .../CppSharp.CppParser.cs | 50 +++++++++++++++++-- .../CppSharp.CppParser.cs | 50 +++++++++++++++++-- .../x86_64-linux-gnu/CppSharp.CppParser.cs | 50 +++++++++++++++++-- .../CppSharp.CppParser.cs | 44 +++++++++++++++- src/CppParser/Parser.cpp | 1 + src/Generator.Tests/AST/TestAST.cs | 17 +++++-- src/Generator.Tests/ASTTestFixture.cs | 3 ++ .../Generators/CSharp/CSharpTypePrinter.cs | 4 +- src/Parser/ASTConverter.cs | 1 + tests/Native/AST.h | 1 + 17 files changed, 325 insertions(+), 24 deletions(-) diff --git a/src/AST/Type.cs b/src/AST/Type.cs index 1896c46b..801f0b97 100644 --- a/src/AST/Type.cs +++ b/src/AST/Type.cs @@ -943,6 +943,8 @@ namespace CppSharp.AST public QualifiedType Qualifier { get; set; } + public string Identifier { get; set; } + public override T Visit(ITypeVisitor visitor, TypeQualifiers quals = new TypeQualifiers()) { diff --git a/src/CppParser/AST.cpp b/src/CppParser/AST.cpp index b79c1eeb..b958cfa2 100644 --- a/src/CppParser/AST.cpp +++ b/src/CppParser/AST.cpp @@ -185,6 +185,10 @@ InjectedClassNameType::InjectedClassNameType() DependentNameType::DependentNameType() : Type(TypeKind::DependentName) {} +DependentNameType::~DependentNameType() {} + +DEF_STRING(DependentNameType, Identifier) + PackExpansionType::PackExpansionType() : Type(TypeKind::PackExpansion) {} UnaryTransformType::UnaryTransformType() : Type(TypeKind::UnaryTransform) {} diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index 32770825..094fe97e 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -258,7 +258,9 @@ class CS_API DependentNameType : public Type { public: DECLARE_TYPE_KIND(DependentName) + ~DependentNameType(); QualifiedType qualifier; + STRING(Identifier) }; class CS_API PackExpansionType : public Type diff --git a/src/CppParser/Bindings/CLI/AST.cpp b/src/CppParser/Bindings/CLI/AST.cpp index 61800bb4..726a54da 100644 --- a/src/CppParser/Bindings/CLI/AST.cpp +++ b/src/CppParser/Bindings/CLI/AST.cpp @@ -1089,6 +1089,12 @@ CppSharp::Parser::AST::DependentNameType^ CppSharp::Parser::AST::DependentNameTy CppSharp::Parser::AST::DependentNameType::~DependentNameType() { + if (NativePtr) + { + auto __nativePtr = NativePtr; + NativePtr = 0; + delete (::CppSharp::CppParser::AST::DependentNameType*) __nativePtr; + } } CppSharp::Parser::AST::DependentNameType::DependentNameType() @@ -1118,6 +1124,20 @@ void CppSharp::Parser::AST::DependentNameType::Qualifier::set(CppSharp::Parser:: ((::CppSharp::CppParser::AST::DependentNameType*)NativePtr)->qualifier = *(::CppSharp::CppParser::AST::QualifiedType*)value->NativePtr; } +System::String^ CppSharp::Parser::AST::DependentNameType::Identifier::get() +{ + auto __ret = ((::CppSharp::CppParser::AST::DependentNameType*)NativePtr)->getIdentifier(); + if (__ret == nullptr) return nullptr; + return (__ret == 0 ? nullptr : clix::marshalString(__ret)); +} + +void CppSharp::Parser::AST::DependentNameType::Identifier::set(System::String^ s) +{ + auto ___arg0 = clix::marshalString(s); + auto __arg0 = ___arg0.c_str(); + ((::CppSharp::CppParser::AST::DependentNameType*)NativePtr)->setIdentifier(__arg0); +} + 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 a59da4db..39a454ee 100644 --- a/src/CppParser/Bindings/CLI/AST.h +++ b/src/CppParser/Bindings/CLI/AST.h @@ -983,6 +983,12 @@ namespace CppSharp CppSharp::Parser::AST::QualifiedType^ get(); void set(CppSharp::Parser::AST::QualifiedType^); } + + property System::String^ Identifier + { + System::String^ get(); + void set(System::String^); + } }; 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 98a930fb..368ff9c6 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 @@ -2552,7 +2552,7 @@ namespace CppSharp public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 16)] + [StructLayout(LayoutKind.Explicit, Size = 28)] public new partial struct __Internal { [FieldOffset(0)] @@ -2564,6 +2564,9 @@ namespace CppSharp [FieldOffset(8)] public global::CppSharp.Parser.AST.QualifiedType.__Internal qualifier; + [FieldOffset(16)] + public global::Std.__1.BasicString.__Internal Identifier; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2Ev")] @@ -2572,7 +2575,22 @@ namespace CppSharp [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2ERKS2_")] - internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0); + internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeD2Ev")] + internal static extern void dtor_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameType13getIdentifierEv")] + internal static extern global::System.IntPtr Identifier_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameType13setIdentifierEPKc")] + internal static extern void SetIdentifier_0(global::System.IntPtr instance, [MarshalAs(UnmanagedType.LPStr)] string s); } internal static new global::CppSharp.Parser.AST.DependentNameType __CreateInstance(global::System.IntPtr native, bool skipVTables = false) @@ -2588,7 +2606,7 @@ namespace CppSharp private static void* __CopyValue(global::CppSharp.Parser.AST.DependentNameType.__Internal native) { var ret = Marshal.AllocHGlobal(sizeof(global::CppSharp.Parser.AST.DependentNameType.__Internal)); - global::CppSharp.Parser.AST.DependentNameType.__Internal.cctor_2(ret, new global::System.IntPtr(&native)); + global::CppSharp.Parser.AST.DependentNameType.__Internal.cctor_1(ret, new global::System.IntPtr(&native)); return ret.ToPointer(); } @@ -2626,7 +2644,17 @@ namespace CppSharp if (ReferenceEquals(_0, null)) throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&)."); var __arg0 = _0.__Instance; - __Internal.cctor_2((__Instance + __PointerAdjustment), __arg0); + __Internal.cctor_1((__Instance + __PointerAdjustment), __arg0); + } + + public override void Dispose(bool disposing) + { + global::CppSharp.Parser.AST.Type __dummy; + NativeToManagedMap.TryRemove(__Instance, out __dummy); + if (disposing) + __Internal.dtor_0((__Instance + __PointerAdjustment)); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); } public global::CppSharp.Parser.AST.QualifiedType Qualifier @@ -2641,6 +2669,20 @@ namespace CppSharp ((global::CppSharp.Parser.AST.DependentNameType.__Internal*) __Instance)->qualifier = ReferenceEquals(value, null) ? new global::CppSharp.Parser.AST.QualifiedType.__Internal() : *(global::CppSharp.Parser.AST.QualifiedType.__Internal*) value.__Instance; } } + + public string Identifier + { + get + { + var __ret = __Internal.Identifier_0((__Instance + __PointerAdjustment)); + return Marshal.PtrToStringAnsi(__ret); + } + + set + { + __Internal.SetIdentifier_0((__Instance + __PointerAdjustment), value); + } + } } 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 740b4708..d2929009 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 @@ -2552,7 +2552,7 @@ namespace CppSharp public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 16)] + [StructLayout(LayoutKind.Explicit, Size = 40)] public new partial struct __Internal { [FieldOffset(0)] @@ -2564,6 +2564,9 @@ namespace CppSharp [FieldOffset(8)] public global::CppSharp.Parser.AST.QualifiedType.__Internal qualifier; + [FieldOffset(16)] + public global::Std.BasicString.__Internal Identifier; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, EntryPoint="??0DependentNameType@AST@CppParser@CppSharp@@QAE@XZ")] @@ -2573,6 +2576,21 @@ namespace CppSharp [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, EntryPoint="??0DependentNameType@AST@CppParser@CppSharp@@QAE@ABV0123@@Z")] internal static extern global::System.IntPtr cctor_1(global::System.IntPtr instance, global::System.IntPtr _0); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, + EntryPoint="??1DependentNameType@AST@CppParser@CppSharp@@QAE@XZ")] + internal static extern void dtor_0(global::System.IntPtr instance, int delete); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, + EntryPoint="?getIdentifier@DependentNameType@AST@CppParser@CppSharp@@QAEPBDXZ")] + internal static extern global::System.IntPtr Identifier_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, + EntryPoint="?setIdentifier@DependentNameType@AST@CppParser@CppSharp@@QAEXPBD@Z")] + internal static extern void SetIdentifier_0(global::System.IntPtr instance, [MarshalAs(UnmanagedType.LPStr)] string s); } internal static new global::CppSharp.Parser.AST.DependentNameType __CreateInstance(global::System.IntPtr native, bool skipVTables = false) @@ -2629,6 +2647,16 @@ namespace CppSharp __Internal.cctor_1((__Instance + __PointerAdjustment), __arg0); } + public override void Dispose(bool disposing) + { + global::CppSharp.Parser.AST.Type __dummy; + NativeToManagedMap.TryRemove(__Instance, out __dummy); + if (disposing) + __Internal.dtor_0((__Instance + __PointerAdjustment), 0); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + } + public global::CppSharp.Parser.AST.QualifiedType Qualifier { get @@ -2641,6 +2669,20 @@ namespace CppSharp ((global::CppSharp.Parser.AST.DependentNameType.__Internal*) __Instance)->qualifier = ReferenceEquals(value, null) ? new global::CppSharp.Parser.AST.QualifiedType.__Internal() : *(global::CppSharp.Parser.AST.QualifiedType.__Internal*) value.__Instance; } } + + public string Identifier + { + get + { + var __ret = __Internal.Identifier_0((__Instance + __PointerAdjustment)); + return Marshal.PtrToStringAnsi(__ret); + } + + set + { + __Internal.SetIdentifier_0((__Instance + __PointerAdjustment), value); + } + } } 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 65078066..301b0ecb 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 @@ -2552,7 +2552,7 @@ namespace CppSharp public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 24)] + [StructLayout(LayoutKind.Explicit, Size = 48)] public new partial struct __Internal { [FieldOffset(0)] @@ -2564,6 +2564,9 @@ namespace CppSharp [FieldOffset(8)] public global::CppSharp.Parser.AST.QualifiedType.__Internal qualifier; + [FieldOffset(24)] + public global::Std.__1.BasicString.__Internal Identifier; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2Ev")] @@ -2572,7 +2575,22 @@ namespace CppSharp [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2ERKS2_")] - internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0); + internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeD2Ev")] + internal static extern void dtor_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameType13getIdentifierEv")] + internal static extern global::System.IntPtr Identifier_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameType13setIdentifierEPKc")] + internal static extern void SetIdentifier_0(global::System.IntPtr instance, [MarshalAs(UnmanagedType.LPStr)] string s); } internal static new global::CppSharp.Parser.AST.DependentNameType __CreateInstance(global::System.IntPtr native, bool skipVTables = false) @@ -2588,7 +2606,7 @@ namespace CppSharp private static void* __CopyValue(global::CppSharp.Parser.AST.DependentNameType.__Internal native) { var ret = Marshal.AllocHGlobal(sizeof(global::CppSharp.Parser.AST.DependentNameType.__Internal)); - global::CppSharp.Parser.AST.DependentNameType.__Internal.cctor_2(ret, new global::System.IntPtr(&native)); + global::CppSharp.Parser.AST.DependentNameType.__Internal.cctor_1(ret, new global::System.IntPtr(&native)); return ret.ToPointer(); } @@ -2626,7 +2644,17 @@ namespace CppSharp if (ReferenceEquals(_0, null)) throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&)."); var __arg0 = _0.__Instance; - __Internal.cctor_2((__Instance + __PointerAdjustment), __arg0); + __Internal.cctor_1((__Instance + __PointerAdjustment), __arg0); + } + + public override void Dispose(bool disposing) + { + global::CppSharp.Parser.AST.Type __dummy; + NativeToManagedMap.TryRemove(__Instance, out __dummy); + if (disposing) + __Internal.dtor_0((__Instance + __PointerAdjustment)); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); } public global::CppSharp.Parser.AST.QualifiedType Qualifier @@ -2641,6 +2669,20 @@ namespace CppSharp ((global::CppSharp.Parser.AST.DependentNameType.__Internal*) __Instance)->qualifier = ReferenceEquals(value, null) ? new global::CppSharp.Parser.AST.QualifiedType.__Internal() : *(global::CppSharp.Parser.AST.QualifiedType.__Internal*) value.__Instance; } } + + public string Identifier + { + get + { + var __ret = __Internal.Identifier_0((__Instance + __PointerAdjustment)); + return Marshal.PtrToStringAnsi(__ret); + } + + set + { + __Internal.SetIdentifier_0((__Instance + __PointerAdjustment), value); + } + } } 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 d0682fab..603687fe 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 @@ -2552,7 +2552,7 @@ namespace CppSharp public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 24)] + [StructLayout(LayoutKind.Explicit, Size = 56)] public new partial struct __Internal { [FieldOffset(0)] @@ -2564,6 +2564,9 @@ namespace CppSharp [FieldOffset(8)] public global::CppSharp.Parser.AST.QualifiedType.__Internal qualifier; + [FieldOffset(24)] + public global::Std.Cxx11.BasicString.__Internal Identifier; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2Ev")] @@ -2572,7 +2575,22 @@ namespace CppSharp [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2ERKS2_")] - internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0); + internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeD2Ev")] + internal static extern void dtor_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameType13getIdentifierEv")] + internal static extern global::System.IntPtr Identifier_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameType13setIdentifierEPKc")] + internal static extern void SetIdentifier_0(global::System.IntPtr instance, [MarshalAs(UnmanagedType.LPStr)] string s); } internal static new global::CppSharp.Parser.AST.DependentNameType __CreateInstance(global::System.IntPtr native, bool skipVTables = false) @@ -2588,7 +2606,7 @@ namespace CppSharp private static void* __CopyValue(global::CppSharp.Parser.AST.DependentNameType.__Internal native) { var ret = Marshal.AllocHGlobal(sizeof(global::CppSharp.Parser.AST.DependentNameType.__Internal)); - global::CppSharp.Parser.AST.DependentNameType.__Internal.cctor_2(ret, new global::System.IntPtr(&native)); + global::CppSharp.Parser.AST.DependentNameType.__Internal.cctor_1(ret, new global::System.IntPtr(&native)); return ret.ToPointer(); } @@ -2626,7 +2644,17 @@ namespace CppSharp if (ReferenceEquals(_0, null)) throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&)."); var __arg0 = _0.__Instance; - __Internal.cctor_2((__Instance + __PointerAdjustment), __arg0); + __Internal.cctor_1((__Instance + __PointerAdjustment), __arg0); + } + + public override void Dispose(bool disposing) + { + global::CppSharp.Parser.AST.Type __dummy; + NativeToManagedMap.TryRemove(__Instance, out __dummy); + if (disposing) + __Internal.dtor_0((__Instance + __PointerAdjustment)); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); } public global::CppSharp.Parser.AST.QualifiedType Qualifier @@ -2641,6 +2669,20 @@ namespace CppSharp ((global::CppSharp.Parser.AST.DependentNameType.__Internal*) __Instance)->qualifier = ReferenceEquals(value, null) ? new global::CppSharp.Parser.AST.QualifiedType.__Internal() : *(global::CppSharp.Parser.AST.QualifiedType.__Internal*) value.__Instance; } } + + public string Identifier + { + get + { + var __ret = __Internal.Identifier_0((__Instance + __PointerAdjustment)); + return Marshal.PtrToStringAnsi(__ret); + } + + set + { + __Internal.SetIdentifier_0((__Instance + __PointerAdjustment), value); + } + } } 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 1330e1fb..1d552f0b 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 @@ -2552,7 +2552,7 @@ namespace CppSharp public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 24)] + [StructLayout(LayoutKind.Explicit, Size = 32)] public new partial struct __Internal { [FieldOffset(0)] @@ -2564,6 +2564,9 @@ namespace CppSharp [FieldOffset(8)] public global::CppSharp.Parser.AST.QualifiedType.__Internal qualifier; + [FieldOffset(24)] + public global::Std.BasicString.__Internal Identifier; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2Ev")] @@ -2572,7 +2575,22 @@ namespace CppSharp [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2ERKS2_")] - internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0); + internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeD2Ev")] + internal static extern void dtor_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameType13getIdentifierEv")] + internal static extern global::System.IntPtr Identifier_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameType13setIdentifierEPKc")] + internal static extern void SetIdentifier_0(global::System.IntPtr instance, [MarshalAs(UnmanagedType.LPStr)] string s); } internal static new global::CppSharp.Parser.AST.DependentNameType __CreateInstance(global::System.IntPtr native, bool skipVTables = false) @@ -2588,7 +2606,7 @@ namespace CppSharp private static void* __CopyValue(global::CppSharp.Parser.AST.DependentNameType.__Internal native) { var ret = Marshal.AllocHGlobal(sizeof(global::CppSharp.Parser.AST.DependentNameType.__Internal)); - global::CppSharp.Parser.AST.DependentNameType.__Internal.cctor_2(ret, new global::System.IntPtr(&native)); + global::CppSharp.Parser.AST.DependentNameType.__Internal.cctor_1(ret, new global::System.IntPtr(&native)); return ret.ToPointer(); } @@ -2626,7 +2644,17 @@ namespace CppSharp if (ReferenceEquals(_0, null)) throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&)."); var __arg0 = _0.__Instance; - __Internal.cctor_2((__Instance + __PointerAdjustment), __arg0); + __Internal.cctor_1((__Instance + __PointerAdjustment), __arg0); + } + + public override void Dispose(bool disposing) + { + global::CppSharp.Parser.AST.Type __dummy; + NativeToManagedMap.TryRemove(__Instance, out __dummy); + if (disposing) + __Internal.dtor_0((__Instance + __PointerAdjustment)); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); } public global::CppSharp.Parser.AST.QualifiedType Qualifier @@ -2641,6 +2669,20 @@ namespace CppSharp ((global::CppSharp.Parser.AST.DependentNameType.__Internal*) __Instance)->qualifier = ReferenceEquals(value, null) ? new global::CppSharp.Parser.AST.QualifiedType.__Internal() : *(global::CppSharp.Parser.AST.QualifiedType.__Internal*) value.__Instance; } } + + public string Identifier + { + get + { + var __ret = __Internal.Identifier_0((__Instance + __PointerAdjustment)); + return Marshal.PtrToStringAnsi(__ret); + } + + set + { + __Internal.SetIdentifier_0((__Instance + __PointerAdjustment), value); + } + } } 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 5a7c203a..816dd2e8 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 @@ -2552,7 +2552,7 @@ namespace CppSharp public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 24)] + [StructLayout(LayoutKind.Explicit, Size = 56)] public new partial struct __Internal { [FieldOffset(0)] @@ -2564,6 +2564,9 @@ namespace CppSharp [FieldOffset(8)] public global::CppSharp.Parser.AST.QualifiedType.__Internal qualifier; + [FieldOffset(24)] + public global::Std.BasicString.__Internal Identifier; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="??0DependentNameType@AST@CppParser@CppSharp@@QEAA@XZ")] @@ -2573,6 +2576,21 @@ namespace CppSharp [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="??0DependentNameType@AST@CppParser@CppSharp@@QEAA@AEBV0123@@Z")] internal static extern global::System.IntPtr cctor_1(global::System.IntPtr instance, global::System.IntPtr _0); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="??1DependentNameType@AST@CppParser@CppSharp@@QEAA@XZ")] + internal static extern void dtor_0(global::System.IntPtr instance, int delete); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="?getIdentifier@DependentNameType@AST@CppParser@CppSharp@@QEAAPEBDXZ")] + internal static extern global::System.IntPtr Identifier_0(global::System.IntPtr instance); + + [SuppressUnmanagedCodeSecurity] + [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, + EntryPoint="?setIdentifier@DependentNameType@AST@CppParser@CppSharp@@QEAAXPEBD@Z")] + internal static extern void SetIdentifier_0(global::System.IntPtr instance, [MarshalAs(UnmanagedType.LPStr)] string s); } internal static new global::CppSharp.Parser.AST.DependentNameType __CreateInstance(global::System.IntPtr native, bool skipVTables = false) @@ -2629,6 +2647,16 @@ namespace CppSharp __Internal.cctor_1((__Instance + __PointerAdjustment), __arg0); } + public override void Dispose(bool disposing) + { + global::CppSharp.Parser.AST.Type __dummy; + NativeToManagedMap.TryRemove(__Instance, out __dummy); + if (disposing) + __Internal.dtor_0((__Instance + __PointerAdjustment), 0); + if (__ownsNativeInstance) + Marshal.FreeHGlobal(__Instance); + } + public global::CppSharp.Parser.AST.QualifiedType Qualifier { get @@ -2641,6 +2669,20 @@ namespace CppSharp ((global::CppSharp.Parser.AST.DependentNameType.__Internal*) __Instance)->qualifier = ReferenceEquals(value, null) ? new global::CppSharp.Parser.AST.QualifiedType.__Internal() : *(global::CppSharp.Parser.AST.QualifiedType.__Internal*) value.__Instance; } } + + public string Identifier + { + get + { + var __ret = __Internal.Identifier_0((__Instance + __PointerAdjustment)); + return Marshal.PtrToStringAnsi(__ret); + } + + set + { + __Internal.SetIdentifier_0((__Instance + __PointerAdjustment), value); + } + } } public unsafe partial class PackExpansionType : global::CppSharp.Parser.AST.Type, IDisposable diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index d585fe0d..4cedfc8c 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -2593,6 +2593,7 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL, DNT->qualifier = GetQualifiedType(clang::QualType(DN->getQualifier()->getAsType(), 0)); break; } + DNT->Identifier = DN->getIdentifier()->getName(); Ty = DNT; break; diff --git a/src/Generator.Tests/AST/TestAST.cs b/src/Generator.Tests/AST/TestAST.cs index bb61d8fb..c262edf1 100644 --- a/src/Generator.Tests/AST/TestAST.cs +++ b/src/Generator.Tests/AST/TestAST.cs @@ -279,10 +279,10 @@ namespace CppSharp.Generator.Tests.AST var paramType = ctor.Parameters[0].Type as TemplateParameterType; Assert.IsNotNull(paramType); Assert.AreEqual(templateTypeParameter, paramType.Parameter); - Assert.AreEqual(3, template.Specializations.Count); + Assert.AreEqual(5, template.Specializations.Count); Assert.AreEqual(TemplateSpecializationKind.ExplicitInstantiationDefinition, template.Specializations[0].SpecializationKind); - Assert.AreEqual(TemplateSpecializationKind.ExplicitInstantiationDefinition, template.Specializations[1].SpecializationKind); - Assert.AreEqual(TemplateSpecializationKind.Undeclared, template.Specializations[2].SpecializationKind); + Assert.AreEqual(TemplateSpecializationKind.ExplicitInstantiationDefinition, template.Specializations[3].SpecializationKind); + Assert.AreEqual(TemplateSpecializationKind.Undeclared, template.Specializations[4].SpecializationKind); var typeDef = AstContext.FindTypedef("TestTemplateClassInt").FirstOrDefault(); Assert.IsNotNull(typeDef, "Couldn't find TestTemplateClassInt typedef."); var integerInst = typeDef.Type as TemplateSpecializationType; @@ -335,7 +335,6 @@ namespace CppSharp.Generator.Tests.AST [Test] public void TestAmbiguity() { - new CleanUnitPass { Context = Driver.Context }.VisitASTContext(AstContext); new CheckAmbiguousFunctions { Context = Driver.Context }.VisitASTContext(AstContext); Assert.IsTrue(AstContext.FindClass("HasAmbiguousFunctions").Single().FindMethod("ambiguous").IsAmbiguous); } @@ -501,7 +500,7 @@ namespace CppSharp.Generator.Tests.AST { var template = AstContext.FindDecl("TestTemplateClass").First(); var cppTypePrinter = new CppTypePrinter { PrintScopeKind = TypePrintScopeKind.Qualified }; - Assert.That(template.Specializations[1].Classes[0].Visit(cppTypePrinter), + Assert.That(template.Specializations[3].Classes[0].Visit(cppTypePrinter), Is.EqualTo("TestTemplateClass::NestedInTemplate")); } @@ -513,5 +512,13 @@ namespace CppSharp.Generator.Tests.AST Assert.That(functionWithSpecializationArg.Parameters[0].Visit(cppTypePrinter), Is.EqualTo("const TestTemplateClass")); } + + [Test] + public void TestDependentNameType() + { + var template = AstContext.FindDecl("TestSpecializationArguments").First(); + Assert.That(template.TemplatedClass.Fields[0].Type.ToString(), + Is.EqualTo("global::Test.TestTemplateClass.NestedInTemplate")); + } } } diff --git a/src/Generator.Tests/ASTTestFixture.cs b/src/Generator.Tests/ASTTestFixture.cs index 47b6543b..2c5c771d 100644 --- a/src/Generator.Tests/ASTTestFixture.cs +++ b/src/Generator.Tests/ASTTestFixture.cs @@ -2,6 +2,7 @@ using System; using CppSharp.AST; using CppSharp.Utils; using CppSharp.Parser; +using CppSharp.Passes; namespace CppSharp.Generator.Tests { @@ -34,6 +35,8 @@ namespace CppSharp.Generator.Tests throw new Exception("Error parsing the code"); AstContext = Driver.Context.ASTContext; + new CleanUnitPass { Context = Driver.Context }.VisitASTContext(AstContext); + new ResolveIncompleteDeclsPass { Context = Driver.Context }.VisitASTContext(AstContext); } } } diff --git a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs index 3a2e8121..0c8c34ae 100644 --- a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs +++ b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs @@ -442,7 +442,9 @@ namespace CppSharp.Generators.CSharp public override TypePrinterResult VisitDependentNameType(DependentNameType dependent, TypeQualifiers quals) { - return dependent.Qualifier.Type != null ? dependent.Qualifier.Visit(this) : string.Empty; + if (dependent.Qualifier.Type == null) + return dependent.Identifier; + return $"{dependent.Qualifier.Visit(this)}.{dependent.Identifier}"; } public override TypePrinterResult VisitPackExpansionType(PackExpansionType type, diff --git a/src/Parser/ASTConverter.cs b/src/Parser/ASTConverter.cs index f9f0f76b..60e17c9d 100644 --- a/src/Parser/ASTConverter.cs +++ b/src/Parser/ASTConverter.cs @@ -703,6 +703,7 @@ namespace CppSharp var _type = new AST.DependentNameType(); VisitType(type, _type); _type.Qualifier = VisitQualified(type.Qualifier); + _type.Identifier = type.Identifier; return _type; } diff --git a/tests/Native/AST.h b/tests/Native/AST.h index 147c37eb..c5e05727 100644 --- a/tests/Native/AST.h +++ b/tests/Native/AST.h @@ -121,6 +121,7 @@ class TestSpecializationArguments { public: TestSpecializationArguments() {} + typename TestTemplateClass::NestedInTemplate n; }; void instantiatesTemplate(TestSpecializationArguments i, TestSpecializationArguments f)