@@ -261,60 +261,65 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MiscLints {
261261 }
262262 }
263263
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 ) {
265265 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;
269269 then {
270270 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 {
273277 ( "mut " , sugg_init. mut_addr( ) )
274278 } else {
275279 ( "" , sugg_init. addr( ) )
276280 } ;
277- let tyopt = if let Some ( ref ty) = l . ty {
281+ let tyopt = if let Some ( ref ty) = local . ty {
278282 format!( ": &{mutopt}{ty}" , mutopt=mutopt, ty=snippet( cx, ty. span, "_" ) )
279283 } else {
280284 String :: new( )
281285 } ;
282- span_lint_hir_and_then( cx,
286+ span_lint_hir_and_then(
287+ cx,
283288 TOPLEVEL_REF_ARG ,
284289 init. hir_id,
285- l . pat. span,
290+ local . pat. span,
286291 "`ref` on an entire `let` pattern is discouraged, take a reference with `&` instead" ,
287292 |db| {
288293 db. span_suggestion(
289- s . span,
294+ stmt . span,
290295 "try" ,
291296 format!(
292297 "let {name}{tyopt} = {initref};" ,
293- name=snippet( cx, i . span, "_" ) ,
298+ name=snippet( cx, name . span, "_" ) ,
294299 tyopt=tyopt,
295300 initref=initref,
296301 ) ,
297- Applicability :: MachineApplicable , // snippet
302+ Applicability :: MachineApplicable ,
298303 ) ;
299304 }
300305 ) ;
301306 }
302307 }
303308 } ;
304309 if_chain ! {
305- if let StmtKind :: Semi ( ref expr) = s . node;
310+ if let StmtKind :: Semi ( ref expr) = stmt . node;
306311 if let ExprKind :: Binary ( ref binop, ref a, ref b) = expr. node;
307312 if binop. node == BinOpKind :: And || binop. node == BinOpKind :: Or ;
308313 if let Some ( sugg) = Sugg :: hir_opt( cx, a) ;
309314 then {
310315 span_lint_and_then( cx,
311316 SHORT_CIRCUIT_STATEMENT ,
312- s . span,
317+ stmt . span,
313318 "boolean short circuit operator in statement may be clearer using an explicit test" ,
314319 |db| {
315320 let sugg = if binop. node == BinOpKind :: Or { !sugg } else { sugg } ;
316321 db. span_suggestion(
317- s . span,
322+ stmt . span,
318323 "replace it with" ,
319324 format!(
320325 "if {} {{ {}; }}" ,
0 commit comments