Skip to content

Commit b4e11c2

Browse files
authored
Auto merge of #34655 - jseyfried:improve_resolver_api, r=nrc
Add to `resolve`'s public API This adds a public method `with_module_lexical_scope` to `Resolver` to allow users to resolve a path in the lexical scope of an arbitrary module. r? @nrc
2 parents de78655 + 58dd06d commit b4e11c2

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

src/librustc_resolve/lib.rs

+29-1
Original file line numberDiff line numberDiff line change
@@ -980,7 +980,7 @@ pub struct Resolver<'a> {
980980
//
981981
// There will be an anonymous module created around `g` with the ID of the
982982
// entry block for `f`.
983-
module_map: NodeMap<Module<'a>>,
983+
pub module_map: NodeMap<Module<'a>>,
984984

985985
// Whether or not to print error messages. Can be set to true
986986
// when getting additional info for error message suggestions,
@@ -2674,6 +2674,34 @@ impl<'a> Resolver<'a> {
26742674
rs
26752675
}
26762676

2677+
// Calls `f` with a `Resolver` whose current lexical scope is `module`'s lexical scope,
2678+
// i.e. the module's items and the prelude (unless the module is `#[no_implicit_prelude]`).
2679+
// FIXME #34673: This needs testing.
2680+
pub fn with_module_lexical_scope<T, F>(&mut self, module: Module<'a>, f: F) -> T
2681+
where F: FnOnce(&mut Resolver<'a>) -> T,
2682+
{
2683+
self.with_empty_ribs(|this| {
2684+
this.value_ribs.push(Rib::new(ModuleRibKind(module)));
2685+
this.type_ribs.push(Rib::new(ModuleRibKind(module)));
2686+
f(this)
2687+
})
2688+
}
2689+
2690+
fn with_empty_ribs<T, F>(&mut self, f: F) -> T
2691+
where F: FnOnce(&mut Resolver<'a>) -> T,
2692+
{
2693+
use ::std::mem::replace;
2694+
let value_ribs = replace(&mut self.value_ribs, Vec::new());
2695+
let type_ribs = replace(&mut self.type_ribs, Vec::new());
2696+
let label_ribs = replace(&mut self.label_ribs, Vec::new());
2697+
2698+
let result = f(self);
2699+
self.value_ribs = value_ribs;
2700+
self.type_ribs = type_ribs;
2701+
self.label_ribs = label_ribs;
2702+
result
2703+
}
2704+
26772705
fn find_fallback_in_self_type(&mut self, name: Name) -> FallbackSuggestion {
26782706
fn extract_node_id(t: &Ty) -> Option<NodeId> {
26792707
match t.node {

0 commit comments

Comments
 (0)