From a47e66e2c4469561bfd24f47d6495632e7250551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20M=C3=BCller?= Date: Thu, 23 Feb 2017 17:52:11 +0100 Subject: [PATCH] Parse enums --- C++ Types.xmind | Bin 42636 -> 0 bytes CMakeLists.txt | 11 --- TODO.md | 6 -- include/cppast/cpp_enum.hpp | 4 ++ main.cpp | 77 -------------------- src/cpp_enum.cpp | 14 +++- src/libclang/enum_parser.cpp | 82 +++++++++++++++++++++ src/libclang/expression_parser.cpp | 34 +++++++++ src/libclang/parse_functions.cpp | 3 + src/libclang/parse_functions.hpp | 7 ++ src/libclang/tokenizer.cpp | 3 + src/libclang/type_parser.cpp | 9 +-- test.cpp | 0 test/cpp_enum.cpp | 112 +++++++++++++++++++++++++++++ test/preprocessor.cpp | 5 -- test/test_parser.hpp | 4 ++ 16 files changed, 262 insertions(+), 109 deletions(-) delete mode 100644 C++ Types.xmind delete mode 100644 CMakeLists.txt delete mode 100644 TODO.md delete mode 100644 main.cpp create mode 100644 src/libclang/enum_parser.cpp create mode 100644 src/libclang/expression_parser.cpp delete mode 100644 test.cpp create mode 100644 test/cpp_enum.cpp delete mode 100644 test/preprocessor.cpp diff --git a/C++ Types.xmind b/C++ Types.xmind deleted file mode 100644 index e23ab57e3bf064f922193e7959a6eb115c79e66a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42636 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 diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 4db44e4..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -cmake_minimum_required(VERSION 3.6) -project(cppast) - -set(CMAKE_CXX_STANDARD 11) - -set(SOURCE_FILES include/cppast/cpp_entity.hpp include/cppast/cpp_entity_kind.hpp include/cppast/detail/intrusive_list.hpp include/cppast/detail/assert.hpp include/cppast/cpp_entity_container.hpp src/cpp_entity_kind.cpp include/cppast/cpp_file.hpp src/cpp_file.cpp include/cppast/cpp_namespace.hpp include/cppast/cpp_entity_index.hpp include/cppast/cpp_entity_ref.hpp include/cppast/cpp_type.hpp src/cpp_namespace.cpp src/cpp_type.cpp include/cppast/cpp_expression.hpp include/cppast/cpp_array_type.hpp include/cppast/cpp_function_type.hpp include/cppast/cpp_enum.hpp src/cpp_enum.cpp src/cpp_entity.cpp include/cppast/visitor.hpp src/visitor.cpp src/cpp_type_alias.cpp include/cppast/cpp_type_alias.hpp include/cppast/cpp_variable_base.hpp src/cpp_variable.cpp include/cppast/cpp_variable.hpp src/cpp_language_linkage.cpp include/cppast/cpp_language_linkage.hpp src/cpp_function.cpp include/cppast/cpp_function.hpp include/cppast/cpp_storage_specifiers.hpp src/cpp_class.cpp include/cppast/cpp_class.hpp src/cpp_member_variable.cpp include/cppast/cpp_member_variable.hpp src/cpp_member_function.cpp include/cppast/cpp_member_function.hpp src/cpp_template_parameter.cpp include/cppast/cpp_template_parameter.hpp include/cppast/cpp_alias_template.hpp src/cpp_alias_template.cpp include/cppast/cpp_template.hpp src/cpp_function_template.cpp include/cppast/cpp_function_template.hpp src/cpp_class_template.cpp include/cppast/cpp_class_template.hpp src/cpp_variable_template.cpp include/cppast/cpp_variable_template.hpp) -add_library(cppast ${SOURCE_FILES}) -target_include_directories(cppast PUBLIC ../type_safe/include ../debug_assert include/) - -add_executable(cppast_main main.cpp) -target_link_libraries(cppast_main PUBLIC cppast) \ No newline at end of file diff --git a/TODO.md b/TODO.md deleted file mode 100644 index fadbcc0..0000000 --- a/TODO.md +++ /dev/null @@ -1,6 +0,0 @@ -Milestone 0 - Hierachy - -* overloaded entity ref -* namespace id stuff -* preprocessor -* translation_unit diff --git a/include/cppast/cpp_enum.hpp b/include/cppast/cpp_enum.hpp index d4d2518..25302af 100644 --- a/include/cppast/cpp_enum.hpp +++ b/include/cppast/cpp_enum.hpp @@ -21,6 +21,8 @@ namespace cppast class cpp_enum_value final : public cpp_entity { public: + static cpp_entity_kind kind() noexcept; + /// \returns A newly created and registered enum value. /// \notes `value` may be `nullptr`, in which case the enum has an implicit value. static std::unique_ptr build( @@ -49,6 +51,8 @@ namespace cppast class cpp_enum final : public cpp_entity, public cpp_entity_container { public: + static cpp_entity_kind kind() noexcept; + /// Builds a [cppast::cpp_enum](). class builder { diff --git a/main.cpp b/main.cpp deleted file mode 100644 index 3b4877b..0000000 --- a/main.cpp +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (C) 2017 Jonathan Müller -// This file is subject to the license terms in the LICENSE file -// found in the top-level directory of this distribution. - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -std::unique_ptr make_file(const cppast::cpp_entity_index& idx) -{ - using namespace cppast; - - cpp_file::builder file_builder("main.cpp"); - file_builder.add_child(cpp_namespace::builder("foo", false).finish(idx, "foo"_id)); - - cpp_namespace::builder ns_builder("bar", false); - ns_builder.add_child(cpp_namespace::builder("foo", false).finish(idx, "bar::foo"_id)); - file_builder.add_child(ns_builder.finish(idx, "bar"_id)); - - cpp_enum::builder e_builder("e", true); - e_builder.add_value(cpp_enum_value::build(idx, "e::a"_id, "a", nullptr)); - file_builder.add_child(e_builder.finish(idx, "e"_id)); - - cpp_function::builder f_builder("func", cpp_builtin_type::build("int")); - f_builder.add_parameter( - cpp_function_parameter::build(idx, "param"_id, "param", cpp_builtin_type::build("int"))); - f_builder.is_variadic(); - file_builder.add_child(f_builder.finish(idx, "func"_id)); - - cpp_class::builder c_builder("type", cpp_class_kind::class_t, false); - c_builder.access_specifier(cpp_public); - c_builder.add_child(cpp_variable::build(idx, "var"_id, "var", cpp_builtin_type::build("int"), - nullptr, cpp_storage_class_none, false)); - file_builder.add_child(c_builder.finish(idx, "type"_id)); - - cpp_alias_template::builder a_builder( - cpp_type_alias::build("alias", cpp_template_parameter_type::build( - cpp_template_type_parameter_ref("T"_id, "T")))); - a_builder.add_parameter( - cpp_template_type_parameter::build(idx, "T"_id, "T", cpp_template_keyword::keyword_typename, - false, nullptr)); - file_builder.add_child(a_builder.finish(idx, "alias"_id)); - - return file_builder.finish(idx); -} - -int main() -{ - cppast::cpp_entity_index idx; - auto file = make_file(idx); - - auto level = 0; - cppast::visit(*file, [&](const cppast::cpp_entity& e, cppast::visitor_info info) { - if (info == cppast::visitor_info::container_entity_exit) - --level; - else - { - std::cout << std::string(level, ' ') << cppast::to_string(e.kind()) << ' ' << e.name() - << ' ' << cppast::full_name(e) << '\n'; - if (info == cppast::visitor_info::container_entity_enter) - ++level; - } - - return true; - }); -} diff --git a/src/cpp_enum.cpp b/src/cpp_enum.cpp index 578a725..11d2f00 100644 --- a/src/cpp_enum.cpp +++ b/src/cpp_enum.cpp @@ -8,6 +8,11 @@ using namespace cppast; +cpp_entity_kind cpp_enum_value::kind() noexcept +{ + return cpp_entity_kind::enum_value_t; +} + std::unique_ptr cpp_enum_value::build(const cpp_entity_index& idx, cpp_entity_id id, std::string name, std::unique_ptr value) @@ -20,12 +25,17 @@ std::unique_ptr cpp_enum_value::build(const cpp_entity_index& id cpp_entity_kind cpp_enum_value::do_get_entity_kind() const noexcept { - return cpp_entity_kind::enum_value_t; + return kind(); +} + +cpp_entity_kind cpp_enum::kind() noexcept +{ + return cpp_entity_kind::enum_t; } cpp_entity_kind cpp_enum::do_get_entity_kind() const noexcept { - return cpp_entity_kind::enum_t; + return kind(); } type_safe::optional cpp_enum::do_get_scope_name() const diff --git a/src/libclang/enum_parser.cpp b/src/libclang/enum_parser.cpp new file mode 100644 index 0000000..19952f6 --- /dev/null +++ b/src/libclang/enum_parser.cpp @@ -0,0 +1,82 @@ +// Copyright (C) 2017 Jonathan Müller +// This file is subject to the license terms in the LICENSE file +// found in the top-level directory of this distribution. + +#include + +#include "parse_functions.hpp" +#include "libclang_visitor.hpp" + +using namespace cppast; + +namespace +{ + std::unique_ptr parse_enum_value(const detail::parse_context& context, + const CXCursor& cur) + { + DEBUG_ASSERT(cur.kind == CXCursor_EnumConstantDecl, detail::parse_error_handler{}, cur, + "unexpected child cursor of enum"); + + detail::tokenizer tokenizer(context.tu, context.file, cur); + detail::token_stream stream(tokenizer, cur); + + // , + // or: = , + auto& name = stream.get().value(); + + std::unique_ptr value; + if (detail::skip_if(stream, "=")) + { + detail::visit_children(cur, [&](const CXCursor& child) { + DEBUG_ASSERT(clang_isExpression(child.kind) && !value, + detail::parse_error_handler{}, cur, + "unexpected child cursor of enum value"); + + value = detail::parse_expression(context, child); + }); + } + + return cpp_enum_value::build(*context.idx, detail::get_entity_id(cur), name.c_str(), + std::move(value)); + } + + cpp_enum::builder make_enum_builder(const detail::parse_context& context, const CXCursor& cur) + { + detail::tokenizer tokenizer(context.tu, context.file, cur); + detail::token_stream stream(tokenizer, cur); + + // enum [class] name [: type] { + detail::skip(stream, "enum"); + auto scoped = detail::skip_if(stream, "class"); + auto& name = stream.get().value(); + + std::unique_ptr type; + if (detail::skip_if(stream, ":")) + // parse type, explictly given one + type = detail::parse_type(context, clang_getEnumDeclIntegerType(cur)); + + return cpp_enum::builder(name.c_str(), scoped, std::move(type)); + } +} + +std::unique_ptr detail::parse_cpp_enum(const detail::parse_context& context, + const CXCursor& cur) +{ + DEBUG_ASSERT(cur.kind == CXCursor_EnumDecl, detail::assert_handler{}); + if (!clang_isCursorDefinition(cur)) + return nullptr; + + auto builder = make_enum_builder(context, cur); + detail::visit_children(cur, [&](const CXCursor& child) { + try + { + auto entity = parse_enum_value(context, child); + builder.add_value(std::move(entity)); + } + catch (parse_error& ex) + { + context.logger->log("libclang parser", ex.get_diagnostic()); + } + }); + return builder.finish(*context.idx, get_entity_id(cur)); +} diff --git a/src/libclang/expression_parser.cpp b/src/libclang/expression_parser.cpp new file mode 100644 index 0000000..17ef82d --- /dev/null +++ b/src/libclang/expression_parser.cpp @@ -0,0 +1,34 @@ +// Copyright (C) 2017 Jonathan Müller +// This file is subject to the license terms in the LICENSE file +// found in the top-level directory of this distribution. + +#include + +#include "parse_functions.hpp" + +using namespace cppast; + +std::unique_ptr detail::parse_expression(const detail::parse_context& context, + const CXCursor& cur) +{ + auto kind = clang_getCursorKind(cur); + DEBUG_ASSERT(clang_isExpression(kind), detail::assert_handler{}); + + detail::tokenizer tokenizer(context.tu, context.file, cur); + detail::token_stream stream(tokenizer, cur); + + // just concat everything + std::string expr; + while (!stream.done()) + expr += stream.get().c_str(); + + auto type = parse_type(context, clang_getCursorType(cur)); + + if (kind == CXCursor_CharacterLiteral || kind == CXCursor_CompoundLiteralExpr + || kind == CXCursor_FloatingLiteral || kind == CXCursor_ImaginaryLiteral + || kind == CXCursor_IntegerLiteral || kind == CXCursor_StringLiteral + || kind == CXCursor_CXXBoolLiteralExpr || kind == CXCursor_CXXNullPtrLiteralExpr) + return cpp_literal_expression::build(std::move(type), std::move(expr)); + else + return cpp_unexposed_expression::build(std::move(type), std::move(expr)); +} diff --git a/src/libclang/parse_functions.cpp b/src/libclang/parse_functions.cpp index 01c14a2..993a0aa 100644 --- a/src/libclang/parse_functions.cpp +++ b/src/libclang/parse_functions.cpp @@ -38,6 +38,9 @@ std::unique_ptr detail::parse_entity(const detail::parse_context& co case CXCursor_TypedefDecl: return parse_cpp_type_alias(context, cur); + case CXCursor_EnumDecl: + return parse_cpp_enum(context, cur); + default: break; } diff --git a/src/libclang/parse_functions.hpp b/src/libclang/parse_functions.hpp index 8a70850..055bd81 100644 --- a/src/libclang/parse_functions.hpp +++ b/src/libclang/parse_functions.hpp @@ -14,6 +14,7 @@ namespace cppast { + class cpp_expression; class cpp_type; namespace detail @@ -30,6 +31,9 @@ namespace cppast std::unique_ptr parse_type(const parse_context& context, const CXType& type); + std::unique_ptr parse_expression(const parse_context& context, + const CXCursor& cur); + // parse_entity() dispatches on the cursor type // it calls one of the other parse functions defined elsewhere // try_parse_XXX are not exposed entities @@ -50,6 +54,9 @@ namespace cppast std::unique_ptr parse_cpp_type_alias(const parse_context& context, const CXCursor& cur); + std::unique_ptr parse_cpp_enum(const parse_context& context, + const CXCursor& cur); + std::unique_ptr parse_entity(const parse_context& context, const CXCursor& cur); } } // namespace cppast::detail diff --git a/src/libclang/tokenizer.cpp b/src/libclang/tokenizer.cpp index e0cbee9..8d51d2c 100644 --- a/src/libclang/tokenizer.cpp +++ b/src/libclang/tokenizer.cpp @@ -152,6 +152,9 @@ namespace } while (!token_after_is(tu, file, cur, end, ";")); end = get_next_location(tu, file, end); } + else if (clang_isExpression(clang_getCursorKind(cur))) + // need to shrink range by one + end = get_next_location(tu, file, end, -1); return clang_getRange(begin, end); } diff --git a/src/libclang/type_parser.cpp b/src/libclang/type_parser.cpp index fa72973..af6558c 100644 --- a/src/libclang/type_parser.cpp +++ b/src/libclang/type_parser.cpp @@ -399,17 +399,12 @@ namespace } std::unique_ptr detail::parse_type(const detail::parse_context& context, - const CXType& type) try + const CXType& type) { auto result = parse_type_impl(context, type); DEBUG_ASSERT(result && is_valid(*result), detail::parse_error_handler{}, type, "invalid type"); return std::move(result); } -catch (parse_error& ex) -{ - context.logger->log("libclang parser", ex.get_diagnostic()); - return nullptr; -} std::unique_ptr detail::parse_cpp_type_alias(const detail::parse_context& context, const CXCursor& cur) @@ -419,7 +414,5 @@ std::unique_ptr detail::parse_cpp_type_alias(const detail::parse_con auto name = cxstring(clang_getCursorSpelling(cur)); auto type = parse_type(context, clang_getTypedefDeclUnderlyingType(cur)); - if (!type) - return nullptr; return cpp_type_alias::build(*context.idx, get_entity_id(cur), name.c_str(), std::move(type)); } diff --git a/test.cpp b/test.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/test/cpp_enum.cpp b/test/cpp_enum.cpp new file mode 100644 index 0000000..b0063c3 --- /dev/null +++ b/test/cpp_enum.cpp @@ -0,0 +1,112 @@ +// Copyright (C) 2017 Jonathan Müller +// This file is subject to the license terms in the LICENSE file +// found in the top-level directory of this distribution. + +#include + +#include "test_parser.hpp" + +using namespace cppast; + +TEST_CASE("cpp_enum") +{ + auto code = R"( +enum ignore_me : int; + +enum a +{ + a_a, + a_b = 42, + a_c, + a_d = a_a + 2, +}; + +enum class ignore_me2; + +enum class b : int +{ + b_a, + b_b = 42, + b_c +}; + +)"; + + cpp_entity_index idx; + auto file = parse(idx, "cpp_enum.cpp", code); + auto count = test_visit(*file, [&](const cpp_enum& e) { + if (e.name() == "a") + { + REQUIRE(!e.is_scoped()); + REQUIRE(!e.underlying_type()); + + auto no_vals = 0u; + for (auto& val : e) + { + if (val.name() == "a_a" || val.name() == "a_c") + { + ++no_vals; + REQUIRE(!val.value()); + } + else if (val.name() == "a_b") + { + ++no_vals; + REQUIRE(val.value()); + auto& expr = val.value().value(); + REQUIRE(expr.kind() == cpp_expression_kind::unexposed); + REQUIRE(static_cast(expr).expression() + == "42"); + REQUIRE( + equal_types(idx, expr.type(), *cpp_builtin_type::build("unsigned int"))); + } + else if (val.name() == "a_d") + { + ++no_vals; + REQUIRE(val.value()); + auto& expr = val.value().value(); + // this is unexposed for some reason + REQUIRE(expr.kind() == cpp_expression_kind::unexposed); + REQUIRE(static_cast(expr).expression() + == "a_a+2"); + REQUIRE( + equal_types(idx, expr.type(), *cpp_builtin_type::build("unsigned int"))); + } + else + REQUIRE(false); + } + REQUIRE(no_vals == 4u); + } + else if (e.name() == "b") + { + REQUIRE(e.is_scoped()); + REQUIRE(e.underlying_type()); + REQUIRE(equal_types(idx, e.underlying_type().value(), *cpp_builtin_type::build("int"))); + + auto no_vals = 0u; + for (auto& val : e) + { + REQUIRE(full_name(val) == "b::" + val.name()); + if (val.name() == "b_a" || val.name() == "b_c") + { + ++no_vals; + REQUIRE(!val.value()); + } + else if (val.name() == "b_b") + { + ++no_vals; + REQUIRE(val.value()); + auto& expr = val.value().value(); + REQUIRE(expr.kind() == cpp_expression_kind::literal); + REQUIRE(static_cast(expr).value() == "42"); + REQUIRE(equal_types(idx, expr.type(), *cpp_builtin_type::build("int"))); + } + else + REQUIRE(false); + } + REQUIRE(no_vals == 3u); + } + else + REQUIRE(false); + }); + REQUIRE(count == 2u); +} diff --git a/test/preprocessor.cpp b/test/preprocessor.cpp deleted file mode 100644 index e860755..0000000 --- a/test/preprocessor.cpp +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright (C) 2017 Jonathan Müller -// This file is subject to the license terms in the LICENSE file -// found in the top-level directory of this distribution. - -#i diff --git a/test/test_parser.hpp b/test/test_parser.hpp index 3b20139..53219cd 100644 --- a/test/test_parser.hpp +++ b/test/test_parser.hpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -71,4 +72,7 @@ inline void check_parent(const cppast::cpp_entity& e, const char* parent_name, REQUIRE(cppast::full_name(e) == full_name); } +bool equal_types(const cppast::cpp_entity_index& idx, const cppast::cpp_type& parsed, + const cppast::cpp_type& synthesized); + #endif // CPPAST_TEST_PARSER_HPP_INCLUDED