Skip to content

Commit

Permalink
fix trailing comment attribution when file has no final nweline
Browse files Browse the repository at this point in the history
  • Loading branch information
jhump committed Feb 28, 2023
1 parent 0a480ad commit 767e41c
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 11 deletions.
2 changes: 1 addition & 1 deletion src/google/protobuf/io/tokenizer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -942,7 +942,7 @@ bool Tokenizer::NextWithComments(std::string* prev_trailing_comments,
// makes no sense to attach a comment to the following token.
collector.Flush();
}
if (prev_line == line_ || trailing_comment_end_line == line_) {
if (result && (prev_line == line_ || trailing_comment_end_line == line_)) {
// When previous token and this one are on the same line, or
// even if a multi-line trailing comment ends on the same line
// as this token, it's unclear to what token the comment
Expand Down
48 changes: 38 additions & 10 deletions src/google/protobuf/io/tokenizer_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -650,6 +650,18 @@ DocCommentCase kDocCommentCases[] = {
{},
""},

{"prev // no next token\n",

" no next token\n",
{},
""},

{"prev // no next token and no trailing newline",

" no next token and no trailing newline",
{},
""},

{"prev /* detached */ next",

"",
Expand Down Expand Up @@ -780,7 +792,7 @@ DocCommentCase kDocCommentCases[] = {
prev /* a single block comment
that spans multiple lines
is detached if it ends
on the same line as next */ next"
on the same line as next */ next
)pb",

"",
Expand All @@ -791,7 +803,7 @@ DocCommentCase kDocCommentCases[] = {
""},

{R"pb(
prev /* trailing */ /* leading */ next"
prev /* trailing */ /* leading */ next
)pb",

" trailing ",
Expand All @@ -802,12 +814,25 @@ DocCommentCase kDocCommentCases[] = {
prev /* multi-line
trailing */ /* an oddly
placed detached */ /* an oddly
placed leading */ next"
placed leading */ next
)pb",

" multi-line\ntrailing ",
{" an oddly\nplaced detached "},
" an oddly\nplaced leading "},

{R"pb(
prev // trailing with newline
// detached
/* another detached */
// leading but no next token to attach it to
)pb",

" trailing with newline\n",
{" detached\n",
" another detached ",
" leading but no next token to attach it to\n"},
""},
};

TEST_2D(TokenizerTest, DocComments, kDocCommentCases, kBlockSizes) {
Expand All @@ -822,20 +847,23 @@ TEST_2D(TokenizerTest, DocComments, kDocCommentCases, kBlockSizes) {
kDocCommentCases_case.input.size(), kBlockSizes_case);
Tokenizer tokenizer2(&input2, &error_collector);

tokenizer.Next();
tokenizer2.Next();
EXPECT_TRUE(tokenizer.Next());
EXPECT_TRUE(tokenizer2.Next());

EXPECT_EQ("prev", tokenizer.current().text);
EXPECT_EQ("prev", tokenizer2.current().text);

std::string prev_trailing_comments;
std::vector<std::string> detached_comments;
std::string next_leading_comments;
tokenizer.NextWithComments(&prev_trailing_comments, &detached_comments,
&next_leading_comments);
tokenizer2.NextWithComments(NULL, NULL, NULL);
EXPECT_EQ("next", tokenizer.current().text);
EXPECT_EQ("next", tokenizer2.current().text);
bool has_next = tokenizer.NextWithComments(&prev_trailing_comments,
&detached_comments,
&next_leading_comments);
EXPECT_EQ(has_next, tokenizer2.NextWithComments(NULL, NULL, NULL));
if (has_next) {
EXPECT_EQ("next", tokenizer.current().text);
EXPECT_EQ("next", tokenizer2.current().text);
}

EXPECT_EQ(kDocCommentCases_case.prev_trailing_comments,
prev_trailing_comments);
Expand Down

0 comments on commit 767e41c

Please sign in to comment.