summaryrefslogtreecommitdiff
path: root/cli/semantics/unit.hxx
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.hxx
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.hxx')
-rw-r--r--cli/semantics/unit.hxx310
1 files changed, 0 insertions, 310 deletions
diff --git a/cli/semantics/unit.hxx b/cli/semantics/unit.hxx
deleted file mode 100644
index e37648a..0000000
--- a/cli/semantics/unit.hxx
+++ /dev/null
@@ -1,310 +0,0 @@
-// file : cli/semantics/unit.hxx
-// author : Boris Kolpackov <boris@codesynthesis.com>
-// license : MIT; see accompanying LICENSE file
-
-#ifndef CLI_SEMANTICS_UNIT_HXX
-#define CLI_SEMANTICS_UNIT_HXX
-
-#include <map>
-#include <vector>
-#include <string>
-
-#include <cli/semantics/elements.hxx>
-#include <cli/semantics/namespace.hxx>
-
-namespace semantics
-{
- //
- //
- class cli_unit;
- class cxx_unit;
-
- //
- //
- class includes: public edge
- {
- public:
- enum kind_type {quote, bracket};
-
- cli_unit&
- includer () const
- {
- return *includer_;
- }
-
- kind_type
- kind () const
- {
- return kind_;
- }
-
- path const&
- file () const
- {
- return file_;
- }
-
- public:
- includes (kind_type kind, path const& file)
- : kind_ (kind), file_ (file)
- {
- }
-
- void
- set_left_node (cli_unit& n)
- {
- includer_ = &n;
- }
-
- protected:
- kind_type kind_;
- path file_;
- cli_unit* includer_;
- };
-
- //
- //
- class cli_includes: public includes
- {
- public:
- cli_unit&
- includee () const
- {
- return *includee_;
- }
-
- public:
- cli_includes (kind_type kind, path const& file)
- : includes (kind, file)
- {
- }
-
- void
- set_right_node (cli_unit& n)
- {
- includee_ = &n;
- }
-
- private:
- cli_unit* includee_;
- };
-
- //
- //
- class cxx_includes: public includes
- {
- public:
- cxx_unit&
- includee () const
- {
- return *includee_;
- }
-
- public:
- cxx_includes (kind_type kind, path const& file)
- : includes (kind, file)
- {
- }
-
- void
- set_right_node (cxx_unit& n)
- {
- includee_ = &n;
- }
-
- private:
- cxx_unit* includee_;
- };
-
- //
- //
- class cxx_unit: public node
- {
- public:
- cxx_unit (path const& file, size_t line, size_t column)
- : node (file, line, column)
- {
- }
-
- void
- add_edge_right (cxx_includes&)
- {
- }
- };
-
- //
- //
- class cli_unit: public graph<node, edge>, public namespace_
- {
- typedef std::vector<includes*> includes_list;
-
- public:
- // Lookup a name in the specified starting scope. Empty scope denotes
- // the global namespace. Starting scope should be a fully-qualified
- // name while name can be qualified but should not be fully-qualified
- // (to lookup a fully-qualified name use the global namespace as the
- // starting scope).
- //
- // The lookup starts in this unit and continues in all the units that
- // this unit includes, transitively.
- //
- // The outer flag specifies whether to search the outer scopes.
- //
- template <typename T>
- T*
- lookup (std::string const& scope,
- std::string const& name,
- bool outer = true);
-
- public:
- typedef
- pointer_iterator<includes_list::const_iterator>
- includes_iterator;
-
- includes_iterator
- includes_begin () const
- {
- return includes_.begin ();
- }
-
- includes_iterator
- includes_end () const
- {
- return includes_.end ();
- }
-
- public:
- cli_unit (path const& file, size_t line, size_t column)
- : node (file, line, column), graph_ (*this)
- {
- // Use a special edge to get this->name() return the global
- // namespace name ("").
- //
- new_edge<global_names> (*this, *this);
- }
-
- public:
- template <typename T>
- T&
- new_node (path const& file, size_t line, size_t column)
- {
- return graph_.new_node<T> (file, line, column);
- }
-
- template <typename T, typename A0>
- T&
- new_node (path const& file, size_t line, size_t column, A0 const& a0)
- {
- return graph_.new_node<T> (file, line, column, a0);
- }
-
- template <typename T, typename A0, typename A1>
- T&
- new_node (path const& file, size_t line, size_t column,
- A0 const& a0, A1 const& a1)
- {
- return graph_.new_node<T> (file, line, column, a0, a1);
- }
-
- template <typename T, typename A0, typename A1, typename A2>
- T&
- new_node (path const& file, size_t line, size_t column,
- A0 const& a0, A1 const& a1, A2 const& a2)
- {
- return graph_.new_node<T> (file, line, column, a0, a1, a2);
- }
-
- template <typename T, typename A0, typename A1, typename A2, typename A3>
- T&
- new_node (path const& file, size_t line, size_t column,
- A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3)
- {
- return graph_.new_node<T> (file, line, column, a0, a1, a2, a3);
- }
-
- public:
- type&
- new_type (path const& file, size_t l, size_t c, string const& name)
- {
- type_map::iterator i (types_.find (name));
-
- return i != types_.end ()
- ? *i->second
- : *(types_[name] = &new_node<type> (file, l, c, name));
- }
-
- protected:
- // Special names edge for the global namespace.
- //
- class global_names: public names
- {
- public:
- global_names ()
- : names ("")
- {
- scope_ = 0;
- }
-
- void
- set_left_node (cli_unit&)
- {
- }
-
- void
- set_right_node (nameable& n)
- {
- named_ = &n;
- }
-
- void
- clear_left_node (cli_unit&)
- {
- }
-
- void
- clear_right_node (nameable& n)
- {
- assert (named_ == &n);
- named_ = 0;
- }
- };
-
- public:
- void
- add_edge_left (cli_includes& e)
- {
- includes_.push_back (&e);
- }
-
- void
- add_edge_left (cxx_includes& e)
- {
- includes_.push_back (&e);
- }
-
- void
- add_edge_left (global_names&)
- {
- }
-
- void
- add_edge_right (cli_includes&)
- {
- }
-
- using namespace_::add_edge_left;
- using namespace_::add_edge_right;
-
- private:
- typedef std::map<string, type*> type_map;
-
- private:
- graph<node, edge>& graph_;
- includes_list includes_;
- type_map types_;
- };
-}
-
-#include <cli/semantics/unit.txx>
-
-#endif // CLI_SEMANTICS_UNIT_HXX