Skip to content

Commit fd0c901

Browse files
committed
Auto merge of #153656 - aerooneqq:split-ast-lowering-resolver, r=petrochenkov
Abstract AST lowering resolver This PR adds new methods for `ResolverAstLoweringExt` for future use in #153489 and abstracts resolver in lowering through generic parameters. > ~This PR splits resolver for AST lowering into two parts: mutable and readonly. This will allow us to use borrowed resolver in #153489, when we will not steal but borrow resolver from resolve stage.~ Second step for #153489. r? @petrochenkov
2 parents 53d60bb + 3656fbf commit fd0c901

11 files changed

Lines changed: 129 additions & 80 deletions

File tree

compiler/rustc_ast_lowering/src/asm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::{
2323
AllowReturnTypeNotation, ImplTraitContext, ImplTraitPosition, ParamMode, ResolverAstLoweringExt,
2424
};
2525

26-
impl<'a, 'hir> LoweringContext<'a, 'hir> {
26+
impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
2727
pub(crate) fn lower_inline_asm(
2828
&mut self,
2929
sp: Span,

compiler/rustc_ast_lowering/src/block.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ use rustc_hir::Target;
44
use rustc_span::sym;
55
use smallvec::SmallVec;
66

7-
use crate::{ImplTraitContext, ImplTraitPosition, LoweringContext};
7+
use crate::{ImplTraitContext, ImplTraitPosition, LoweringContext, ResolverAstLoweringExt};
88

9-
impl<'a, 'hir> LoweringContext<'a, 'hir> {
9+
impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
1010
pub(super) fn lower_block(
1111
&mut self,
1212
b: &Block,

compiler/rustc_ast_lowering/src/contract.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ use std::sync::Arc;
22

33
use thin_vec::thin_vec;
44

5-
use crate::LoweringContext;
5+
use crate::{LoweringContext, ResolverAstLoweringExt};
66

7-
impl<'a, 'hir> LoweringContext<'a, 'hir> {
7+
impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
88
/// Lowered contracts are guarded with the `contract_checks` compiler flag,
99
/// i.e. the flag turns into a boolean guard in the lowered HIR. The reason
1010
/// for not eliminating the contract code entirely when the `contract_checks`

compiler/rustc_ast_lowering/src/delegation.rs

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
//! also be emitted during HIR ty lowering.
3838
3939
use std::iter;
40+
use std::marker::PhantomData;
4041

4142
use ast::visit::Visitor;
4243
use hir::def::{DefKind, PartialRes, Res};
@@ -51,7 +52,7 @@ use rustc_hir as hir;
5152
use rustc_hir::attrs::{AttributeKind, InlineAttr};
5253
use rustc_hir::def_id::{DefId, LocalDefId};
5354
use rustc_middle::span_bug;
54-
use rustc_middle::ty::{Asyncness, DelegationAttrs, DelegationFnSigAttrs, ResolverAstLowering};
55+
use rustc_middle::ty::{Asyncness, DelegationAttrs, DelegationFnSigAttrs};
5556
use rustc_span::symbol::kw;
5657
use rustc_span::{DUMMY_SP, Ident, Span, Symbol};
5758
use smallvec::SmallVec;
@@ -134,16 +135,14 @@ impl DelegationIds {
134135
}
135136
}
136137

137-
impl<'hir> LoweringContext<'_, 'hir> {
138+
impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
138139
fn is_method(&self, def_id: DefId, span: Span) -> bool {
139140
match self.tcx.def_kind(def_id) {
140141
DefKind::Fn => false,
141142
DefKind::AssocFn => match def_id.as_local() {
142-
Some(local_def_id) => self
143-
.resolver
144-
.delegation_fn_sigs
145-
.get(&local_def_id)
146-
.is_some_and(|sig| sig.has_self),
143+
Some(local_def_id) => {
144+
self.resolver.delegation_fn_sig(local_def_id).is_some_and(|sig| sig.has_self)
145+
}
147146
None => self.tcx.associated_item(def_id).is_method(),
148147
},
149148
_ => span_bug!(span, "unexpected DefKind for delegation item"),
@@ -159,7 +158,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
159158

160159
// Delegation can be unresolved in illegal places such as function bodies in extern blocks (see #151356)
161160
let ids = if let Some(delegation_info) =
162-
self.resolver.delegation_infos.get(&self.local_def_id(item_id))
161+
self.resolver.delegation_info(self.local_def_id(item_id))
163162
{
164163
self.get_delegation_ids(delegation_info.resolution_node, span)
165164
} else {
@@ -344,10 +343,10 @@ impl<'hir> LoweringContext<'_, 'hir> {
344343

345344
fn get_attrs(&self, local_id: LocalDefId) -> &DelegationAttrs {
346345
// local_id can correspond either to a function or other delegation
347-
if let Some(fn_sig) = self.resolver.delegation_fn_sigs.get(&local_id) {
346+
if let Some(fn_sig) = self.resolver.delegation_fn_sig(local_id) {
348347
&fn_sig.attrs
349348
} else {
350-
&self.resolver.delegation_infos[&local_id].attrs
349+
&self.resolver.delegation_info(local_id).expect("processing delegation").attrs
351350
}
352351
}
353352

@@ -378,7 +377,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
378377
// it means that we refer to another delegation as a callee, so in order to obtain
379378
// a signature DefId we obtain NodeId of the callee delegation and try to get signature from it.
380379
if let Some(local_id) = def_id.as_local()
381-
&& let Some(delegation_info) = self.resolver.delegation_infos.get(&local_id)
380+
&& let Some(delegation_info) = self.resolver.delegation_info(local_id)
382381
{
383382
node_id = delegation_info.resolution_node;
384383
if visited.contains(&node_id) {
@@ -402,7 +401,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
402401
// Function parameter count, including C variadic `...` if present.
403402
fn param_count(&self, def_id: DefId) -> (usize, bool /*c_variadic*/) {
404403
if let Some(local_sig_id) = def_id.as_local() {
405-
match self.resolver.delegation_fn_sigs.get(&local_sig_id) {
404+
match self.resolver.delegation_fn_sig(local_sig_id) {
406405
Some(sig) => (sig.param_count, sig.c_variadic),
407406
None => (0, false),
408407
}
@@ -457,7 +456,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
457456
span: Span,
458457
) -> hir::FnSig<'hir> {
459458
let header = if let Some(local_sig_id) = sig_id.as_local() {
460-
match self.resolver.delegation_fn_sigs.get(&local_sig_id) {
459+
match self.resolver.delegation_fn_sig(local_sig_id) {
461460
Some(sig) => {
462461
let parent = self.tcx.parent(sig_id);
463462
// HACK: we override the default safety instead of generating attributes from the ether.
@@ -573,6 +572,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
573572
resolver: this.resolver,
574573
path_id: delegation.id,
575574
self_param_id: pat_node_id,
575+
phantom: PhantomData,
576576
};
577577
self_resolver.visit_block(block);
578578
// Target expr needs to lower `self` path.
@@ -818,25 +818,26 @@ impl<'hir> LoweringContext<'_, 'hir> {
818818
}
819819
}
820820

821-
struct SelfResolver<'a, 'tcx> {
822-
resolver: &'a mut ResolverAstLowering<'tcx>,
821+
struct SelfResolver<'a, 'tcx, R> {
822+
resolver: &'a mut R,
823823
path_id: NodeId,
824824
self_param_id: NodeId,
825+
phantom: PhantomData<&'tcx ()>,
825826
}
826827

827-
impl SelfResolver<'_, '_> {
828+
impl<'tcx, R: ResolverAstLoweringExt<'tcx>> SelfResolver<'_, 'tcx, R> {
828829
fn try_replace_id(&mut self, id: NodeId) {
829-
if let Some(res) = self.resolver.partial_res_map.get(&id)
830+
if let Some(res) = self.resolver.get_partial_res(id)
830831
&& let Some(Res::Local(sig_id)) = res.full_res()
831832
&& sig_id == self.path_id
832833
{
833834
let new_res = PartialRes::new(Res::Local(self.self_param_id));
834-
self.resolver.partial_res_map.insert(id, new_res);
835+
self.resolver.insert_partial_res(id, new_res);
835836
}
836837
}
837838
}
838839

839-
impl<'ast, 'a> Visitor<'ast> for SelfResolver<'a, '_> {
840+
impl<'ast, 'a, 'tcx, R: ResolverAstLoweringExt<'tcx>> Visitor<'ast> for SelfResolver<'a, 'tcx, R> {
840841
fn visit_id(&mut self, id: NodeId) {
841842
self.try_replace_id(id);
842843
}

compiler/rustc_ast_lowering/src/delegation/generics.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rustc_span::symbol::kw;
1010
use rustc_span::{DUMMY_SP, Ident, Span};
1111
use thin_vec::{ThinVec, thin_vec};
1212

13-
use crate::{AstOwner, LoweringContext};
13+
use crate::{AstOwner, LoweringContext, ResolverAstLoweringExt};
1414

1515
pub(super) enum DelegationGenerics<T> {
1616
/// User-specified args are present: `reuse foo::<String>;`.
@@ -81,7 +81,7 @@ impl<T> DelegationGenerics<T> {
8181
impl<'hir> HirOrAstGenerics<'hir> {
8282
pub(super) fn into_hir_generics(
8383
&mut self,
84-
ctx: &mut LoweringContext<'_, 'hir>,
84+
ctx: &mut LoweringContext<'_, 'hir, impl ResolverAstLoweringExt<'hir>>,
8585
item_id: NodeId,
8686
span: Span,
8787
) -> &mut HirOrAstGenerics<'hir> {
@@ -128,7 +128,7 @@ impl<'hir> HirOrAstGenerics<'hir> {
128128

129129
pub(super) fn into_generic_args(
130130
&self,
131-
ctx: &mut LoweringContext<'_, 'hir>,
131+
ctx: &mut LoweringContext<'_, 'hir, impl ResolverAstLoweringExt<'hir>>,
132132
add_lifetimes: bool,
133133
span: Span,
134134
) -> Option<&'hir hir::GenericArgs<'hir>> {
@@ -169,7 +169,7 @@ impl<'hir> GenericsGenerationResults<'hir> {
169169
&mut self,
170170
item_id: NodeId,
171171
span: Span,
172-
ctx: &mut LoweringContext<'_, 'hir>,
172+
ctx: &mut LoweringContext<'_, 'hir, impl ResolverAstLoweringExt<'hir>>,
173173
) -> impl Iterator<Item = hir::GenericParam<'hir>> {
174174
// Now we always call `into_hir_generics` both on child and parent,
175175
// however in future we would not do that, when scenarios like
@@ -211,7 +211,7 @@ impl<'hir> GenericsGenerationResults<'hir> {
211211
&mut self,
212212
item_id: NodeId,
213213
span: Span,
214-
ctx: &mut LoweringContext<'_, 'hir>,
214+
ctx: &mut LoweringContext<'_, 'hir, impl ResolverAstLoweringExt<'hir>>,
215215
) -> impl Iterator<Item = hir::WherePredicate<'hir>> {
216216
// Now we always call `into_hir_generics` both on child and parent,
217217
// however in future we would not do that, when scenarios like
@@ -236,7 +236,7 @@ impl<'hir> GenericsGenerationResults<'hir> {
236236
}
237237
}
238238

239-
impl<'hir> LoweringContext<'_, 'hir> {
239+
impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
240240
pub(super) fn lower_delegation_generics(
241241
&mut self,
242242
delegation: &Delegation,
@@ -334,11 +334,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
334334

335335
// Note that we use self.disambiguator here, if we will create new every time
336336
// we will get ICE if params have the same name.
337-
self.resolver.node_id_to_def_id.insert(
337+
self.resolver.insert_new_def_id(
338338
p.id,
339339
self.tcx
340340
.create_def(
341-
self.resolver.node_id_to_def_id[&item_id],
341+
self.local_def_id(item_id),
342342
Some(p.ident.name),
343343
match p.kind {
344344
GenericParamKind::Lifetime => DefKind::LifetimeParam,
@@ -554,7 +554,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
554554

555555
let node_id = self.next_node_id();
556556

557-
self.resolver.partial_res_map.insert(node_id, hir::def::PartialRes::new(res));
557+
self.resolver.insert_partial_res(node_id, hir::def::PartialRes::new(res));
558558

559559
GenericParamKind::Const {
560560
ty: Box::new(Ty {

compiler/rustc_ast_lowering/src/expr.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ impl<'v> rustc_ast::visit::Visitor<'v> for WillCreateDefIdsVisitor {
5252
}
5353
}
5454

55-
impl<'hir> LoweringContext<'_, 'hir> {
55+
impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
5656
fn lower_exprs(&mut self, exprs: &[Box<Expr>]) -> &'hir [hir::Expr<'hir>] {
5757
self.arena.alloc_from_iter(exprs.iter().map(|x| self.lower_expr_mut(x)))
5858
}
@@ -1244,7 +1244,10 @@ impl<'hir> LoweringContext<'_, 'hir> {
12441244
whole_span: Span,
12451245
) -> hir::ExprKind<'hir> {
12461246
// Return early in case of an ordinary assignment.
1247-
fn is_ordinary(lower_ctx: &mut LoweringContext<'_, '_>, lhs: &Expr) -> bool {
1247+
fn is_ordinary<'hir>(
1248+
lower_ctx: &mut LoweringContext<'_, 'hir, impl ResolverAstLoweringExt<'hir>>,
1249+
lhs: &Expr,
1250+
) -> bool {
12481251
match &lhs.kind {
12491252
ExprKind::Array(..)
12501253
| ExprKind::Struct(..)

compiler/rustc_ast_lowering/src/format.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ use rustc_session::config::FmtDebug;
77
use rustc_span::{ByteSymbol, DesugaringKind, Ident, Span, Symbol, sym};
88

99
use super::LoweringContext;
10+
use crate::ResolverAstLoweringExt;
1011

11-
impl<'hir> LoweringContext<'_, 'hir> {
12+
impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
1213
pub(crate) fn lower_format_args(&mut self, sp: Span, fmt: &FormatArgs) -> hir::ExprKind<'hir> {
1314
// Never call the const constructor of `fmt::Arguments` if the
1415
// format_args!() had any arguments _before_ flattening/inlining.
@@ -230,7 +231,7 @@ enum ArgumentType {
230231
/// <core::fmt::Argument>::new_…(arg)
231232
/// ```
232233
fn make_argument<'hir>(
233-
ctx: &mut LoweringContext<'_, 'hir>,
234+
ctx: &mut LoweringContext<'_, 'hir, impl ResolverAstLoweringExt<'hir>>,
234235
sp: Span,
235236
arg: &'hir hir::Expr<'hir>,
236237
ty: ArgumentType,
@@ -277,7 +278,7 @@ fn make_count(
277278
}
278279

279280
fn expand_format_args<'hir>(
280-
ctx: &mut LoweringContext<'_, 'hir>,
281+
ctx: &mut LoweringContext<'_, 'hir, impl ResolverAstLoweringExt<'hir>>,
281282
macsp: Span,
282283
fmt: &FormatArgs,
283284
allow_const: bool,

compiler/rustc_ast_lowering/src/item.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use rustc_hir::{
1212
};
1313
use rustc_index::{IndexSlice, IndexVec};
1414
use rustc_middle::span_bug;
15-
use rustc_middle::ty::{ResolverAstLowering, TyCtxt};
15+
use rustc_middle::ty::TyCtxt;
1616
use rustc_span::def_id::DefId;
1717
use rustc_span::edit_distance::find_best_match_for_name;
1818
use rustc_span::{DUMMY_SP, DesugaringKind, Ident, Span, Symbol, kw, sym};
@@ -27,9 +27,9 @@ use super::{
2727
RelaxedBoundForbiddenReason, RelaxedBoundPolicy, ResolverAstLoweringExt,
2828
};
2929

30-
pub(super) struct ItemLowerer<'a, 'hir> {
30+
pub(super) struct ItemLowerer<'a, 'hir, R> {
3131
pub(super) tcx: TyCtxt<'hir>,
32-
pub(super) resolver: &'a mut ResolverAstLowering<'hir>,
32+
pub(super) resolver: &'a mut R,
3333
pub(super) ast_index: &'a IndexSlice<LocalDefId, AstOwner<'a>>,
3434
pub(super) owners: &'a mut IndexVec<LocalDefId, hir::MaybeOwner<'hir>>,
3535
}
@@ -53,11 +53,11 @@ fn add_ty_alias_where_clause(
5353
if before.0 || !after.0 { before } else { after };
5454
}
5555

56-
impl<'a, 'hir> ItemLowerer<'a, 'hir> {
56+
impl<'hir, R: ResolverAstLoweringExt<'hir>> ItemLowerer<'_, 'hir, R> {
5757
fn with_lctx(
5858
&mut self,
5959
owner: NodeId,
60-
f: impl FnOnce(&mut LoweringContext<'_, 'hir>) -> hir::OwnerNode<'hir>,
60+
f: impl FnOnce(&mut LoweringContext<'_, 'hir, R>) -> hir::OwnerNode<'hir>,
6161
) {
6262
let mut lctx = LoweringContext::new(self.tcx, self.ast_index, self.resolver);
6363
lctx.with_hir_id_owner(owner, |lctx| f(lctx));
@@ -79,7 +79,7 @@ impl<'a, 'hir> ItemLowerer<'a, 'hir> {
7979
match node {
8080
AstOwner::NonOwner => {}
8181
AstOwner::Crate(c) => {
82-
assert_eq!(self.resolver.node_id_to_def_id[&CRATE_NODE_ID], CRATE_DEF_ID);
82+
assert_eq!(self.resolver.local_def_id(CRATE_NODE_ID), CRATE_DEF_ID);
8383
self.with_lctx(CRATE_NODE_ID, |lctx| {
8484
let module = lctx.lower_mod(&c.items, &c.spans);
8585
// FIXME(jdonszelman): is dummy span ever a problem here?
@@ -101,7 +101,7 @@ impl<'a, 'hir> ItemLowerer<'a, 'hir> {
101101
}
102102
}
103103

104-
impl<'hir> LoweringContext<'_, 'hir> {
104+
impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
105105
pub(super) fn lower_mod(
106106
&mut self,
107107
items: &[Box<Item>],
@@ -1491,7 +1491,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
14911491
pub(crate) fn lower_coroutine_body_with_moved_arguments(
14921492
&mut self,
14931493
decl: &FnDecl,
1494-
lower_body: impl FnOnce(&mut LoweringContext<'_, 'hir>) -> hir::Expr<'hir>,
1494+
lower_body: impl FnOnce(&mut LoweringContext<'_, 'hir, R>) -> hir::Expr<'hir>,
14951495
fn_decl_span: Span,
14961496
body_span: Span,
14971497
coroutine_kind: CoroutineKind,
@@ -1628,7 +1628,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
16281628
parameters.push(new_parameter);
16291629
}
16301630

1631-
let mkbody = |this: &mut LoweringContext<'_, 'hir>| {
1631+
let mkbody = |this: &mut LoweringContext<'_, 'hir, R>| {
16321632
// Create a block from the user's function body:
16331633
let user_body = lower_body(this);
16341634

0 commit comments

Comments
 (0)