@@ -118,6 +118,9 @@ impl ModuleHierarchy {
118118 }
119119 }
120120
121+ // TODO(peter) Do we want this?
122+ // `add_module` already has "get or insert" semantics. The difference here is just that
123+ // `get_by_name_or_add` is not making the module visible.
121124 pub fn get_by_name_or_add ( & mut self , name : & str ) -> Result < & Module > {
122125 let token = match self . get_by_name ( name) {
123126 Some ( module) => module. token ,
@@ -131,6 +134,11 @@ impl ModuleHierarchy {
131134 self . modules . get ( module)
132135 }
133136
137+ // TODO(peter) Guarantee order?
138+ pub fn all ( & self ) -> impl Iterator < Item = & Module > {
139+ self . modules . values ( )
140+ }
141+
134142 pub fn get_parent ( & self , module : ModuleToken ) -> Option < & Module > {
135143 match self . module_parents . get ( module) {
136144 Some ( parent) => parent. map ( |parent| self . get ( parent) . unwrap ( ) ) ,
@@ -196,6 +204,22 @@ impl<T: Sized + Clone + IntoIterator<Item = ModuleToken> + Extend<ModuleToken>>
196204{
197205}
198206
207+ pub trait ModuleIterator < ' a > : Iterator < Item = & ' a Module > + Sized {
208+ fn tokens ( self ) -> impl Iterator < Item = ModuleToken > {
209+ self . map ( |m| m. token )
210+ }
211+
212+ fn names ( self ) -> impl Iterator < Item = & ' a str > {
213+ self . map ( |m| m. name . as_str ( ) )
214+ }
215+
216+ fn visible ( self ) -> impl Iterator < Item = & ' a Module > {
217+ self . filter ( |m| !m. is_invisible )
218+ }
219+ }
220+
221+ impl < ' a , T : Iterator < Item = & ' a Module > > ModuleIterator < ' a > for T { }
222+
199223fn parent_name ( name : & str ) -> Option < String > {
200224 match name. rsplit_once ( "." ) {
201225 Some ( ( base, _) ) => Some ( base. to_owned ( ) ) ,
0 commit comments