Unnamed repository; edit this file 'description' to name the repository.
Merge #10819
10819: internal: Replace some `Vec` occurences with `Box` r=Veykril a=Veykril
Shaves off ~15mb from self analysis
Co-authored-by: Lukas Wirth <[email protected]>
| -rw-r--r-- | crates/hir_def/src/body/lower.rs | 35 | ||||
| -rw-r--r-- | crates/hir_def/src/body/scope.rs | 2 | ||||
| -rw-r--r-- | crates/hir_def/src/expr.rs | 88 | ||||
| -rw-r--r-- | crates/hir_def/src/path.rs | 16 | ||||
| -rw-r--r-- | crates/hir_def/src/path/lower.rs | 17 | ||||
| -rw-r--r-- | crates/hir_ty/src/diagnostics/expr.rs | 10 | ||||
| -rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 2 | ||||
| -rw-r--r-- | crates/hir_ty/src/infer/pat.rs | 8 |
8 files changed, 78 insertions, 100 deletions
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 |