forked from OSchip/llvm-project
Comment parsing: don't parse whitespace before \endverbatim as a separate line of whitespace.
llvm-svn: 160464
This commit is contained in:
parent
66372684f7
commit
e4a3997d70
|
@ -201,6 +201,10 @@ const char *skipWhitespace(const char *BufferPtr, const char *BufferEnd) {
|
|||
return BufferEnd;
|
||||
}
|
||||
|
||||
bool isWhitespace(const char *BufferPtr, const char *BufferEnd) {
|
||||
return skipWhitespace(BufferPtr, BufferEnd) == BufferEnd;
|
||||
}
|
||||
|
||||
bool isCommandNameCharacter(char C) {
|
||||
return (C >= 'a' && C <= 'z') ||
|
||||
(C >= 'A' && C <= 'Z') ||
|
||||
|
@ -429,6 +433,7 @@ void Lexer::setupAndLexVerbatimBlock(Token &T,
|
|||
}
|
||||
|
||||
void Lexer::lexVerbatimBlockFirstLine(Token &T) {
|
||||
again:
|
||||
assert(BufferPtr < CommentEnd);
|
||||
|
||||
// FIXME: It would be better to scan the text once, finding either the block
|
||||
|
@ -458,6 +463,11 @@ void Lexer::lexVerbatimBlockFirstLine(Token &T) {
|
|||
// There is some text, followed by end command. Extract text first.
|
||||
TextEnd = BufferPtr + Pos;
|
||||
NextLine = TextEnd;
|
||||
// If there is only whitespace before end command, skip whitespace.
|
||||
if (isWhitespace(BufferPtr, TextEnd)) {
|
||||
BufferPtr = TextEnd;
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
|
||||
StringRef Text(BufferPtr, TextEnd - BufferPtr);
|
||||
|
|
|
@ -514,7 +514,7 @@ TEST_F(CommentLexerTest, VerbatimBlock6) {
|
|||
|
||||
lexString(Source, Toks);
|
||||
|
||||
ASSERT_EQ(11U, Toks.size());
|
||||
ASSERT_EQ(10U, Toks.size());
|
||||
|
||||
ASSERT_EQ(tok::text, Toks[0].getKind());
|
||||
ASSERT_EQ(StringRef(" "), Toks[0].getText());
|
||||
|
@ -536,13 +536,10 @@ TEST_F(CommentLexerTest, VerbatimBlock6) {
|
|||
|
||||
ASSERT_EQ(tok::newline, Toks[7].getKind());
|
||||
|
||||
ASSERT_EQ(tok::verbatim_block_line, Toks[8].getKind());
|
||||
ASSERT_EQ(StringRef(" "), Toks[8].getVerbatimBlockText());
|
||||
ASSERT_EQ(tok::verbatim_block_end, Toks[8].getKind());
|
||||
ASSERT_EQ(StringRef("endverbatim"), Toks[8].getVerbatimBlockName());
|
||||
|
||||
ASSERT_EQ(tok::verbatim_block_end, Toks[9].getKind());
|
||||
ASSERT_EQ(StringRef("endverbatim"), Toks[9].getVerbatimBlockName());
|
||||
|
||||
ASSERT_EQ(tok::newline, Toks[10].getKind());
|
||||
ASSERT_EQ(tok::newline, Toks[9].getKind());
|
||||
}
|
||||
|
||||
TEST_F(CommentLexerTest, VerbatimBlock7) {
|
||||
|
@ -558,7 +555,7 @@ TEST_F(CommentLexerTest, VerbatimBlock7) {
|
|||
|
||||
lexString(Source, Toks);
|
||||
|
||||
ASSERT_EQ(11U, Toks.size());
|
||||
ASSERT_EQ(10U, Toks.size());
|
||||
|
||||
ASSERT_EQ(tok::text, Toks[0].getKind());
|
||||
ASSERT_EQ(StringRef(" "), Toks[0].getText());
|
||||
|
@ -575,19 +572,16 @@ TEST_F(CommentLexerTest, VerbatimBlock7) {
|
|||
ASSERT_EQ(tok::verbatim_block_line, Toks[4].getKind());
|
||||
ASSERT_EQ(StringRef(" Bbb"), Toks[4].getVerbatimBlockText());
|
||||
|
||||
ASSERT_EQ(tok::verbatim_block_line, Toks[5].getKind());
|
||||
ASSERT_EQ(StringRef(" "), Toks[5].getVerbatimBlockText());
|
||||
ASSERT_EQ(tok::verbatim_block_end, Toks[5].getKind());
|
||||
ASSERT_EQ(StringRef("endverbatim"), Toks[5].getVerbatimBlockName());
|
||||
|
||||
ASSERT_EQ(tok::verbatim_block_end, Toks[6].getKind());
|
||||
ASSERT_EQ(StringRef("endverbatim"), Toks[6].getVerbatimBlockName());
|
||||
ASSERT_EQ(tok::newline, Toks[6].getKind());
|
||||
|
||||
ASSERT_EQ(tok::newline, Toks[7].getKind());
|
||||
|
||||
ASSERT_EQ(tok::text, Toks[8].getKind());
|
||||
ASSERT_EQ(StringRef(" "), Toks[8].getText());
|
||||
ASSERT_EQ(tok::text, Toks[7].getKind());
|
||||
ASSERT_EQ(StringRef(" "), Toks[7].getText());
|
||||
|
||||
ASSERT_EQ(tok::newline, Toks[8].getKind());
|
||||
ASSERT_EQ(tok::newline, Toks[9].getKind());
|
||||
ASSERT_EQ(tok::newline, Toks[10].getKind());
|
||||
}
|
||||
|
||||
// Complex test for verbatim blocks.
|
||||
|
|
|
@ -1077,12 +1077,43 @@ TEST_F(CommentParserTest, VerbatimBlock5) {
|
|||
}
|
||||
{
|
||||
VerbatimBlockComment *VBC;
|
||||
ASSERT_TRUE(HasVerbatimBlockAt(FC, 1, VBC, "verbatim", " Aaa", " "));
|
||||
ASSERT_TRUE(HasVerbatimBlockAt(FC, 1, VBC, "verbatim", " Aaa"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(CommentParserTest, VerbatimBlock6) {
|
||||
const char *Sources[] = {
|
||||
"// \\verbatim\n"
|
||||
"// Aaa\n"
|
||||
"// Bbb\n"
|
||||
"// \\endverbatim\n",
|
||||
|
||||
"/* \\verbatim\n"
|
||||
" * Aaa\n"
|
||||
" * Bbb\n"
|
||||
" * \\endverbatim*/"
|
||||
};
|
||||
|
||||
for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
|
||||
FullComment *FC = parseString(Sources[i]);
|
||||
ASSERT_TRUE(HasChildCount(FC, 2));
|
||||
|
||||
{
|
||||
ParagraphComment *PC;
|
||||
ASSERT_TRUE(GetChildAt(FC, 0, PC));
|
||||
|
||||
ASSERT_TRUE(HasChildCount(PC, 1));
|
||||
ASSERT_TRUE(HasTextAt(PC, 0, " "));
|
||||
}
|
||||
{
|
||||
VerbatimBlockComment *VBC;
|
||||
ASSERT_TRUE(HasVerbatimBlockAt(FC, 1, VBC, "verbatim", " Aaa", " Bbb"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(CommentParserTest, VerbatimBlock7) {
|
||||
const char *Sources[] = {
|
||||
"// \\verbatim\n"
|
||||
"// Aaa\n"
|
||||
|
@ -1110,11 +1141,10 @@ TEST_F(CommentParserTest, VerbatimBlock6) {
|
|||
{
|
||||
VerbatimBlockComment *VBC;
|
||||
ASSERT_TRUE(HasVerbatimBlockAt(FC, 1, VBC, "verbatim"));
|
||||
ASSERT_EQ(4U, VBC->getNumLines());
|
||||
ASSERT_EQ(3U, VBC->getNumLines());
|
||||
ASSERT_EQ(" Aaa", VBC->getText(0));
|
||||
ASSERT_EQ("", VBC->getText(1));
|
||||
ASSERT_EQ(" Bbb", VBC->getText(2));
|
||||
ASSERT_EQ(" ", VBC->getText(3));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue