Skip to content

Commit 1894b6b

Browse files
committed
Fix some template declarations not setting namespace
1 parent d53dfed commit 1894b6b

File tree

11 files changed

+120
-8
lines changed

11 files changed

+120
-8
lines changed

src/AST/Template.cs

+2
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ public override T Visit<T>(IDeclVisitor<T> visitor)
180180
{
181181
return visitor.VisitTypeAliasTemplateDecl(this);
182182
}
183+
184+
public Declaration CanonicalDecl;
183185
}
184186

185187
/// <summary>

src/CppParser/Bindings/CLI/Decl.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -3915,6 +3915,16 @@ CppSharp::Parser::AST::TypeAliasTemplate::TypeAliasTemplate(CppSharp::Parser::AS
39153915
NativePtr = new class ::CppSharp::CppParser::AST::TypeAliasTemplate(__arg0);
39163916
}
39173917

3918+
CppSharp::Parser::AST::Declaration^ CppSharp::Parser::AST::TypeAliasTemplate::CanonicalDecl::get()
3919+
{
3920+
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);
3921+
}
3922+
3923+
void CppSharp::Parser::AST::TypeAliasTemplate::CanonicalDecl::set(CppSharp::Parser::AST::Declaration^ value)
3924+
{
3925+
((class ::CppSharp::CppParser::AST::TypeAliasTemplate*)NativePtr)->CanonicalDecl = (class ::CppSharp::CppParser::AST::Declaration*)value->NativePtr;
3926+
}
3927+
39183928
CppSharp::Parser::AST::TemplateParameter::TemplateParameter(class ::CppSharp::CppParser::AST::TemplateParameter* native)
39193929
: CppSharp::Parser::AST::Declaration((::CppSharp::CppParser::AST::Declaration*)native)
39203930
{

src/CppParser/Bindings/CLI/Decl.h

+6
Original file line numberDiff line numberDiff line change
@@ -1971,6 +1971,12 @@ namespace CppSharp
19711971
TypeAliasTemplate(CppSharp::Parser::AST::TypeAliasTemplate^ _0);
19721972

19731973
~TypeAliasTemplate();
1974+
1975+
property CppSharp::Parser::AST::Declaration^ CanonicalDecl
1976+
{
1977+
CppSharp::Parser::AST::Declaration^ get();
1978+
void set(CppSharp::Parser::AST::Declaration^);
1979+
}
19741980
};
19751981

19761982
public ref class TemplateParameter : CppSharp::Parser::AST::Declaration

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

+16-1
Original file line numberDiff line numberDiff line change
@@ -12580,7 +12580,7 @@ public uint ParametersCount
1258012580

1258112581
public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Template, IDisposable
1258212582
{
12583-
[StructLayout(LayoutKind.Sequential, Size = 192)]
12583+
[StructLayout(LayoutKind.Sequential, Size = 196)]
1258412584
public new partial struct __Internal
1258512585
{
1258612586
internal global::CppSharp.Parser.AST.DeclarationKind kind;
@@ -12607,6 +12607,7 @@ public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Temp
1260712607
internal __IntPtr comment;
1260812608
internal __IntPtr TemplatedDecl;
1260912609
internal global::Std.Vector.__Internalc__N_std_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S_allocator__S0_ Parameters;
12610+
internal __IntPtr CanonicalDecl;
1261012611

1261112612
[SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser.dll", EntryPoint = "??0TypeAliasTemplate@AST@CppParser@CppSharp@@QAE@XZ", CallingConvention = __CallingConvention.ThisCall)]
1261212613
internal static extern __IntPtr ctor(__IntPtr __instance);
@@ -12696,6 +12697,20 @@ internal protected override void Dispose(bool disposing, bool callNativeDtor)
1269612697
Marshal.FreeHGlobal(__Instance);
1269712698
__Instance = IntPtr.Zero;
1269812699
}
12700+
12701+
public global::CppSharp.Parser.AST.Declaration CanonicalDecl
12702+
{
12703+
get
12704+
{
12705+
var __result0 = global::CppSharp.Parser.AST.Declaration.__GetOrCreateInstance(((__Internal*)__Instance)->CanonicalDecl, false);
12706+
return __result0;
12707+
}
12708+
12709+
set
12710+
{
12711+
((__Internal*)__Instance)->CanonicalDecl = value is null ? __IntPtr.Zero : value.__Instance;
12712+
}
12713+
}
1269912714
}
1270012715

1270112716
public unsafe partial class TemplateParameter : global::CppSharp.Parser.AST.Declaration, IDisposable

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

+16-1
Original file line numberDiff line numberDiff line change
@@ -12580,7 +12580,7 @@ public uint ParametersCount
1258012580

1258112581
public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Template, IDisposable
1258212582
{
12583-
[StructLayout(LayoutKind.Sequential, Size = 168)]
12583+
[StructLayout(LayoutKind.Sequential, Size = 172)]
1258412584
public new partial struct __Internal
1258512585
{
1258612586
internal global::CppSharp.Parser.AST.DeclarationKind kind;
@@ -12607,6 +12607,7 @@ public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Temp
1260712607
internal __IntPtr comment;
1260812608
internal __IntPtr TemplatedDecl;
1260912609
internal global::Std.Vector.__Internalc__N_std_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S_allocator__S0_ Parameters;
12610+
internal __IntPtr CanonicalDecl;
1261012611

1261112612
[SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser.dll", EntryPoint = "??0TypeAliasTemplate@AST@CppParser@CppSharp@@QAE@XZ", CallingConvention = __CallingConvention.ThisCall)]
1261212613
internal static extern __IntPtr ctor(__IntPtr __instance);
@@ -12696,6 +12697,20 @@ internal protected override void Dispose(bool disposing, bool callNativeDtor)
1269612697
Marshal.FreeHGlobal(__Instance);
1269712698
__Instance = IntPtr.Zero;
1269812699
}
12700+
12701+
public global::CppSharp.Parser.AST.Declaration CanonicalDecl
12702+
{
12703+
get
12704+
{
12705+
var __result0 = global::CppSharp.Parser.AST.Declaration.__GetOrCreateInstance(((__Internal*)__Instance)->CanonicalDecl, false);
12706+
return __result0;
12707+
}
12708+
12709+
set
12710+
{
12711+
((__Internal*)__Instance)->CanonicalDecl = value is null ? __IntPtr.Zero : value.__Instance;
12712+
}
12713+
}
1269912714
}
1270012715

1270112716
public unsafe partial class TemplateParameter : global::CppSharp.Parser.AST.Declaration, IDisposable

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

+16-1
Original file line numberDiff line numberDiff line change
@@ -12581,7 +12581,7 @@ public uint ParametersCount
1258112581

1258212582
public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Template, IDisposable
1258312583
{
12584-
[StructLayout(LayoutKind.Sequential, Size = 304)]
12584+
[StructLayout(LayoutKind.Sequential, Size = 312)]
1258512585
public new partial struct __Internal
1258612586
{
1258712587
internal global::CppSharp.Parser.AST.DeclarationKind kind;
@@ -12608,6 +12608,7 @@ public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Temp
1260812608
internal __IntPtr comment;
1260912609
internal __IntPtr TemplatedDecl;
1261012610
internal global::Std.Vector.__Internalc__N_std_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S_allocator__S0_ Parameters;
12611+
internal __IntPtr CanonicalDecl;
1261112612

1261212613
[SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser.dll", EntryPoint = "??0TypeAliasTemplate@AST@CppParser@CppSharp@@QEAA@XZ", CallingConvention = __CallingConvention.Cdecl)]
1261312614
internal static extern __IntPtr ctor(__IntPtr __instance);
@@ -12697,6 +12698,20 @@ internal protected override void Dispose(bool disposing, bool callNativeDtor)
1269712698
Marshal.FreeHGlobal(__Instance);
1269812699
__Instance = IntPtr.Zero;
1269912700
}
12701+
12702+
public global::CppSharp.Parser.AST.Declaration CanonicalDecl
12703+
{
12704+
get
12705+
{
12706+
var __result0 = global::CppSharp.Parser.AST.Declaration.__GetOrCreateInstance(((__Internal*)__Instance)->CanonicalDecl, false);
12707+
return __result0;
12708+
}
12709+
12710+
set
12711+
{
12712+
((__Internal*)__Instance)->CanonicalDecl = value is null ? __IntPtr.Zero : value.__Instance;
12713+
}
12714+
}
1270012715
}
1270112716

1270212717
public unsafe partial class TemplateParameter : global::CppSharp.Parser.AST.Declaration, IDisposable

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

+16-1
Original file line numberDiff line numberDiff line change
@@ -12581,7 +12581,7 @@ public uint ParametersCount
1258112581

1258212582
public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Template, IDisposable
1258312583
{
12584-
[StructLayout(LayoutKind.Sequential, Size = 256)]
12584+
[StructLayout(LayoutKind.Sequential, Size = 264)]
1258512585
public new partial struct __Internal
1258612586
{
1258712587
internal global::CppSharp.Parser.AST.DeclarationKind kind;
@@ -12608,6 +12608,7 @@ public unsafe partial class TypeAliasTemplate : global::CppSharp.Parser.AST.Temp
1260812608
internal __IntPtr comment;
1260912609
internal __IntPtr TemplatedDecl;
1261012610
internal global::Std.Vector.__Internalc__N_std_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S_allocator__S0_ Parameters;
12611+
internal __IntPtr CanonicalDecl;
1261112612

1261212613
[SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser.dll", EntryPoint = "??0TypeAliasTemplate@AST@CppParser@CppSharp@@QEAA@XZ", CallingConvention = __CallingConvention.Cdecl)]
1261312614
internal static extern __IntPtr ctor(__IntPtr __instance);
@@ -12697,6 +12698,20 @@ internal protected override void Dispose(bool disposing, bool callNativeDtor)
1269712698
Marshal.FreeHGlobal(__Instance);
1269812699
__Instance = IntPtr.Zero;
1269912700
}
12701+
12702+
public global::CppSharp.Parser.AST.Declaration CanonicalDecl
12703+
{
12704+
get
12705+
{
12706+
var __result0 = global::CppSharp.Parser.AST.Declaration.__GetOrCreateInstance(((__Internal*)__Instance)->CanonicalDecl, false);
12707+
return __result0;
12708+
}
12709+
12710+
set
12711+
{
12712+
((__Internal*)__Instance)->CanonicalDecl = value is null ? __IntPtr.Zero : value.__Instance;
12713+
}
12714+
}
1270012715
}
1270112716

1270212717
public unsafe partial class TemplateParameter : global::CppSharp.Parser.AST.Declaration, IDisposable

src/CppParser/Decl.h

+2
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,8 @@ namespace CppSharp
632632
public:
633633
TypeAliasTemplate();
634634
~TypeAliasTemplate();
635+
636+
Declaration* CanonicalDecl = nullptr;
635637
};
636638

637639
class CS_API TemplateParameter : public Declaration

src/CppParser/Parser.cpp

+34-4
Original file line numberDiff line numberDiff line change
@@ -1474,12 +1474,17 @@ TemplateTemplateParameter* Parser::WalkTemplateTemplateParameter(const clang::Te
14741474
if (TP)
14751475
return TP;
14761476

1477+
auto NS = GetNamespace(TTP);
1478+
assertm(NS, "Expected a valid namespace!\n");
1479+
14771480
TP = new TemplateTemplateParameter();
14781481
HandleDeclaration(TTP, TP);
1482+
TP->_namespace = NS;
14791483
TP->Parameters = WalkTemplateParameterList(TTP->getTemplateParameters());
14801484
TP->isParameterPack = TTP->isParameterPack();
14811485
TP->isPackExpansion = TTP->isPackExpansion();
14821486
TP->isExpandedParameterPack = TTP->isExpandedParameterPack();
1487+
14831488
if (TTP->getTemplatedDecl())
14841489
{
14851490
auto TD = WalkDeclaration(TTP->getTemplatedDecl());
@@ -1499,6 +1504,10 @@ TypeTemplateParameter* Parser::WalkTypeTemplateParameter(const clang::TemplateTy
14991504

15001505
TP = new TypeTemplateParameter();
15011506
TP->name = GetDeclName(TTPD);
1507+
auto NS = GetNamespace(TTPD);
1508+
assertm(NS, "Expected a valid namespace!\n");
1509+
TP->_namespace = NS;
1510+
15021511
HandleDeclaration(TTPD, TP);
15031512
if (TTPD->hasDefaultArgument())
15041513
TP->defaultArgument = GetQualifiedType(TTPD->getDefaultArgument());
@@ -1519,6 +1528,10 @@ NonTypeTemplateParameter* Parser::WalkNonTypeTemplateParameter(const clang::NonT
15191528

15201529
NTP = new NonTypeTemplateParameter();
15211530
NTP->name = GetDeclName(NTTPD);
1531+
auto NS = GetNamespace(NTTPD);
1532+
assertm(NS, "Expected a valid namespace!\n");
1533+
NTP->_namespace = NS;
1534+
15221535
HandleDeclaration(NTTPD, NTP);
15231536
if (NTTPD->hasDefaultArgument())
15241537
NTP->defaultArgument = WalkExpressionObsolete(NTTPD->getDefaultArgument());
@@ -1677,8 +1690,9 @@ TypeAliasTemplate* Parser::WalkTypeAliasTemplate(
16771690
HandleDeclaration(TD, TA);
16781691

16791692
TA->name = GetDeclName(TD);
1693+
TA->_namespace = NS;
16801694
NS->Templates.push_back(TA);
1681-
1695+
TA->CanonicalDecl = WalkDeclaration(TD->getCanonicalDecl());
16821696
TA->TemplatedDecl = WalkDeclaration(TD->getTemplatedDecl());
16831697
TA->Parameters = WalkTemplateParameterList(TD->getTemplateParameters());
16841698

@@ -2119,6 +2133,10 @@ DeclarationContext* Parser::GetNamespace(const clang::Decl* D,
21192133
if (Context->isTranslationUnit())
21202134
return GetTranslationUnit(D);
21212135

2136+
auto NS = walkedNamespaces[Context];
2137+
if (NS)
2138+
return NS;
2139+
21222140
TranslationUnit* Unit = GetTranslationUnit(cast<Decl>(Context));
21232141

21242142
// 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,
21382156
{
21392157
const auto* Ctx = *I;
21402158

2159+
auto CtxNS = walkedNamespaces[Ctx];
2160+
if (CtxNS)
2161+
{
2162+
DC = CtxNS;
2163+
continue;
2164+
}
2165+
21412166
switch(Ctx->getDeclKind())
21422167
{
21432168
case Decl::Namespace:
21442169
{
21452170
auto ND = cast<NamespaceDecl>(Ctx);
21462171
if (ND->isAnonymousNamespace())
2147-
continue;
2172+
break;
2173+
21482174
auto Name = ND->getName();
21492175
DC = DC->FindCreateNamespace(Name.str());
21502176
((Namespace*)DC)->isAnonymous = ND->isAnonymousNamespace();
21512177
((Namespace*)DC)->isInline = ND->isInline();
21522178
HandleDeclaration(ND, DC);
2153-
continue;
2179+
break;
21542180
}
21552181
case Decl::LinkageSpec:
21562182
{
@@ -2161,7 +2187,7 @@ DeclarationContext* Parser::GetNamespace(const clang::Decl* D,
21612187
{
21622188
auto RD = cast<CXXRecordDecl>(Ctx);
21632189
DC = WalkRecordCXX(RD);
2164-
continue;
2190+
break;
21652191
}
21662192
case Decl::CXXDeductionGuide:
21672193
{
@@ -2172,9 +2198,13 @@ DeclarationContext* Parser::GetNamespace(const clang::Decl* D,
21722198
auto D = cast<Decl>(Ctx);
21732199
auto Decl = WalkDeclaration(D);
21742200
DC = static_cast<DeclarationContext*>(Decl);
2201+
break;
21752202
} }
2203+
2204+
walkedNamespaces[Ctx] = DC;
21762205
}
21772206

2207+
walkedNamespaces[Context] = DC;
21782208
return DC;
21792209
}
21802210

src/CppParser/Parser.h

+1
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ class Parser
187187
std::unique_ptr<llvm::Module> LLVMModule;
188188
std::unique_ptr<clang::CodeGen::CodeGenModule> CGM;
189189
std::unique_ptr<clang::CodeGen::CodeGenTypes> codeGenTypes;
190+
std::unordered_map<const clang::DeclContext*, AST::DeclarationContext*> walkedNamespaces;
190191
std::unordered_map<const clang::TemplateTypeParmDecl*, AST::TypeTemplateParameter*> walkedTypeTemplateParameters;
191192
std::unordered_map<const clang::TemplateTemplateParmDecl*, AST::TemplateTemplateParameter*> walkedTemplateTemplateParameters;
192193
std::unordered_map<const clang::NonTypeTemplateParmDecl*, AST::NonTypeTemplateParameter*> walkedNonTypeTemplateParameters;

src/Parser/ASTConverter.cs

+1
Original file line numberDiff line numberDiff line change
@@ -1818,6 +1818,7 @@ public override AST.Declaration VisitTypeAliasTemplate(TypeAliasTemplate decl)
18181818
{
18191819
var _decl = new AST.TypeAliasTemplate();
18201820
VisitTemplate(decl, _decl);
1821+
_decl.CanonicalDecl = Visit(decl.CanonicalDecl);
18211822

18221823
return _decl;
18231824
}

0 commit comments

Comments
 (0)