aboutsummaryrefslogtreecommitdiff
path: root/build2/test/script/parser.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2016-10-28 13:01:04 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2016-11-04 09:26:36 +0200
commit08ae9246421cf2b7269dc09dab2dbd5dc5d0817a (patch)
tree727dcf6be0a382a3a41f3ebf63d624ab893c786d /build2/test/script/parser.cxx
parentfac9e22e90591b4c60d0e13c10c3abccf8c96a0f (diff)
Add tests and fixes for trailing description support
Diffstat (limited to 'build2/test/script/parser.cxx')
-rw-r--r--build2/test/script/parser.cxx48
1 files changed, 30 insertions, 18 deletions
diff --git a/build2/test/script/parser.cxx b/build2/test/script/parser.cxx
index a6b8e50..e714665 100644
--- a/build2/test/script/parser.cxx
+++ b/build2/test/script/parser.cxx
@@ -350,13 +350,20 @@ namespace build2
mode (lexer_mode::description_line);
next (t, tt);
- assert (tt == type::word);
- const string& l (t.value);
+ // If it is empty, then we get newline right away.
+ //
+ const string& l (tt == type::word ? t.value : string ());
+
+ if (tt == type::word)
+ next (t, tt); // Get newline.
+
+ assert (tt == type::newline);
- // If this is the first line, then get the "strip prefix", i.e., the
- // beginning of the line that contains only whitespaces. If the
- // subsequent lines start with the same prefix, then we strip it.
+ // If this is the first line, then get the "strip prefix", i.e.,
+ // the beginning of the line that contains only whitespaces. If
+ // the subsequent lines start with the same prefix, then we strip
+ // it.
//
if (ln == 1)
{
@@ -1099,6 +1106,7 @@ namespace build2
case type::equal:
case type::not_equal:
case type::semi:
+ case type::colon:
case type::newline:
{
done = true;
@@ -1424,23 +1432,27 @@ namespace build2
mode (lexer_mode::description_line);
next (t, tt);
- assert (tt == type::word);
-
- string l (move (t.value));
- trim (l); // Strip leading/trailing whitespaces.
- // Decide whether this is id or summary.
+ // If it is empty, then we get newline right away.
//
- auto& d (*(r.second = description ()));
- (l.find_first_of (" \t") == string::npos ? d.id : d.summary) =
- move (l);
+ if (tt == type::word)
+ {
+ string l (move (t.value));
+ trim (l); // Strip leading/trailing whitespaces.
- if (d.empty ())
- fail (loc) << "empty description";
+ // Decide whether this is id or summary.
+ //
+ auto& d (*(r.second = description ()));
+ (l.find_first_of (" \t") == string::npos ? d.id : d.summary) =
+ move (l);
- //@@ No newline token!
- //
- tt = type::newline;
+ next (t, tt); // Get newline.
+ }
+
+ assert (tt == type::newline);
+
+ if (r.second->empty ())
+ fail (loc) << "empty description";
}
else
{