diff options
Diffstat (limited to 'libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx')
| -rw-r--r-- | libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx | 130 | 
1 files changed, 130 insertions, 0 deletions
| diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx new file mode 100644 index 0000000..d1cbf25 --- /dev/null +++ b/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx @@ -0,0 +1,130 @@ +// file      : xsd-frontend/semantic-graph/schema.cxx +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include <cutl/compiler/type-info.hxx> + +#include <xsd-frontend/semantic-graph/schema.hxx> + +namespace XSDFrontend +{ +  namespace SemanticGraph +  { +    // Schema +    // +    Schema::NamesIteratorPair Schema:: +    find (Name const& name) const +    { +      // Here we are going to create an illusion that the namespace +      // hierarchy is flat. +      names_.clear (); +      schemas_.clear (); + +      find_ (name, names_, schemas_); + +      return NamesIteratorPair (NamesConstIterator (names_.begin ()), +                                NamesConstIterator (names_.end ())); +    } + +    void Schema:: +    find_ (Name const& name, NamesList& names, SchemaSet& set) const +    { +      set.insert (this); + +      // Check our own namespace first so it will end up first in the list. +      // +      NamesIteratorPair pair (Scope::find (name)); +      names.insert (names.end (), pair.first.base (), pair.second.base ()); + +      for (UsesIterator i (uses_begin ()), end (uses_end ()); i != end; ++i) +      { +        Schema& s (i->schema ()); + +        if (set.find (&s) == set.end ()) +          s.find_ (name, names, set); +      } +    } + +    namespace +    { +      using compiler::type_info; + +      // Uses +      // +      struct UsesInit +      { +        UsesInit () +        { +          type_info ti (typeid (Uses)); +          ti.add_base (typeid (Edge)); +          insert (ti); +        } +      } uses_init_; + + +      // Implies +      // +      struct ImpliesInit +      { +        ImpliesInit () +        { +          type_info ti (typeid (Implies)); +          ti.add_base (typeid (Uses)); +          insert (ti); +        } +      } implies_init_; + + +      // Sources +      // +      struct SourcesInit +      { +        SourcesInit () +        { +          type_info ti (typeid (Sources)); +          ti.add_base (typeid (Uses)); +          insert (ti); +        } +      } sources_init_; + + +      // Includes +      // +      struct IncludesInit +      { +        IncludesInit () +        { +          type_info ti (typeid (Includes)); +          ti.add_base (typeid (Uses)); +          insert (ti); +        } +      } includes_init_; + + +      // Imports +      // +      struct ImportsInit +      { +        ImportsInit () +        { +          type_info ti (typeid (Imports)); +          ti.add_base (typeid (Uses)); +          insert (ti); +        } +      } imports_init_; + + +      // Schema +      // +      struct SchemaInit +      { +        SchemaInit () +        { +          type_info ti (typeid (Schema)); +          ti.add_base (typeid (Scope)); +          insert (ti); +        } +      } schema_init_; +    } +  } +} | 
