thread tighter span for closures around
Track the span corresponding to the `|...|` part of the closure.
This commit is contained in:
parent
23ccaddaa7
commit
ecd10f04ce
29 changed files with 87 additions and 53 deletions
|
|
@ -1060,10 +1060,11 @@ pub fn noop_fold_expr<T: Folder>(Expr { id, node, span, attrs }: Expr, folder: &
|
|||
arms.move_map(|x| folder.fold_arm(x)),
|
||||
source)
|
||||
}
|
||||
ExprClosure(capture_clause, decl, body) => {
|
||||
ExprClosure(capture_clause, decl, body, fn_decl_span) => {
|
||||
ExprClosure(capture_clause,
|
||||
folder.fold_fn_decl(decl),
|
||||
folder.fold_block(body))
|
||||
folder.fold_block(body),
|
||||
folder.new_span(fn_decl_span))
|
||||
}
|
||||
ExprBlock(blk) => ExprBlock(folder.fold_block(blk)),
|
||||
ExprAssign(el, er) => {
|
||||
|
|
|
|||
|
|
@ -785,7 +785,7 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) {
|
|||
visitor.visit_expr(subexpression);
|
||||
walk_list!(visitor, visit_arm, arms);
|
||||
}
|
||||
ExprClosure(_, ref function_declaration, ref body) => {
|
||||
ExprClosure(_, ref function_declaration, ref body, _fn_decl_span) => {
|
||||
visitor.visit_fn(FnKind::Closure(expression.attrs.as_attr_slice()),
|
||||
function_declaration,
|
||||
body,
|
||||
|
|
|
|||
|
|
@ -1260,11 +1260,12 @@ pub fn lower_expr(lctx: &LoweringContext, e: &Expr) -> P<hir::Expr> {
|
|||
arms.iter().map(|x| lower_arm(lctx, x)).collect(),
|
||||
hir::MatchSource::Normal)
|
||||
}
|
||||
ExprKind::Closure(capture_clause, ref decl, ref body) => {
|
||||
ExprKind::Closure(capture_clause, ref decl, ref body, fn_decl_span) => {
|
||||
lctx.with_parent_def(e.id, || {
|
||||
hir::ExprClosure(lower_capture_clause(lctx, capture_clause),
|
||||
lower_fn_decl(lctx, decl),
|
||||
lower_block(lctx, body))
|
||||
lower_block(lctx, body),
|
||||
fn_decl_span)
|
||||
})
|
||||
}
|
||||
ExprKind::Block(ref blk) => hir::ExprBlock(lower_block(lctx, blk)),
|
||||
|
|
|
|||
|
|
@ -250,7 +250,7 @@ impl<'a> FnLikeNode<'a> {
|
|||
}
|
||||
}
|
||||
map::NodeExpr(e) => match e.node {
|
||||
ast::ExprClosure(_, ref decl, ref block) =>
|
||||
ast::ExprClosure(_, ref decl, ref block, _fn_decl_span) =>
|
||||
closure(ClosureParts::new(&decl,
|
||||
&block,
|
||||
e.id,
|
||||
|
|
|
|||
|
|
@ -949,8 +949,10 @@ pub enum Expr_ {
|
|||
/// A `match` block, with a source that indicates whether or not it is
|
||||
/// the result of a desugaring, and if so, which kind.
|
||||
ExprMatch(P<Expr>, HirVec<Arm>, MatchSource),
|
||||
/// A closure (for example, `move |a, b, c| {a + b + c}`)
|
||||
ExprClosure(CaptureClause, P<FnDecl>, P<Block>),
|
||||
/// A closure (for example, `move |a, b, c| {a + b + c}`).
|
||||
///
|
||||
/// The final span is the span of the argument block `|...|`
|
||||
ExprClosure(CaptureClause, P<FnDecl>, P<Block>, Span),
|
||||
/// A block (`{ ... }`)
|
||||
ExprBlock(P<Block>),
|
||||
|
||||
|
|
|
|||
|
|
@ -1392,7 +1392,7 @@ impl<'a> State<'a> {
|
|||
}
|
||||
self.bclose_(expr.span, indent_unit)?;
|
||||
}
|
||||
hir::ExprClosure(capture_clause, ref decl, ref body) => {
|
||||
hir::ExprClosure(capture_clause, ref decl, ref body, _fn_decl_span) => {
|
||||
self.print_capture_clause(capture_clause)?;
|
||||
|
||||
self.print_fn_block_args(&decl)?;
|
||||
|
|
|
|||
|
|
@ -537,8 +537,8 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
|
|||
self.consume_expr(&count);
|
||||
}
|
||||
|
||||
hir::ExprClosure(..) => {
|
||||
self.walk_captures(expr)
|
||||
hir::ExprClosure(_, _, _, fn_decl_span) => {
|
||||
self.walk_captures(expr, fn_decl_span)
|
||||
}
|
||||
|
||||
hir::ExprBox(ref base) => {
|
||||
|
|
@ -1142,7 +1142,7 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
|
|||
}));
|
||||
}
|
||||
|
||||
fn walk_captures(&mut self, closure_expr: &hir::Expr) {
|
||||
fn walk_captures(&mut self, closure_expr: &hir::Expr, fn_decl_span: Span) {
|
||||
debug!("walk_captures({:?})", closure_expr);
|
||||
|
||||
self.tcx().with_freevars(closure_expr.id, |freevars| {
|
||||
|
|
@ -1152,7 +1152,7 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
|
|||
closure_expr_id: closure_expr.id };
|
||||
let upvar_capture = self.typer.upvar_capture(upvar_id).unwrap();
|
||||
let cmt_var = return_if_err!(self.cat_captured_var(closure_expr.id,
|
||||
closure_expr.span,
|
||||
fn_decl_span,
|
||||
freevar.def));
|
||||
match upvar_capture {
|
||||
ty::UpvarCapture::ByValue => {
|
||||
|
|
@ -1161,7 +1161,7 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
|
|||
}
|
||||
ty::UpvarCapture::ByRef(upvar_borrow) => {
|
||||
self.delegate.borrow(closure_expr.id,
|
||||
closure_expr.span,
|
||||
fn_decl_span,
|
||||
cmt_var,
|
||||
upvar_borrow.region,
|
||||
upvar_borrow.kind,
|
||||
|
|
|
|||
|
|
@ -948,7 +948,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
|||
self.propagate_through_expr(&e, succ)
|
||||
}
|
||||
|
||||
hir::ExprClosure(_, _, ref blk) => {
|
||||
hir::ExprClosure(_, _, ref blk, _) => {
|
||||
debug!("{} is an ExprClosure",
|
||||
expr_to_string(expr));
|
||||
|
||||
|
|
|
|||
|
|
@ -728,7 +728,7 @@ impl<'t, 'a,'tcx> MemCategorizationContext<'t, 'a, 'tcx> {
|
|||
};
|
||||
|
||||
match fn_expr.node {
|
||||
hir::ExprClosure(_, _, ref body) => body.id,
|
||||
hir::ExprClosure(_, _, ref body, _) => body.id,
|
||||
_ => bug!()
|
||||
}
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue