Browse Source

Fix some template declarations not setting namespace

pull/1913/head
duckdoom5 4 months ago
parent
commit
1894b6b217
  1. 2
      src/AST/Template.cs
  2. 10
      src/CppParser/Bindings/CLI/Decl.cpp
  3. 6
      src/CppParser/Bindings/CLI/Decl.h
  4. 17
      src/CppParser/Bindings/CSharp/i686-pc-win32-msvc-d/CppSharp.CppParser.cs
  5. 17
      src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs
  6. 17
      src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc-d/CppSharp.CppParser.cs
  7. 17
      src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs
  8. 2
      src/CppParser/Decl.h
  9. 38
      src/CppParser/Parser.cpp
  10. 1
      src/CppParser/Parser.h
  11. 1
      src/Parser/ASTConverter.cs

2
src/AST/Template.cs

@ -180,6 +180,8 @@ namespace CppSharp.AST @@ -180,6 +180,8 @@ namespace CppSharp.AST
{
return visitor.VisitTypeAliasTemplateDecl(this);
}
public Declaration CanonicalDecl;
}
/// <summary>

10
src/CppParser/Bindings/CLI/Decl.cpp

@ -3915,6 +3915,16 @@ CppSharp::Parser::AST::TypeAliasTemplate::TypeAliasTemplate(CppSharp::Parser::AS @@ -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)
{

6
src/CppParser/Bindings/CLI/Decl.h

@ -1971,6 +1971,12 @@ namespace CppSharp @@ -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

17
src/CppParser/Bindings/CSharp/i686-pc-win32-msvc-d/CppSharp.CppParser.cs

@ -12580,7 +12580,7 @@ namespace CppSharp @@ -12580,7 +12580,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 +12607,7 @@ namespace CppSharp @@ -12607,6 +12607,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 +12697,20 @@ namespace CppSharp @@ -12696,6 +12697,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

17
src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs

@ -12580,7 +12580,7 @@ namespace CppSharp @@ -12580,7 +12580,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 +12607,7 @@ namespace CppSharp @@ -12607,6 +12607,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 +12697,20 @@ namespace CppSharp @@ -12696,6 +12697,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

17
src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc-d/CppSharp.CppParser.cs

@ -12581,7 +12581,7 @@ namespace CppSharp @@ -12581,7 +12581,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 +12608,7 @@ namespace CppSharp @@ -12608,6 +12608,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 +12698,20 @@ namespace CppSharp @@ -12697,6 +12698,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

17
src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs

@ -12581,7 +12581,7 @@ namespace CppSharp @@ -12581,7 +12581,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 +12608,7 @@ namespace CppSharp @@ -12608,6 +12608,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 +12698,20 @@ namespace CppSharp @@ -12697,6 +12698,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

2
src/CppParser/Decl.h

@ -632,6 +632,8 @@ namespace CppSharp @@ -632,6 +632,8 @@ namespace CppSharp
public:
TypeAliasTemplate();
~TypeAliasTemplate();
Declaration* CanonicalDecl = nullptr;
};
class CS_API TemplateParameter : public Declaration

38
src/CppParser/Parser.cpp

@ -1474,12 +1474,17 @@ TemplateTemplateParameter* Parser::WalkTemplateTemplateParameter(const clang::Te @@ -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 @@ -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 @@ -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( @@ -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, @@ -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<Decl>(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, @@ -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<NamespaceDecl>(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, @@ -2161,7 +2187,7 @@ DeclarationContext* Parser::GetNamespace(const clang::Decl* D,
{
auto RD = cast<CXXRecordDecl>(Ctx);
DC = WalkRecordCXX(RD);
continue;
break;
}
case Decl::CXXDeductionGuide:
{
@ -2172,9 +2198,13 @@ DeclarationContext* Parser::GetNamespace(const clang::Decl* D, @@ -2172,9 +2198,13 @@ DeclarationContext* Parser::GetNamespace(const clang::Decl* D,
auto D = cast<Decl>(Ctx);
auto Decl = WalkDeclaration(D);
DC = static_cast<DeclarationContext*>(Decl);
break;
} }
walkedNamespaces[Ctx] = DC;
}
walkedNamespaces[Context] = DC;
return DC;
}

1
src/CppParser/Parser.h

@ -187,6 +187,7 @@ private: @@ -187,6 +187,7 @@ private:
std::unique_ptr<llvm::Module> LLVMModule;
std::unique_ptr<clang::CodeGen::CodeGenModule> CGM;
std::unique_ptr<clang::CodeGen::CodeGenTypes> codeGenTypes;
std::unordered_map<const clang::DeclContext*, AST::DeclarationContext*> walkedNamespaces;
std::unordered_map<const clang::TemplateTypeParmDecl*, AST::TypeTemplateParameter*> walkedTypeTemplateParameters;
std::unordered_map<const clang::TemplateTemplateParmDecl*, AST::TemplateTemplateParameter*> walkedTemplateTemplateParameters;
std::unordered_map<const clang::NonTypeTemplateParmDecl*, AST::NonTypeTemplateParameter*> walkedNonTypeTemplateParameters;

1
src/Parser/ASTConverter.cs

@ -1818,6 +1818,7 @@ namespace CppSharp @@ -1818,6 +1818,7 @@ namespace CppSharp
{
var _decl = new AST.TypeAliasTemplate();
VisitTemplate(decl, _decl);
_decl.CanonicalDecl = Visit(decl.CanonicalDecl);
return _decl;
}

Loading…
Cancel
Save