aboutsummaryrefslogtreecommitdiff
path: root/build/scope.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-12-02 11:37:15 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-12-02 11:37:15 +0200
commit9891b20350021ce41a950645dd76df20a45c92cc (patch)
tree0cd27041b0c3413e17b9319ae99e87c5e745b1ff /build/scope.cxx
parent74212589a797ca75e55f92a522e198915c0dbaf6 (diff)
Implement optional module loading
The syntax is: using? cli Now each module use results in two bool variables: <module>.loaded and <module>.configured. Also implement variable visibility (the above two variables are limited to project).
Diffstat (limited to 'build/scope.cxx')
-rw-r--r--build/scope.cxx38
1 files changed, 17 insertions, 21 deletions
diff --git a/build/scope.cxx b/build/scope.cxx
index 305950b..dfddf20 100644
--- a/build/scope.cxx
+++ b/build/scope.cxx
@@ -13,37 +13,33 @@ namespace build
// scope
//
lookup<const value> scope::
- operator[] (const variable& var) const
+ lookup (const target_type* tt, const string* name, const variable& var) const
{
using result = build::lookup<const value>;
- const value* r (nullptr);
- const scope* s (this);
-
- for (; s != nullptr; s = s->parent_scope ())
+ for (const scope* s (this); s != nullptr; )
{
- if ((r = s->vars.find (var)) != nullptr)
- break;
- }
-
- return result (r, &s->vars);
- }
-
- lookup<const value> scope::
- lookup (const target_type& tt, const string& name, const variable& var) const
- {
- using result = build::lookup<const value>;
-
- for (const scope* s (this); s != nullptr; s = s->parent_scope ())
- {
- if (!s->target_vars.empty ())
+ if (tt != nullptr && !s->target_vars.empty ())
{
- if (auto l = s->target_vars.lookup (tt, name, var))
+ if (auto l = s->target_vars.lookup (*tt, *name, var))
return l;
}
if (auto r = s->vars.find (var))
return result (r, &s->vars);
+
+ switch (var.visibility)
+ {
+ case variable_visibility::scope:
+ s = nullptr;
+ break;
+ case variable_visibility::project:
+ s = s->root () ? nullptr : s->parent_scope ();
+ break;
+ case variable_visibility::normal:
+ s = s->parent_scope ();
+ break;
+ }
}
return result ();