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') ||
}
void Lexer::lexVerbatimBlockFirstLine(Token &T) {
+again:
assert(BufferPtr < CommentEnd);
// FIXME: It would be better to scan the text once, finding either the block
// 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);
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());
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) {
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());
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[6].getKind());
- ASSERT_EQ(StringRef("endverbatim"), Toks[6].getVerbatimBlockName());
+ ASSERT_EQ(tok::verbatim_block_end, Toks[5].getKind());
+ ASSERT_EQ(StringRef("endverbatim"), Toks[5].getVerbatimBlockName());
- ASSERT_EQ(tok::newline, Toks[7].getKind());
+ ASSERT_EQ(tok::newline, Toks[6].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.
}
{
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"
" * \\endverbatim*/"
};
for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
- FullComment *FC = parseString(Sources[i]);
- ASSERT_TRUE(HasChildCount(FC, 2));
+ FullComment *FC = parseString(Sources[i]);
+ ASSERT_TRUE(HasChildCount(FC, 2));
- {
- ParagraphComment *PC;
- ASSERT_TRUE(GetChildAt(FC, 0, PC));
+ {
+ 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"));
- ASSERT_EQ(4U, VBC->getNumLines());
- ASSERT_EQ(" Aaa", VBC->getText(0));
- ASSERT_EQ("", VBC->getText(1));
- ASSERT_EQ(" Bbb", VBC->getText(2));
- ASSERT_EQ(" ", VBC->getText(3));
- }
+ ASSERT_TRUE(HasChildCount(PC, 1));
+ ASSERT_TRUE(HasTextAt(PC, 0, " "));
+ }
+ {
+ VerbatimBlockComment *VBC;
+ ASSERT_TRUE(HasVerbatimBlockAt(FC, 1, VBC, "verbatim"));
+ ASSERT_EQ(3U, VBC->getNumLines());
+ ASSERT_EQ(" Aaa", VBC->getText(0));
+ ASSERT_EQ("", VBC->getText(1));
+ ASSERT_EQ(" Bbb", VBC->getText(2));
+ }
}
}