summaryrefslogtreecommitdiff
path: root/cli/semantics/unit.txx
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2020-04-08 14:51:57 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2020-04-27 11:38:53 +0300
commit720c5a33b6a49cf328fdd7611f49153cf8f60247 (patch)
tree9725f3d1f42ec90fde84520f49647edea013ce5e /cli/semantics/unit.txx
parent3183f3bb927a90783ae0aeaf190a0919377aabe4 (diff)
Separate tests and examples into individual packages
Also make cli module to be explicitly enabled via the config.cli configuration variable.
Diffstat (limited to 'cli/semantics/unit.txx')
-rw-r--r--cli/semantics/unit.txx108
1 files changed, 0 insertions, 108 deletions
diff --git a/cli/semantics/unit.txx b/cli/semantics/unit.txx
deleted file mode 100644
index 99d178f..0000000
--- a/cli/semantics/unit.txx
+++ /dev/null
@@ -1,108 +0,0 @@
-// file : cli/semantics/unit.txx
-// author : Boris Kolpackov <boris@codesynthesis.com>
-// license : MIT; see accompanying LICENSE file
-
-namespace semantics
-{
- template <typename T>
- T* cli_unit::
- lookup (std::string const& ss, std::string const& name, bool outer)
- {
- using std::string;
-
- // Resolve the starting scope in this unit, if any.
- //
- string::size_type b (0), e;
- scope* s (0);
-
- do
- {
- e = ss.find ("::", b);
- string n (ss, b, e == string::npos ? e : e - b);
-
- if (n.empty ())
- s = this;
- else
- {
- scope::names_iterator_pair ip (s->find (n));
-
- for (s = 0; ip.first != ip.second; ++ip.first)
- if ((s = dynamic_cast<scope*> (&ip.first->named ())))
- break;
-
- if (s == 0)
- break; // No such scope in this unit.
- }
-
- b = e;
-
- if (b == string::npos)
- break;
-
- b += 2;
- } while (true);
-
- // If we have the starting scope, then try to resolve the name in it.
- //
- if (s != 0)
- {
- b = 0;
-
- do
- {
- e = name.find ("::", b);
- string n (name, b, e == string::npos ? e : e - b);
-
- scope::names_iterator_pair ip (s->find (n));
-
- // If this is the last name, then see if we have the desired type.
- //
- if (e == string::npos)
- {
- for (; ip.first != ip.second; ++ip.first)
- if (T* r = dynamic_cast<T*> (&ip.first->named ()))
- return r;
- }
- // Otherwise, this should be a scope.
- //
- else
- {
- for (s = 0; ip.first != ip.second; ++ip.first)
- if ((s = dynamic_cast<scope*> (&ip.first->named ())))
- break;
-
- if (s == 0)
- break; // No such inner scope.
- }
-
- b = e;
-
- if (b == string::npos)
- break;
-
- b += 2;
- } while (true);
- }
-
- // If we are here, then that means the lookup didn't find anything in
- // this unit. The next step is to examine all the included units.
- //
- for (includes_iterator i (includes_begin ()); i != includes_end (); ++i)
- {
- if (cli_includes* ci = dynamic_cast<cli_includes*> (&*i))
- if (T* r = ci->includee ().lookup<T> (ss, name, false))
- return r;
- }
-
- // If we still haven't found anything, then the next step is to search
- // one-outer scope, unless it is the global namespace.
- //
- if (outer && !ss.empty ())
- {
- string n (ss, 0, ss.rfind ("::"));
- return lookup<T> (n, name, true);
- }
-
- return 0;
- }
-}