提交 ef524710 编写于 作者: B bors

Auto merge of #88208 - petrochenkov:lowspan, r=Aaron1011

ast_lowering: Introduce `lower_span` for catching all spans entering HIR

This PR cherry-picks the `fn lower_span` change from https://github.com/rust-lang/rust/pull/84373.
I also introduced `fn lower_ident` for lowering spans in identifiers, and audited places where HIR structures with spans or identifiers are constructed and added a few missing `lower_span`s/`lower_ident`s.

Having a hook for spans entering HIR can be useful for things other than https://github.com/rust-lang/rust/pull/84373, e.g. https://github.com/rust-lang/rust/issues/35148.
I also want to check whether this change causes perf regressions due to some accidental inlining issues.

r? `@cjgillot`
......@@ -128,7 +128,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
hir::InlineAsmOperand::Sym { expr: self.lower_expr_mut(expr) }
}
};
(op, *op_sp)
(op, self.lower_span(*op_sp))
})
.collect();
......@@ -384,7 +384,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
late: true,
expr: None,
},
abi_span,
self.lower_span(abi_span),
));
}
}
......@@ -392,8 +392,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
let operands = self.arena.alloc_from_iter(operands);
let template = self.arena.alloc_from_iter(asm.template.iter().cloned());
let template_strs = self.arena.alloc_from_iter(asm.template_strs.iter().cloned());
let line_spans = self.arena.alloc_slice(&asm.line_spans[..]);
let template_strs = self.arena.alloc_from_iter(
asm.template_strs
.iter()
.map(|(sym, snippet, span)| (*sym, *snippet, self.lower_span(*span))),
);
let line_spans =
self.arena.alloc_from_iter(asm.line_spans.iter().map(|span| self.lower_span(*span)));
let hir_asm =
hir::InlineAsm { template, template_strs, operands, options: asm.options, line_spans };
self.arena.alloc(hir_asm)
......
......@@ -58,7 +58,12 @@ pub(super) fn lower_expr_mut(&mut self, e: &Expr) -> hir::Expr<'hir> {
None,
));
let args = self.lower_exprs(args);
hir::ExprKind::MethodCall(hir_seg, seg.ident.span, args, span)
hir::ExprKind::MethodCall(
hir_seg,
self.lower_span(seg.ident.span),
args,
self.lower_span(span),
)
}
ExprKind::Binary(binop, ref lhs, ref rhs) => {
let binop = self.lower_binop(binop);
......@@ -71,7 +76,9 @@ pub(super) fn lower_expr_mut(&mut self, e: &Expr) -> hir::Expr<'hir> {
let ohs = self.lower_expr(ohs);
hir::ExprKind::Unary(op, ohs)
}
ExprKind::Lit(ref l) => hir::ExprKind::Lit(respan(l.span, l.kind.clone())),
ExprKind::Lit(ref l) => {
hir::ExprKind::Lit(respan(self.lower_span(l.span), l.kind.clone()))
}
ExprKind::Cast(ref expr, ref ty) => {
let expr = self.lower_expr(expr);
let ty = self.lower_ty(ty, ImplTraitContext::disallowed());
......@@ -86,9 +93,11 @@ pub(super) fn lower_expr_mut(&mut self, e: &Expr) -> hir::Expr<'hir> {
let ohs = self.lower_expr(ohs);
hir::ExprKind::AddrOf(k, m, ohs)
}
ExprKind::Let(ref pat, ref scrutinee, span) => {
hir::ExprKind::Let(self.lower_pat(pat), self.lower_expr(scrutinee), span)
}
ExprKind::Let(ref pat, ref scrutinee, span) => hir::ExprKind::Let(
self.lower_pat(pat),
self.lower_expr(scrutinee),
self.lower_span(span),
),
ExprKind::If(ref cond, ref then, ref else_opt) => {
self.lower_expr_if(cond, then, else_opt.as_deref())
}
......@@ -99,7 +108,7 @@ pub(super) fn lower_expr_mut(&mut self, e: &Expr) -> hir::Expr<'hir> {
ExprKind::Loop(ref body, opt_label) => self.with_loop_scope(e.id, |this| {
hir::ExprKind::Loop(
this.lower_block(body, false),
opt_label,
this.lower_label(opt_label),
hir::LoopSource::Loop,
DUMMY_SP,
)
......@@ -147,6 +156,7 @@ pub(super) fn lower_expr_mut(&mut self, e: &Expr) -> hir::Expr<'hir> {
}
}
ExprKind::Block(ref blk, opt_label) => {
let opt_label = self.lower_label(opt_label);
hir::ExprKind::Block(self.lower_block(blk, opt_label.is_some()), opt_label)
}
ExprKind::Assign(ref el, ref er, span) => {
......@@ -157,7 +167,9 @@ pub(super) fn lower_expr_mut(&mut self, e: &Expr) -> hir::Expr<'hir> {
self.lower_expr(el),
self.lower_expr(er),
),
ExprKind::Field(ref el, ident) => hir::ExprKind::Field(self.lower_expr(el), ident),
ExprKind::Field(ref el, ident) => {
hir::ExprKind::Field(self.lower_expr(el), self.lower_ident(ident))
}
ExprKind::Index(ref el, ref er) => {
hir::ExprKind::Index(self.lower_expr(el), self.lower_expr(er))
}
......@@ -234,7 +246,7 @@ pub(super) fn lower_expr_mut(&mut self, e: &Expr) -> hir::Expr<'hir> {
let mut ex = self.lower_expr_mut(ex);
// Include parens in span, but only if it is a super-span.
if e.span.contains(ex.span) {
ex.span = e.span;
ex.span = self.lower_span(e.span);
}
// Merge attributes into the inner expression.
if !e.attrs.is_empty() {
......@@ -262,7 +274,7 @@ pub(super) fn lower_expr_mut(&mut self, e: &Expr) -> hir::Expr<'hir> {
let hir_id = self.lower_node_id(e.id);
self.lower_attrs(hir_id, &e.attrs);
hir::Expr { hir_id, kind, span: e.span }
hir::Expr { hir_id, kind, span: self.lower_span(e.span) }
})
}
......@@ -296,7 +308,7 @@ fn lower_binop(&mut self, b: BinOp) -> hir::BinOp {
BinOpKind::Ge => hir::BinOpKind::Ge,
BinOpKind::Gt => hir::BinOpKind::Gt,
},
span: b.span,
span: self.lower_span(b.span),
}
}
......@@ -478,7 +490,13 @@ fn lower_arm(&mut self, arm: &Arm) -> hir::Arm<'hir> {
});
let hir_id = self.next_id();
self.lower_attrs(hir_id, &arm.attrs);
hir::Arm { hir_id, pat, guard, body: self.lower_expr(&arm.body), span: arm.span }
hir::Arm {
hir_id,
pat,
guard,
body: self.lower_expr(&arm.body),
span: self.lower_span(arm.span),
}
}
/// Lower an `async` construct to a generator that is then wrapped so it implements `Future`.
......@@ -501,12 +519,16 @@ pub(super) fn make_async_expr(
) -> hir::ExprKind<'hir> {
let output = match ret_ty {
Some(ty) => hir::FnRetTy::Return(self.lower_ty(&ty, ImplTraitContext::disallowed())),
None => hir::FnRetTy::DefaultReturn(span),
None => hir::FnRetTy::DefaultReturn(self.lower_span(span)),
};
// Resume argument type. We let the compiler infer this to simplify the lowering. It is
// fully constrained by `future::from_generator`.
let input_ty = hir::Ty { hir_id: self.next_id(), kind: hir::TyKind::Infer, span };
let input_ty = hir::Ty {
hir_id: self.next_id(),
kind: hir::TyKind::Infer,
span: self.lower_span(span),
};
// The closure/generator `FnDecl` takes a single (resume) argument of type `input_ty`.
let decl = self.arena.alloc(hir::FnDecl {
......@@ -522,7 +544,12 @@ pub(super) fn make_async_expr(
Ident::with_dummy_span(sym::_task_context),
hir::BindingAnnotation::Mutable,
);
let param = hir::Param { hir_id: self.next_id(), pat, ty_span: span, span };
let param = hir::Param {
hir_id: self.next_id(),
pat,
ty_span: self.lower_span(span),
span: self.lower_span(span),
};
let params = arena_vec![self; param];
let body_id = self.lower_body(move |this| {
......@@ -540,11 +567,14 @@ pub(super) fn make_async_expr(
capture_clause,
decl,
body_id,
span,
self.lower_span(span),
Some(hir::Movability::Static),
);
let generator =
hir::Expr { hir_id: self.lower_node_id(closure_node_id), kind: generator_kind, span };
let generator = hir::Expr {
hir_id: self.lower_node_id(closure_node_id),
kind: generator_kind,
span: self.lower_span(span),
};
// `future::from_generator`:
let unstable_span =
......@@ -681,8 +711,11 @@ fn lower_expr_await(&mut self, await_span: Span, expr: &Expr) -> hir::ExprKind<'
if let Some(task_context_hid) = self.task_context {
let lhs = self.expr_ident(span, task_context_ident, task_context_hid);
let assign =
self.expr(span, hir::ExprKind::Assign(lhs, yield_expr, span), AttrVec::new());
let assign = self.expr(
span,
hir::ExprKind::Assign(lhs, yield_expr, self.lower_span(span)),
AttrVec::new(),
);
self.stmt_expr(span, assign)
} else {
// Use of `await` outside of an async context. Return `yield_expr` so that we can
......@@ -696,8 +729,13 @@ fn lower_expr_await(&mut self, await_span: Span, expr: &Expr) -> hir::ExprKind<'
// loop { .. }
let loop_expr = self.arena.alloc(hir::Expr {
hir_id: loop_hir_id,
kind: hir::ExprKind::Loop(loop_block, None, hir::LoopSource::Loop, span),
span,
kind: hir::ExprKind::Loop(
loop_block,
None,
hir::LoopSource::Loop,
self.lower_span(span),
),
span: self.lower_span(span),
});
// mut pinned => loop { ... }
......@@ -735,7 +773,13 @@ fn lower_expr_closure(
// Lower outside new scope to preserve `is_in_loop_condition`.
let fn_decl = self.lower_fn_decl(decl, None, false, None);
hir::ExprKind::Closure(capture_clause, fn_decl, body_id, fn_decl_span, generator_option)
hir::ExprKind::Closure(
capture_clause,
fn_decl,
body_id,
self.lower_span(fn_decl_span),
generator_option,
)
}
fn generator_movability_for_fn(
......@@ -821,7 +865,13 @@ fn lower_expr_async_closure(
// closure argument types.
let fn_decl = self.lower_fn_decl(&outer_decl, None, false, None);
hir::ExprKind::Closure(capture_clause, fn_decl, body_id, fn_decl_span, None)
hir::ExprKind::Closure(
capture_clause,
fn_decl,
body_id,
self.lower_span(fn_decl_span),
None,
)
}
/// Destructure the LHS of complex assignments.
......@@ -853,7 +903,11 @@ fn is_ordinary(lower_ctx: &mut LoweringContext<'_, '_>, lhs: &Expr) -> bool {
}
}
if is_ordinary(self, lhs) {
return hir::ExprKind::Assign(self.lower_expr(lhs), self.lower_expr(rhs), eq_sign_span);
return hir::ExprKind::Assign(
self.lower_expr(lhs),
self.lower_expr(rhs),
self.lower_span(eq_sign_span),
);
}
if !self.sess.features_untracked().destructuring_assignment {
feature_err(
......@@ -878,7 +932,7 @@ fn is_ordinary(lower_ctx: &mut LoweringContext<'_, '_>, lhs: &Expr) -> bool {
whole_span,
Some(rhs),
pat,
hir::LocalSource::AssignDesugar(eq_sign_span),
hir::LocalSource::AssignDesugar(self.lower_span(eq_sign_span)),
);
// `a = lhs1; b = lhs2;`.
......@@ -978,10 +1032,10 @@ fn destructure_assign_mut(
let pat = self.destructure_assign(&f.expr, eq_sign_span, assignments);
hir::PatField {
hir_id: self.next_id(),
ident: f.ident,
ident: self.lower_ident(f.ident),
pat,
is_shorthand: f.is_shorthand,
span: f.span,
span: self.lower_span(f.span),
}
}));
let qpath = self.lower_qpath(
......@@ -1033,10 +1087,11 @@ fn destructure_assign_mut(
_ => {}
}
// Treat all other cases as normal lvalue.
let ident = Ident::new(sym::lhs, lhs.span);
let ident = Ident::new(sym::lhs, self.lower_span(lhs.span));
let (pat, binding) = self.pat_ident_mut(lhs.span, ident);
let ident = self.expr_ident(lhs.span, ident, binding);
let assign = hir::ExprKind::Assign(self.lower_expr(lhs), ident, eq_sign_span);
let assign =
hir::ExprKind::Assign(self.lower_expr(lhs), ident, self.lower_span(eq_sign_span));
let expr = self.expr(lhs.span, assign, ThinVec::new());
assignments.push(self.stmt_expr(lhs.span, expr));
pat
......@@ -1076,7 +1131,7 @@ fn destructure_sequence(
fn lower_expr_range_closed(&mut self, span: Span, e1: &Expr, e2: &Expr) -> hir::ExprKind<'hir> {
let e1 = self.lower_expr_mut(e1);
let e2 = self.lower_expr_mut(e2);
let fn_path = hir::QPath::LangItem(hir::LangItem::RangeInclusiveNew, span);
let fn_path = hir::QPath::LangItem(hir::LangItem::RangeInclusiveNew, self.lower_span(span));
let fn_expr =
self.arena.alloc(self.expr(span, hir::ExprKind::Path(fn_path), ThinVec::new()));
hir::ExprKind::Call(fn_expr, arena_vec![self; e1, e2])
......@@ -1104,12 +1159,21 @@ fn lower_expr_range(
let fields = self.arena.alloc_from_iter(
e1.iter().map(|e| ("start", e)).chain(e2.iter().map(|e| ("end", e))).map(|(s, e)| {
let expr = self.lower_expr(&e);
let ident = Ident::new(Symbol::intern(s), e.span);
let ident = Ident::new(Symbol::intern(s), self.lower_span(e.span));
self.expr_field(ident, expr, e.span)
}),
);
hir::ExprKind::Struct(self.arena.alloc(hir::QPath::LangItem(lang_item, span)), fields, None)
hir::ExprKind::Struct(
self.arena.alloc(hir::QPath::LangItem(lang_item, self.lower_span(span))),
fields,
None,
)
}
fn lower_label(&self, opt_label: Option<Label>) -> Option<Label> {
let label = opt_label?;
Some(Label { ident: self.lower_ident(label.ident) })
}
fn lower_loop_destination(&mut self, destination: Option<(NodeId, Label)>) -> hir::Destination {
......@@ -1128,7 +1192,8 @@ fn lower_loop_destination(&mut self, destination: Option<(NodeId, Label)>) -> hi
.map(|id| Ok(self.lower_node_id(id)))
.unwrap_or(Err(hir::LoopIdError::OutsideLoopScope)),
};
hir::Destination { label: destination.map(|(_, label)| label), target_id }
let label = self.lower_label(destination.map(|(_, label)| label));
hir::Destination { label, target_id }
}
fn lower_jump_destination(&mut self, id: NodeId, opt_label: Option<Label>) -> hir::Destination {
......@@ -1201,7 +1266,7 @@ fn lower_expr_llvm_asm(&mut self, asm: &LlvmInlineAsm) -> hir::ExprKind<'hir> {
constraint: out.constraint,
is_rw: out.is_rw,
is_indirect: out.is_indirect,
span: out.expr.span,
span: self.lower_span(out.expr.span),
})
.collect(),
asm: asm.asm,
......@@ -1226,9 +1291,9 @@ fn lower_expr_llvm_asm(&mut self, asm: &LlvmInlineAsm) -> hir::ExprKind<'hir> {
fn lower_expr_field(&mut self, f: &ExprField) -> hir::ExprField<'hir> {
hir::ExprField {
hir_id: self.next_id(),
ident: f.ident,
ident: self.lower_ident(f.ident),
expr: self.lower_expr(&f.expr),
span: f.span,
span: self.lower_span(f.span),
is_shorthand: f.is_shorthand,
}
}
......@@ -1289,7 +1354,7 @@ fn lower_expr_for(
orig_head_span,
None,
);
head.span = desugared_span;
head.span = self.lower_span(desugared_span);
let iter = Ident::with_dummy_span(sym::iter);
......@@ -1308,7 +1373,7 @@ fn lower_expr_for(
let next_expr = self.expr_ident(pat.span, next_ident, next_pat_hid);
let assign = self.arena.alloc(self.expr(
pat.span,
hir::ExprKind::Assign(next_expr, val_expr, pat.span),
hir::ExprKind::Assign(next_expr, val_expr, self.lower_span(pat.span)),
ThinVec::new(),
));
let some_pat = self.pat_some(pat.span, val_pat);
......@@ -1376,12 +1441,15 @@ fn lower_expr_for(
// `[opt_ident]: loop { ... }`
let kind = hir::ExprKind::Loop(
loop_block,
opt_label,
self.lower_label(opt_label),
hir::LoopSource::ForLoop,
e.span.with_hi(orig_head_span.hi()),
self.lower_span(e.span.with_hi(orig_head_span.hi())),
);
let loop_expr =
self.arena.alloc(hir::Expr { hir_id: self.lower_node_id(e.id), kind, span: e.span });
let loop_expr = self.arena.alloc(hir::Expr {
hir_id: self.lower_node_id(e.id),
kind,
span: self.lower_span(e.span),
});
// `mut iter => { ... }`
let iter_arm = self.arm(iter_pat, loop_expr);
......@@ -1460,8 +1528,8 @@ fn lower_expr_try(&mut self, span: Span, sub_expr: &Expr) -> hir::ExprKind<'hir>
let attr = {
// `allow(unreachable_code)`
let allow = {
let allow_ident = Ident::new(sym::allow, span);
let uc_ident = Ident::new(sym::unreachable_code, span);
let allow_ident = Ident::new(sym::allow, self.lower_span(span));
let uc_ident = Ident::new(sym::unreachable_code, self.lower_span(span));
let uc_nested = attr::mk_nested_word_item(uc_ident);
attr::mk_list_item(allow_ident, vec![uc_nested])
};
......@@ -1630,7 +1698,11 @@ fn expr_lang_item_path(
lang_item: hir::LangItem,
attrs: AttrVec,
) -> hir::Expr<'hir> {
self.expr(span, hir::ExprKind::Path(hir::QPath::LangItem(lang_item, span)), attrs)
self.expr(
span,
hir::ExprKind::Path(hir::QPath::LangItem(lang_item, self.lower_span(span))),
attrs,
)
}
pub(super) fn expr_ident(
......@@ -1661,7 +1733,7 @@ fn expr_ident_with_attrs(
let expr_path = hir::ExprKind::Path(hir::QPath::Resolved(
None,
self.arena.alloc(hir::Path {
span,
span: self.lower_span(span),
res: Res::Local(binding),
segments: arena_vec![self; hir::PathSegment::from_ident(ident)],
}),
......@@ -1681,7 +1753,7 @@ fn expr_unsafe(&mut self, expr: &'hir hir::Expr<'hir>) -> hir::Expr<'hir> {
expr: Some(expr),
hir_id,
rules: hir::BlockCheckMode::UnsafeBlock(hir::UnsafeSource::CompilerGenerated),
span,
span: self.lower_span(span),
targeted_by_break: false,
}),
None,
......@@ -1712,7 +1784,7 @@ pub(super) fn expr(
) -> hir::Expr<'hir> {
let hir_id = self.next_id();
self.lower_attrs(hir_id, &attrs);
hir::Expr { hir_id, kind, span }
hir::Expr { hir_id, kind, span: self.lower_span(span) }
}
fn expr_field(
......@@ -1721,10 +1793,22 @@ fn expr_field(
expr: &'hir hir::Expr<'hir>,
span: Span,
) -> hir::ExprField<'hir> {
hir::ExprField { hir_id: self.next_id(), ident, span, expr, is_shorthand: false }
hir::ExprField {
hir_id: self.next_id(),
ident,
span: self.lower_span(span),
expr,
is_shorthand: false,
}
}
fn arm(&mut self, pat: &'hir hir::Pat<'hir>, expr: &'hir hir::Expr<'hir>) -> hir::Arm<'hir> {
hir::Arm { hir_id: self.next_id(), pat, guard: None, span: expr.span, body: expr }
hir::Arm {
hir_id: self.next_id(),
pat,
guard: None,
span: self.lower_span(expr.span),
body: expr,
}
}
}
......@@ -158,7 +158,7 @@ fn without_in_scope_lifetime_defs<T>(
pub(super) fn lower_mod(&mut self, items: &[P<Item>], inner: Span) -> hir::Mod<'hir> {
hir::Mod {
inner,
inner: self.lower_span(inner),
item_ids: self.arena.alloc_from_iter(items.iter().flat_map(|x| self.lower_item_id(x))),
}
}
......@@ -214,7 +214,13 @@ pub fn lower_item(&mut self, i: &Item) -> Option<hir::Item<'hir>> {
let hir_id = self.lower_node_id(i.id);
let attrs = self.lower_attrs(hir_id, &i.attrs);
let kind = self.lower_item_kind(i.span, i.id, hir_id, &mut ident, attrs, &mut vis, &i.kind);
Some(hir::Item { def_id: hir_id.expect_owner(), ident, kind, vis, span: i.span })
Some(hir::Item {
def_id: hir_id.expect_owner(),
ident: self.lower_ident(ident),
kind,
vis,
span: self.lower_span(i.span),
})
}
fn lower_item_kind(
......@@ -278,7 +284,7 @@ fn lower_item_kind(
let sig = hir::FnSig {
decl,
header: this.lower_fn_header(header, fn_sig_span, id),
span: fn_sig_span,
span: this.lower_span(fn_sig_span),
};
hir::ItemKind::Fn(sig, generics, body_id)
})
......@@ -407,6 +413,10 @@ fn lower_item_kind(
// to not cause an assertion failure inside the `lower_defaultness` function.
let has_val = true;
let (defaultness, defaultness_span) = self.lower_defaultness(defaultness, has_val);
let polarity = match polarity {
ImplPolarity::Positive => ImplPolarity::Positive,
ImplPolarity::Negative(s) => ImplPolarity::Negative(self.lower_span(s)),
};
hir::ItemKind::Impl(hir::Impl {
unsafety: self.lower_unsafety(unsafety),
polarity,
......@@ -525,10 +535,10 @@ fn lower_use_tree(
this.insert_item(hir::Item {
def_id: new_id.expect_owner(),
ident,
ident: this.lower_ident(ident),
kind,
vis,
span,
span: this.lower_span(span),
});
});
}
......@@ -599,10 +609,10 @@ fn lower_use_tree(
this.insert_item(hir::Item {
def_id: new_hir_id.expect_owner(),
ident,
ident: this.lower_ident(ident),
kind,
vis,
span: use_tree.span,
span: this.lower_span(use_tree.span),
});
});
}
......@@ -621,7 +631,10 @@ fn lower_use_tree(
hir::VisibilityKind::Public
| hir::VisibilityKind::Crate(_)
| hir::VisibilityKind::Inherited => {
*vis = respan(prefix.span.shrink_to_lo(), hir::VisibilityKind::Inherited);
*vis = respan(
self.lower_span(prefix.span.shrink_to_lo()),
hir::VisibilityKind::Inherited,
);
}
hir::VisibilityKind::Restricted { .. } => {
// Do nothing here, as described in the comment on the match.
......@@ -664,7 +677,7 @@ fn rebuild_vis(&mut self, vis: &hir::Visibility<'hir>) -> hir::Visibility<'hir>
}
}
};
respan(vis.span, vis_kind)
respan(self.lower_span(vis.span), vis_kind)
}
fn lower_foreign_item(&mut self, i: &ForeignItem) -> hir::ForeignItem<'hir> {
......@@ -673,7 +686,7 @@ fn lower_foreign_item(&mut self, i: &ForeignItem) -> hir::ForeignItem<'hir> {
self.lower_attrs(hir_id, &i.attrs);
hir::ForeignItem {
def_id,
ident: i.ident,
ident: self.lower_ident(i.ident),
kind: match i.kind {
ForeignItemKind::Fn(box FnKind(_, ref sig, ref generics, _)) => {
let fdec = &sig.decl;
......@@ -700,15 +713,15 @@ fn lower_foreign_item(&mut self, i: &ForeignItem) -> hir::ForeignItem<'hir> {
ForeignItemKind::MacCall(_) => panic!("macro shouldn't exist here"),
},
vis: self.lower_visibility(&i.vis, None),
span: i.span,
span: self.lower_span(i.span),
}
}
fn lower_foreign_item_ref(&mut self, i: &ForeignItem) -> hir::ForeignItemRef<'hir> {
hir::ForeignItemRef {
id: hir::ForeignItemId { def_id: self.lower_node_id(i.id).expect_owner() },
ident: i.ident,
span: i.span,
ident: self.lower_ident(i.ident),
span: self.lower_span(i.span),
vis: self.lower_visibility(&i.vis, Some(i.id)),
}
}
......@@ -720,8 +733,8 @@ fn lower_variant(&mut self, v: &Variant) -> hir::Variant<'hir> {
id,
data: self.lower_variant_data(id, &v.data),
disr_expr: v.disr_expr.as_ref().map(|e| self.lower_anon_const(e)),
ident: v.ident,
span: v.span,
ident: self.lower_ident(v.ident),
span: self.lower_span(v.span),
}
}
......@@ -773,12 +786,12 @@ pub(super) fn lower_field_def(
let hir_id = self.lower_node_id(f.id);
self.lower_attrs(hir_id, &f.attrs);
hir::FieldDef {
span: f.span,
span: self.lower_span(f.span),
hir_id,
ident: match f.ident {
Some(ident) => ident,
Some(ident) => self.lower_ident(ident),
// FIXME(jseyfried): positional field hygiene.
None => Ident::new(sym::integer(index), f.span),
None => Ident::new(sym::integer(index), self.lower_span(f.span)),
},
vis: self.lower_visibility(&f.vis, None),
ty,
......@@ -829,7 +842,13 @@ fn lower_trait_item(&mut self, i: &AssocItem) -> hir::TraitItem<'hir> {
};
self.lower_attrs(hir_id, &i.attrs);
hir::TraitItem { def_id: trait_item_def_id, ident: i.ident, generics, kind, span: i.span }
hir::TraitItem {
def_id: trait_item_def_id,
ident: self.lower_ident(i.ident),
generics,
kind,
span: self.lower_span(i.span),
}
}
fn lower_trait_item_ref(&mut self, i: &AssocItem) -> hir::TraitItemRef {
......@@ -845,7 +864,13 @@ fn lower_trait_item_ref(&mut self, i: &AssocItem) -> hir::TraitItemRef {
};
let id = hir::TraitItemId { def_id: self.lower_node_id(i.id).expect_owner() };
let defaultness = hir::Defaultness::Default { has_value: has_default };
hir::TraitItemRef { id, ident: i.ident, span: i.span, defaultness, kind }
hir::TraitItemRef {
id,
ident: self.lower_ident(i.ident),
span: self.lower_span(i.span),
defaultness,
kind,
}
}
/// Construct `ExprKind::Err` for the given `span`.
......@@ -910,12 +935,12 @@ fn lower_impl_item(&mut self, i: &AssocItem) -> hir::ImplItem<'hir> {
self.lower_attrs(hir_id, &i.attrs);
hir::ImplItem {
def_id: hir_id.expect_owner(),
ident: i.ident,
ident: self.lower_ident(i.ident),
generics,
vis: self.lower_visibility(&i.vis, None),
defaultness,
kind,
span: i.span,
span: self.lower_span(i.span),
}
}
......@@ -925,8 +950,8 @@ fn lower_impl_item_ref(&mut self, i: &AssocItem) -> hir::ImplItemRef<'hir> {
let (defaultness, _) = self.lower_defaultness(i.kind.defaultness(), has_value);
hir::ImplItemRef {
id: hir::ImplItemId { def_id: self.lower_node_id(i.id).expect_owner() },
ident: i.ident,
span: i.span,
ident: self.lower_ident(i.ident),
span: self.lower_span(i.span),
vis: self.lower_visibility(&i.vis, Some(i.id)),
defaultness,
kind: match &i.kind {
......@@ -969,7 +994,7 @@ fn lower_visibility(
}
VisibilityKind::Inherited => hir::VisibilityKind::Inherited,
};
respan(v.span, node)
respan(self.lower_span(v.span), node)
}
fn lower_defaultness(
......@@ -978,7 +1003,9 @@ fn lower_defaultness(
has_value: bool,
) -> (hir::Defaultness, Option<Span>) {
match d {
Defaultness::Default(sp) => (hir::Defaultness::Default { has_value }, Some(sp)),
Defaultness::Default(sp) => {
(hir::Defaultness::Default { has_value }, Some(self.lower_span(sp)))
}
Defaultness::Final => {
assert!(has_value);
(hir::Defaultness::Final, None)
......@@ -1016,8 +1043,8 @@ fn lower_param(&mut self, param: &Param) -> hir::Param<'hir> {
hir::Param {
hir_id,
pat: self.lower_pat(&param.pat),
ty_span: param.ty.span,
span: param.span,
ty_span: self.lower_span(param.ty.span),
span: self.lower_span(param.span),
}
}
......@@ -1151,8 +1178,8 @@ fn lower_maybe_async_body(
let new_parameter = hir::Param {
hir_id: parameter.hir_id,
pat: new_parameter_pat,
ty_span: parameter.ty_span,
span: parameter.span,
ty_span: this.lower_span(parameter.ty_span),
span: this.lower_span(parameter.span),
};
if is_simple_parameter {
......@@ -1285,7 +1312,7 @@ fn lower_method_sig(
)
},
);
(generics, hir::FnSig { header, decl, span: sig.span })
(generics, hir::FnSig { header, decl, span: self.lower_span(sig.span) })
}
fn lower_fn_header(&mut self, h: FnHeader, span: Span, id: NodeId) -> hir::FnHeader {
......@@ -1385,7 +1412,7 @@ pub(super) fn lower_generics_mut(
GenericsCtor {
params: self.lower_generic_params_mut(&generics.params, &add_bounds, itctx).collect(),
where_clause: self.lower_where_clause(&generics.where_clause),
span: generics.span,
span: self.lower_span(generics.span),
}
}
......@@ -1404,7 +1431,7 @@ fn lower_where_clause(&mut self, wc: &WhereClause) -> hir::WhereClause<'hir> {
predicates: this.arena.alloc_from_iter(
wc.predicates.iter().map(|predicate| this.lower_where_predicate(predicate)),
),
span: wc.span,
span: this.lower_span(wc.span),
}
})
}
......@@ -1433,12 +1460,12 @@ fn lower_where_predicate(&mut self, pred: &WherePredicate) -> hir::WherePredicat
// `suggest_constraining_type_param`. This will need to change if
// we ever allow something *other* than `?Sized`.
GenericBound::Trait(p, TraitBoundModifier::Maybe) => {
hir::GenericBound::Unsized(p.span)
hir::GenericBound::Unsized(this.lower_span(p.span))
}
_ => this.lower_param_bound(bound, ImplTraitContext::disallowed()),
},
)),
span,
span: this.lower_span(span),
})
})
}
......@@ -1447,7 +1474,7 @@ fn lower_where_predicate(&mut self, pred: &WherePredicate) -> hir::WherePredicat
ref bounds,
span,
}) => hir::WherePredicate::RegionPredicate(hir::WhereRegionPredicate {
span,
span: self.lower_span(span),
lifetime: self.lower_lifetime(lifetime),
bounds: self.lower_param_bounds(bounds, ImplTraitContext::disallowed()),
}),
......@@ -1456,7 +1483,7 @@ fn lower_where_predicate(&mut self, pred: &WherePredicate) -> hir::WherePredicat
hir_id: self.lower_node_id(id),
lhs_ty: self.lower_ty(lhs_ty, ImplTraitContext::disallowed()),
rhs_ty: self.lower_ty(rhs_ty, ImplTraitContext::disallowed()),
span,
span: self.lower_span(span),
})
}
}
......
......@@ -62,10 +62,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
let fs = self.arena.alloc_from_iter(fields.iter().map(|f| hir::PatField {
hir_id: self.next_id(),
ident: f.ident,
ident: self.lower_ident(f.ident),
pat: self.lower_pat(&f.pat),
is_shorthand: f.is_shorthand,
span: f.span,
span: self.lower_span(f.span),
}));
break hir::PatKind::Struct(qpath, fs, etc);
}
......@@ -247,16 +247,16 @@ fn lower_pat_ident(
hir::PatKind::Binding(
self.lower_binding_mode(binding_mode),
self.lower_node_id(canonical_id),
ident,
self.lower_ident(ident),
lower_sub(self),
)
}
Some(res) => hir::PatKind::Path(hir::QPath::Resolved(
None,
self.arena.alloc(hir::Path {
span: ident.span,
span: self.lower_span(ident.span),
res: self.lower_res(res),
segments: arena_vec![self; hir::PathSegment::from_ident(ident)],
segments: arena_vec![self; hir::PathSegment::from_ident(self.lower_ident(ident))],
}),
)),
}
......@@ -280,7 +280,7 @@ fn pat_with_node_id_of(&mut self, p: &Pat, kind: hir::PatKind<'hir>) -> hir::Pat
hir::Pat {
hir_id: self.lower_node_id(p.id),
kind,
span: p.span,
span: self.lower_span(p.span),
default_binding_modes: true,
}
}
......
......@@ -110,9 +110,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
)
},
)),
span: p.segments[..proj_start]
span: self.lower_span(
p.segments[..proj_start]
.last()
.map_or(path_span_lo, |segment| path_span_lo.to(segment.span())),
),
});
// Simple case, either no projections, or only fully-qualified.
......@@ -198,7 +200,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
explicit_owner,
)
})),
span: p.span,
span: self.lower_span(p.span),
})
}
......@@ -370,14 +372,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
);
hir::PathSegment {
ident: segment.ident,
ident: self.lower_ident(segment.ident),
hir_id: Some(id),
res: Some(self.lower_res(res)),
infer_args,
args: if generic_args.is_empty() && generic_args.span.is_empty() {
None
} else {
Some(self.arena.alloc(generic_args.into_generic_args(self.arena)))
Some(generic_args.into_generic_args(self))
},
}
}
......@@ -459,6 +461,12 @@ fn lower_parenthesized_parameter_data(
parenthesized: false,
span_ext: DUMMY_SP,
});
hir::TypeBinding { hir_id: self.next_id(), gen_args, span, ident, kind }
hir::TypeBinding {
hir_id: self.next_id(),
gen_args,
span: self.lower_span(span),
ident,
kind,
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册