Skip to content

Commit 33b69db

Browse files
Vipul-Cariappavgvassilev
authored andcommitted
Update Cppyy::GetScope to handle nested namespaces and templates
1 parent bfea6ba commit 33b69db

File tree

1 file changed

+25
-6
lines changed

1 file changed

+25
-6
lines changed

clingwrapper/src/clingwrapper.cxx

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -565,13 +565,32 @@ Cppyy::TCppScope_t Cppyy::GetUnderlyingScope(TCppScope_t scope)
565565
Cppyy::TCppScope_t Cppyy::GetScope(const std::string& name,
566566
TCppScope_t parent_scope)
567567
{
568-
#ifndef NDEBUG
569-
if (name.find("::") != std::string::npos)
570-
throw std::runtime_error("Calling Cppyy::GetScope with qualified name '"
571-
+ name + "'\n");
572-
#endif // NDEBUG
568+
if (Cppyy::TCppScope_t scope = Cpp::GetScope(name, parent_scope))
569+
return scope;
570+
if (!parent_scope || parent_scope == Cpp::GetGlobalScope())
571+
if (Cppyy::TCppScope_t scope = Cpp::GetScopeFromCompleteName(name))
572+
return scope;
573573

574-
return Cpp::GetScope(name, parent_scope);
574+
// FIXME: avoid string parsing here
575+
if (name.find('<') != std::string::npos) {
576+
// Templated Type; May need instantiation
577+
size_t start = name.find('<');
578+
size_t end = name.rfind('>');
579+
std::string params = name.substr(start + 1, end - start - 1);
580+
581+
std::string pure_name = name.substr(0, start);
582+
Cppyy::TCppScope_t scope = Cpp::GetScope(pure_name, parent_scope);
583+
if (!scope && (!parent_scope || parent_scope == Cpp::GetGlobalScope()))
584+
scope = Cpp::GetScopeFromCompleteName(pure_name);
585+
586+
if (Cppyy::IsTemplate(scope)) {
587+
std::vector<Cpp::TemplateArgInfo> templ_params;
588+
if (!Cppyy::AppendTypesSlow(params, templ_params))
589+
return Cpp::InstantiateTemplate(scope, templ_params.data(),
590+
templ_params.size());
591+
}
592+
}
593+
return nullptr;
575594
}
576595

577596
Cppyy::TCppScope_t Cppyy::GetFullScope(const std::string& name)

0 commit comments

Comments
 (0)