(
&self,
query: impl IntoIterator<Item = Symbol<'heap>>,
mut module: Module<'heap>,
)
| 188 | |
| 189 | #[define_opaque(ModuleItemIterator)] |
| 190 | fn resolve_impl( |
| 191 | &self, |
| 192 | query: impl IntoIterator<Item = Symbol<'heap>>, |
| 193 | mut module: Module<'heap>, |
| 194 | ) -> Result<ResolveIter<'heap>, ResolutionError<'heap>> { |
| 195 | let mut query = query.into_iter().enumerate().peekable(); |
| 196 | |
| 197 | // In case that we're in glob mode and the query is empty (which is only valid in glob |
| 198 | // mode), return all items |
| 199 | if query.peek().is_none() && self.options.mode == ResolverMode::Glob { |
| 200 | if module.items.is_empty() { |
| 201 | return Err(ResolutionError::ModuleEmpty { depth: 0 }); |
| 202 | } |
| 203 | |
| 204 | return Ok(ResolveIter::Glob( |
| 205 | module.items.into_iter().copied().map(Reference::Item), |
| 206 | )); |
| 207 | } |
| 208 | |
| 209 | // Traverse the entry until we're at the last item |
| 210 | let (depth, name) = loop { |
| 211 | let Some((mut depth, name)) = query.next() else { |
| 212 | return Err(ResolutionError::InvalidQueryLength { expected: 2 }); |
| 213 | }; |
| 214 | |
| 215 | // We start at 1, because the entry (the one we're starting at) is selected by the user |
| 216 | depth += 1; |
| 217 | |
| 218 | if query.peek().is_none() { |
| 219 | // The last item is the entry we're trying to resolve to |
| 220 | break (depth, name); |
| 221 | } |
| 222 | |
| 223 | let Some(&item) = module.items.iter().find(|item| item.name == name) else { |
| 224 | return Err(ResolutionError::ModuleNotFound { |
| 225 | depth, |
| 226 | name, |
| 227 | suggestions: self.suggest(|| { |
| 228 | module.suggestions(|item| matches!(item.kind, ItemKind::Module(_))) |
| 229 | }), |
| 230 | }); |
| 231 | }; |
| 232 | |
| 233 | // Because we're not at the last item, the item needs to be a module |
| 234 | let ItemKind::Module(next) = item.kind else { |
| 235 | return Err(ResolutionError::ModuleRequired { |
| 236 | depth, |
| 237 | found: item.kind.universe(), |
| 238 | }); |
| 239 | }; |
| 240 | |
| 241 | module = self.registry.modules.index(next); |
| 242 | }; |
| 243 | |
| 244 | match self.options.mode { |
| 245 | ResolverMode::Single(universe) => self |
| 246 | .resolve_single(module, universe, name, depth) |
| 247 | .map(ResolveIter::Single), |
no test coverage detected