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