diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2016-04-18 10:17:37 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2016-04-18 10:17:37 +0200 |
commit | ae20570f2ad55b2fa8e71cf450457cb9c4b21b1b (patch) | |
tree | 4db6740878ffb28fb00c5fc323a1891300db749e /build2/variable.txx | |
parent | e2501db05c9e9f139d22f3748584992679954721 (diff) |
Add support for using value attributes in eval context
For example:
if ($x == [null])
Or:
if ([uint64] 01 == [uint64] 1)
Diffstat (limited to 'build2/variable.txx')
-rw-r--r-- | build2/variable.txx | 107 |
1 files changed, 77 insertions, 30 deletions
diff --git a/build2/variable.txx b/build2/variable.txx index 99ea79b..31d9284 100644 --- a/build2/variable.txx +++ b/build2/variable.txx @@ -37,7 +37,7 @@ namespace build2 template <typename T, bool empty> bool - simple_assign (value& v, names&& ns, const variable& var) + simple_assign (value& v, names&& ns, const variable* var) { size_t n (ns.size ()); @@ -54,14 +54,20 @@ namespace build2 catch (const invalid_argument&) {} // Fall through. } - error << "invalid " << value_traits<T>::value_type.name - << " value '" << ns << "' in variable " << var.name; + diag_record dr (error); + + dr << "invalid " << value_traits<T>::value_type.name + << " value '" << ns << "'"; + + if (var != nullptr) + dr << " in variable " << var->name; + throw failed (); } template <typename T, bool empty> bool - simple_append (value& v, names&& ns, const variable& var) + simple_append (value& v, names&& ns, const variable* var) { size_t n (ns.size ()); @@ -78,14 +84,20 @@ namespace build2 catch (const invalid_argument&) {} // Fall through. } - error << "invalid " << value_traits<T>::value_type.name - << " value '" << ns << "' in variable " << var.name; + diag_record dr (error); + + dr << "invalid " << value_traits<T>::value_type.name + << " value '" << ns << "'"; + + if (var != nullptr) + dr << " in variable " << var->name; + throw failed (); } template <typename T, bool empty> bool - simple_prepend (value& v, names&& ns, const variable& var) + simple_prepend (value& v, names&& ns, const variable* var) { size_t n (ns.size ()); @@ -102,8 +114,14 @@ namespace build2 catch (const invalid_argument&) {} // Fall through. } - error << "invalid " << value_traits<T>::value_type.name - << " value '" << ns << "' in variable " << var.name; + diag_record dr (error); + + dr << "invalid " << value_traits<T>::value_type.name + << " value '" << ns << "'"; + + if (var != nullptr) + dr << " in variable " << var->name; + throw failed (); } @@ -127,7 +145,7 @@ namespace build2 template <typename T> bool - vector_append (value& v, names&& ns, const variable& var) + vector_append (value& v, names&& ns, const variable* var) { vector<T>* p (v.null () ? new (&v.data_) vector<T> () @@ -145,10 +163,16 @@ namespace build2 r = &*++i; if (n.pair != '@') - fail << "unexpected pair style for " - << value_traits<T>::value_type.name << " value " - << "'" << n << "'" << n.pair << "'" << *r << "' " - << "in variable " << var.name; + { + diag_record dr (fail); + + dr << "unexpected pair style for " + << value_traits<T>::value_type.name << " value " + << "'" << n << "'" << n.pair << "'" << *r << "'"; + + if (var != nullptr) + dr << " in variable " << var->name; + } } try @@ -166,7 +190,8 @@ namespace build2 else dr << " element '" << n << "'"; - dr << " in variable " << var.name; + if (var != nullptr) + dr << " in variable " << var->name; } } @@ -175,7 +200,7 @@ namespace build2 template <typename T> bool - vector_assign (value& v, names&& ns, const variable& var) + vector_assign (value& v, names&& ns, const variable* var) { if (!v.null ()) v.as<vector<T>> ().clear (); @@ -185,7 +210,7 @@ namespace build2 template <typename T> bool - vector_prepend (value& v, names&& ns, const variable& var) + vector_prepend (value& v, names&& ns, const variable* var) { // Reduce to append. // @@ -270,7 +295,7 @@ namespace build2 // template <typename K, typename V> bool - map_append (value& v, names&& ns, const variable& var) + map_append (value& v, names&& ns, const variable* var) { using std::map; @@ -285,17 +310,29 @@ namespace build2 name& l (*i); if (!l.pair) - fail << value_traits<map<K, V>>::value_type.name << " key-value " - << "pair expected instead of '" << l << "' " - << "in variable " << var.name; + { + diag_record dr (fail); + + dr << value_traits<map<K, V>>::value_type.name << " key-value " + << "pair expected instead of '" << l << "'"; + + if (var != nullptr) + dr << " in variable " << var->name; + } name& r (*++i); // Got to have the second half of the pair. if (l.pair != '@') - fail << "unexpected pair style for " - << value_traits<map<K, V>>::value_type.name << " key-value " - << "'" << l << "'" << l.pair << "'" << r << "' " - << "in variable " << var.name; + { + diag_record dr (fail); + + dr << "unexpected pair style for " + << value_traits<map<K, V>>::value_type.name << " key-value " + << "'" << l << "'" << l.pair << "'" << r << "'"; + + if (var != nullptr) + dr << " in variable " << var->name; + } try { @@ -309,14 +346,24 @@ namespace build2 } catch (const invalid_argument&) { - fail << "invalid " << value_traits<V>::value_type.name - << " element value '" << r << "' in variable " << var.name; + diag_record dr (fail); + + dr << "invalid " << value_traits<V>::value_type.name + << " element value '" << r << "'"; + + if (var != nullptr) + dr << " in variable " << var->name; } } catch (const invalid_argument&) { - fail << "invalid " << value_traits<K>::value_type.name - << " element key '" << l << "' in variable " << var.name; + diag_record dr (fail); + + dr << "invalid " << value_traits<K>::value_type.name + << " element key '" << l << "'"; + + if (var != nullptr) + dr << " in variable " << var->name; } } @@ -325,7 +372,7 @@ namespace build2 template <typename K, typename V> bool - map_assign (value& v, names&& ns, const variable& var) + map_assign (value& v, names&& ns, const variable* var) { using std::map; |