From 32cac452a834605a15a679e247f0f5faf3f2fc5d Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 16 May 2018 18:22:22 +0300 Subject: Redo testscript diagnostics not to rely on invalid paths --- build2/test/script/parser.cxx | 35 ++++++++++------------------------- build2/test/script/runner.cxx | 41 ++++++++++++++--------------------------- 2 files changed, 24 insertions(+), 52 deletions(-) (limited to 'build2/test') diff --git a/build2/test/script/parser.cxx b/build2/test/script/parser.cxx index d3cab0a..dad397b 100644 --- a/build2/test/script/parser.cxx +++ b/build2/test/script/parser.cxx @@ -2232,34 +2232,17 @@ namespace build2 add_word (move (s), l); else { - // Come up with a "path" that contains both the original - // location as well as the expanded string. The resulting - // diagnostics will look like this: + // If the chunk re-parsing results in error, our diagnostics + // will look like this: // - // testscript:10:1 ('abc): unterminated single quote + // :1:4: error: stdout merge redirect file descriptor must be 2 + // testscript:2:5: info: while parsing string '1>&a' // - path name; - { - string n (l.file->string ()); - n += ':'; - - if (!ops.no_line ()) + auto df = make_diag_frame ( + [s, &l](const diag_record& dr) { - n += to_string (l.line); - n += ':'; - - if (!ops.no_column ()) - { - n += to_string (l.column); - n += ':'; - } - } - - n += " ("; - n += s; - n += ')'; - name = path (move (n)); - } + dr << info (l) << "while parsing string '" << s << "'"; + }); // When re-lexing we do "effective escaping" and only for // ['"\] (quotes plus the backslash itself). In particular, @@ -2273,6 +2256,8 @@ namespace build2 // args = 'x=\"foo bar\"' // cmd $args # cmd x="foo bar" // + + path name (""); istringstream is (s); lexer lex (is, name, lexer_mode::command_expansion, diff --git a/build2/test/script/runner.cxx b/build2/test/script/runner.cxx index 13f7f8a..889b27c 100644 --- a/build2/test/script/runner.cxx +++ b/build2/test/script/runner.cxx @@ -1077,38 +1077,25 @@ namespace build2 lhs.assign (move (ns), &var); else { - // Come up with a "path" that contains both the expression line - // location as well as the attributes string. The resulting - // diagnostics will look like this: + // If there is an error in the attributes string, our diagnostics + // will look like this: // - // testscript:10:1: ([x]):1:1: error: unknown value attribute x + // :1:1 error: unknown value attribute x + // testscript:10:1 info: while parsing attributes '[x]' // - path name; - { - string n (ll.file->string ()); - n += ':'; - - if (!ops.no_line ()) + auto df = make_diag_frame ( + [ats, &ll](const diag_record& dr) { - n += to_string (ll.line); - n += ':'; - - if (!ops.no_column ()) - { - n += to_string (ll.column); - n += ':'; - } - } - - n += " ("; - n += *ats; - n += ')'; - name = path (move (n)); - } + dr << info (ll) << "while parsing attributes '" << *ats << "'"; + }); parser p; - p.apply_value_attributes( - &var, lhs, value (move (ns)), *ats, token_type::assign, name); + p.apply_value_attributes (&var, + lhs, + value (move (ns)), + *ats, + token_type::assign, + path ("")); } } catch (const io_error& e) -- cgit v1.1