diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2022-11-25 17:39:38 +0300 | 
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2022-12-01 18:51:05 +0300 | 
| commit | 1f259ae6799e7e0a08e5b84fc5686e404b17eef0 (patch) | |
| tree | 388417f61bf1eb19e633f3e613353f01c05b8730 /compiler/rustc_ast_lowering/src | |
| parent | 6cd4dd3091dfe0ce4a728bd9ae177361fba23736 (diff) | |
| download | rust-1f259ae6799e7e0a08e5b84fc5686e404b17eef0.tar.gz rust-1f259ae6799e7e0a08e5b84fc5686e404b17eef0.zip | |
rustc_hir: Change representation of import paths to support multiple resolutions
Diffstat (limited to 'compiler/rustc_ast_lowering/src')
| -rw-r--r-- | compiler/rustc_ast_lowering/src/item.rs | 21 | ||||
| -rw-r--r-- | compiler/rustc_ast_lowering/src/path.rs | 21 | 
2 files changed, 15 insertions, 27 deletions
| diff --git a/compiler/rustc_ast_lowering/src/item.rs b/compiler/rustc_ast_lowering/src/item.rs index 2b47e908912..b26b37b0466 100644 --- a/compiler/rustc_ast_lowering/src/item.rs +++ b/compiler/rustc_ast_lowering/src/item.rs @@ -508,7 +508,7 @@ impl<'hir> LoweringContext<'_, 'hir> { let mut resolutions = self.expect_full_res_from_use(id).fuse(); // We want to return *something* from this function, so hold onto the first item // for later. - let ret_res = self.lower_res(resolutions.next().unwrap_or(Res::Err)); + let ret_res = smallvec![self.lower_res(resolutions.next().unwrap_or(Res::Err))]; // Here, we are looping over namespaces, if they exist for the definition // being imported. We only handle type and value namespaces because we @@ -538,8 +538,8 @@ impl<'hir> LoweringContext<'_, 'hir> { let span = path.span; self.with_hir_id_owner(new_node_id, |this| { - let res = this.lower_res(res); - let path = this.lower_path_extra(res, &path, ParamMode::Explicit); + let res = smallvec![this.lower_res(res)]; + let path = this.lower_use_path(res, &path, ParamMode::Explicit); let kind = hir::ItemKind::Use(path, hir::UseKind::Single); if let Some(attrs) = attrs { this.attrs.insert(hir::ItemLocalId::new(0), attrs); @@ -556,15 +556,14 @@ impl<'hir> LoweringContext<'_, 'hir> { }); } - let path = self.lower_path_extra(ret_res, &path, ParamMode::Explicit); + let path = self.lower_use_path(ret_res, &path, ParamMode::Explicit); hir::ItemKind::Use(path, hir::UseKind::Single) } UseTreeKind::Glob => { - let path = self.lower_path( - id, - &Path { segments, span: path.span, tokens: None }, - ParamMode::Explicit, - ); + let res = self.expect_full_res(id); + let res = smallvec![self.lower_res(res)]; + let path = Path { segments, span: path.span, tokens: None }; + let path = self.lower_use_path(res, &path, ParamMode::Explicit); hir::ItemKind::Use(path, hir::UseKind::Glob) } UseTreeKind::Nested(ref trees) => { @@ -635,8 +634,8 @@ impl<'hir> LoweringContext<'_, 'hir> { } let res = self.expect_full_res_from_use(id).next().unwrap_or(Res::Err); - let res = self.lower_res(res); - let path = self.lower_path_extra(res, &prefix, ParamMode::Explicit); + let res = smallvec![self.lower_res(res)]; + let path = self.lower_use_path(res, &prefix, ParamMode::Explicit); hir::ItemKind::Use(path, hir::UseKind::ListStem) } } diff --git a/compiler/rustc_ast_lowering/src/path.rs b/compiler/rustc_ast_lowering/src/path.rs index dc85b5e95ea..8d23c26e603 100644 --- a/compiler/rustc_ast_lowering/src/path.rs +++ b/compiler/rustc_ast_lowering/src/path.rs @@ -12,7 +12,7 @@ use rustc_hir::GenericArg; use rustc_span::symbol::{kw, Ident}; use rustc_span::{BytePos, Span, DUMMY_SP}; -use smallvec::smallvec; +use smallvec::{smallvec, SmallVec}; impl<'a, 'hir> LoweringContext<'a, 'hir> { #[instrument(level = "trace", skip(self))] @@ -144,13 +144,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { ); } - pub(crate) fn lower_path_extra( + pub(crate) fn lower_use_path( &mut self, - res: Res, + res: SmallVec<[Res; 3]>, p: &Path, param_mode: ParamMode, - ) -> &'hir hir::Path<'hir> { - self.arena.alloc(hir::Path { + ) -> &'hir hir::UsePath<'hir> { + self.arena.alloc(hir::UsePath { res, segments: self.arena.alloc_from_iter(p.segments.iter().map(|segment| { self.lower_path_segment( @@ -165,17 +165,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { }) } - pub(crate) fn lower_path( - &mut self, - id: NodeId, - p: &Path, - param_mode: ParamMode, - ) -> &'hir hir::Path<'hir> { - let res = self.expect_full_res(id); - let res = self.lower_res(res); - self.lower_path_extra(res, p, param_mode) - } - pub(crate) fn lower_path_segment( &mut self, path_span: Span, | 
