Repository: rust-analyzer/rust-analyzer
Pull request #10819 (2021-11-20 15:19:36)

internal: Replace some `Vec` occurences with `Box` 
Shaves off ~15mb from self analysis


Patch:
diff --git a/crates/hir/src/display.rs b/crates/hir/src/display.rs
index 38bbf41797..e9ace855fc 100644
--- a/crates/hir/src/display.rs
+++ b/crates/hir/src/display.rs
@@ -325,21 +325,7 @@ fn write_generic_params(def: GenericDefId, f: &mut HirFormatter) -> Result<(), H
 
 fn write_where_clause(def: GenericDefId, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
     let params = f.db.generic_params(def);
-
-    // unnamed type targets are displayed inline with the argument itself, e.g. `f: impl Y`.
-    let is_unnamed_type_target = |target: &WherePredicateTypeTarget| match target {
-        WherePredicateTypeTarget::TypeRef(_) => false,
-        WherePredicateTypeTarget::TypeParam(id) => params.types[*id].name.is_none(),
-    };
-
-    let has_displayable_predicate = params
-        .where_predicates
-        .iter()
-        .any(|pred| {
-            !matches!(pred, WherePredicate::TypeBound { target, .. } if is_unnamed_type_target(target))
-        });
-
-    if !has_displayable_predicate {
+    if params.where_predicates.is_empty() {
         return Ok(());
     }
 
@@ -362,7 +348,6 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter) -> Result<(), Hir
         };
 
         match pred {
-            WherePredicate::TypeBound { target, .. } if is_unnamed_type_target(target) => {}
             WherePredicate::TypeBound { target, bound } => {
                 if matches!(prev_pred, Some(WherePredicate::TypeBound { target: target_, .. }) if target_ == target)
                 {
diff --git a/crates/hir_def/src/body/lower.rs b/crates/hir_def/src/body/lower.rs
index 3136206761..e322a95384 100644
--- a/crates/hir_def/src/body/lower.rs
+++ b/crates/hir_def/src/body/lower.rs
@@ -130,11 +130,7 @@ impl ExprCollector<'_> {
                 self.body.params.push(param_pat);
             }
 
-            for param in param_list.params() {
-                let pat = match param.pat() {
-                    None => continue,
-                    Some(pat) => pat,
-                };
+            for pat in param_list.params().filter_map(|param| param.pat()) {
                 let param_pat = self.collect_pat(pat);
                 self.body.params.push(param_pat);
             }
@@ -160,7 +156,7 @@ impl ExprCollector<'_> {
         self.make_expr(expr, Err(SyntheticSyntax))
     }
     fn unit(&mut self) -> ExprId {
-        self.alloc_expr_desugared(Expr::Tuple { exprs: Vec::new() })
+        self.alloc_expr_desugared(Expr::Tuple { exprs: Box::default() })
     }
     fn missing_expr(&mut self) -> ExprId {
         self.alloc_expr_desugared(Expr::Missing)
@@ -235,7 +231,8 @@ impl ExprCollector<'_> {
                                     expr: else_branch.unwrap_or_else(|| self.unit()),
                                     guard: None,
                                 },
-                            ];
+                            ]
+                            .into();
                             return Some(
                                 self.alloc_expr(Expr::Match { expr: match_expr, arms }, syntax_ptr),
                             );
@@ -300,7 +297,8 @@ impl ExprCollector<'_> {
                             let arms = vec![
                                 MatchArm { pat, expr: body, guard: None },
                                 MatchArm { pat: placeholder_pat, expr: break_, guard: None },
-                            ];
+                            ]
+                            .into();
                             let match_expr =
                                 self.alloc_expr_desugared(Expr::Match { expr: match_expr, arms });
                             return Some(
@@ -324,7 +322,7 @@ impl ExprCollector<'_> {
                 let args = if let Some(arg_list) = e.arg_list() {
                     arg_list.args().filter_map(|e| self.maybe_collect_expr(e)).collect()
                 } else {
-                    Vec::new()
+                    Box::default()
                 };
                 self.alloc_expr(Expr::Call { callee, args }, syntax_ptr)
             }
@@ -333,7 +331,7 @@ impl ExprCollector<'_> {
                 let args = if let Some(arg_list) = e.arg_list() {
                     arg_list.args().filter_map(|e| self.maybe_collect_expr(e)).collect()
                 } else {
-                    Vec::new()
+                    Box::default()
                 };
                 let method_name = e.name_ref().map(|nr| nr.as_name()).unwrap_or_else(Name::missing);
                 let generic_args = e
@@ -367,7 +365,7 @@ impl ExprCollector<'_> {
                         })
                         .collect()
                 } else {
-                    Vec::new()
+                    Box::default()
                 };
                 self.alloc_expr(Expr::Match { expr, arms }, syntax_ptr)
             }
@@ -429,7 +427,7 @@ impl ExprCollector<'_> {
                     let spread = nfl.spread().map(|s| self.collect_expr(s));
                     Expr::RecordLit { path, fields, spread }
                 } else {
-                    Expr::RecordLit { path, fields: Vec::new(), spread: None }
+                    Expr::RecordLit { path, fields: Box::default(), spread: None }
                 };
 
                 self.alloc_expr(record_lit, syntax_ptr)
@@ -496,7 +494,10 @@ impl ExprCollector<'_> {
                     .and_then(|r| r.ty())
                     .map(|it| Interned::new(TypeRef::from_ast(&self.ctx(), it)));
                 let body = self.collect_expr_opt(e.body());
-                self.alloc_expr(Expr::Lambda { args, arg_types, ret_type, body }, syntax_ptr)
+                self.alloc_expr(
+                    Expr::Lambda { args: args.into(), arg_types: arg_types.into(), ret_type, body },
+                    syntax_ptr,
+                )
             }
             ast::Expr::BinExpr(e) => {
                 let lhs = self.collect_expr_opt(e.lhs());
@@ -718,7 +719,7 @@ impl ExprCollector<'_> {
             self.statements_in_scope.pop();
         }
         let tail = tail;
-        let statements = std::mem::replace(&mut self.statements_in_scope, prev_statements);
+        let statements = std::mem::replace(&mut self.statements_in_scope, prev_statements).into();
         let syntax_node_ptr = AstPtr::new(&block.into());
         let expr_id = self.alloc_expr(
             Expr::Block { id: block_id, statements, tail, label: None },
@@ -812,7 +813,7 @@ impl ExprCollector<'_> {
             ast::Pat::RecordPat(p) => {
                 let path =
                     p.path().and_then(|path| self.expander.parse_path(self.db, path)).map(Box::new);
-                let args: Vec<_> = p
+                let args = p
                     .record_pat_field_list()
                     .expect("every struct should have a field list")
                     .fields()
@@ -902,7 +903,7 @@ impl ExprCollector<'_> {
         }
     }
 
-    fn collect_tuple_pat(&mut self, args: AstChildren<ast::Pat>) -> (Vec<PatId>, Option<usize>) {
+    fn collect_tuple_pat(&mut self, args: AstChildren<ast::Pat>) -> (Box<[PatId]>, Option<usize>) {
         // Find the location of the `..`, if there is one. Note that we do not
         // consider the possibility of there being multiple `..` here.
         let ellipsis = args.clone().position(|p| matches!(p, ast::Pat::RestPat(_)));
@@ -961,7 +962,7 @@ impl From<ast::LiteralKind> for Literal {
                 Literal::Float(Default::default(), ty)
             }
             LiteralKind::ByteString(bs) => {
-                let text = bs.value().map(Vec::from).unwrap_or_else(Default::default);
+                let text = bs.value().map(Box::from).unwrap_or_else(Default::default);
                 Literal::ByteString(text)
             }
             LiteralKind::String(_) => Literal::String(Default::default()),
diff --git a/crates/hir_def/src/body/scope.rs b/crates/hir_def/src/body/scope.rs
index 147d641235..2658eece8e 100644
--- a/crates/hir_def/src/body/scope.rs
+++ b/crates/hir_def/src/body/scope.rs
@@ -204,7 +204,7 @@ fn compute_expr_scopes(expr: ExprId, body: &Body, scopes: &mut ExprScopes, scope
         }
         Expr::Match { expr, arms } => {
             compute_expr_scopes(*expr, body, scopes, scope);
-            for arm in arms {
+            for arm in arms.iter() {
                 let mut scope = scopes.new_scope(scope);
                 scopes.add_bindings(body, scope, arm.pat);
                 match arm.guard {
diff --git a/crates/hir_def/src/expr.rs b/crates/hir_def/src/expr.rs
index 17af48b7bf..6534f970ee 100644
--- a/crates/hir_def/src/expr.rs
+++ b/crates/hir_def/src/expr.rs
@@ -40,8 +40,8 @@ pub type LabelId = Idx<Label>;
 
 #[derive(Debug, Clone, Eq, PartialEq)]
 pub enum Literal {
-    String(String),
-    ByteString(Vec<u8>),
+    String(Box<str>),
+    ByteString(Box<[u8]>),
     Char(char),
     Bool(bool),
     Int(i128, Option<BuiltinInt>),
@@ -61,7 +61,7 @@ pub enum Expr {
     },
     Block {
         id: BlockId,
-        statements: Vec<Statement>,
+        statements: Box<[Statement]>,
         tail: Option<ExprId>,
         label: Option<LabelId>,
     },
@@ -82,17 +82,17 @@ pub enum Expr {
     },
     Call {
         callee: ExprId,
-        args: Vec<ExprId>,
+        args: Box<[ExprId]>,
     },
     MethodCall {
         receiver: ExprId,
         method_name: Name,
-        args: Vec<ExprId>,
+        args: Box<[ExprId]>,
         generic_args: Option<Box<GenericArgs>>,
     },
     Match {
         expr: ExprId,
-        arms: Vec<MatchArm>,
+        arms: Box<[MatchArm]>,
     },
     Continue {
         label: Option<Name>,
@@ -109,7 +109,7 @@ pub enum Expr {
     },
     RecordLit {
         path: Option<Box<Path>>,
-        fields: Vec<RecordLitField>,
+        fields: Box<[RecordLitField]>,
         spread: Option<ExprId>,
     },
     Field {
@@ -162,13 +162,13 @@ pub enum Expr {
         index: ExprId,
     },
     Lambda {
-        args: Vec<PatId>,
-        arg_types: Vec<Option<Interned<TypeRef>>>,
+        args: Box<[PatId]>,
+        arg_types: Box<[Option<Interned<TypeRef>>]>,
         ret_type: Option<Interned<TypeRef>>,
         body: ExprId,
     },
     Tuple {
-        exprs: Vec<ExprId>,
+        exprs: Box<[ExprId]>,
     },
     Unsafe {
         body: ExprId,
@@ -182,7 +182,7 @@ pub enum Expr {
 
 #[derive(Debug, Clone, Eq, PartialEq)]
 pub enum Array {
-    ElementList(Vec<ExprId>),
+    ElementList(Box<[ExprId]>),
     Repeat { initializer: ExprId, repeat: ExprId },
 }
 
@@ -228,23 +228,23 @@ impl Expr {
             Expr::If { condition, then_branch, else_branch } => {
                 f(*condition);
                 f(*then_branch);
-                if let Some(else_branch) = else_branch {
-                    f(*else_branch);
+                if let &Some(else_branch) = else_branch {
+                    f(else_branch);
                 }
             }
             Expr::Block { statements, tail, .. } => {
-                for stmt in statements {
+                for stmt in statements.iter() {
                     match stmt {
                         Statement::Let { initializer, .. } => {
-                            if let Some(expr) = initializer {
-                                f(*expr);
+                            if let &Some(expr) = initializer {
+                                f(expr);
                             }
                         }
                         Statement::Expr { expr: expression, .. } => f(*expression),
                     }
                 }
-                if let Some(expr) = tail {
-                    f(*expr);
+                if let &Some(expr) = tail {
+                    f(expr);
                 }
             }
             Expr::TryBlock { body }
@@ -262,34 +262,28 @@ impl Expr {
             }
             Expr::Call { callee, args } => {
                 f(*callee);
-                for arg in args {
-                    f(*arg);
-                }
+                args.iter().copied().for_each(f);
             }
             Expr::MethodCall { receiver, args, .. } => {
                 f(*receiver);
-                for arg in args {
-                    f(*arg);
-                }
+                args.iter().copied().for_each(f);
             }
             Expr::Match { expr, arms } => {
                 f(*expr);
-                for arm in arms {
-                    f(arm.expr);
-                }
+                arms.iter().map(|arm| arm.expr).for_each(f);
             }
             Expr::Continue { .. } => {}
             Expr::Break { expr, .. } | Expr::Return { expr } | Expr::Yield { expr } => {
-                if let Some(expr) = expr {
-                    f(*expr);
+                if let &Some(expr) = expr {
+                    f(expr);
                 }
             }
             Expr::RecordLit { fields, spread, .. } => {
-                for field in fields {
+                for field in fields.iter() {
                     f(field.expr);
                 }
-                if let Some(expr) = spread {
-                    f(*expr);
+                if let &Some(expr) = spread {
+                    f(expr);
                 }
             }
             Expr::Lambda { body, .. } => {
@@ -300,11 +294,11 @@ impl Expr {
                 f(*rhs);
             }
             Expr::Range { lhs, rhs, .. } => {
-                if let Some(lhs) = rhs {
-                    f(*lhs);
+                if let &Some(lhs) = rhs {
+                    f(lhs);
                 }
-                if let Some(rhs) = lhs {
-                    f(*rhs);
+                if let &Some(rhs) = lhs {
+                    f(rhs);
                 }
             }
             Expr::Index { base, index } => {
@@ -320,17 +314,9 @@ impl Expr {
             | Expr::Box { expr } => {
                 f(*expr);
             }
-            Expr::Tuple { exprs } => {
-                for expr in exprs {
-                    f(*expr);
-                }
-            }
+            Expr::Tuple { exprs } => exprs.iter().copied().for_each(f),
             Expr::Array(a) => match a {
-                Array::ElementList(exprs) => {
-                    for expr in exprs {
-                        f(*expr);
-                    }
-                }
+                Array::ElementList(exprs) => exprs.iter().copied().for_each(f),
                 Array::Repeat { initializer, repeat } => {
                     f(*initializer);
                     f(*repeat)
@@ -386,15 +372,15 @@ pub struct RecordFieldPat {
 pub enum Pat {
     Missing,
     Wild,
-    Tuple { args: Vec<PatId>, ellipsis: Option<usize> },
-    Or(Vec<PatId>),
-    Record { path: Option<Box<Path>>, args: Vec<RecordFieldPat>, ellipsis: bool },
+    Tuple { args: Box<[PatId]>, ellipsis: Option<usize> },
+    Or(Box<[PatId]>),
+    Record { path: Option<Box<Path>>, args: Box<[RecordFieldPat]>, ellipsis: bool },
     Range { start: ExprId, end: ExprId },
-    Slice { prefix: Vec<PatId>, slice: Option<PatId>, suffix: Vec<PatId> },
+    Slice { prefix: Box<[PatId]>, slice: Option<PatId>, suffix: Box<[PatId]> },
     Path(Box<Path>),
     Lit(ExprId),
     Bind { mode: BindingAnnotation, name: Name, subpat: Option<PatId> },
-    TupleStruct { path: Option<Box<Path>>, args: Vec<PatId>, ellipsis: Option<usize> },
+    TupleStruct { path: Option<Box<Path>>, args: Box<[PatId]>, ellipsis: Option<usize> },
     Ref { pat: PatId, mutability: Mutability },
     Box { inner: PatId },
     ConstBlock(ExprId),
diff --git a/crates/hir_def/src/path.rs b/crates/hir_def/src/path.rs
index a54352439c..5bb8afa5cc 100644
--- a/crates/hir_def/src/path.rs
+++ b/crates/hir_def/src/path.rs
@@ -22,7 +22,7 @@ pub struct ModPath {
     segments: Vec<Name>,
 }
 
-#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
 pub enum PathKind {
     Plain,
     /// `self::` is `Super(0)`
@@ -119,7 +119,7 @@ pub struct Path {
     type_anchor: Option<Interned<TypeRef>>,
     mod_path: Interned<ModPath>,
     /// Invariant: the same len as `self.mod_path.segments`
-    generic_args: Vec<Option<Interned<GenericArgs>>>,
+    generic_args: Box<[Option<Interned<GenericArgs>>]>,
 }
 
 /// Generic arguments to a path segment (e.g. the `i32` in `Option<i32>`). This
@@ -171,9 +171,9 @@ impl Path {
     /// Converts a known mod path to `Path`.
     pub fn from_known_path(
         path: ModPath,
-        generic_args: Vec<Option<Interned<GenericArgs>>>,
+        generic_args: impl Into<Box<[Option<Interned<GenericArgs>>]>>,
     ) -> Path {
-        Path { type_anchor: None, mod_path: Interned::new(path), generic_args }
+        Path { type_anchor: None, mod_path: Interned::new(path), generic_args: generic_args.into() }
     }
 
     pub fn kind(&self) -> &PathKind {
@@ -187,7 +187,7 @@ impl Path {
     pub fn segments(&self) -> PathSegments<'_> {
         PathSegments {
             segments: self.mod_path.segments.as_slice(),
-            generic_args: self.generic_args.as_slice(),
+            generic_args: &self.generic_args,
         }
     }
 
@@ -205,14 +205,14 @@ impl Path {
                 self.mod_path.kind.clone(),
                 self.mod_path.segments[..self.mod_path.segments.len() - 1].iter().cloned(),
             )),
-            generic_args: self.generic_args[..self.generic_args.len() - 1].to_vec(),
+            generic_args: self.generic_args[..self.generic_args.len() - 1].to_vec().into(),
         };
         Some(res)
     }
 
     pub fn is_self_type(&self) -> bool {
         self.type_anchor.is_none()
-            && self.generic_args == [None]
+            && *self.generic_args == [None]
             && self.mod_path.as_ident() == Some(&name!(Self))
     }
 }
@@ -286,7 +286,7 @@ impl From<Name> for Path {
         Path {
             type_anchor: None,
             mod_path: Interned::new(ModPath::from_segments(PathKind::Plain, iter::once(name))),
-            generic_args: vec![None],
+            generic_args: Box::new([None]),
         }
     }
 }
diff --git a/crates/hir_def/src/path/lower.rs b/crates/hir_def/src/path/lower.rs
index b08708bd28..c84cd50ce6 100644
--- a/crates/hir_def/src/path/lower.rs
+++ b/crates/hir_def/src/path/lower.rs
@@ -70,18 +70,13 @@ pub(super) fn lower_path(mut path: ast::Path, ctx: &LowerCtx) -> Option<Path> {
                     }
                     // <T as Trait<A>>::Foo desugars to Trait<Self=T, A>::Foo
                     Some(trait_ref) => {
-                        let path = Path::from_src(trait_ref.path()?, ctx)?;
-                        let mod_path = (*path.mod_path).clone();
-                        let num_segments = path.mod_path.segments.len();
+                        let Path { mod_path, generic_args: path_generic_args, .. } =
+                            Path::from_src(trait_ref.path()?, ctx)?;
+                        let num_segments = mod_path.segments.len();
                         kind = mod_path.kind;
 
-                        let mut prefix_segments = mod_path.segments;
-                        prefix_segments.reverse();
-                        segments.extend(prefix_segments);
-
-                        let mut prefix_args = path.generic_args;
-                        prefix_args.reverse();
-                        generic_args.extend(prefix_args);
+                        segments.extend(mod_path.segments.iter().cloned().rev());
+                        generic_args.extend(path_generic_args.iter().cloned().rev());
 
                         // Insert the type reference (T in the above example) as Self parameter for the trait
                         let last_segment =
@@ -139,7 +134,7 @@ pub(super) fn lower_path(mut path: ast::Path, ctx: &LowerCtx) -> Option<Path> {
     }
 
     let mod_path = Interned::new(ModPath::from_segments(kind, segments));
-    return Some(Path { type_anchor, mod_path, generic_args });
+    return Some(Path { type_anchor, mod_path, generic_args: generic_args.into() });
 
     fn qualifier(path: &ast::Path) -> Option<ast::Path> {
         if let Some(q) = path.qualifier() {
diff --git a/crates/hir_ty/src/diagnostics/expr.rs b/crates/hir_ty/src/diagnostics/expr.rs
index abcb84401b..195c53c17e 100644
--- a/crates/hir_ty/src/diagnostics/expr.rs
+++ b/crates/hir_ty/src/diagnostics/expr.rs
@@ -202,19 +202,16 @@ impl ExprValidator {
         }
 
         let is_method_call = matches!(expr, Expr::MethodCall { .. });
-        let (sig, args) = match expr {
+        let (sig, mut arg_count) = match expr {
             Expr::Call { callee, args } => {
                 let callee = &self.infer.type_of_expr[*callee];
                 let sig = match callee.callable_sig(db) {
                     Some(sig) => sig,
                     None => return,
                 };
-                (sig, args.clone())
+                (sig, args.len())
             }
             Expr::MethodCall { receiver, args, .. } => {
-                let mut args = args.clone();
-                args.insert(0, *receiver);
-
                 let receiver = &self.infer.type_of_expr[*receiver];
                 if receiver.strip_references().is_unknown() {
                     // if the receiver is of unknown type, it's very likely we
@@ -229,7 +226,7 @@ impl ExprValidator {
                 };
                 let sig = db.callable_item_signature(callee.into()).substitute(&Interner, &subst);
 
-                (sig, args)
+                (sig, args.len() + 1)
             }
             _ => return,
         };
@@ -241,7 +238,6 @@ impl ExprValidator {
         let params = sig.params();
 
         let mut param_count = params.len();
-        let mut arg_count = args.len();
 
         if arg_count != param_count {
             if is_method_call {
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs
index 3aad9d4cc8..5fb227c0e4 100644
--- a/crates/hir_ty/src/infer/expr.rs
+++ b/crates/hir_ty/src/infer/expr.rs
@@ -375,7 +375,7 @@ impl<'a> InferenceContext<'a> {
                 let matchee_diverges = self.diverges;
                 let mut all_arms_diverge = Diverges::Always;
 
-                for arm in arms {
+                for arm in arms.iter() {
                     self.diverges = Diverges::Maybe;
                     let _pat_ty = self.infer_pat(arm.pat, &input_ty, BindingMode::default());
                     match arm.guard {
diff --git a/crates/hir_ty/src/infer/pat.rs b/crates/hir_ty/src/infer/pat.rs
index 9aaf7db87b..cc91932745 100644
--- a/crates/hir_ty/src/infer/pat.rs
+++ b/crates/hir_ty/src/infer/pat.rs
@@ -226,8 +226,8 @@ impl<'a> InferenceContext<'a> {
                     _ => self.err_ty(),
                 };
 
-                for pat_id in prefix.iter().chain(suffix) {
-                    self.infer_pat(*pat_id, &elem_ty, default_bm);
+                for &pat_id in prefix.iter().chain(suffix.iter()) {
+                    self.infer_pat(pat_id, &elem_ty, default_bm);
                 }
 
                 let pat_ty = match expected.kind(&Interner) {
@@ -235,8 +235,8 @@ impl<'a> InferenceContext<'a> {
                     _ => TyKind::Slice(elem_ty),
                 }
                 .intern(&Interner);
-                if let Some(slice_pat_id) = slice {
-                    self.infer_pat(*slice_pat_id, &pat_ty, default_bm);
+                if let &Some(slice_pat_id) = slice {
+                    self.infer_pat(slice_pat_id, &pat_ty, default_bm);
                 }
 
                 pat_ty


Test patch:
diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs
index c745f86d84..5db6fd7974 100644
--- a/crates/ide/src/hover/tests.rs
+++ b/crates/ide/src/hover/tests.rs
@@ -340,48 +340,6 @@ fn main() { m::f$0oo(); }
     );
 }
 
-#[test]
-fn hover_omits_unnamed_where_preds() {
-    check(
-        r#"
-pub fn foo(bar: impl T) { }
-
-fn main() { fo$0o(); }
-        "#,
-        expect![[r#"
-            *foo*
-
-            ```rust
-            test
-            ```
-
-            ```rust
-            pub fn foo(bar: impl T)
-            ```
-        "#]],
-    );
-    check(
-        r#"
-pub fn foo<V: AsRef<str>>(bar: impl T, baz: V) { }
-
-fn main() { fo$0o(); }
-        "#,
-        expect![[r#"
-            *foo*
-
-            ```rust
-            test
-            ```
-
-            ```rust
-            pub fn foo<V>(bar: impl T, baz: V)
-            where
-                V: AsRef<str>,
-            ```
-        "#]],
-    );
-}
-
 #[test]
 fn hover_shows_fn_signature_with_type_params() {
     check(