Parse cpp_class_template
This commit is contained in:
parent
bf7c85a9dd
commit
22fd582756
12 changed files with 289 additions and 56 deletions
|
|
@ -23,6 +23,17 @@ std::unique_ptr<cpp_class> cpp_class::builder::finish_declaration(const cpp_enti
|
|||
return std::move(class_);
|
||||
}
|
||||
|
||||
std::unique_ptr<cpp_class> cpp_class::builder::finish()
|
||||
{
|
||||
return std::move(class_);
|
||||
}
|
||||
|
||||
std::unique_ptr<cpp_class> cpp_class::builder::finish_declaration(cpp_entity_id definition_id)
|
||||
{
|
||||
class_->set_definition(definition_id);
|
||||
return std::move(class_);
|
||||
}
|
||||
|
||||
const char* cppast::to_string(cpp_class_kind kind) noexcept
|
||||
{
|
||||
switch (kind)
|
||||
|
|
|
|||
|
|
@ -8,11 +8,16 @@
|
|||
|
||||
using namespace cppast;
|
||||
|
||||
cpp_entity_kind cpp_class_template::do_get_entity_kind() const noexcept
|
||||
cpp_entity_kind cpp_class_template::kind() noexcept
|
||||
{
|
||||
return cpp_entity_kind::class_template_t;
|
||||
}
|
||||
|
||||
cpp_entity_kind cpp_class_template::do_get_entity_kind() const noexcept
|
||||
{
|
||||
return kind();
|
||||
}
|
||||
|
||||
cpp_entity_kind cpp_class_template_specialization::do_get_entity_kind() const noexcept
|
||||
{
|
||||
return cpp_entity_kind::class_template_specialization_t;
|
||||
|
|
|
|||
|
|
@ -14,7 +14,10 @@ namespace
|
|||
{
|
||||
cpp_class_kind parse_class_kind(const CXCursor& cur)
|
||||
{
|
||||
switch (clang_getCursorKind(cur))
|
||||
auto kind = clang_getTemplateCursorKind(cur);
|
||||
if (kind == CXCursor_NoDeclFound)
|
||||
kind = clang_getCursorKind(cur);
|
||||
switch (kind)
|
||||
{
|
||||
case CXCursor_ClassDecl:
|
||||
return cpp_class_kind::class_t;
|
||||
|
|
@ -62,7 +65,7 @@ namespace
|
|||
}
|
||||
|
||||
void add_base_class(cpp_class::builder& builder, const detail::parse_context& context,
|
||||
const CXCursor& cur)
|
||||
const CXCursor& cur, const CXCursor& class_cur)
|
||||
{
|
||||
DEBUG_ASSERT(cur.kind == CXCursor_CXXBaseSpecifier, detail::assert_handler{});
|
||||
auto access = convert_access(cur);
|
||||
|
|
@ -82,9 +85,8 @@ namespace
|
|||
while (!stream.done())
|
||||
name += stream.get().c_str();
|
||||
|
||||
auto type =
|
||||
cpp_type_ref(detail::get_entity_id(clang_getCursorReferenced(cur)), std::move(name));
|
||||
builder.base_class(type, access, is_virtual);
|
||||
auto type = detail::parse_type(context, class_cur, clang_getCursorType(cur));
|
||||
builder.base_class(std::move(name), std::move(type), access, is_virtual);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -98,14 +100,19 @@ std::unique_ptr<cpp_entity> detail::parse_cpp_class(const detail::parse_context&
|
|||
if (kind == CXCursor_CXXAccessSpecifier)
|
||||
add_access_specifier(builder, child);
|
||||
else if (kind == CXCursor_CXXBaseSpecifier)
|
||||
add_base_class(builder, context, child);
|
||||
add_base_class(builder, context, child, cur);
|
||||
else if (kind == CXCursor_CXXFinalAttr)
|
||||
builder.is_final();
|
||||
else if (kind == CXCursor_TemplateTypeParameter || kind == CXCursor_NonTypeTemplateParameter
|
||||
|| kind == CXCursor_TemplateTemplateParameter)
|
||||
return;
|
||||
else if (auto entity = parse_entity(context, child))
|
||||
builder.add_child(std::move(entity));
|
||||
});
|
||||
auto is_templated = clang_getTemplateCursorKind(cur) != CXCursor_NoDeclFound;
|
||||
if (clang_isCursorDefinition(cur))
|
||||
return builder.finish(*context.idx, get_entity_id(cur));
|
||||
return is_templated ? builder.finish() : builder.finish(*context.idx, get_entity_id(cur));
|
||||
else
|
||||
return builder.finish_declaration(*context.idx, get_entity_id(cur));
|
||||
return is_templated ? builder.finish_declaration(detail::get_entity_id(cur)) :
|
||||
builder.finish_declaration(*context.idx, get_entity_id(cur));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -132,6 +132,8 @@ std::unique_ptr<cpp_entity> detail::parse_entity(const detail::parse_context& co
|
|||
return parse_cpp_alias_template(context, cur);
|
||||
case CXCursor_FunctionTemplate:
|
||||
return parse_cpp_function_template(context, cur);
|
||||
case CXCursor_ClassTemplate:
|
||||
return parse_cpp_class_template(context, cur);
|
||||
|
||||
default:
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -133,6 +133,8 @@ namespace cppast
|
|||
const CXCursor& cur);
|
||||
std::unique_ptr<cpp_entity> parse_cpp_function_template(const parse_context& context,
|
||||
const CXCursor& cur);
|
||||
std::unique_ptr<cpp_entity> parse_cpp_class_template(const parse_context& context,
|
||||
const CXCursor& cur);
|
||||
|
||||
// as_template: true, iff currently parsing a template
|
||||
std::unique_ptr<cpp_entity> parse_entity(
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
// found in the top-level directory of this distribution.
|
||||
|
||||
#include <cppast/cpp_alias_template.hpp>
|
||||
#include <cppast/cpp_class_template.hpp>
|
||||
#include <cppast/cpp_function_template.hpp>
|
||||
|
||||
#include <cppast/cpp_entity_kind.hpp>
|
||||
|
|
@ -217,7 +218,7 @@ std::unique_ptr<cpp_entity> detail::parse_cpp_alias_template(const detail::parse
|
|||
return nullptr;
|
||||
context.comments.match(builder.value().get(), cur);
|
||||
parse_parameters(builder.value(), context, cur);
|
||||
return builder.value().finish(*context.idx, detail::get_entity_id(cur));
|
||||
return builder.value().finish(*context.idx, detail::get_entity_id(cur), true);
|
||||
}
|
||||
|
||||
std::unique_ptr<cpp_entity> detail::parse_cpp_function_template(
|
||||
|
|
@ -259,13 +260,14 @@ std::unique_ptr<cpp_entity> detail::parse_cpp_function_template(
|
|||
std::unique_ptr<cpp_function_base>(static_cast<cpp_function_base*>(func.release())));
|
||||
builder.get().set_comment(std::move(comment));
|
||||
parse_parameters(builder, context, cur);
|
||||
return builder.finish(*context.idx, detail::get_entity_id(cur));
|
||||
return builder.finish(*context.idx, detail::get_entity_id(cur),
|
||||
builder.get().function().is_definition());
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
template <class Builder>
|
||||
void add_arguments(Builder& b, const detail::parse_context& context, const CXCursor& cur)
|
||||
void parse_arguments(Builder& b, const detail::parse_context& context, const CXCursor& cur)
|
||||
{
|
||||
detail::tokenizer tokenizer(context.tu, context.file, cur);
|
||||
detail::token_stream stream(tokenizer, cur);
|
||||
|
|
@ -320,10 +322,36 @@ std::unique_ptr<cpp_entity> detail::try_parse_cpp_function_template_specializati
|
|||
if (!func)
|
||||
return nullptr;
|
||||
|
||||
// steal comment
|
||||
auto comment = type_safe::copy(func->comment());
|
||||
func->set_comment(type_safe::nullopt);
|
||||
|
||||
cpp_function_template_specialization::builder
|
||||
builder(std::unique_ptr<cpp_function_base>(static_cast<cpp_function_base*>(func.release())),
|
||||
cpp_template_ref(detail::get_entity_id(templ), ""));
|
||||
|
||||
add_arguments(builder, context, cur);
|
||||
return builder.finish(*context.idx, detail::get_entity_id(cur));
|
||||
builder.get().set_comment(std::move(comment));
|
||||
parse_arguments(builder, context, cur);
|
||||
return builder.finish(*context.idx, detail::get_entity_id(cur),
|
||||
builder.get().function().is_definition());
|
||||
}
|
||||
|
||||
std::unique_ptr<cpp_entity> detail::parse_cpp_class_template(const detail::parse_context& context,
|
||||
const CXCursor& cur)
|
||||
{
|
||||
DEBUG_ASSERT(clang_getCursorKind(cur) == CXCursor_ClassTemplate, detail::assert_handler{});
|
||||
|
||||
auto c = detail::parse_cpp_class(context, cur);
|
||||
if (!c)
|
||||
return nullptr;
|
||||
|
||||
// steal comment
|
||||
auto comment = type_safe::copy(c->comment());
|
||||
c->set_comment(type_safe::nullopt);
|
||||
|
||||
cpp_class_template::builder builder(
|
||||
std::unique_ptr<cpp_class>(static_cast<cpp_class*>(c.release())));
|
||||
builder.get().set_comment(std::move(comment));
|
||||
parse_parameters(builder, context, cur);
|
||||
return builder.finish(*context.idx, detail::get_entity_id(cur),
|
||||
builder.get().class_().is_definition());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -451,6 +451,7 @@ namespace
|
|||
case CXType_Vector:
|
||||
case CXType_ObjCInterface:
|
||||
case CXType_ObjCObjectPointer:
|
||||
case CXType_Dependent:
|
||||
{
|
||||
auto msg = detail::format("unexpected type of kind '",
|
||||
detail::get_type_kind_spelling(type).c_str(), "'");
|
||||
|
|
@ -543,10 +544,6 @@ namespace
|
|||
case CXType_MemberPointer:
|
||||
return cpp_pointer_type::build(parse_member_pointee_type(context, cur, type));
|
||||
|
||||
// TODO: everything template related
|
||||
case CXType_Dependent:
|
||||
break;
|
||||
|
||||
// TODO: auto/decltype
|
||||
case CXType_Auto:
|
||||
break;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue