mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 05:23:24 +00:00
Prevent re-allocation in CallableSig::from_params_and_return
This commit is contained in:
parent
34ba8db3ed
commit
4c62e6b05f
2 changed files with 9 additions and 8 deletions
|
@ -513,14 +513,16 @@ pub type PolyFnSig = Binders<CallableSig>;
|
||||||
|
|
||||||
impl CallableSig {
|
impl CallableSig {
|
||||||
pub fn from_params_and_return(
|
pub fn from_params_and_return(
|
||||||
mut params: Vec<Ty>,
|
params: impl ExactSizeIterator<Item = Ty>,
|
||||||
ret: Ty,
|
ret: Ty,
|
||||||
is_varargs: bool,
|
is_varargs: bool,
|
||||||
safety: Safety,
|
safety: Safety,
|
||||||
abi: FnAbi,
|
abi: FnAbi,
|
||||||
) -> CallableSig {
|
) -> CallableSig {
|
||||||
params.push(ret);
|
let mut params_and_return = Vec::with_capacity(params.len() + 1);
|
||||||
CallableSig { params_and_return: params.into(), is_varargs, safety, abi }
|
params_and_return.extend(params);
|
||||||
|
params_and_return.push(ret);
|
||||||
|
CallableSig { params_and_return: params_and_return.into(), is_varargs, safety, abi }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_def(db: &dyn HirDatabase, def: FnDefId, substs: &Substitution) -> CallableSig {
|
pub fn from_def(db: &dyn HirDatabase, def: FnDefId, substs: &Substitution) -> CallableSig {
|
||||||
|
@ -935,8 +937,7 @@ pub fn callable_sig_from_fn_trait(
|
||||||
.as_tuple()?
|
.as_tuple()?
|
||||||
.iter(Interner)
|
.iter(Interner)
|
||||||
.map(|it| it.assert_ty_ref(Interner))
|
.map(|it| it.assert_ty_ref(Interner))
|
||||||
.cloned()
|
.cloned();
|
||||||
.collect();
|
|
||||||
|
|
||||||
return Some((
|
return Some((
|
||||||
fn_x,
|
fn_x,
|
||||||
|
|
|
@ -1855,7 +1855,7 @@ fn fn_sig_for_fn(db: &dyn HirDatabase, def: FunctionId) -> PolyFnSig {
|
||||||
let ctx_params = TyLoweringContext::new(db, &resolver, def.into())
|
let ctx_params = TyLoweringContext::new(db, &resolver, def.into())
|
||||||
.with_impl_trait_mode(ImplTraitLoweringMode::Variable)
|
.with_impl_trait_mode(ImplTraitLoweringMode::Variable)
|
||||||
.with_type_param_mode(ParamLoweringMode::Variable);
|
.with_type_param_mode(ParamLoweringMode::Variable);
|
||||||
let params = data.params.iter().map(|tr| ctx_params.lower_ty(tr)).collect::<Vec<_>>();
|
let params = data.params.iter().map(|tr| ctx_params.lower_ty(tr));
|
||||||
let ctx_ret = TyLoweringContext::new(db, &resolver, def.into())
|
let ctx_ret = TyLoweringContext::new(db, &resolver, def.into())
|
||||||
.with_impl_trait_mode(ImplTraitLoweringMode::Opaque)
|
.with_impl_trait_mode(ImplTraitLoweringMode::Opaque)
|
||||||
.with_type_param_mode(ParamLoweringMode::Variable);
|
.with_type_param_mode(ParamLoweringMode::Variable);
|
||||||
|
@ -1909,7 +1909,7 @@ fn fn_sig_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> PolyFnS
|
||||||
let resolver = def.resolver(db.upcast());
|
let resolver = def.resolver(db.upcast());
|
||||||
let ctx = TyLoweringContext::new(db, &resolver, AdtId::from(def).into())
|
let ctx = TyLoweringContext::new(db, &resolver, AdtId::from(def).into())
|
||||||
.with_type_param_mode(ParamLoweringMode::Variable);
|
.with_type_param_mode(ParamLoweringMode::Variable);
|
||||||
let params = fields.iter().map(|(_, field)| ctx.lower_ty(&field.type_ref)).collect::<Vec<_>>();
|
let params = fields.iter().map(|(_, field)| ctx.lower_ty(&field.type_ref));
|
||||||
let (ret, binders) = type_for_adt(db, def.into()).into_value_and_skipped_binders();
|
let (ret, binders) = type_for_adt(db, def.into()).into_value_and_skipped_binders();
|
||||||
Binders::new(
|
Binders::new(
|
||||||
binders,
|
binders,
|
||||||
|
@ -1941,7 +1941,7 @@ fn fn_sig_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId)
|
||||||
let resolver = def.resolver(db.upcast());
|
let resolver = def.resolver(db.upcast());
|
||||||
let ctx = TyLoweringContext::new(db, &resolver, DefWithBodyId::VariantId(def).into())
|
let ctx = TyLoweringContext::new(db, &resolver, DefWithBodyId::VariantId(def).into())
|
||||||
.with_type_param_mode(ParamLoweringMode::Variable);
|
.with_type_param_mode(ParamLoweringMode::Variable);
|
||||||
let params = fields.iter().map(|(_, field)| ctx.lower_ty(&field.type_ref)).collect::<Vec<_>>();
|
let params = fields.iter().map(|(_, field)| ctx.lower_ty(&field.type_ref));
|
||||||
let (ret, binders) =
|
let (ret, binders) =
|
||||||
type_for_adt(db, def.lookup(db.upcast()).parent.into()).into_value_and_skipped_binders();
|
type_for_adt(db, def.lookup(db.upcast()).parent.into()).into_value_and_skipped_binders();
|
||||||
Binders::new(
|
Binders::new(
|
||||||
|
|
Loading…
Reference in a new issue