From fe7afc3b0519c9449fb8960a079ff95ee67d362f Mon Sep 17 00:00:00 2001 From: Jelle Date: Fri, 14 Feb 2025 13:45:16 +0000 Subject: [PATCH] Fix some template declarations not setting namespace (#1913) * Fix some template declarations not setting namespace * throw on unsupported arch/platform * Update bindings --- src/AST/Template.cs | 2 + src/CLI/Generator.cs | 4 ++ src/CppParser/AST.h | 5 +- src/CppParser/Bindings/CLI/Decl.cpp | 10 ++++ src/CppParser/Bindings/CLI/Decl.h | 6 +++ .../CppSharp.CppParser.cs | 26 ++++++++-- .../CppSharp.CppParser.cs | 22 ++++++++- .../i686-pc-win32-msvc/CppSharp.CppParser.cs | 22 ++++++++- .../CppSharp.CppParser.cs | 26 ++++++++-- .../CppSharp.CppParser.cs | 26 ++++++++-- .../x86_64-linux-gnu/CppSharp.CppParser.cs | 26 ++++++++-- .../CppSharp.CppParser.cs | 22 ++++++++- .../CppSharp.CppParser.cs | 22 ++++++++- src/CppParser/Decl.h | 2 + src/CppParser/Parser.cpp | 48 +++++++++++++++++-- src/CppParser/Parser.h | 1 + src/Generator/Driver.cs | 6 +-- src/Parser/ASTConverter.cs | 1 + 18 files changed, 243 insertions(+), 34 deletions(-) diff --git a/src/AST/Template.cs b/src/AST/Template.cs index 57cd5c7d..9ce61187 100644 --- a/src/AST/Template.cs +++ b/src/AST/Template.cs @@ -180,6 +180,8 @@ namespace CppSharp.AST { return visitor.VisitTypeAliasTemplateDecl(this); } + + public Declaration CanonicalDecl; } /// diff --git a/src/CLI/Generator.cs b/src/CLI/Generator.cs index ab90cf9b..7dfce75c 100644 --- a/src/CLI/Generator.cs +++ b/src/CLI/Generator.cs @@ -40,6 +40,8 @@ namespace CppSharp case TargetArchitecture.WASM64: tripleBuilder.Append("wasm64-"); break; + default: + throw new ArgumentOutOfRangeException(nameof(options.Architecture), "Unsupported target architecture."); } switch (options.Platform) @@ -71,6 +73,8 @@ namespace CppSharp abi = CppAbi.Itanium; break; } + default: + throw new ArgumentOutOfRangeException(nameof(options.Platform), "Unsupported target platform."); } triple = tripleBuilder.ToString(); diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index c8a3be1c..7bb740ec 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -23,7 +23,10 @@ enum class ArchType { UnknownArch, x86, - x86_64 + x86_64, + aarch64, + aarch64_be, + aarch64_32 }; class CS_API NativeLibrary diff --git a/src/CppParser/Bindings/CLI/Decl.cpp b/src/CppParser/Bindings/CLI/Decl.cpp index 58553e54..7e6513ba 100644 --- a/src/CppParser/Bindings/CLI/Decl.cpp +++ b/src/CppParser/Bindings/CLI/Decl.cpp @@ -3915,6 +3915,16 @@ CppSharp::Parser::AST::TypeAliasTemplate::TypeAliasTemplate(CppSharp::Parser::AS NativePtr = new class ::CppSharp::CppParser::AST::TypeAliasTemplate(__arg0); } +CppSharp::Parser::AST::Declaration^ CppSharp::Parser::AST::TypeAliasTemplate::CanonicalDecl::get() +{ + return (((class ::CppSharp::CppParser::AST::TypeAliasTemplate*)NativePtr)->CanonicalDecl == nullptr) ? nullptr : gcnew ::CppSharp::Parser::AST::Declaration((class ::CppSharp::CppParser::AST::Declaration*)((class ::CppSharp::CppParser::AST::TypeAliasTemplate*)NativePtr)->CanonicalDecl); +} + +void CppSharp::Parser::AST::TypeAliasTemplate::CanonicalDecl::set(CppSharp::Parser::AST::Declaration^ value) +{ + ((class ::CppSharp::CppParser::AST::TypeAliasTemplate*)NativePtr)->CanonicalDecl = (class ::CppSharp::CppParser::AST::Declaration*)value->NativePtr; +} + CppSharp::Parser::AST::TemplateParameter::TemplateParameter(class ::CppSharp::CppParser::AST::TemplateParameter* native) : CppSharp::Parser::AST::Declaration((::CppSharp::CppParser::AST::Declaration*)native) { diff --git a/src/CppParser/Bindings/CLI/Decl.h b/src/CppParser/Bindings/CLI/Decl.h index ef71e36c..05940503 100644 --- a/src/CppParser/Bindings/CLI/Decl.h +++ b/src/CppParser/Bindings/CLI/Decl.h @@ -1971,6 +1971,12 @@ namespace CppSharp TypeAliasTemplate(CppSharp::Parser::AST::TypeAliasTemplate^ _0); ~TypeAliasTemplate(); + + property CppSharp::Parser::AST::Declaration^ CanonicalDecl + { + CppSharp::Parser::AST::Declaration^ get(); + void set(CppSharp::Parser::AST::Declaration^); + } }; public ref class TemplateParameter : CppSharp::Parser::AST::Declaration 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 c12579c6..6e57cd5d 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 @@ -57,7 +57,10 @@ namespace CppSharp { UnknownArch = 0, X86 = 1, - X86_64 = 2 + X86_64 = 2, + Aarch64 = 3, + Aarch64Be = 4, + Aarch64_32 = 5 } public unsafe partial class NativeLibrary : IDisposable @@ -12580,7 +12583,7 @@ namespace CppSharp public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Template, IDisposable { - [StructLayout(LayoutKind.Sequential, Size = 132)] + [StructLayout(LayoutKind.Sequential, Size = 136)] public new partial struct __Internal { internal global::CppSharp.Parser.AST.DeclarationKind kind; @@ -12607,6 +12610,7 @@ namespace CppSharp internal __IntPtr comment; internal __IntPtr TemplatedDecl; internal global::Std.Vector.__Internalc__N_std_N___1_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_N___1_S_allocator__S0_ Parameters; + internal __IntPtr CanonicalDecl; [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST17TypeAliasTemplateC2Ev", CallingConvention = __CallingConvention.Cdecl)] internal static extern void ctor(__IntPtr __instance); @@ -12696,6 +12700,20 @@ namespace CppSharp Marshal.FreeHGlobal(__Instance); __Instance = IntPtr.Zero; } + + public global::CppSharp.Parser.AST.Declaration CanonicalDecl + { + get + { + var __result0 = global::CppSharp.Parser.AST.Declaration.__GetOrCreateInstance(((__Internal*)__Instance)->CanonicalDecl, false); + return __result0; + } + + set + { + ((__Internal*)__Instance)->CanonicalDecl = value is null ? __IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class TemplateParameter : global::CppSharp.Parser.AST.Declaration, IDisposable @@ -15793,7 +15811,7 @@ namespace CppSharp [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContextD2Ev", CallingConvention = __CallingConvention.Cdecl)] internal static extern void dtor(__IntPtr __instance); - [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContext18FindOrCreateModuleENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE", CallingConvention = __CallingConvention.Cdecl)] + [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContext18FindOrCreateModuleERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE", CallingConvention = __CallingConvention.Cdecl)] internal static extern __IntPtr FindOrCreateModule(__IntPtr __instance, __IntPtr File); [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContext19getTranslationUnitsEj", CallingConvention = __CallingConvention.Cdecl)] @@ -15917,7 +15935,7 @@ namespace CppSharp global::Std.BasicStringExtensions.Assign(__basicString0, File); var __arg0 = __basicString0.__Instance; var ___ret = __Internal.FindOrCreateModule(__Instance, __arg0); - __basicString0.Dispose(disposing: true, callNativeDtor:false); + __basicString0.Dispose(); var __result0 = global::CppSharp.Parser.AST.TranslationUnit.__GetOrCreateInstance(___ret, false); return __result0; } diff --git a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc-d/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc-d/CppSharp.CppParser.cs index 331cdb47..7fbe64b0 100644 --- a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc-d/CppSharp.CppParser.cs +++ b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc-d/CppSharp.CppParser.cs @@ -57,7 +57,10 @@ namespace CppSharp { UnknownArch = 0, X86 = 1, - X86_64 = 2 + X86_64 = 2, + Aarch64 = 3, + Aarch64Be = 4, + Aarch64_32 = 5 } public unsafe partial class NativeLibrary : IDisposable @@ -12580,7 +12583,7 @@ namespace CppSharp public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Template, IDisposable { - [StructLayout(LayoutKind.Sequential, Size = 192)] + [StructLayout(LayoutKind.Sequential, Size = 196)] public new partial struct __Internal { internal global::CppSharp.Parser.AST.DeclarationKind kind; @@ -12607,6 +12610,7 @@ namespace CppSharp internal __IntPtr comment; internal __IntPtr TemplatedDecl; internal global::Std.Vector.__Internalc__N_std_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S_allocator__S0_ Parameters; + internal __IntPtr CanonicalDecl; [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser.dll", EntryPoint = "??0TypeAliasTemplate@AST@CppParser@CppSharp@@QAE@XZ", CallingConvention = __CallingConvention.ThisCall)] internal static extern __IntPtr ctor(__IntPtr __instance); @@ -12696,6 +12700,20 @@ namespace CppSharp Marshal.FreeHGlobal(__Instance); __Instance = IntPtr.Zero; } + + public global::CppSharp.Parser.AST.Declaration CanonicalDecl + { + get + { + var __result0 = global::CppSharp.Parser.AST.Declaration.__GetOrCreateInstance(((__Internal*)__Instance)->CanonicalDecl, false); + return __result0; + } + + set + { + ((__Internal*)__Instance)->CanonicalDecl = value is null ? __IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class TemplateParameter : global::CppSharp.Parser.AST.Declaration, 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 18f4dc9c..e76e466f 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 @@ -57,7 +57,10 @@ namespace CppSharp { UnknownArch = 0, X86 = 1, - X86_64 = 2 + X86_64 = 2, + Aarch64 = 3, + Aarch64Be = 4, + Aarch64_32 = 5 } public unsafe partial class NativeLibrary : IDisposable @@ -12580,7 +12583,7 @@ namespace CppSharp public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Template, IDisposable { - [StructLayout(LayoutKind.Sequential, Size = 168)] + [StructLayout(LayoutKind.Sequential, Size = 172)] public new partial struct __Internal { internal global::CppSharp.Parser.AST.DeclarationKind kind; @@ -12607,6 +12610,7 @@ namespace CppSharp internal __IntPtr comment; internal __IntPtr TemplatedDecl; internal global::Std.Vector.__Internalc__N_std_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S_allocator__S0_ Parameters; + internal __IntPtr CanonicalDecl; [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser.dll", EntryPoint = "??0TypeAliasTemplate@AST@CppParser@CppSharp@@QAE@XZ", CallingConvention = __CallingConvention.ThisCall)] internal static extern __IntPtr ctor(__IntPtr __instance); @@ -12696,6 +12700,20 @@ namespace CppSharp Marshal.FreeHGlobal(__Instance); __Instance = IntPtr.Zero; } + + public global::CppSharp.Parser.AST.Declaration CanonicalDecl + { + get + { + var __result0 = global::CppSharp.Parser.AST.Declaration.__GetOrCreateInstance(((__Internal*)__Instance)->CanonicalDecl, false); + return __result0; + } + + set + { + ((__Internal*)__Instance)->CanonicalDecl = value is null ? __IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class TemplateParameter : global::CppSharp.Parser.AST.Declaration, 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 2c6915da..dd03b4d1 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 @@ -57,7 +57,10 @@ namespace CppSharp { UnknownArch = 0, X86 = 1, - X86_64 = 2 + X86_64 = 2, + Aarch64 = 3, + Aarch64Be = 4, + Aarch64_32 = 5 } public unsafe partial class NativeLibrary : IDisposable @@ -12579,7 +12582,7 @@ namespace CppSharp public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Template, IDisposable { - [StructLayout(LayoutKind.Sequential, Size = 232)] + [StructLayout(LayoutKind.Sequential, Size = 240)] public new partial struct __Internal { internal global::CppSharp.Parser.AST.DeclarationKind kind; @@ -12606,6 +12609,7 @@ namespace CppSharp internal __IntPtr comment; internal __IntPtr TemplatedDecl; internal global::Std.Vector.__Internalc__N_std_N___1_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_N___1_S_allocator__S0_ Parameters; + internal __IntPtr CanonicalDecl; [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST17TypeAliasTemplateC2Ev", CallingConvention = __CallingConvention.Cdecl)] internal static extern void ctor(__IntPtr __instance); @@ -12695,6 +12699,20 @@ namespace CppSharp Marshal.FreeHGlobal(__Instance); __Instance = IntPtr.Zero; } + + public global::CppSharp.Parser.AST.Declaration CanonicalDecl + { + get + { + var __result0 = global::CppSharp.Parser.AST.Declaration.__GetOrCreateInstance(((__Internal*)__Instance)->CanonicalDecl, false); + return __result0; + } + + set + { + ((__Internal*)__Instance)->CanonicalDecl = value is null ? __IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class TemplateParameter : global::CppSharp.Parser.AST.Declaration, IDisposable @@ -15792,7 +15810,7 @@ namespace CppSharp [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContextD2Ev", CallingConvention = __CallingConvention.Cdecl)] internal static extern void dtor(__IntPtr __instance); - [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContext18FindOrCreateModuleENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE", CallingConvention = __CallingConvention.Cdecl)] + [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContext18FindOrCreateModuleERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE", CallingConvention = __CallingConvention.Cdecl)] internal static extern __IntPtr FindOrCreateModule(__IntPtr __instance, __IntPtr File); [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContext19getTranslationUnitsEj", CallingConvention = __CallingConvention.Cdecl)] @@ -15916,7 +15934,7 @@ namespace CppSharp global::Std.BasicStringExtensions.Assign(__basicString0, File); var __arg0 = __basicString0.__Instance; var ___ret = __Internal.FindOrCreateModule(__Instance, __arg0); - __basicString0.Dispose(disposing: true, callNativeDtor:false); + __basicString0.Dispose(); var __result0 = global::CppSharp.Parser.AST.TranslationUnit.__GetOrCreateInstance(___ret, false); return __result0; } 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 93855910..e360d8bd 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 @@ -57,7 +57,10 @@ namespace CppSharp { UnknownArch = 0, X86 = 1, - X86_64 = 2 + X86_64 = 2, + Aarch64 = 3, + Aarch64Be = 4, + Aarch64_32 = 5 } public unsafe partial class NativeLibrary : IDisposable @@ -12579,7 +12582,7 @@ namespace CppSharp public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Template, IDisposable { - [StructLayout(LayoutKind.Sequential, Size = 256)] + [StructLayout(LayoutKind.Sequential, Size = 264)] public new partial struct __Internal { internal global::CppSharp.Parser.AST.DeclarationKind kind; @@ -12606,6 +12609,7 @@ namespace CppSharp internal __IntPtr comment; internal __IntPtr TemplatedDecl; internal global::Std.Vector.__Internal Parameters; + internal __IntPtr CanonicalDecl; [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST17TypeAliasTemplateC2Ev", CallingConvention = __CallingConvention.Cdecl)] internal static extern void ctor(__IntPtr __instance); @@ -12695,6 +12699,20 @@ namespace CppSharp Marshal.FreeHGlobal(__Instance); __Instance = IntPtr.Zero; } + + public global::CppSharp.Parser.AST.Declaration CanonicalDecl + { + get + { + var __result0 = global::CppSharp.Parser.AST.Declaration.__GetOrCreateInstance(((__Internal*)__Instance)->CanonicalDecl, false); + return __result0; + } + + set + { + ((__Internal*)__Instance)->CanonicalDecl = value is null ? __IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class TemplateParameter : global::CppSharp.Parser.AST.Declaration, IDisposable @@ -15792,7 +15810,7 @@ namespace CppSharp [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContextD2Ev", CallingConvention = __CallingConvention.Cdecl)] internal static extern void dtor(__IntPtr __instance); - [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContext18FindOrCreateModuleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", CallingConvention = __CallingConvention.Cdecl)] + [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContext18FindOrCreateModuleERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", CallingConvention = __CallingConvention.Cdecl)] internal static extern __IntPtr FindOrCreateModule(__IntPtr __instance, __IntPtr File); [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContext19getTranslationUnitsEj", CallingConvention = __CallingConvention.Cdecl)] @@ -15916,7 +15934,7 @@ namespace CppSharp global::Std.BasicStringExtensions.Assign(__basicString0, File); var __arg0 = __basicString0.__Instance; var ___ret = __Internal.FindOrCreateModule(__Instance, __arg0); - __basicString0.Dispose(disposing: true, callNativeDtor:false); + __basicString0.Dispose(); var __result0 = global::CppSharp.Parser.AST.TranslationUnit.__GetOrCreateInstance(___ret, false); return __result0; } 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 f9e37817..1e7e142e 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 @@ -57,7 +57,10 @@ namespace CppSharp { UnknownArch = 0, X86 = 1, - X86_64 = 2 + X86_64 = 2, + Aarch64 = 3, + Aarch64Be = 4, + Aarch64_32 = 5 } public unsafe partial class NativeLibrary : IDisposable @@ -12579,7 +12582,7 @@ namespace CppSharp public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Template, IDisposable { - [StructLayout(LayoutKind.Sequential, Size = 184)] + [StructLayout(LayoutKind.Sequential, Size = 192)] public new partial struct __Internal { internal global::CppSharp.Parser.AST.DeclarationKind kind; @@ -12606,6 +12609,7 @@ namespace CppSharp internal __IntPtr comment; internal __IntPtr TemplatedDecl; internal global::Std.Vector.__Internal Parameters; + internal __IntPtr CanonicalDecl; [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST17TypeAliasTemplateC2Ev", CallingConvention = __CallingConvention.Cdecl)] internal static extern void ctor(__IntPtr __instance); @@ -12695,6 +12699,20 @@ namespace CppSharp Marshal.FreeHGlobal(__Instance); __Instance = IntPtr.Zero; } + + public global::CppSharp.Parser.AST.Declaration CanonicalDecl + { + get + { + var __result0 = global::CppSharp.Parser.AST.Declaration.__GetOrCreateInstance(((__Internal*)__Instance)->CanonicalDecl, false); + return __result0; + } + + set + { + ((__Internal*)__Instance)->CanonicalDecl = value is null ? __IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class TemplateParameter : global::CppSharp.Parser.AST.Declaration, IDisposable @@ -15792,7 +15810,7 @@ namespace CppSharp [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContextD2Ev", CallingConvention = __CallingConvention.Cdecl)] internal static extern void dtor(__IntPtr __instance); - [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContext18FindOrCreateModuleESs", CallingConvention = __CallingConvention.Cdecl)] + [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContext18FindOrCreateModuleERKSs", CallingConvention = __CallingConvention.Cdecl)] internal static extern __IntPtr FindOrCreateModule(__IntPtr __instance, __IntPtr File); [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser", EntryPoint = "_ZN8CppSharp9CppParser3AST10ASTContext19getTranslationUnitsEj", CallingConvention = __CallingConvention.Cdecl)] @@ -15916,7 +15934,7 @@ namespace CppSharp global::Std.BasicStringExtensions.Assign(__basicString0, File); var __arg0 = __basicString0.__Instance; var ___ret = __Internal.FindOrCreateModule(__Instance, __arg0); - __basicString0.Dispose(disposing: true, callNativeDtor:false); + __basicString0.Dispose(); var __result0 = global::CppSharp.Parser.AST.TranslationUnit.__GetOrCreateInstance(___ret, false); return __result0; } diff --git a/src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc-d/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc-d/CppSharp.CppParser.cs index 4679af98..efa095b7 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc-d/CppSharp.CppParser.cs +++ b/src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc-d/CppSharp.CppParser.cs @@ -57,7 +57,10 @@ namespace CppSharp { UnknownArch = 0, X86 = 1, - X86_64 = 2 + X86_64 = 2, + Aarch64 = 3, + Aarch64Be = 4, + Aarch64_32 = 5 } public unsafe partial class NativeLibrary : IDisposable @@ -12581,7 +12584,7 @@ namespace CppSharp public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Template, IDisposable { - [StructLayout(LayoutKind.Sequential, Size = 304)] + [StructLayout(LayoutKind.Sequential, Size = 312)] public new partial struct __Internal { internal global::CppSharp.Parser.AST.DeclarationKind kind; @@ -12608,6 +12611,7 @@ namespace CppSharp internal __IntPtr comment; internal __IntPtr TemplatedDecl; internal global::Std.Vector.__Internalc__N_std_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S_allocator__S0_ Parameters; + internal __IntPtr CanonicalDecl; [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser.dll", EntryPoint = "??0TypeAliasTemplate@AST@CppParser@CppSharp@@QEAA@XZ", CallingConvention = __CallingConvention.Cdecl)] internal static extern __IntPtr ctor(__IntPtr __instance); @@ -12697,6 +12701,20 @@ namespace CppSharp Marshal.FreeHGlobal(__Instance); __Instance = IntPtr.Zero; } + + public global::CppSharp.Parser.AST.Declaration CanonicalDecl + { + get + { + var __result0 = global::CppSharp.Parser.AST.Declaration.__GetOrCreateInstance(((__Internal*)__Instance)->CanonicalDecl, false); + return __result0; + } + + set + { + ((__Internal*)__Instance)->CanonicalDecl = value is null ? __IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class TemplateParameter : global::CppSharp.Parser.AST.Declaration, 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 99aa82fc..19e7529e 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 @@ -57,7 +57,10 @@ namespace CppSharp { UnknownArch = 0, X86 = 1, - X86_64 = 2 + X86_64 = 2, + Aarch64 = 3, + Aarch64Be = 4, + Aarch64_32 = 5 } public unsafe partial class NativeLibrary : IDisposable @@ -12581,7 +12584,7 @@ namespace CppSharp public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Template, IDisposable { - [StructLayout(LayoutKind.Sequential, Size = 256)] + [StructLayout(LayoutKind.Sequential, Size = 264)] public new partial struct __Internal { internal global::CppSharp.Parser.AST.DeclarationKind kind; @@ -12608,6 +12611,7 @@ namespace CppSharp internal __IntPtr comment; internal __IntPtr TemplatedDecl; internal global::Std.Vector.__Internalc__N_std_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S_allocator__S0_ Parameters; + internal __IntPtr CanonicalDecl; [SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser.dll", EntryPoint = "??0TypeAliasTemplate@AST@CppParser@CppSharp@@QEAA@XZ", CallingConvention = __CallingConvention.Cdecl)] internal static extern __IntPtr ctor(__IntPtr __instance); @@ -12697,6 +12701,20 @@ namespace CppSharp Marshal.FreeHGlobal(__Instance); __Instance = IntPtr.Zero; } + + public global::CppSharp.Parser.AST.Declaration CanonicalDecl + { + get + { + var __result0 = global::CppSharp.Parser.AST.Declaration.__GetOrCreateInstance(((__Internal*)__Instance)->CanonicalDecl, false); + return __result0; + } + + set + { + ((__Internal*)__Instance)->CanonicalDecl = value is null ? __IntPtr.Zero : value.__Instance; + } + } } public unsafe partial class TemplateParameter : global::CppSharp.Parser.AST.Declaration, IDisposable diff --git a/src/CppParser/Decl.h b/src/CppParser/Decl.h index 09fa9b68..ff78797c 100644 --- a/src/CppParser/Decl.h +++ b/src/CppParser/Decl.h @@ -632,6 +632,8 @@ namespace CppSharp public: TypeAliasTemplate(); ~TypeAliasTemplate(); + + Declaration* CanonicalDecl = nullptr; }; class CS_API TemplateParameter : public Declaration diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 9564728d..b7d1d895 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -1474,12 +1474,17 @@ TemplateTemplateParameter* Parser::WalkTemplateTemplateParameter(const clang::Te if (TP) return TP; + auto NS = GetNamespace(TTP); + assertm(NS, "Expected a valid namespace!\n"); + TP = new TemplateTemplateParameter(); HandleDeclaration(TTP, TP); + TP->_namespace = NS; TP->Parameters = WalkTemplateParameterList(TTP->getTemplateParameters()); TP->isParameterPack = TTP->isParameterPack(); TP->isPackExpansion = TTP->isPackExpansion(); TP->isExpandedParameterPack = TTP->isExpandedParameterPack(); + if (TTP->getTemplatedDecl()) { auto TD = WalkDeclaration(TTP->getTemplatedDecl()); @@ -1499,6 +1504,10 @@ TypeTemplateParameter* Parser::WalkTypeTemplateParameter(const clang::TemplateTy TP = new TypeTemplateParameter(); TP->name = GetDeclName(TTPD); + auto NS = GetNamespace(TTPD); + assertm(NS, "Expected a valid namespace!\n"); + TP->_namespace = NS; + HandleDeclaration(TTPD, TP); if (TTPD->hasDefaultArgument()) TP->defaultArgument = GetQualifiedType(TTPD->getDefaultArgument()); @@ -1519,6 +1528,10 @@ NonTypeTemplateParameter* Parser::WalkNonTypeTemplateParameter(const clang::NonT NTP = new NonTypeTemplateParameter(); NTP->name = GetDeclName(NTTPD); + auto NS = GetNamespace(NTTPD); + assertm(NS, "Expected a valid namespace!\n"); + NTP->_namespace = NS; + HandleDeclaration(NTTPD, NTP); if (NTTPD->hasDefaultArgument()) NTP->defaultArgument = WalkExpressionObsolete(NTTPD->getDefaultArgument()); @@ -1677,8 +1690,9 @@ TypeAliasTemplate* Parser::WalkTypeAliasTemplate( HandleDeclaration(TD, TA); TA->name = GetDeclName(TD); + TA->_namespace = NS; NS->Templates.push_back(TA); - + TA->CanonicalDecl = WalkDeclaration(TD->getCanonicalDecl()); TA->TemplatedDecl = WalkDeclaration(TD->getTemplatedDecl()); TA->Parameters = WalkTemplateParameterList(TD->getTemplateParameters()); @@ -2119,6 +2133,10 @@ DeclarationContext* Parser::GetNamespace(const clang::Decl* D, if (Context->isTranslationUnit()) return GetTranslationUnit(D); + auto NS = walkedNamespaces[Context]; + if (NS) + return NS; + TranslationUnit* Unit = GetTranslationUnit(cast(Context)); // Else we need to do a more expensive check to get all the namespaces, @@ -2138,19 +2156,27 @@ DeclarationContext* Parser::GetNamespace(const clang::Decl* D, { const auto* Ctx = *I; + auto CtxNS = walkedNamespaces[Ctx]; + if (CtxNS) + { + DC = CtxNS; + continue; + } + switch(Ctx->getDeclKind()) { case Decl::Namespace: { auto ND = cast(Ctx); if (ND->isAnonymousNamespace()) - continue; + break; + auto Name = ND->getName(); DC = DC->FindCreateNamespace(Name.str()); ((Namespace*)DC)->isAnonymous = ND->isAnonymousNamespace(); ((Namespace*)DC)->isInline = ND->isInline(); HandleDeclaration(ND, DC); - continue; + break; } case Decl::LinkageSpec: { @@ -2161,7 +2187,7 @@ DeclarationContext* Parser::GetNamespace(const clang::Decl* D, { auto RD = cast(Ctx); DC = WalkRecordCXX(RD); - continue; + break; } case Decl::CXXDeductionGuide: { @@ -2172,9 +2198,13 @@ DeclarationContext* Parser::GetNamespace(const clang::Decl* D, auto D = cast(Ctx); auto Decl = WalkDeclaration(D); DC = static_cast(Decl); + break; } } + + walkedNamespaces[Ctx] = DC; } + walkedNamespaces[Context] = DC; return DC; } @@ -4637,8 +4667,16 @@ static ArchType ConvertArchType(unsigned int archType) return ArchType::x86; case llvm::Triple::ArchType::x86_64: return ArchType::x86_64; + case llvm::Triple::ArchType::aarch64: + return ArchType::aarch64; + case llvm::Triple::ArchType::aarch64_be: + return ArchType::aarch64_be; + case llvm::Triple::ArchType::aarch64_32: + return ArchType::aarch64_32; + default: + assertm(0, "Unsupported architecture type!\n"); + return ArchType::UnknownArch; } - return ArchType::UnknownArch; } template diff --git a/src/CppParser/Parser.h b/src/CppParser/Parser.h index fd71dd40..8fb9338b 100644 --- a/src/CppParser/Parser.h +++ b/src/CppParser/Parser.h @@ -187,6 +187,7 @@ private: std::unique_ptr LLVMModule; std::unique_ptr CGM; std::unique_ptr codeGenTypes; + std::unordered_map walkedNamespaces; std::unordered_map walkedTypeTemplateParameters; std::unordered_map walkedTemplateTemplateParameters; std::unordered_map walkedNonTypeTemplateParameters; diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs index 0edbcf1c..856398e9 100644 --- a/src/Generator/Driver.cs +++ b/src/Generator/Driver.cs @@ -28,16 +28,14 @@ namespace CppSharp void ValidateOptions() { - if (!Options.Compilation.Platform.HasValue) - Options.Compilation.Platform = Platform.Host; + Options.Compilation.Platform ??= Platform.Host; foreach (var module in Options.Modules) { if (string.IsNullOrWhiteSpace(module.LibraryName)) throw new InvalidOptionException("One of your modules has no library name."); - if (module.OutputNamespace == null) - module.OutputNamespace = module.LibraryName; + module.OutputNamespace ??= module.LibraryName; for (int i = 0; i < module.IncludeDirs.Count; i++) { diff --git a/src/Parser/ASTConverter.cs b/src/Parser/ASTConverter.cs index 81332f02..73a6e169 100644 --- a/src/Parser/ASTConverter.cs +++ b/src/Parser/ASTConverter.cs @@ -1818,6 +1818,7 @@ namespace CppSharp { var _decl = new AST.TypeAliasTemplate(); VisitTemplate(decl, _decl); + _decl.CanonicalDecl = Visit(decl.CanonicalDecl); return _decl; }