Fix comment matching for includes not on top of the file

See foonathan/standardese#83.
This commit is contained in:
Jonathan Müller 2017-12-13 17:30:46 +01:00
commit 9df3b39e1e
4 changed files with 23 additions and 5 deletions

View file

@ -489,7 +489,9 @@ std::unique_ptr<cpp_file> libclang_parser::do_parse(const cpp_entity_index& idx,
auto include =
cpp_include_directive::build(std::move(include_iter->file), include_iter->kind,
detail::get_cursor_name(cur).c_str());
context.comments.match(*include, include_iter->line);
context.comments.match(*include, include_iter->line,
false); // must not skip comments,
// includes are not reported in order
builder.add_child(std::move(include));
++include_iter;

View file

@ -85,13 +85,17 @@ void detail::comment_context::match(cpp_entity& e, const CXCursor& cur) const
match(e, line);
}
void detail::comment_context::match(cpp_entity& e, unsigned line) const
void detail::comment_context::match(cpp_entity& e, unsigned line, bool skip_comments) const
{
// find comment
auto save = cur_;
while (cur_ != end_ && cur_->line + 1 < line)
++cur_;
if (cur_ != end_ && cur_->matches(e, line))
e.set_comment(std::move(cur_++->comment));
if (!skip_comments)
cur_ = save;
}
namespace

View file

@ -48,7 +48,7 @@ namespace cppast
// must be called for entities that want an associated comment
// must be called *BEFORE* the children are added
void match(cpp_entity& e, const CXCursor& cur) const;
void match(cpp_entity& e, unsigned line) const;
void match(cpp_entity& e, unsigned line, bool skip_comments = true) const;
private:
mutable pp_doc_comment* cur_;