Add basic concept support (#144)

This commit is contained in:
waitingtocompile 2022-09-03 20:22:59 +01:00 committed by GitHub
commit a937efbcbc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 396 additions and 16 deletions

View file

@ -6,6 +6,7 @@
#include <cppast/cpp_alias_template.hpp>
#include <cppast/cpp_class.hpp>
#include <cppast/cpp_class_template.hpp>
#include <cppast/cpp_concept.hpp>
#include <cppast/cpp_entity_kind.hpp>
#include <cppast/cpp_enum.hpp>
#include <cppast/cpp_file.hpp>
@ -879,7 +880,10 @@ bool generate_template_type_parameter(code_generator& generat
code_generator::output output(type_safe::ref(generator), type_safe::ref(param), cur_access);
if (output)
{
output << keyword(to_string(param.keyword()));
if(param.keyword() == cpp_template_keyword::concept_contraint)
detail::write_token_string(output, param.concept_constraint().value());
else
output << keyword(to_string(param.keyword()));
if (param.is_variadic())
output << operator_ws << punctuation("...");
if (!param.name().empty())
@ -1036,6 +1040,23 @@ bool generate_class_template_specialization(code_generator&
return static_cast<bool>(output);
}
bool generate_concept(code_generator& generator,
const cpp_concept& con,
cpp_access_specifier_kind cur_access)
{
code_generator::output output(type_safe::ref(generator), type_safe::ref(con), cur_access);
if(output)
{
output << keyword("template") << operator_ws << punctuation("<") << bracket_ws;
detail::write_token_string(output, con.parameters());
output << bracket_ws << punctuation(">") << newl;
output << keyword("concept") << operator_ws << identifier(con.name()) << operator_ws << punctuation("=") << operator_ws;
detail::write_expression(output, con.constraint_expression());
output << operator_ws << punctuation(";") << newl;
}
return static_cast<bool>(output);
}
bool generate_static_assert(code_generator& generator, const cpp_static_assert& assert,
cpp_access_specifier_kind cur_access)
{
@ -1115,6 +1136,7 @@ bool generate_code_impl(code_generator& generator, const cpp_entity& e,
CPPAST_DETAIL_HANDLE(function_template_specialization)
CPPAST_DETAIL_HANDLE(class_template)
CPPAST_DETAIL_HANDLE(class_template_specialization)
CPPAST_DETAIL_HANDLE(concept)
CPPAST_DETAIL_HANDLE(static_assert)