Support attributes in using declaration target

Fixes parsing of libcxx.
This commit is contained in:
Jonathan Müller 2021-12-19 16:19:50 +01:00
commit d303bab0da

View file

@ -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