From 003207361a9ee39f886554da2d1ef66ac96d99ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20M=C3=BCller?= Date: Mon, 19 Mar 2018 21:12:40 +0100 Subject: [PATCH] Properly handle unnecessary semicolons Now fixes #45. --- src/libclang/cxtokenizer.cpp | 3 +++ src/libclang/parse_functions.cpp | 21 +++++++++++++-------- test/cpp_namespace.cpp | 3 +++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/libclang/cxtokenizer.cpp b/src/libclang/cxtokenizer.cpp index 35f075b..b502fdb 100644 --- a/src/libclang/cxtokenizer.cpp +++ b/src/libclang/cxtokenizer.cpp @@ -78,6 +78,9 @@ namespace simple_tokenizer tokenizer(tu, inc > 0 ? clang_getRange(loc, loc_after) : clang_getRange(loc_after, loc)); + if (tokenizer.size() == 0u) + return false; + detail::cxstring spelling(clang_getTokenSpelling(tu, tokenizer[0u])); return spelling == token_str; } diff --git a/src/libclang/parse_functions.cpp b/src/libclang/parse_functions.cpp index 1a93792..72aee15 100644 --- a/src/libclang/parse_functions.cpp +++ b/src/libclang/parse_functions.cpp @@ -212,18 +212,15 @@ std::unique_ptr detail::parse_entity(const detail::parse_context& co if (!clang_isAttribute(clang_getCursorKind(cur))) { - auto msg = detail::format("unhandled cursor of kind '", - detail::get_cursor_kind_spelling(cur).c_str(), "'"); - context.logger->log("libclang parser", - format_diagnostic(severity::warning, detail::make_location(cur), - "unhandled cursor of kind '", - detail::get_cursor_kind_spelling(cur).c_str(), "'")); - // build unexposed entity - auto name = detail::get_cursor_name(cur); detail::cxtokenizer tokenizer(context.tu, context.file, cur); detail::cxtoken_stream stream(tokenizer, cur); auto spelling = detail::to_string(stream, stream.end()); + if (spelling.begin() + 1 == spelling.end() && spelling.front().spelling == ";") + // unnecessary semicolon + return nullptr; + + auto name = detail::get_cursor_name(cur); std::unique_ptr entity; if (name.empty()) @@ -233,6 +230,14 @@ std::unique_ptr detail::parse_entity(const detail::parse_context& co name.c_str(), std::move(spelling)); context.comments.match(*entity, cur); + + auto msg = detail::format("unhandled cursor of kind '", + detail::get_cursor_kind_spelling(cur).c_str(), "'"); + context.logger->log("libclang parser", + format_diagnostic(severity::warning, detail::make_location(cur), + "unhandled cursor of kind '", + detail::get_cursor_kind_spelling(cur).c_str(), "'")); + return entity; } else diff --git a/test/cpp_namespace.cpp b/test/cpp_namespace.cpp index e659e85..93a4313 100644 --- a/test/cpp_namespace.cpp +++ b/test/cpp_namespace.cpp @@ -37,6 +37,9 @@ namespace {} /// namespace f{ /// } namespace e::f {} + +// unnecessary semicolon at end of file +; )"; auto file = parse({}, "cpp_namespace.cpp", code);