Rollup merge of #118401 - nnethercote:rustc_ast_lowering, r=compiler-errors
`rustc_ast_lowering` cleanups Just some cleanups I found while looking through this code. r? `@spastorino`
This commit is contained in:
commit
82eda5865a
@ -530,7 +530,7 @@ fn lower_expr_try_block(&mut self, body: &Block) -> hir::ExprKind<'hir> {
|
|||||||
this.mark_span_with_reason(
|
this.mark_span_with_reason(
|
||||||
DesugaringKind::TryBlock,
|
DesugaringKind::TryBlock,
|
||||||
expr.span,
|
expr.span,
|
||||||
this.allow_try_trait.clone(),
|
Some(this.allow_try_trait.clone()),
|
||||||
),
|
),
|
||||||
expr,
|
expr,
|
||||||
)
|
)
|
||||||
@ -538,7 +538,7 @@ fn lower_expr_try_block(&mut self, body: &Block) -> hir::ExprKind<'hir> {
|
|||||||
let try_span = this.mark_span_with_reason(
|
let try_span = this.mark_span_with_reason(
|
||||||
DesugaringKind::TryBlock,
|
DesugaringKind::TryBlock,
|
||||||
this.tcx.sess.source_map().end_point(body.span),
|
this.tcx.sess.source_map().end_point(body.span),
|
||||||
this.allow_try_trait.clone(),
|
Some(this.allow_try_trait.clone()),
|
||||||
);
|
);
|
||||||
|
|
||||||
(try_span, this.expr_unit(try_span))
|
(try_span, this.expr_unit(try_span))
|
||||||
@ -618,8 +618,11 @@ pub(super) fn make_async_expr(
|
|||||||
let output = ret_ty.unwrap_or_else(|| hir::FnRetTy::DefaultReturn(self.lower_span(span)));
|
let output = ret_ty.unwrap_or_else(|| hir::FnRetTy::DefaultReturn(self.lower_span(span)));
|
||||||
|
|
||||||
// Resume argument type: `ResumeTy`
|
// Resume argument type: `ResumeTy`
|
||||||
let unstable_span =
|
let unstable_span = self.mark_span_with_reason(
|
||||||
self.mark_span_with_reason(DesugaringKind::Async, span, self.allow_gen_future.clone());
|
DesugaringKind::Async,
|
||||||
|
span,
|
||||||
|
Some(self.allow_gen_future.clone()),
|
||||||
|
);
|
||||||
let resume_ty = hir::QPath::LangItem(hir::LangItem::ResumeTy, unstable_span);
|
let resume_ty = hir::QPath::LangItem(hir::LangItem::ResumeTy, unstable_span);
|
||||||
let input_ty = hir::Ty {
|
let input_ty = hir::Ty {
|
||||||
hir_id: self.next_id(),
|
hir_id: self.next_id(),
|
||||||
@ -741,7 +744,7 @@ pub(super) fn maybe_forward_track_caller(
|
|||||||
let unstable_span = self.mark_span_with_reason(
|
let unstable_span = self.mark_span_with_reason(
|
||||||
DesugaringKind::Async,
|
DesugaringKind::Async,
|
||||||
span,
|
span,
|
||||||
self.allow_gen_future.clone(),
|
Some(self.allow_gen_future.clone()),
|
||||||
);
|
);
|
||||||
self.lower_attrs(
|
self.lower_attrs(
|
||||||
inner_hir_id,
|
inner_hir_id,
|
||||||
@ -788,7 +791,7 @@ fn lower_expr_await(&mut self, await_kw_span: Span, expr: &Expr) -> hir::ExprKin
|
|||||||
let gen_future_span = self.mark_span_with_reason(
|
let gen_future_span = self.mark_span_with_reason(
|
||||||
DesugaringKind::Await,
|
DesugaringKind::Await,
|
||||||
full_span,
|
full_span,
|
||||||
self.allow_gen_future.clone(),
|
Some(self.allow_gen_future.clone()),
|
||||||
);
|
);
|
||||||
let expr = self.lower_expr_mut(expr);
|
let expr = self.lower_expr_mut(expr);
|
||||||
let expr_hir_id = expr.hir_id;
|
let expr_hir_id = expr.hir_id;
|
||||||
@ -1646,13 +1649,13 @@ fn lower_expr_try(&mut self, span: Span, sub_expr: &Expr) -> hir::ExprKind<'hir>
|
|||||||
let unstable_span = self.mark_span_with_reason(
|
let unstable_span = self.mark_span_with_reason(
|
||||||
DesugaringKind::QuestionMark,
|
DesugaringKind::QuestionMark,
|
||||||
span,
|
span,
|
||||||
self.allow_try_trait.clone(),
|
Some(self.allow_try_trait.clone()),
|
||||||
);
|
);
|
||||||
let try_span = self.tcx.sess.source_map().end_point(span);
|
let try_span = self.tcx.sess.source_map().end_point(span);
|
||||||
let try_span = self.mark_span_with_reason(
|
let try_span = self.mark_span_with_reason(
|
||||||
DesugaringKind::QuestionMark,
|
DesugaringKind::QuestionMark,
|
||||||
try_span,
|
try_span,
|
||||||
self.allow_try_trait.clone(),
|
Some(self.allow_try_trait.clone()),
|
||||||
);
|
);
|
||||||
|
|
||||||
// `Try::branch(<expr>)`
|
// `Try::branch(<expr>)`
|
||||||
@ -1745,7 +1748,7 @@ fn lower_expr_yeet(&mut self, span: Span, sub_expr: Option<&Expr>) -> hir::ExprK
|
|||||||
let unstable_span = self.mark_span_with_reason(
|
let unstable_span = self.mark_span_with_reason(
|
||||||
DesugaringKind::YeetExpr,
|
DesugaringKind::YeetExpr,
|
||||||
span,
|
span,
|
||||||
self.allow_try_trait.clone(),
|
Some(self.allow_try_trait.clone()),
|
||||||
);
|
);
|
||||||
|
|
||||||
let from_yeet_expr = self.wrap_in_try_constructor(
|
let from_yeet_expr = self.wrap_in_try_constructor(
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
use rustc_span::{Span, DUMMY_SP};
|
use rustc_span::{Span, DUMMY_SP};
|
||||||
|
|
||||||
/// A visitor that walks over the HIR and collects `Node`s into a HIR map.
|
/// A visitor that walks over the HIR and collects `Node`s into a HIR map.
|
||||||
pub(super) struct NodeCollector<'a, 'hir> {
|
struct NodeCollector<'a, 'hir> {
|
||||||
tcx: TyCtxt<'hir>,
|
tcx: TyCtxt<'hir>,
|
||||||
|
|
||||||
bodies: &'a SortedMap<ItemLocalId, &'hir Body<'hir>>,
|
bodies: &'a SortedMap<ItemLocalId, &'hir Body<'hir>>,
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
use rustc_ast::ptr::P;
|
use rustc_ast::ptr::P;
|
||||||
use rustc_ast::visit::AssocCtxt;
|
use rustc_ast::visit::AssocCtxt;
|
||||||
use rustc_ast::*;
|
use rustc_ast::*;
|
||||||
use rustc_data_structures::sorted_map::SortedMap;
|
|
||||||
use rustc_errors::ErrorGuaranteed;
|
use rustc_errors::ErrorGuaranteed;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{DefKind, Res};
|
use rustc_hir::def::{DefKind, Res};
|
||||||
@ -55,42 +54,7 @@ fn with_lctx(
|
|||||||
owner: NodeId,
|
owner: NodeId,
|
||||||
f: impl FnOnce(&mut LoweringContext<'_, 'hir>) -> hir::OwnerNode<'hir>,
|
f: impl FnOnce(&mut LoweringContext<'_, 'hir>) -> hir::OwnerNode<'hir>,
|
||||||
) {
|
) {
|
||||||
let allow_gen_future = Some(if self.tcx.features().async_fn_track_caller {
|
let mut lctx = LoweringContext::new(self.tcx, self.resolver);
|
||||||
[sym::gen_future, sym::closure_track_caller][..].into()
|
|
||||||
} else {
|
|
||||||
[sym::gen_future][..].into()
|
|
||||||
});
|
|
||||||
let mut lctx = LoweringContext {
|
|
||||||
// Pseudo-globals.
|
|
||||||
tcx: self.tcx,
|
|
||||||
resolver: self.resolver,
|
|
||||||
arena: self.tcx.hir_arena,
|
|
||||||
|
|
||||||
// HirId handling.
|
|
||||||
bodies: Vec::new(),
|
|
||||||
attrs: SortedMap::default(),
|
|
||||||
children: Vec::default(),
|
|
||||||
current_hir_id_owner: hir::CRATE_OWNER_ID,
|
|
||||||
item_local_id_counter: hir::ItemLocalId::new(0),
|
|
||||||
node_id_to_local_id: Default::default(),
|
|
||||||
trait_map: Default::default(),
|
|
||||||
|
|
||||||
// Lowering state.
|
|
||||||
catch_scope: None,
|
|
||||||
loop_scope: None,
|
|
||||||
is_in_loop_condition: false,
|
|
||||||
is_in_trait_impl: false,
|
|
||||||
is_in_dyn_type: false,
|
|
||||||
coroutine_kind: None,
|
|
||||||
task_context: None,
|
|
||||||
current_item: None,
|
|
||||||
impl_trait_defs: Vec::new(),
|
|
||||||
impl_trait_bounds: Vec::new(),
|
|
||||||
allow_try_trait: Some([sym::try_trait_v2, sym::yeet_desugar_details][..].into()),
|
|
||||||
allow_gen_future,
|
|
||||||
generics_def_id_map: Default::default(),
|
|
||||||
host_param_id: None,
|
|
||||||
};
|
|
||||||
lctx.with_hir_id_owner(owner, |lctx| f(lctx));
|
lctx.with_hir_id_owner(owner, |lctx| f(lctx));
|
||||||
|
|
||||||
for (def_id, info) in lctx.children {
|
for (def_id, info) in lctx.children {
|
||||||
@ -136,39 +100,9 @@ fn lower_item(&mut self, item: &Item) {
|
|||||||
|
|
||||||
fn lower_assoc_item(&mut self, item: &AssocItem, ctxt: AssocCtxt) {
|
fn lower_assoc_item(&mut self, item: &AssocItem, ctxt: AssocCtxt) {
|
||||||
let def_id = self.resolver.node_id_to_def_id[&item.id];
|
let def_id = self.resolver.node_id_to_def_id[&item.id];
|
||||||
|
|
||||||
let parent_id = self.tcx.local_parent(def_id);
|
let parent_id = self.tcx.local_parent(def_id);
|
||||||
let parent_hir = self.lower_node(parent_id).unwrap();
|
let parent_hir = self.lower_node(parent_id).unwrap();
|
||||||
self.with_lctx(item.id, |lctx| {
|
self.with_lctx(item.id, |lctx| lctx.lower_assoc_item(item, ctxt, parent_hir))
|
||||||
// Evaluate with the lifetimes in `params` in-scope.
|
|
||||||
// This is used to track which lifetimes have already been defined,
|
|
||||||
// and which need to be replicated when lowering an async fn.
|
|
||||||
|
|
||||||
match parent_hir.node().expect_item().kind {
|
|
||||||
hir::ItemKind::Impl(impl_) => {
|
|
||||||
lctx.is_in_trait_impl = impl_.of_trait.is_some();
|
|
||||||
}
|
|
||||||
hir::ItemKind::Trait(_, _, generics, _, _) if lctx.tcx.features().effects => {
|
|
||||||
lctx.host_param_id = generics
|
|
||||||
.params
|
|
||||||
.iter()
|
|
||||||
.find(|param| {
|
|
||||||
parent_hir
|
|
||||||
.attrs
|
|
||||||
.get(param.hir_id.local_id)
|
|
||||||
.iter()
|
|
||||||
.any(|attr| attr.has_name(sym::rustc_host))
|
|
||||||
})
|
|
||||||
.map(|param| param.def_id);
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
|
|
||||||
match ctxt {
|
|
||||||
AssocCtxt::Trait => hir::OwnerNode::TraitItem(lctx.lower_trait_item(item)),
|
|
||||||
AssocCtxt::Impl => hir::OwnerNode::ImplItem(lctx.lower_impl_item(item)),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lower_foreign_item(&mut self, item: &ForeignItem) {
|
fn lower_foreign_item(&mut self, item: &ForeignItem) {
|
||||||
@ -611,6 +545,42 @@ fn lower_use_tree(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn lower_assoc_item(
|
||||||
|
&mut self,
|
||||||
|
item: &AssocItem,
|
||||||
|
ctxt: AssocCtxt,
|
||||||
|
parent_hir: &'hir hir::OwnerInfo<'hir>,
|
||||||
|
) -> hir::OwnerNode<'hir> {
|
||||||
|
// Evaluate with the lifetimes in `params` in-scope.
|
||||||
|
// This is used to track which lifetimes have already been defined,
|
||||||
|
// and which need to be replicated when lowering an async fn.
|
||||||
|
|
||||||
|
match parent_hir.node().expect_item().kind {
|
||||||
|
hir::ItemKind::Impl(impl_) => {
|
||||||
|
self.is_in_trait_impl = impl_.of_trait.is_some();
|
||||||
|
}
|
||||||
|
hir::ItemKind::Trait(_, _, generics, _, _) if self.tcx.features().effects => {
|
||||||
|
self.host_param_id = generics
|
||||||
|
.params
|
||||||
|
.iter()
|
||||||
|
.find(|param| {
|
||||||
|
parent_hir
|
||||||
|
.attrs
|
||||||
|
.get(param.hir_id.local_id)
|
||||||
|
.iter()
|
||||||
|
.any(|attr| attr.has_name(sym::rustc_host))
|
||||||
|
})
|
||||||
|
.map(|param| param.def_id);
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
match ctxt {
|
||||||
|
AssocCtxt::Trait => hir::OwnerNode::TraitItem(self.lower_trait_item(item)),
|
||||||
|
AssocCtxt::Impl => hir::OwnerNode::ImplItem(self.lower_impl_item(item)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn lower_foreign_item(&mut self, i: &ForeignItem) -> &'hir hir::ForeignItem<'hir> {
|
fn lower_foreign_item(&mut self, i: &ForeignItem) -> &'hir hir::ForeignItem<'hir> {
|
||||||
let hir_id = self.lower_node_id(i.id);
|
let hir_id = self.lower_node_id(i.id);
|
||||||
let owner_id = hir_id.expect_owner();
|
let owner_id = hir_id.expect_owner();
|
||||||
|
@ -35,7 +35,6 @@
|
|||||||
#![doc(rust_logo)]
|
#![doc(rust_logo)]
|
||||||
#![feature(box_patterns)]
|
#![feature(box_patterns)]
|
||||||
#![feature(let_chains)]
|
#![feature(let_chains)]
|
||||||
#![feature(never_type)]
|
|
||||||
#![recursion_limit = "256"]
|
#![recursion_limit = "256"]
|
||||||
#![deny(rustc::untranslatable_diagnostic)]
|
#![deny(rustc::untranslatable_diagnostic)]
|
||||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||||
@ -132,8 +131,8 @@ struct LoweringContext<'a, 'hir> {
|
|||||||
/// NodeIds that are lowered inside the current HIR owner.
|
/// NodeIds that are lowered inside the current HIR owner.
|
||||||
node_id_to_local_id: FxHashMap<NodeId, hir::ItemLocalId>,
|
node_id_to_local_id: FxHashMap<NodeId, hir::ItemLocalId>,
|
||||||
|
|
||||||
allow_try_trait: Option<Lrc<[Symbol]>>,
|
allow_try_trait: Lrc<[Symbol]>,
|
||||||
allow_gen_future: Option<Lrc<[Symbol]>>,
|
allow_gen_future: Lrc<[Symbol]>,
|
||||||
|
|
||||||
/// Mapping from generics `def_id`s to TAIT generics `def_id`s.
|
/// Mapping from generics `def_id`s to TAIT generics `def_id`s.
|
||||||
/// For each captured lifetime (e.g., 'a), we create a new lifetime parameter that is a generic
|
/// For each captured lifetime (e.g., 'a), we create a new lifetime parameter that is a generic
|
||||||
@ -144,6 +143,46 @@ struct LoweringContext<'a, 'hir> {
|
|||||||
host_param_id: Option<LocalDefId>,
|
host_param_id: Option<LocalDefId>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
|
fn new(tcx: TyCtxt<'hir>, resolver: &'a mut ResolverAstLowering) -> Self {
|
||||||
|
Self {
|
||||||
|
// Pseudo-globals.
|
||||||
|
tcx,
|
||||||
|
resolver: resolver,
|
||||||
|
arena: tcx.hir_arena,
|
||||||
|
|
||||||
|
// HirId handling.
|
||||||
|
bodies: Vec::new(),
|
||||||
|
attrs: SortedMap::default(),
|
||||||
|
children: Vec::default(),
|
||||||
|
current_hir_id_owner: hir::CRATE_OWNER_ID,
|
||||||
|
item_local_id_counter: hir::ItemLocalId::new(0),
|
||||||
|
node_id_to_local_id: Default::default(),
|
||||||
|
trait_map: Default::default(),
|
||||||
|
|
||||||
|
// Lowering state.
|
||||||
|
catch_scope: None,
|
||||||
|
loop_scope: None,
|
||||||
|
is_in_loop_condition: false,
|
||||||
|
is_in_trait_impl: false,
|
||||||
|
is_in_dyn_type: false,
|
||||||
|
coroutine_kind: None,
|
||||||
|
task_context: None,
|
||||||
|
current_item: None,
|
||||||
|
impl_trait_defs: Vec::new(),
|
||||||
|
impl_trait_bounds: Vec::new(),
|
||||||
|
allow_try_trait: [sym::try_trait_v2, sym::yeet_desugar_details].into(),
|
||||||
|
allow_gen_future: if tcx.features().async_fn_track_caller {
|
||||||
|
[sym::gen_future, sym::closure_track_caller].into()
|
||||||
|
} else {
|
||||||
|
[sym::gen_future].into()
|
||||||
|
},
|
||||||
|
generics_def_id_map: Default::default(),
|
||||||
|
host_param_id: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
trait ResolverAstLoweringExt {
|
trait ResolverAstLoweringExt {
|
||||||
fn legacy_const_generic_args(&self, expr: &Expr) -> Option<Vec<usize>>;
|
fn legacy_const_generic_args(&self, expr: &Expr) -> Option<Vec<usize>>;
|
||||||
fn get_partial_res(&self, id: NodeId) -> Option<PartialRes>;
|
fn get_partial_res(&self, id: NodeId) -> Option<PartialRes>;
|
||||||
|
@ -108,7 +108,7 @@ fn visit_ty(&mut self, t: &'ast Ty) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn lifetimes_in_bounds(
|
pub(crate) fn lifetimes_in_bounds(
|
||||||
resolver: &ResolverAstLowering,
|
resolver: &ResolverAstLowering,
|
||||||
bounds: &GenericBounds,
|
bounds: &GenericBounds,
|
||||||
) -> Vec<Lifetime> {
|
) -> Vec<Lifetime> {
|
||||||
|
@ -18,7 +18,7 @@ pub(crate) fn lower_pat(&mut self, pattern: &Pat) -> &'hir hir::Pat<'hir> {
|
|||||||
self.arena.alloc(self.lower_pat_mut(pattern))
|
self.arena.alloc(self.lower_pat_mut(pattern))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn lower_pat_mut(&mut self, mut pattern: &Pat) -> hir::Pat<'hir> {
|
fn lower_pat_mut(&mut self, mut pattern: &Pat) -> hir::Pat<'hir> {
|
||||||
ensure_sufficient_stack(|| {
|
ensure_sufficient_stack(|| {
|
||||||
// loop here to avoid recursion
|
// loop here to avoid recursion
|
||||||
let node = loop {
|
let node = loop {
|
||||||
|
@ -492,7 +492,7 @@ struct VisitingNodeFrame<G: DirectedGraph, Successors> {
|
|||||||
let returned_walk =
|
let returned_walk =
|
||||||
return_value.take().into_iter().map(|walk| (*successor_node, Some(walk)));
|
return_value.take().into_iter().map(|walk| (*successor_node, Some(walk)));
|
||||||
|
|
||||||
let successor_walk = successors.by_ref().map(|successor_node| {
|
let successor_walk = successors.map(|successor_node| {
|
||||||
debug!(?node, ?successor_node);
|
debug!(?node, ?successor_node);
|
||||||
(successor_node, self.inspect_node(successor_node))
|
(successor_node, self.inspect_node(successor_node))
|
||||||
});
|
});
|
||||||
|
@ -222,7 +222,6 @@ pub struct DefIndex {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// njn: I don't understand these
|
|
||||||
impl<E: Encoder> Encodable<E> for DefIndex {
|
impl<E: Encoder> Encodable<E> for DefIndex {
|
||||||
default fn encode(&self, _: &mut E) {
|
default fn encode(&self, _: &mut E) {
|
||||||
panic!("cannot encode `DefIndex` with `{}`", std::any::type_name::<E>());
|
panic!("cannot encode `DefIndex` with `{}`", std::any::type_name::<E>());
|
||||||
|
Loading…
Reference in New Issue
Block a user