diff --git a/src/libclang/preprocessor.cpp b/src/libclang/preprocessor.cpp index 0a36e2a..7459933 100644 --- a/src/libclang/preprocessor.cpp +++ b/src/libclang/preprocessor.cpp @@ -242,6 +242,17 @@ namespace ptr_ += offset; } + void skip_with_linecount() noexcept + { + if (*ptr_ == '\n' && write_ == true) + { + result_->push_back('\n'); + ++cur_line_; + } + + ++ptr_; + } + void enable_write() noexcept { write_.set(); @@ -395,9 +406,11 @@ namespace // remove trailing spaces while (!result.comment.empty() && result.comment.back() == ' ') result.comment.pop_back(); + // skip newline - p.skip(); + p.skip_with_linecount(); result.comment += '\n'; + // skip indentation while (starts_with(p, " ")) p.skip(); @@ -447,17 +460,10 @@ namespace else { while (!starts_with(p, "*/")) - p.skip(); + p.skip_with_linecount(); p.skip(2u); } - if (!starts_with(p, "\n")) - // ensure an additional newline after each C comment - // this allows matching documentation comments to entities generated from macros - // as the entity corresponding to the documentation comment will be on the next line - // otherwise all entities would have the same line number - p.write_str("\n"); - return true; } diff --git a/test/cpp_preprocessor.cpp b/test/cpp_preprocessor.cpp index 3bd499b..bbca7a4 100644 --- a/test/cpp_preprocessor.cpp +++ b/test/cpp_preprocessor.cpp @@ -162,15 +162,28 @@ foo {} /// 23 +/* C comment +spanning +multiple +lines +*/ + +/** + +*/ + #include -/// 27 +/// 37 )"; auto file = parse({}, "preprocessor_line_numbers.cpp", code); for (auto& comment : file->unmatched_comments()) - REQUIRE(comment.line == std::stoi(comment.content)); - REQUIRE((file->unmatched_comments().size() == 6u)); + { + if (comment.content[0] != '\n') + REQUIRE(comment.line == std::stoi(comment.content)); + } + REQUIRE((file->unmatched_comments().size() == 6u + 1u)); } TEST_CASE("comment matching")