diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2021-05-24 16:51:24 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2021-05-28 10:10:44 +0200 |
commit | af5fa9e744acf6da12f2eab7f44810195c0d3ecd (patch) | |
tree | 3685dda19882b79a20235286f2c8593797d55de6 /libbuild2/variable.cxx | |
parent | 9c3e14bb61d6fb1da6ada3213e2c4d566ddd5e33 (diff) |
Ban conversion of patterns to values
Also improve conversion diagnostic.
Diffstat (limited to 'libbuild2/variable.cxx')
-rw-r--r-- | libbuild2/variable.cxx | 101 |
1 files changed, 54 insertions, 47 deletions
diff --git a/libbuild2/variable.cxx b/libbuild2/variable.cxx index 6de0cfb..3e3bf05 100644 --- a/libbuild2/variable.cxx +++ b/libbuild2/variable.cxx @@ -432,23 +432,30 @@ namespace build2 // Throw invalid_argument for an invalid simple value. // [[noreturn]] static void - throw_invalid_argument (const name& n, const name* r, const char* type) + throw_invalid_argument (const name& n, + const name* r, + const char* type, + bool pair_ok = false) { string m; string t (type); - if (r != nullptr) + // Note that the message should be suitable for appending "in variable X". + // + if (!pair_ok && r != nullptr) m = "pair in " + t + " value"; + else if (n.pattern || (r != nullptr && r->pattern)) + m = "pattern in " + t + " value"; else { - m = "invalid " + t + " value: "; + m = "invalid " + t + " value "; if (n.simple ()) m += "'" + n.value + "'"; else if (n.directory ()) m += "'" + n.dir.representation () + "'"; else - m += "complex name"; + m += "name '" + to_string (n) + "'"; } throw invalid_argument (m); @@ -463,7 +470,7 @@ namespace build2 bool value_traits<bool>:: convert (const name& n, const name* r) { - if (r == nullptr && n.simple ()) + if (r == nullptr && !n.pattern && n.simple () ) { const string& s (n.value); @@ -504,7 +511,7 @@ namespace build2 int64_t value_traits<int64_t>:: convert (const name& n, const name* r) { - if (r == nullptr && n.simple ()) + if (r == nullptr && !n.pattern && n.simple ()) { try { @@ -552,7 +559,7 @@ namespace build2 uint64_t value_traits<uint64_t>:: convert (const name& n, const name* r) { - if (r == nullptr && n.simple ()) + if (r == nullptr && !n.pattern && n.simple ()) { try { @@ -607,9 +614,16 @@ namespace build2 // We can only convert project-qualified simple and directory names. // - if (!(n.simple (true) || n.directory (true)) || - !(r == nullptr || r->simple (true) || r->directory (true))) - throw_invalid_argument (n, r, "string"); + if (n.pattern || + !(n.simple (true) || n.directory (true))) + throw_invalid_argument (n, nullptr, "string"); + + if (r != nullptr) + { + if (r->pattern || + !(r->simple (true) || r->directory (true))) + throw_invalid_argument (*r, nullptr, "string"); + } string s; @@ -679,7 +693,7 @@ namespace build2 path value_traits<path>:: convert (name&& n, name* r) { - if (r == nullptr) + if (r == nullptr && !n.pattern) { // A directory path is a path. // @@ -746,7 +760,7 @@ namespace build2 dir_path value_traits<dir_path>:: convert (name&& n, name* r) { - if (r == nullptr) + if (r == nullptr && !n.pattern) { if (n.directory ()) return move (n.dir); @@ -813,7 +827,7 @@ namespace build2 abs_dir_path value_traits<abs_dir_path>:: convert (name&& n, name* r) { - if (r == nullptr && (n.simple () || n.directory ())) + if (r == nullptr && !n.pattern && (n.simple () || n.directory ())) { try { @@ -861,7 +875,7 @@ namespace build2 name value_traits<name>:: convert (name&& n, name* r) { - if (r == nullptr) + if (r == nullptr && !n.pattern) return move (n); throw_invalid_argument (n, r, "name"); @@ -899,6 +913,9 @@ namespace build2 name_pair value_traits<name_pair>:: convert (name&& n, name* r) { + if (n.pattern || (r != nullptr && r->pattern)) + throw_invalid_argument (n, r, "name_pair", true /* pair_ok */); + n.pair = '\0'; // Keep "unpaired" in case r is empty. return name_pair (move (n), r != nullptr ? move (*r) : name ()); } @@ -979,8 +996,8 @@ namespace build2 static T process_path_convert (name&& n, name* r, const char* what) { - if ( n.untyped () && n.unqualified () && !n.empty () && - (r == nullptr || (r->untyped () && r->unqualified () && !r->empty ()))) + if ( !n.pattern && n.untyped () && n.unqualified () && !n.empty () && + (r == nullptr || (!r->pattern && r->untyped () && r->unqualified () && !r->empty ()))) { path rp (move (n.dir)); if (rp.empty ()) @@ -1003,7 +1020,7 @@ namespace build2 return pp; } - throw_invalid_argument (n, r, what); + throw_invalid_argument (n, r, what, true /* pair_ok */); } process_path value_traits<process_path>:: @@ -1142,7 +1159,7 @@ namespace build2 if (!i->pair) throw invalid_argument ("non-pair in process_path_ex value"); - if (!i->simple ()) + if (i->pattern || !i->simple ()) throw_invalid_argument (*i, nullptr, "process_path_ex"); const string& k ((i++)->value); @@ -1151,14 +1168,14 @@ namespace build2 // if (k == "name") { - if (!i->simple ()) + if (i->pattern || !i->simple ()) throw_invalid_argument (*i, nullptr, "process_path_ex name"); pp.name = move (i->value); } else if (k == "checksum") { - if (!i->simple ()) + if (i->pattern || !i->simple ()) throw_invalid_argument ( *i, nullptr, "process_path_ex executable checksum"); @@ -1166,7 +1183,7 @@ namespace build2 } else if (k == "env-checksum") { - if (!i->simple ()) + if (i->pattern || !i->simple ()) throw_invalid_argument ( *i, nullptr, "process_path_ex environment checksum"); @@ -1323,22 +1340,17 @@ namespace build2 target_triplet value_traits<target_triplet>:: convert (name&& n, name* r) { - if (r == nullptr) + if (r == nullptr && !n.pattern && n.simple ()) { - if (n.simple ()) + try { - try - { - return n.empty () ? target_triplet () : target_triplet (n.value); - } - catch (const invalid_argument& e) - { - throw invalid_argument ( - string ("invalid target_triplet value: ") + e.what ()); - } + return n.empty () ? target_triplet () : target_triplet (n.value); + } + catch (const invalid_argument& e) + { + throw invalid_argument ( + string ("invalid target_triplet value: ") + e.what ()); } - - // Fall through. } throw_invalid_argument (n, r, "target_triplet"); @@ -1369,22 +1381,17 @@ namespace build2 project_name value_traits<project_name>:: convert (name&& n, name* r) { - if (r == nullptr) + if (r == nullptr && !n.pattern && n.simple ()) { - if (n.simple ()) + try { - try - { - return n.empty () ? project_name () : project_name (move (n.value)); - } - catch (const invalid_argument& e) - { - throw invalid_argument ( - string ("invalid project_name value: ") + e.what ()); - } + return n.empty () ? project_name () : project_name (move (n.value)); + } + catch (const invalid_argument& e) + { + throw invalid_argument ( + string ("invalid project_name value: ") + e.what ()); } - - // Fall through. } throw_invalid_argument (n, r, "project_name"); |