@@ -261,36 +261,40 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MiscLints {
261
261
}
262
262
}
263
263
264
- fn check_stmt ( & mut self , cx : & LateContext < ' a , ' tcx > , s : & ' tcx Stmt ) {
264
+ fn check_stmt ( & mut self , cx : & LateContext < ' a , ' tcx > , stmt : & ' tcx Stmt ) {
265
265
if_chain ! {
266
- if let StmtKind :: Local ( ref l ) = s . node;
267
- if let PatKind :: Binding ( an, .., i , None ) = l . pat. node;
268
- if let Some ( ref init) = l . init;
266
+ if let StmtKind :: Local ( ref local ) = stmt . node;
267
+ if let PatKind :: Binding ( an, .., name , None ) = local . pat. node;
268
+ if let Some ( ref init) = local . init;
269
269
then {
270
270
if an == BindingAnnotation :: Ref || an == BindingAnnotation :: RefMut {
271
- let sugg_init = Sugg :: hir( cx, init, ".." ) ;
272
- let ( mutopt, initref) = if an == BindingAnnotation :: RefMut {
271
+ let sugg_init = if init. span. from_expansion( ) {
272
+ Sugg :: hir_with_macro_callsite( cx, init, ".." )
273
+ } else {
274
+ Sugg :: hir( cx, init, ".." )
275
+ } ;
276
+ let ( mutopt, initref) = if an == BindingAnnotation :: RefMut {
273
277
( "mut " , sugg_init. mut_addr( ) )
274
278
} else {
275
279
( "" , sugg_init. addr( ) )
276
280
} ;
277
- let tyopt = if let Some ( ref ty) = l . ty {
281
+ let tyopt = if let Some ( ref ty) = local . ty {
278
282
format!( ": &{mutopt}{ty}" , mutopt=mutopt, ty=snippet( cx, ty. span, "_" ) )
279
283
} else {
280
284
String :: new( )
281
285
} ;
282
286
span_lint_hir_and_then( cx,
283
287
TOPLEVEL_REF_ARG ,
284
288
init. hir_id,
285
- l . pat. span,
289
+ local . pat. span,
286
290
"`ref` on an entire `let` pattern is discouraged, take a reference with `&` instead" ,
287
291
|db| {
288
292
db. span_suggestion(
289
- s . span,
293
+ stmt . span,
290
294
"try" ,
291
295
format!(
292
296
"let {name}{tyopt} = {initref};" ,
293
- name=snippet( cx, i . span, "_" ) ,
297
+ name=snippet( cx, name . span, "_" ) ,
294
298
tyopt=tyopt,
295
299
initref=initref,
296
300
) ,
@@ -302,19 +306,19 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MiscLints {
302
306
}
303
307
} ;
304
308
if_chain ! {
305
- if let StmtKind :: Semi ( ref expr) = s . node;
309
+ if let StmtKind :: Semi ( ref expr) = stmt . node;
306
310
if let ExprKind :: Binary ( ref binop, ref a, ref b) = expr. node;
307
311
if binop. node == BinOpKind :: And || binop. node == BinOpKind :: Or ;
308
312
if let Some ( sugg) = Sugg :: hir_opt( cx, a) ;
309
313
then {
310
314
span_lint_and_then( cx,
311
315
SHORT_CIRCUIT_STATEMENT ,
312
- s . span,
316
+ stmt . span,
313
317
"boolean short circuit operator in statement may be clearer using an explicit test" ,
314
318
|db| {
315
319
let sugg = if binop. node == BinOpKind :: Or { !sugg } else { sugg } ;
316
320
db. span_suggestion(
317
- s . span,
321
+ stmt . span,
318
322
"replace it with" ,
319
323
format!(
320
324
"if {} {{ {}; }}" ,
0 commit comments