diff options
| author | Ayaz Hafiz <ayaz.hafiz.1@gmail.com> | 2020-08-15 13:34:06 -0700 |
|---|---|---|
| committer | Caleb Cartwright <calebcartwright@users.noreply.github.com> | 2020-11-14 11:50:28 -0600 |
| commit | ce13ff15c33da1e31931ba4bc692709be3a2cf30 (patch) | |
| tree | cf4f70b41a601ecf95906a44b7dd61212ecbd828 /src | |
| parent | dd32de74ce4911bdf46621d53ed72cfc6071d8ed (diff) | |
Correctly create artificial span for formatting closure body
This commit partially reverts #3934, opting to create a span that covers the entire body of a closure when formatting a closure body with a block-formatting strategy, rather than having the block-formatting code determine if the visitor pointer should be rewound. The problem with rewinding the visitor pointer is it may be incorrect for other (i.e. non-artificial) AST nodes, as in the case of #4382. Closes #4382
Diffstat (limited to 'src')
| -rw-r--r-- | src/closures.rs | 7 | ||||
| -rw-r--r-- | src/expr.rs | 12 |
2 files changed, 7 insertions, 12 deletions
diff --git a/src/closures.rs b/src/closures.rs index fe632323aa4..3cfaa4513eb 100644 --- a/src/closures.rs +++ b/src/closures.rs @@ -133,6 +133,7 @@ fn veto_block(e: &ast::Expr) -> bool { } // Rewrite closure with a single expression wrapping its body with block. +// || { #[attr] foo() } -> Block { #[attr] foo() } fn rewrite_closure_with_block( body: &ast::Expr, prefix: &str, @@ -154,8 +155,12 @@ fn rewrite_closure_with_block( }], id: ast::NodeId::root(), rules: ast::BlockCheckMode::Default, - span: body.span, tokens: None, + span: body + .attrs + .first() + .map(|attr| attr.span.to(body.span)) + .unwrap_or(body.span), }; let block = crate::expr::rewrite_block_with_visitor( context, diff --git a/src/expr.rs b/src/expr.rs index 6bc54ff8601..1ba879ccc1d 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -528,17 +528,7 @@ pub(crate) fn rewrite_block_with_visitor( let open_pos = snippet.find_uncommented("{")?; visitor.last_pos = block.span.lo() + BytePos(open_pos as u32) } - (ast::BlockCheckMode::Default, None) => { - visitor.last_pos = block.span.lo(); - if let Some(attrs) = attrs { - if let Some(first) = attrs.first() { - let first_lo_span = first.span.lo(); - if first_lo_span < visitor.last_pos { - visitor.last_pos = first_lo_span; - } - } - } - } + (ast::BlockCheckMode::Default, None) => visitor.last_pos = block.span.lo(), } let inner_attrs = attrs.map(inner_attributes); |
