11use clippy_config:: Conf ;
22use clippy_utils:: diagnostics:: span_lint_hir_and_then;
33use clippy_utils:: msrvs:: Msrv ;
4- use clippy_utils:: source:: { IntoSpan as _ , SpanExt , snippet, snippet_block_with_applicability} ;
4+ use clippy_utils:: source:: { SpanEditCx , SpanExt , StrExt , snippet, snippet_block_with_applicability} ;
55use clippy_utils:: { can_use_if_let_chains, span_contains_non_whitespace, sym, tokenize_with_text} ;
66use rustc_ast:: { BinOpKind , MetaItemInner } ;
77use rustc_errors:: Applicability ;
@@ -113,15 +113,16 @@ impl CollapsibleIf {
113113 span_extract_keyword ( cx. tcx . sess . source_map ( ) , up_to_else, "else" )
114114 && let Some ( else_if_keyword_span) =
115115 span_extract_keyword ( cx. tcx . sess . source_map ( ) , else_before_if, "if" )
116+ && let Some ( else_keyword_span) =
117+ else_keyword_span. map_range ( cx, SpanEditCx :: with_leading_whitespace)
118+ && let Some ( [ else_open_bracket, else_closing_bracket] ) =
119+ else_block. span . map_range ( cx, |scx, range| {
120+ let [ open, close] = scx. map_range_text ( range, |src| src. get_prefix_suffix ( '{' , '}' ) ) ?;
121+ let open = scx. with_leading_whitespace ( open) ?;
122+ let close = scx. with_leading_whitespace ( close) ?;
123+ Some ( [ open, close] )
124+ } )
116125 {
117- let else_keyword_span = else_keyword_span. with_leading_whitespace ( cx) . into_span ( ) ;
118- let else_open_bracket = else_block. span . split_at ( 1 ) . 0 . with_leading_whitespace ( cx) . into_span ( ) ;
119- let else_closing_bracket = {
120- let end = else_block. span . shrink_to_hi ( ) ;
121- end. with_lo ( end. lo ( ) - BytePos ( 1 ) )
122- . with_leading_whitespace ( cx)
123- . into_span ( )
124- } ;
125126 let sugg = vec ! [
126127 // Remove the outer else block `else`
127128 ( else_keyword_span, String :: new( ) ) ,
@@ -170,6 +171,12 @@ impl CollapsibleIf {
170171 && self . eligible_condition ( cx, check_inner)
171172 && expr. span . eq_ctxt ( inner. span )
172173 && self . check_significant_tokens_and_expect_attrs ( cx, then, inner, sym:: collapsible_if)
174+ && let Some ( [ then_open_bracket, then_closing_bracket] ) = then. span . map_range ( cx, |scx, range| {
175+ let [ open, close] = scx. map_range_text ( range, |src| src. get_prefix_suffix ( '{' , '}' ) ) ?;
176+ let open = scx. with_leading_whitespace ( open) ?;
177+ let close = scx. with_leading_whitespace ( close) ?;
178+ Some ( [ open, close] )
179+ } )
173180 {
174181 span_lint_hir_and_then (
175182 cx,
@@ -178,13 +185,6 @@ impl CollapsibleIf {
178185 expr. span ,
179186 "this `if` statement can be collapsed" ,
180187 |diag| {
181- let then_open_bracket = then. span . split_at ( 1 ) . 0 . with_leading_whitespace ( cx) . into_span ( ) ;
182- let then_closing_bracket = {
183- let end = then. span . shrink_to_hi ( ) ;
184- end. with_lo ( end. lo ( ) - BytePos ( 1 ) )
185- . with_leading_whitespace ( cx)
186- . into_span ( )
187- } ;
188188 let ( paren_start, inner_if_span, paren_end) = peel_parens ( cx. tcx . sess . source_map ( ) , inner. span ) ;
189189 let inner_if = inner_if_span. split_at ( 2 ) . 0 ;
190190 let mut sugg = vec ! [
0 commit comments