From af5fa9e744acf6da12f2eab7f44810195c0d3ecd Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 24 May 2021 16:51:24 +0200 Subject: Ban conversion of patterns to values Also improve conversion diagnostic. --- libbuild2/variable.txx | 133 ++++++++++++++++++++++++++----------------------- 1 file changed, 71 insertions(+), 62 deletions(-) (limited to 'libbuild2/variable.txx') diff --git a/libbuild2/variable.txx b/libbuild2/variable.txx index 3e4a9f3..b1c4112 100644 --- a/libbuild2/variable.txx +++ b/libbuild2/variable.txx @@ -128,6 +128,7 @@ namespace build2 { size_t n (ns.size ()); + diag_record dr; if (value_traits::empty_value ? n <= 1 : n == 1) { try @@ -137,19 +138,23 @@ namespace build2 (n == 0 ? T () : value_traits::convert (move (ns.front ()), nullptr))); - - return; } - catch (const invalid_argument&) {} // Fall through. + catch (const invalid_argument& e) + { + dr << fail << e; + } } + else + dr << fail << "invalid " << value_traits::value_type.name + << " value: " << (n == 0 ? "empty" : "multiple names"); - diag_record dr (fail); - - dr << "invalid " << value_traits::value_type.name - << " value '" << ns << "'"; + if (!dr.empty ()) + { + if (var != nullptr) + dr << " in variable " << var->name; - if (var != nullptr) - dr << " in variable " << var->name; + dr << info << "while converting '" << ns << "'"; + } } template @@ -158,6 +163,7 @@ namespace build2 { size_t n (ns.size ()); + diag_record dr; if (value_traits::empty_value ? n <= 1 : n == 1) { try @@ -167,19 +173,23 @@ namespace build2 (n == 0 ? T () : value_traits::convert (move (ns.front ()), nullptr))); - - return; } - catch (const invalid_argument&) {} // Fall through. + catch (const invalid_argument& e) + { + dr << fail << e; + } } + else + dr << fail << "invalid " << value_traits::value_type.name + << " value: " << (n == 0 ? "empty" : "multiple names"); - diag_record dr (fail); - - dr << "invalid " << value_traits::value_type.name - << " value '" << ns << "'"; + if (!dr.empty ()) + { + if (var != nullptr) + dr << " in variable " << var->name; - if (var != nullptr) - dr << " in variable " << var->name; + dr << info << "while converting '" << ns << "'"; + } } template @@ -188,6 +198,7 @@ namespace build2 { size_t n (ns.size ()); + diag_record dr; if (value_traits::empty_value ? n <= 1 : n == 1) { try @@ -197,19 +208,23 @@ namespace build2 (n == 0 ? T () : value_traits::convert (move (ns.front ()), nullptr))); - - return; } - catch (const invalid_argument&) {} // Fall through. + catch (const invalid_argument& e) + { + dr << fail << e; + } } + else + dr << fail << "invalid " << value_traits::value_type.name + << " value: " << (n == 0 ? "empty" : "multiple names"); - diag_record dr (fail); - - dr << "invalid " << value_traits::value_type.name - << " value '" << ns << "'"; + if (!dr.empty ()) + { + if (var != nullptr) + dr << " in variable " << var->name; - if (var != nullptr) - dr << " in variable " << var->name; + dr << info << "while converting '" << ns << "'"; + } } template @@ -282,30 +297,28 @@ namespace build2 return pair (move (f), move (s)); } - catch (const invalid_argument&) + catch (const invalid_argument& e) { diag_record dr (fail); - dr << "invalid " << value_traits::value_type.name - << " second have of pair '" << *r << "'"; - + dr << e; if (var != nullptr) dr << " in variable " << var->name; - dr << endf; + dr << info << "while converting second have of pair '" << *r << "'" + << endf; } } - catch (const invalid_argument&) + catch (const invalid_argument& e) { diag_record dr (fail); - dr << "invalid " << value_traits::value_type.name - << " first have of pair '" << l << "'"; - + dr << e; if (var != nullptr) dr << " in variable " << var->name; - dr << endf; + dr << info << "while converting first have of pair '" << l << "'" + << endf; } } @@ -340,30 +353,28 @@ namespace build2 return pair> (move (f), move (s)); } - catch (const invalid_argument&) + catch (const invalid_argument& e) { diag_record dr (fail); - dr << "invalid " << value_traits::value_type.name - << " second have of pair '" << *r << "'"; - + dr << e; if (var != nullptr) dr << " in variable " << var->name; - dr << endf; + dr << info << "while converting second have of pair '" << *r << "'" + << endf; } } - catch (const invalid_argument&) + catch (const invalid_argument& e) { diag_record dr (fail); - dr << "invalid " << value_traits::value_type.name - << " first have of pair '" << l << "'"; - + dr << e; if (var != nullptr) dr << " in variable " << var->name; - dr << endf; + dr << info << "while converting first have of pair '" << l << "'" + << endf; } } @@ -401,30 +412,28 @@ namespace build2 return pair, S> (move (f), move (s)); } - catch (const invalid_argument&) + catch (const invalid_argument& e) { diag_record dr (fail); - dr << "invalid " << value_traits::value_type.name - << " second have of pair '" << l << "'"; - + dr << e; if (var != nullptr) dr << " in variable " << var->name; - dr << endf; + dr << info << "while converting second have of pair '" << *r << "'" + << endf; } } - catch (const invalid_argument&) + catch (const invalid_argument& e) { diag_record dr (fail); - dr << "invalid " << value_traits::value_type.name - << " first have of pair '" << l << "'"; - + dr << e; if (var != nullptr) dr << " in variable " << var->name; - dr << endf; + dr << info << "while converting first have of pair '" << l << "'" + << endf; } } @@ -528,19 +537,19 @@ namespace build2 { p.push_back (value_traits::convert (move (n), r)); } - catch (const invalid_argument&) + catch (const invalid_argument& e) { diag_record dr (fail); - dr << "invalid " << value_traits::value_type.name; + dr << e; + if (var != nullptr) + dr << " in variable " << var->name; + dr << info << "while converting "; if (n.pair) dr << " element pair '" << n << "'@'" << *r << "'"; else dr << " element '" << n << "'"; - - if (var != nullptr) - dr << " in variable " << var->name; } } } -- cgit v1.1