Support attributes in using declaration target
Fixes parsing of libcxx.
This commit is contained in:
parent
bf7ec70ea5
commit
d303bab0da
1 changed files with 52 additions and 52 deletions
|
|
@ -85,21 +85,22 @@ namespace
|
||||||
cpp_entity_id parse_ns_target_cursor(const CXCursor& cur)
|
cpp_entity_id parse_ns_target_cursor(const CXCursor& cur)
|
||||||
{
|
{
|
||||||
cpp_entity_id result("");
|
cpp_entity_id result("");
|
||||||
detail::visit_children(cur,
|
detail::visit_children(
|
||||||
[&](const CXCursor& child) {
|
cur,
|
||||||
auto referenced = clang_getCursorReferenced(child);
|
[&](const CXCursor& child) {
|
||||||
auto kind = clang_getCursorKind(referenced);
|
auto referenced = clang_getCursorReferenced(child);
|
||||||
if (kind == CXCursor_Namespace)
|
auto kind = clang_getCursorKind(referenced);
|
||||||
result = detail::get_entity_id(referenced);
|
if (kind == CXCursor_Namespace)
|
||||||
else if (kind == CXCursor_NamespaceAlias)
|
result = detail::get_entity_id(referenced);
|
||||||
// get target of namespace alias instead
|
else if (kind == CXCursor_NamespaceAlias)
|
||||||
result = parse_ns_target_cursor(referenced);
|
// get target of namespace alias instead
|
||||||
else
|
result = parse_ns_target_cursor(referenced);
|
||||||
DEBUG_UNREACHABLE(detail::parse_error_handler{}, cur,
|
else
|
||||||
"unexpected target for namespace "
|
DEBUG_UNREACHABLE(detail::parse_error_handler{}, cur,
|
||||||
"alias/using directive");
|
"unexpected target for namespace "
|
||||||
},
|
"alias/using directive");
|
||||||
true);
|
},
|
||||||
|
true);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
@ -157,47 +158,46 @@ namespace
|
||||||
cpp_entity_ref parse_entity_target_cursor(const CXCursor& cur, std::string name)
|
cpp_entity_ref parse_entity_target_cursor(const CXCursor& cur, std::string name)
|
||||||
{
|
{
|
||||||
type_safe::deferred_construction<cpp_entity_ref> result;
|
type_safe::deferred_construction<cpp_entity_ref> result;
|
||||||
detail::visit_children(cur,
|
detail::visit_children(
|
||||||
[&](const CXCursor& child) {
|
cur,
|
||||||
if (result)
|
[&](const CXCursor& child) {
|
||||||
return;
|
if (result)
|
||||||
|
return;
|
||||||
|
|
||||||
switch (clang_getCursorKind(child))
|
switch (clang_getCursorKind(child))
|
||||||
{
|
{
|
||||||
case CXCursor_TypeRef:
|
case CXCursor_TypeRef:
|
||||||
case CXCursor_TemplateRef:
|
case CXCursor_TemplateRef:
|
||||||
case CXCursor_MemberRef:
|
case CXCursor_MemberRef:
|
||||||
case CXCursor_VariableRef:
|
case CXCursor_VariableRef:
|
||||||
case CXCursor_DeclRefExpr:
|
case CXCursor_DeclRefExpr: {
|
||||||
{
|
auto referenced = clang_getCursorReferenced(child);
|
||||||
auto referenced = clang_getCursorReferenced(child);
|
result = cpp_entity_ref(detail::get_entity_id(referenced), std::move(name));
|
||||||
result = cpp_entity_ref(detail::get_entity_id(referenced),
|
break;
|
||||||
std::move(name));
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case CXCursor_OverloadedDeclRef:
|
case CXCursor_OverloadedDeclRef: {
|
||||||
{
|
auto size = clang_getNumOverloadedDecls(child);
|
||||||
auto size = clang_getNumOverloadedDecls(child);
|
DEBUG_ASSERT(size >= 1u, detail::parse_error_handler{}, cur,
|
||||||
DEBUG_ASSERT(size >= 1u, detail::parse_error_handler{}, cur,
|
"no target for using declaration");
|
||||||
"no target for using declaration");
|
std::vector<cpp_entity_id> ids;
|
||||||
std::vector<cpp_entity_id> ids;
|
for (auto i = 0u; i != size; ++i)
|
||||||
for (auto i = 0u; i != size; ++i)
|
ids.push_back(detail::get_entity_id(clang_getOverloadedDecl(child, i)));
|
||||||
ids.push_back(detail::get_entity_id(
|
result = cpp_entity_ref(std::move(ids), std::move(name));
|
||||||
clang_getOverloadedDecl(child, i)));
|
break;
|
||||||
result = cpp_entity_ref(std::move(ids), std::move(name));
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case CXCursor_NamespaceRef:
|
case CXCursor_NamespaceRef:
|
||||||
break; // wait for children
|
break; // wait for children
|
||||||
|
|
||||||
default:
|
default:
|
||||||
DEBUG_UNREACHABLE(detail::parse_error_handler{}, cur,
|
if (clang_isAttribute(clang_getCursorKind(child)))
|
||||||
"unexpected target for using declaration");
|
break;
|
||||||
}
|
DEBUG_UNREACHABLE(detail::parse_error_handler{}, cur,
|
||||||
},
|
"unexpected target for using declaration");
|
||||||
true);
|
}
|
||||||
|
},
|
||||||
|
true);
|
||||||
return result.value();
|
return result.value();
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue