diff options
Diffstat (limited to 'src/hir/hir.cpp')
| -rw-r--r-- | src/hir/hir.cpp | 39 | 
1 files changed, 39 insertions, 0 deletions
| diff --git a/src/hir/hir.cpp b/src/hir/hir.cpp index 4b9aef10..2a8ac8bf 100644 --- a/src/hir/hir.cpp +++ b/src/hir/hir.cpp @@ -17,6 +17,20 @@  #include <mir/main_bindings.hpp>  namespace HIR { +    ::std::ostream& operator<<(::std::ostream& os, const Publicity& x) +    { +        if( !x.vis_path ) { +            os << "pub"; +        } +        else if( *x.vis_path == *Publicity::none_path ) { +            os << "priv"; +        } +        else { +            os << "pub(" << *x.vis_path << ")"; +        } +        return os; +    } +      ::std::ostream& operator<<(::std::ostream& os, const ::HIR::Literal& v)      {          TU_MATCH(::HIR::Literal, (v), (e), @@ -110,6 +124,31 @@ namespace HIR {      }  } +::std::shared_ptr<::HIR::SimplePath> HIR::Publicity::none_path = ::std::make_shared<HIR::SimplePath>(::HIR::SimplePath{"#", {}}); + +bool HIR::Publicity::is_visible(const ::HIR::SimplePath& p) const +{ +    // No path = global public +    if( !vis_path ) +        return true; +    // Empty simple path = full private +    if( *vis_path == *none_path ) { +        return false; +    } +    // Crate names must match +    if(p.m_crate_name != vis_path->m_crate_name) +        return false; +    // `p` must be a child of vis_path +    if(p.m_components.size() < vis_path->m_components.size()) +        return false; +    for(size_t i = 0; i < vis_path->m_components.size(); i ++) +    { +        if(p.m_components[i] != vis_path->m_components[i]) +            return false; +    } +    return true; +} +  size_t HIR::Enum::find_variant(const ::std::string& name) const  {      if( m_data.is_Value() ) | 
