diff options
author | Dmitri Gribenko <gribozavr@gmail.com> | 2012-07-24 16:10:47 +0000 |
---|---|---|
committer | Dmitri Gribenko <gribozavr@gmail.com> | 2012-07-24 16:10:47 +0000 |
commit | fd939162ff99a0084ed22a08dd37c149a0883a2b (patch) | |
tree | 7158d0914e86a8b1bdaf6b853bb062dcc6a85fb5 | |
parent | 9f17408d50c1d76c5eab435e4ceb924cc10757ab (diff) |
Comment parsing: retokenized text tokens are now pushed back in correct (not
reverse) order
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160675 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/CommentParser.h | 2 | ||||
-rw-r--r-- | lib/AST/CommentParser.cpp | 7 | ||||
-rw-r--r-- | unittests/AST/CommentParser.cpp | 25 |
3 files changed, 31 insertions, 3 deletions
diff --git a/include/clang/AST/CommentParser.h b/include/clang/AST/CommentParser.h index 47cab25f25..1e4e4f8694 100644 --- a/include/clang/AST/CommentParser.h +++ b/include/clang/AST/CommentParser.h @@ -83,7 +83,7 @@ class Parser { MoreLATokens.push_back(Tok); for (const Token *I = &Toks.back(), - *B = &Toks.front() + 1; + *B = &Toks.front(); I != B; --I) { MoreLATokens.push_back(*I); } diff --git a/lib/AST/CommentParser.cpp b/lib/AST/CommentParser.cpp index 6b7e0ab49d..92ea7042ff 100644 --- a/lib/AST/CommentParser.cpp +++ b/lib/AST/CommentParser.cpp @@ -105,9 +105,12 @@ BlockCommandComment *Parser::parseBlockCommand() { BC = parseBlockCommandArgs(BC, Retokenizer, NumArgs); // Put back tokens we didn't use. + SmallVector<Token, 16> TextToks; Token Text; - while (Retokenizer.lexText(Text)) - putBack(Text); + while (Retokenizer.lexText(Text)) { + TextToks.push_back(Text); + } + putBack(TextToks); } BlockContentComment *Block = parseParagraphOrBlockCommand(); diff --git a/unittests/AST/CommentParser.cpp b/unittests/AST/CommentParser.cpp index 87e10cebc0..ed7681d5c5 100644 --- a/unittests/AST/CommentParser.cpp +++ b/unittests/AST/CommentParser.cpp @@ -755,6 +755,31 @@ TEST_F(CommentParserTest, ParamCommand4) { } } +TEST_F(CommentParserTest, ParamCommand5) { + const char *Source = + "// \\param aaa \\% Bbb \\$ ccc\n"; + + FullComment *FC = parseString(Source); + ASSERT_TRUE(HasChildCount(FC, 2)); + + ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " ")); + { + ParamCommandComment *PCC; + ParagraphComment *PC; + ASSERT_TRUE(HasParamCommandAt(FC, 1, PCC, "param", + ParamCommandComment::In, + /* IsDirectionExplicit = */ false, + "aaa", PC)); + ASSERT_TRUE(HasChildCount(PCC, 1)); + + ASSERT_TRUE(HasChildCount(PC, 5)); + ASSERT_TRUE(HasTextAt(PC, 0, " ")); + ASSERT_TRUE(HasTextAt(PC, 1, "%")); + ASSERT_TRUE(HasTextAt(PC, 2, " Bbb ")); + ASSERT_TRUE(HasTextAt(PC, 3, "$")); + ASSERT_TRUE(HasTextAt(PC, 4, " ccc")); + } +} TEST_F(CommentParserTest, InlineCommand1) { const char *Source = "// \\c"; |