mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Preallocate some vecs
This commit is contained in:
parent
79492cb8ae
commit
7677f41f41
@ -67,7 +67,7 @@ impl InferenceContext<'_> {
|
||||
let arg = projection.substitution.as_slice(Interner).get(1)?;
|
||||
if let Some(subst) = arg.ty(Interner)?.as_tuple() {
|
||||
let generic_args = subst.as_slice(Interner);
|
||||
let mut sig_tys = Vec::new();
|
||||
let mut sig_tys = Vec::with_capacity(generic_args.len() + 1);
|
||||
for arg in generic_args {
|
||||
sig_tys.push(arg.ty(Interner)?.clone());
|
||||
}
|
||||
|
@ -235,7 +235,7 @@ impl<'a> InferenceContext<'a> {
|
||||
Expr::Closure { body, args, ret_type, arg_types, closure_kind } => {
|
||||
assert_eq!(args.len(), arg_types.len());
|
||||
|
||||
let mut sig_tys = Vec::new();
|
||||
let mut sig_tys = Vec::with_capacity(arg_types.len() + 1);
|
||||
|
||||
// collect explicitly written argument types
|
||||
for arg_type in arg_types.iter() {
|
||||
@ -256,7 +256,8 @@ impl<'a> InferenceContext<'a> {
|
||||
num_binders: 0,
|
||||
sig: FnSig { abi: (), safety: chalk_ir::Safety::Safe, variadic: false },
|
||||
substitution: FnSubst(
|
||||
Substitution::from_iter(Interner, sig_tys.clone()).shifted_in(Interner),
|
||||
Substitution::from_iter(Interner, sig_tys.iter().cloned())
|
||||
.shifted_in(Interner),
|
||||
),
|
||||
})
|
||||
.intern(Interner);
|
||||
@ -318,16 +319,16 @@ impl<'a> InferenceContext<'a> {
|
||||
Expr::Call { callee, args, .. } => {
|
||||
let callee_ty = self.infer_expr(*callee, &Expectation::none());
|
||||
let mut derefs = Autoderef::new(&mut self.table, callee_ty.clone());
|
||||
let mut res = None;
|
||||
let mut derefed_callee = callee_ty.clone();
|
||||
// manual loop to be able to access `derefs.table`
|
||||
while let Some((callee_deref_ty, _)) = derefs.next() {
|
||||
res = derefs.table.callable_sig(&callee_deref_ty, args.len());
|
||||
if res.is_some() {
|
||||
derefed_callee = callee_deref_ty;
|
||||
break;
|
||||
let (res, derefed_callee) = 'b: {
|
||||
// manual loop to be able to access `derefs.table`
|
||||
while let Some((callee_deref_ty, _)) = derefs.next() {
|
||||
let res = derefs.table.callable_sig(&callee_deref_ty, args.len());
|
||||
if res.is_some() {
|
||||
break 'b (res, callee_deref_ty);
|
||||
}
|
||||
}
|
||||
}
|
||||
(None, callee_ty.clone())
|
||||
};
|
||||
// if the function is unresolved, we use is_varargs=true to
|
||||
// suppress the arg count diagnostic here
|
||||
let is_varargs =
|
||||
|
Loading…
x
Reference in New Issue
Block a user