Skip to content

Commit ecd10f0

Browse files
nikomatsakisManishearth
authored andcommitted
thread tighter span for closures around
Track the span corresponding to the `|...|` part of the closure.
1 parent 23ccadd commit ecd10f0

File tree

29 files changed

+87
-53
lines changed

29 files changed

+87
-53
lines changed

src/librustc/hir/fold.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,10 +1060,11 @@ pub fn noop_fold_expr<T: Folder>(Expr { id, node, span, attrs }: Expr, folder: &
10601060
arms.move_map(|x| folder.fold_arm(x)),
10611061
source)
10621062
}
1063-
ExprClosure(capture_clause, decl, body) => {
1063+
ExprClosure(capture_clause, decl, body, fn_decl_span) => {
10641064
ExprClosure(capture_clause,
10651065
folder.fold_fn_decl(decl),
1066-
folder.fold_block(body))
1066+
folder.fold_block(body),
1067+
folder.new_span(fn_decl_span))
10671068
}
10681069
ExprBlock(blk) => ExprBlock(folder.fold_block(blk)),
10691070
ExprAssign(el, er) => {

src/librustc/hir/intravisit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,7 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) {
785785
visitor.visit_expr(subexpression);
786786
walk_list!(visitor, visit_arm, arms);
787787
}
788-
ExprClosure(_, ref function_declaration, ref body) => {
788+
ExprClosure(_, ref function_declaration, ref body, _fn_decl_span) => {
789789
visitor.visit_fn(FnKind::Closure(expression.attrs.as_attr_slice()),
790790
function_declaration,
791791
body,

src/librustc/hir/lowering.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,11 +1260,12 @@ pub fn lower_expr(lctx: &LoweringContext, e: &Expr) -> P<hir::Expr> {
12601260
arms.iter().map(|x| lower_arm(lctx, x)).collect(),
12611261
hir::MatchSource::Normal)
12621262
}
1263-
ExprKind::Closure(capture_clause, ref decl, ref body) => {
1263+
ExprKind::Closure(capture_clause, ref decl, ref body, fn_decl_span) => {
12641264
lctx.with_parent_def(e.id, || {
12651265
hir::ExprClosure(lower_capture_clause(lctx, capture_clause),
12661266
lower_fn_decl(lctx, decl),
1267-
lower_block(lctx, body))
1267+
lower_block(lctx, body),
1268+
fn_decl_span)
12681269
})
12691270
}
12701271
ExprKind::Block(ref blk) => hir::ExprBlock(lower_block(lctx, blk)),

src/librustc/hir/map/blocks.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ impl<'a> FnLikeNode<'a> {
250250
}
251251
}
252252
map::NodeExpr(e) => match e.node {
253-
ast::ExprClosure(_, ref decl, ref block) =>
253+
ast::ExprClosure(_, ref decl, ref block, _fn_decl_span) =>
254254
closure(ClosureParts::new(&decl,
255255
&block,
256256
e.id,

src/librustc/hir/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -949,8 +949,10 @@ pub enum Expr_ {
949949
/// A `match` block, with a source that indicates whether or not it is
950950
/// the result of a desugaring, and if so, which kind.
951951
ExprMatch(P<Expr>, HirVec<Arm>, MatchSource),
952-
/// A closure (for example, `move |a, b, c| {a + b + c}`)
953-
ExprClosure(CaptureClause, P<FnDecl>, P<Block>),
952+
/// A closure (for example, `move |a, b, c| {a + b + c}`).
953+
///
954+
/// The final span is the span of the argument block `|...|`
955+
ExprClosure(CaptureClause, P<FnDecl>, P<Block>, Span),
954956
/// A block (`{ ... }`)
955957
ExprBlock(P<Block>),
956958

src/librustc/hir/print.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1392,7 +1392,7 @@ impl<'a> State<'a> {
13921392
}
13931393
self.bclose_(expr.span, indent_unit)?;
13941394
}
1395-
hir::ExprClosure(capture_clause, ref decl, ref body) => {
1395+
hir::ExprClosure(capture_clause, ref decl, ref body, _fn_decl_span) => {
13961396
self.print_capture_clause(capture_clause)?;
13971397

13981398
self.print_fn_block_args(&decl)?;

src/librustc/middle/expr_use_visitor.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -537,8 +537,8 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
537537
self.consume_expr(&count);
538538
}
539539

540-
hir::ExprClosure(..) => {
541-
self.walk_captures(expr)
540+
hir::ExprClosure(_, _, _, fn_decl_span) => {
541+
self.walk_captures(expr, fn_decl_span)
542542
}
543543

544544
hir::ExprBox(ref base) => {
@@ -1142,7 +1142,7 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
11421142
}));
11431143
}
11441144

1145-
fn walk_captures(&mut self, closure_expr: &hir::Expr) {
1145+
fn walk_captures(&mut self, closure_expr: &hir::Expr, fn_decl_span: Span) {
11461146
debug!("walk_captures({:?})", closure_expr);
11471147

11481148
self.tcx().with_freevars(closure_expr.id, |freevars| {
@@ -1152,7 +1152,7 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
11521152
closure_expr_id: closure_expr.id };
11531153
let upvar_capture = self.typer.upvar_capture(upvar_id).unwrap();
11541154
let cmt_var = return_if_err!(self.cat_captured_var(closure_expr.id,
1155-
closure_expr.span,
1155+
fn_decl_span,
11561156
freevar.def));
11571157
match upvar_capture {
11581158
ty::UpvarCapture::ByValue => {
@@ -1161,7 +1161,7 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
11611161
}
11621162
ty::UpvarCapture::ByRef(upvar_borrow) => {
11631163
self.delegate.borrow(closure_expr.id,
1164-
closure_expr.span,
1164+
fn_decl_span,
11651165
cmt_var,
11661166
upvar_borrow.region,
11671167
upvar_borrow.kind,

src/librustc/middle/liveness.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -948,7 +948,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
948948
self.propagate_through_expr(&e, succ)
949949
}
950950

951-
hir::ExprClosure(_, _, ref blk) => {
951+
hir::ExprClosure(_, _, ref blk, _) => {
952952
debug!("{} is an ExprClosure",
953953
expr_to_string(expr));
954954

src/librustc/middle/mem_categorization.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,7 @@ impl<'t, 'a,'tcx> MemCategorizationContext<'t, 'a, 'tcx> {
728728
};
729729

730730
match fn_expr.node {
731-
hir::ExprClosure(_, _, ref body) => body.id,
731+
hir::ExprClosure(_, _, ref body, _) => body.id,
732732
_ => bug!()
733733
}
734734
};

src/librustc_borrowck/borrowck/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ pub fn closure_to_block(closure_id: ast::NodeId,
415415
tcx: &TyCtxt) -> ast::NodeId {
416416
match tcx.map.get(closure_id) {
417417
hir_map::NodeExpr(expr) => match expr.node {
418-
hir::ExprClosure(_, _, ref block) => {
418+
hir::ExprClosure(_, _, ref block, _) => {
419419
block.id
420420
}
421421
_ => {

0 commit comments

Comments
 (0)