]> git.lizzy.rs Git - rust.git/blobdiff - src/libsyntax/mut_visit.rs
Rollup merge of #68106 - varkor:self_self_use, r=estebank
[rust.git] / src / libsyntax / mut_visit.rs
index 1d27f70f5a5443aa3d147024c1c668f4f534a48c..58d4e46111b83adb5dc7344c014724dd4b793d0a 100644 (file)
@@ -8,16 +8,16 @@
 //! that are created by the expansion of a macro.
 
 use crate::ast::*;
-use crate::source_map::{Spanned, respan};
-use crate::token::{self, Token};
 use crate::ptr::P;
+use crate::token::{self, Token};
 use crate::tokenstream::*;
 use crate::util::map_in_place::MapInPlace;
 
-use smallvec::{smallvec, Array, SmallVec};
-use syntax_pos::Span;
-
 use rustc_data_structures::sync::Lrc;
+use rustc_span::source_map::{respan, Spanned};
+use rustc_span::Span;
+
+use smallvec::{smallvec, Array, SmallVec};
 use std::ops::DerefMut;
 use std::{panic, process, ptr};
 
@@ -170,7 +170,7 @@ fn visit_foreign_mod(&mut self, nm: &mut ForeignMod) {
         noop_visit_foreign_mod(nm, self);
     }
 
-    fn flat_map_variant(&mut self, v: Variant) -> SmallVec<[Variant; 1]>  {
+    fn flat_map_variant(&mut self, v: Variant) -> SmallVec<[Variant; 1]> {
         noop_flat_map_variant(v, self)
     }
 
@@ -303,7 +303,10 @@ fn visit_span(&mut self, _sp: &mut Span) {
 /// method. Abort the program if the closure panics.
 //
 // No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
-pub fn visit_clobber<T, F>(t: &mut T, f: F) where F: FnOnce(T) -> T {
+pub fn visit_clobber<T, F>(t: &mut T, f: F)
+where
+    F: FnOnce(T) -> T,
+{
     unsafe {
         // Safe because `t` is used in a read-only fashion by `read()` before
         // being overwritten by `write()`.
@@ -316,7 +319,10 @@ pub fn visit_clobber<T, F>(t: &mut T, f: F) where F: FnOnce(T) -> T {
 
 // No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
 #[inline]
-pub fn visit_vec<T, F>(elems: &mut Vec<T>, mut visit_elem: F) where F: FnMut(&mut T) {
+pub fn visit_vec<T, F>(elems: &mut Vec<T>, mut visit_elem: F)
+where
+    F: FnMut(&mut T),
+{
     for elem in elems {
         visit_elem(elem);
     }
@@ -324,7 +330,10 @@ pub fn visit_vec<T, F>(elems: &mut Vec<T>, mut visit_elem: F) where F: FnMut(&mu
 
 // No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
 #[inline]
-pub fn visit_opt<T, F>(opt: &mut Option<T>, mut visit_elem: F) where F: FnMut(&mut T) {
+pub fn visit_opt<T, F>(opt: &mut Option<T>, mut visit_elem: F)
+where
+    F: FnMut(&mut T),
+{
     if let Some(elem) = opt {
         visit_elem(elem);
     }
@@ -382,15 +391,7 @@ pub fn noop_flat_map_field_pattern<T: MutVisitor>(
     mut fp: FieldPat,
     vis: &mut T,
 ) -> SmallVec<[FieldPat; 1]> {
-    let FieldPat {
-        attrs,
-        id,
-        ident,
-        is_placeholder: _,
-        is_shorthand: _,
-        pat,
-        span,
-    } = &mut fp;
+    let FieldPat { attrs, id, ident, is_placeholder: _, is_shorthand: _, pat, span } = &mut fp;
     vis.visit_id(id);
     vis.visit_ident(ident);
     vis.visit_pat(pat);
@@ -432,7 +433,7 @@ pub fn noop_visit_use_tree<T: MutVisitor>(use_tree: &mut UseTree, vis: &mut T) {
 
 pub fn noop_visit_ty_constraint<T: MutVisitor>(
     AssocTyConstraint { id, ident, kind, span }: &mut AssocTyConstraint,
-    vis: &mut T
+    vis: &mut T,
 ) {
     vis.visit_id(id);
     vis.visit_ident(ident);
@@ -451,8 +452,7 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) {
     let Ty { id, kind, span } = ty.deref_mut();
     vis.visit_id(id);
     match kind {
-        TyKind::Infer | TyKind::ImplicitSelf | TyKind::Err |
-            TyKind::Never | TyKind::CVarArgs => {}
+        TyKind::Infer | TyKind::ImplicitSelf | TyKind::Err | TyKind::Never | TyKind::CVarArgs => {}
         TyKind::Slice(ty) => vis.visit_ty(ty),
         TyKind::Ptr(mt) => vis.visit_mt(mt),
         TyKind::Rptr(lt, mt) => {
@@ -475,8 +475,9 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) {
             vis.visit_anon_const(length);
         }
         TyKind::Typeof(expr) => vis.visit_anon_const(expr),
-        TyKind::TraitObject(bounds, _syntax) =>
-            visit_vec(bounds, |bound| vis.visit_param_bound(bound)),
+        TyKind::TraitObject(bounds, _syntax) => {
+            visit_vec(bounds, |bound| vis.visit_param_bound(bound))
+        }
         TyKind::ImplTrait(id, bounds) => {
             vis.visit_id(id);
             visit_vec(bounds, |bound| vis.visit_param_bound(bound));
@@ -487,13 +488,14 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) {
 }
 
 pub fn noop_visit_foreign_mod<T: MutVisitor>(foreign_mod: &mut ForeignMod, vis: &mut T) {
-    let ForeignMod { abi: _, items} = foreign_mod;
+    let ForeignMod { abi: _, items } = foreign_mod;
     items.flat_map_in_place(|item| vis.flat_map_foreign_item(item));
 }
 
-pub fn noop_flat_map_variant<T: MutVisitor>(mut variant: Variant, visitor: &mut T)
-    -> SmallVec<[Variant; 1]>
-{
+pub fn noop_flat_map_variant<T: MutVisitor>(
+    mut variant: Variant,
+    visitor: &mut T,
+) -> SmallVec<[Variant; 1]> {
     let Variant { ident, vis, attrs, id, data, disr_expr, span, is_placeholder: _ } = &mut variant;
     visitor.visit_ident(ident);
     visitor.visit_vis(vis);
@@ -540,16 +542,20 @@ pub fn noop_visit_generic_arg<T: MutVisitor>(arg: &mut GenericArg, vis: &mut T)
     }
 }
 
-pub fn noop_visit_angle_bracketed_parameter_data<T: MutVisitor>(data: &mut AngleBracketedArgs,
-                                                                vis: &mut T) {
+pub fn noop_visit_angle_bracketed_parameter_data<T: MutVisitor>(
+    data: &mut AngleBracketedArgs,
+    vis: &mut T,
+) {
     let AngleBracketedArgs { args, constraints, span } = data;
     visit_vec(args, |arg| vis.visit_generic_arg(arg));
     visit_vec(constraints, |constraint| vis.visit_ty_constraint(constraint));
     vis.visit_span(span);
 }
 
-pub fn noop_visit_parenthesized_parameter_data<T: MutVisitor>(args: &mut ParenthesizedArgs,
-                                                              vis: &mut T) {
+pub fn noop_visit_parenthesized_parameter_data<T: MutVisitor>(
+    args: &mut ParenthesizedArgs,
+    vis: &mut T,
+) {
     let ParenthesizedArgs { inputs, output, span } = args;
     visit_vec(inputs, |input| vis.visit_ty(input));
     noop_visit_fn_ret_ty(output, vis);
@@ -681,19 +687,17 @@ pub fn noop_visit_token<T: MutVisitor>(t: &mut Token, vis: &mut T) {
 // multiple items there....
 pub fn noop_visit_interpolated<T: MutVisitor>(nt: &mut token::Nonterminal, vis: &mut T) {
     match nt {
-        token::NtItem(item) =>
-            visit_clobber(item, |item| {
-                // This is probably okay, because the only visitors likely to
-                // peek inside interpolated nodes will be renamings/markings,
-                // which map single items to single items.
-                vis.flat_map_item(item).expect_one("expected visitor to produce exactly one item")
-            }),
+        token::NtItem(item) => visit_clobber(item, |item| {
+            // This is probably okay, because the only visitors likely to
+            // peek inside interpolated nodes will be renamings/markings,
+            // which map single items to single items.
+            vis.flat_map_item(item).expect_one("expected visitor to produce exactly one item")
+        }),
         token::NtBlock(block) => vis.visit_block(block),
-        token::NtStmt(stmt) =>
-            visit_clobber(stmt, |stmt| {
-                // See reasoning above.
-                vis.flat_map_stmt(stmt).expect_one("expected visitor to produce exactly one item")
-            }),
+        token::NtStmt(stmt) => visit_clobber(stmt, |stmt| {
+            // See reasoning above.
+            vis.flat_map_stmt(stmt).expect_one("expected visitor to produce exactly one item")
+        }),
         token::NtPat(pat) => vis.visit_pat(pat),
         token::NtExpr(expr) => vis.visit_expr(expr),
         token::NtTy(ty) => vis.visit_ty(ty),
@@ -706,25 +710,20 @@ pub fn noop_visit_interpolated<T: MutVisitor>(nt: &mut token::Nonterminal, vis:
         }
         token::NtPath(path) => vis.visit_path(path),
         token::NtTT(tt) => vis.visit_tt(tt),
-        token::NtImplItem(item) =>
-            visit_clobber(item, |item| {
-                // See reasoning above.
-                vis.flat_map_impl_item(item)
-                    .expect_one("expected visitor to produce exactly one item")
-            }),
-        token::NtTraitItem(item) =>
-            visit_clobber(item, |item| {
-                // See reasoning above.
-                vis.flat_map_trait_item(item)
-                    .expect_one("expected visitor to produce exactly one item")
-            }),
+        token::NtImplItem(item) => visit_clobber(item, |item| {
+            // See reasoning above.
+            vis.flat_map_impl_item(item).expect_one("expected visitor to produce exactly one item")
+        }),
+        token::NtTraitItem(item) => visit_clobber(item, |item| {
+            // See reasoning above.
+            vis.flat_map_trait_item(item).expect_one("expected visitor to produce exactly one item")
+        }),
         token::NtVis(visib) => vis.visit_vis(visib),
-        token::NtForeignItem(item) =>
-            visit_clobber(item, |item| {
-                // See reasoning above.
-                vis.flat_map_foreign_item(item)
-                    .expect_one("expected visitor to produce exactly one item")
-            }),
+        token::NtForeignItem(item) => visit_clobber(item, |item| {
+            // See reasoning above.
+            vis.flat_map_foreign_item(item)
+                .expect_one("expected visitor to produce exactly one item")
+        }),
     }
 }
 
@@ -760,9 +759,8 @@ pub fn noop_visit_param_bound<T: MutVisitor>(pb: &mut GenericBound, vis: &mut T)
 
 pub fn noop_flat_map_generic_param<T: MutVisitor>(
     mut param: GenericParam,
-    vis: &mut T
-) -> SmallVec<[GenericParam; 1]>
-{
+    vis: &mut T,
+) -> SmallVec<[GenericParam; 1]> {
     let GenericParam { id, ident, attrs, bounds, kind, is_placeholder: _ } = &mut param;
     vis.visit_id(id);
     vis.visit_ident(ident);
@@ -831,16 +829,17 @@ pub fn noop_visit_variant_data<T: MutVisitor>(vdata: &mut VariantData, vis: &mut
     match vdata {
         VariantData::Struct(fields, ..) => {
             fields.flat_map_in_place(|field| vis.flat_map_struct_field(field));
-        },
+        }
         VariantData::Tuple(fields, id) => {
             fields.flat_map_in_place(|field| vis.flat_map_struct_field(field));
             vis.visit_id(id);
-        },
+        }
         VariantData::Unit(id) => vis.visit_id(id),
     }
 }
 
-pub fn noop_visit_trait_ref<T: MutVisitor>(TraitRef { path, ref_id }: &mut TraitRef, vis: &mut T) {
+pub fn noop_visit_trait_ref<T: MutVisitor>(tr: &mut TraitRef, vis: &mut T) {
+    let TraitRef { path, ref_id, constness: _ } = tr;
     vis.visit_path(path);
     vis.visit_id(ref_id);
 }
@@ -852,9 +851,10 @@ pub fn noop_visit_poly_trait_ref<T: MutVisitor>(p: &mut PolyTraitRef, vis: &mut
     vis.visit_span(span);
 }
 
-pub fn noop_flat_map_struct_field<T: MutVisitor>(mut sf: StructField, visitor: &mut T)
-    -> SmallVec<[StructField; 1]>
-{
+pub fn noop_flat_map_struct_field<T: MutVisitor>(
+    mut sf: StructField,
+    visitor: &mut T,
+) -> SmallVec<[StructField; 1]> {
     let StructField { span, ident, vis, id, ty, attrs, is_placeholder: _ } = &mut sf;
     visitor.visit_span(span);
     visit_opt(ident, |ident| visitor.visit_ident(ident));
@@ -914,8 +914,7 @@ pub fn noop_visit_item_kind<T: MutVisitor>(kind: &mut ItemKind, vis: &mut T) {
             variants.flat_map_in_place(|variant| vis.flat_map_variant(variant));
             vis.visit_generics(generics);
         }
-        ItemKind::Struct(variant_data, generics) |
-        ItemKind::Union(variant_data, generics) => {
+        ItemKind::Struct(variant_data, generics) | ItemKind::Union(variant_data, generics) => {
             vis.visit_variant_data(variant_data);
             vis.visit_generics(generics);
         }
@@ -939,9 +938,10 @@ pub fn noop_visit_item_kind<T: MutVisitor>(kind: &mut ItemKind, vis: &mut T) {
     }
 }
 
-pub fn noop_flat_map_assoc_item<T: MutVisitor>(mut item: AssocItem, visitor: &mut T)
-    -> SmallVec<[AssocItem; 1]>
-{
+pub fn noop_flat_map_assoc_item<T: MutVisitor>(
+    mut item: AssocItem,
+    visitor: &mut T,
+) -> SmallVec<[AssocItem; 1]> {
     let AssocItem { id, ident, vis, defaultness: _, attrs, generics, kind, span, tokens: _ } =
         &mut item;
     visitor.visit_id(id);
@@ -949,7 +949,7 @@ pub fn noop_flat_map_assoc_item<T: MutVisitor>(mut item: AssocItem, visitor: &mu
     visitor.visit_vis(vis);
     visit_attrs(attrs, visitor);
     visitor.visit_generics(generics);
-    match kind  {
+    match kind {
         AssocItemKind::Const(ty, expr) => {
             visitor.visit_ty(ty);
             visit_opt(expr, |expr| visitor.visit_expr(expr));
@@ -1009,8 +1009,10 @@ pub fn noop_visit_crate<T: MutVisitor>(krate: &mut Crate, vis: &mut T) {
 }
 
 // Mutates one item into possibly many items.
-pub fn noop_flat_map_item<T: MutVisitor>(mut item: P<Item>, visitor: &mut T)
-                                         -> SmallVec<[P<Item>; 1]> {
+pub fn noop_flat_map_item<T: MutVisitor>(
+    mut item: P<Item>,
+    visitor: &mut T,
+) -> SmallVec<[P<Item>; 1]> {
     let Item { ident, attrs, id, kind, vis, span, tokens: _ } = item.deref_mut();
     visitor.visit_ident(ident);
     visit_attrs(attrs, visitor);
@@ -1025,9 +1027,10 @@ pub fn noop_flat_map_item<T: MutVisitor>(mut item: P<Item>, visitor: &mut T)
     smallvec![item]
 }
 
-pub fn noop_flat_map_foreign_item<T: MutVisitor>(mut item: ForeignItem, visitor: &mut T)
-    -> SmallVec<[ForeignItem; 1]>
-{
+pub fn noop_flat_map_foreign_item<T: MutVisitor>(
+    mut item: ForeignItem,
+    visitor: &mut T,
+) -> SmallVec<[ForeignItem; 1]> {
     let ForeignItem { ident, attrs, id, kind, vis, span, tokens: _ } = &mut item;
     visitor.visit_ident(ident);
     visit_attrs(attrs, visitor);
@@ -1072,13 +1075,13 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) {
         PatKind::Box(inner) => vis.visit_pat(inner),
         PatKind::Ref(inner, _mutbl) => vis.visit_pat(inner),
         PatKind::Range(e1, e2, Spanned { span: _, node: _ }) => {
-            vis.visit_expr(e1);
-            vis.visit_expr(e2);
+            visit_opt(e1, |e| vis.visit_expr(e));
+            visit_opt(e2, |e| vis.visit_expr(e));
             vis.visit_span(span);
         }
-        PatKind::Tuple(elems)
-        | PatKind::Slice(elems)
-        | PatKind::Or(elems) => visit_vec(elems, |elem| vis.visit_pat(elem)),
+        PatKind::Tuple(elems) | PatKind::Slice(elems) | PatKind::Or(elems) => {
+            visit_vec(elems, |elem| vis.visit_pat(elem))
+        }
         PatKind::Paren(inner) => vis.visit_pat(inner),
         PatKind::Mac(mac) => vis.visit_mac(mac),
     }
@@ -1166,7 +1169,7 @@ pub fn noop_visit_expr<T: MutVisitor>(Expr { kind, id, span, attrs }: &mut Expr,
             vis.visit_block(body);
         }
         ExprKind::Await(expr) => vis.visit_expr(expr),
-        ExprKind::Assign(el, er) => {
+        ExprKind::Assign(el, er, _) => {
             vis.visit_expr(el);
             vis.visit_expr(er);
         }
@@ -1201,8 +1204,16 @@ pub fn noop_visit_expr<T: MutVisitor>(Expr { kind, id, span, attrs }: &mut Expr,
             visit_opt(expr, |expr| vis.visit_expr(expr));
         }
         ExprKind::InlineAsm(asm) => {
-            let InlineAsm { asm: _, asm_str_style: _, outputs, inputs, clobbers: _, volatile: _,
-                            alignstack: _, dialect: _ } = asm.deref_mut();
+            let InlineAsm {
+                asm: _,
+                asm_str_style: _,
+                outputs,
+                inputs,
+                clobbers: _,
+                volatile: _,
+                alignstack: _,
+                dialect: _,
+            } = asm.deref_mut();
             for out in outputs {
                 let InlineAsmOutput { constraint: _, expr, is_rw: _, is_indirect: _ } = out;
                 vis.visit_expr(expr);
@@ -1214,7 +1225,7 @@ pub fn noop_visit_expr<T: MutVisitor>(Expr { kind, id, span, attrs }: &mut Expr,
             vis.visit_path(path);
             fields.flat_map_in_place(|field| vis.flat_map_field(field));
             visit_opt(expr, |expr| vis.visit_expr(expr));
-        },
+        }
         ExprKind::Paren(expr) => {
             vis.visit_expr(expr);
 
@@ -1237,31 +1248,33 @@ pub fn noop_visit_expr<T: MutVisitor>(Expr { kind, id, span, attrs }: &mut Expr,
 }
 
 pub fn noop_filter_map_expr<T: MutVisitor>(mut e: P<Expr>, vis: &mut T) -> Option<P<Expr>> {
-    Some({ vis.visit_expr(&mut e); e })
+    Some({
+        vis.visit_expr(&mut e);
+        e
+    })
 }
 
-pub fn noop_flat_map_stmt<T: MutVisitor>(Stmt { kind, mut span, mut id }: Stmt, vis: &mut T)
-    -> SmallVec<[Stmt; 1]>
-{
+pub fn noop_flat_map_stmt<T: MutVisitor>(
+    Stmt { kind, mut span, mut id }: Stmt,
+    vis: &mut T,
+) -> SmallVec<[Stmt; 1]> {
     vis.visit_id(&mut id);
     vis.visit_span(&mut span);
-    noop_flat_map_stmt_kind(kind, vis).into_iter().map(|kind| {
-        Stmt { id, kind, span }
-    }).collect()
+    noop_flat_map_stmt_kind(kind, vis).into_iter().map(|kind| Stmt { id, kind, span }).collect()
 }
 
-pub fn noop_flat_map_stmt_kind<T: MutVisitor>(kind: StmtKind, vis: &mut T)
-                                              -> SmallVec<[StmtKind; 1]> {
+pub fn noop_flat_map_stmt_kind<T: MutVisitor>(
+    kind: StmtKind,
+    vis: &mut T,
+) -> SmallVec<[StmtKind; 1]> {
     match kind {
-        StmtKind::Local(mut local) =>
-            smallvec![StmtKind::Local({ vis.visit_local(&mut local); local })],
+        StmtKind::Local(mut local) => smallvec![StmtKind::Local({
+            vis.visit_local(&mut local);
+            local
+        })],
         StmtKind::Item(item) => vis.flat_map_item(item).into_iter().map(StmtKind::Item).collect(),
-        StmtKind::Expr(expr) => {
-            vis.filter_map_expr(expr).into_iter().map(StmtKind::Expr).collect()
-        }
-        StmtKind::Semi(expr) => {
-            vis.filter_map_expr(expr).into_iter().map(StmtKind::Semi).collect()
-        }
+        StmtKind::Expr(expr) => vis.filter_map_expr(expr).into_iter().map(StmtKind::Expr).collect(),
+        StmtKind::Semi(expr) => vis.filter_map_expr(expr).into_iter().map(StmtKind::Semi).collect(),
         StmtKind::Mac(mut mac) => {
             let (mac_, _semi, attrs) = mac.deref_mut();
             vis.visit_mac(mac_);