aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/lib.rs
diff options
context:
space:
mode:
authorJonas Schievink <[email protected]>2020-07-14 17:23:45 +0100
committerJonas Schievink <[email protected]>2020-07-14 19:27:47 +0100
commita09d48380204fa948a3af397dc2188b93bf5793f (patch)
treee38436638e0987a8ed2d68a646a35080a5e4c6d3 /crates/ra_hir_ty/src/lib.rs
parent3f2ab436f45a4fae32514756736055819ead2baa (diff)
Thread varargs through r-a
Diffstat (limited to 'crates/ra_hir_ty/src/lib.rs')
-rw-r--r--crates/ra_hir_ty/src/lib.rs19
1 files changed, 11 insertions, 8 deletions
diff --git a/crates/ra_hir_ty/src/lib.rs b/crates/ra_hir_ty/src/lib.rs
index d54568e67..c4c24a83b 100644
--- a/crates/ra_hir_ty/src/lib.rs
+++ b/crates/ra_hir_ty/src/lib.rs
@@ -112,7 +112,7 @@ pub enum TypeCtor {
112 /// fn foo() -> i32 { 1 } 112 /// fn foo() -> i32 { 1 }
113 /// let bar: fn() -> i32 = foo; 113 /// let bar: fn() -> i32 = foo;
114 /// ``` 114 /// ```
115 FnPtr { num_args: u16 }, 115 FnPtr { num_args: u16, is_varargs: bool },
116 116
117 /// The never type `!`. 117 /// The never type `!`.
118 Never, 118 Never,
@@ -187,7 +187,7 @@ impl TypeCtor {
187 } 187 }
188 } 188 }
189 } 189 }
190 TypeCtor::FnPtr { num_args } => num_args as usize + 1, 190 TypeCtor::FnPtr { num_args, is_varargs: _ } => num_args as usize + 1,
191 TypeCtor::Tuple { cardinality } => cardinality as usize, 191 TypeCtor::Tuple { cardinality } => cardinality as usize,
192 } 192 }
193 } 193 }
@@ -667,19 +667,20 @@ pub enum TyKind {
667#[derive(Clone, PartialEq, Eq, Debug)] 667#[derive(Clone, PartialEq, Eq, Debug)]
668pub struct FnSig { 668pub struct FnSig {
669 params_and_return: Arc<[Ty]>, 669 params_and_return: Arc<[Ty]>,
670 is_varargs: bool,
670} 671}
671 672
672/// A polymorphic function signature. 673/// A polymorphic function signature.
673pub type PolyFnSig = Binders<FnSig>; 674pub type PolyFnSig = Binders<FnSig>;
674 675
675impl FnSig { 676impl FnSig {
676 pub fn from_params_and_return(mut params: Vec<Ty>, ret: Ty) -> FnSig { 677 pub fn from_params_and_return(mut params: Vec<Ty>, ret: Ty, is_varargs: bool) -> FnSig {
677 params.push(ret); 678 params.push(ret);
678 FnSig { params_and_return: params.into() } 679 FnSig { params_and_return: params.into(), is_varargs }
679 } 680 }
680 681
681 pub fn from_fn_ptr_substs(substs: &Substs) -> FnSig { 682 pub fn from_fn_ptr_substs(substs: &Substs, is_varargs: bool) -> FnSig {
682 FnSig { params_and_return: Arc::clone(&substs.0) } 683 FnSig { params_and_return: Arc::clone(&substs.0), is_varargs }
683 } 684 }
684 685
685 pub fn params(&self) -> &[Ty] { 686 pub fn params(&self) -> &[Ty] {
@@ -724,7 +725,7 @@ impl Ty {
724 } 725 }
725 pub fn fn_ptr(sig: FnSig) -> Self { 726 pub fn fn_ptr(sig: FnSig) -> Self {
726 Ty::apply( 727 Ty::apply(
727 TypeCtor::FnPtr { num_args: sig.params().len() as u16 }, 728 TypeCtor::FnPtr { num_args: sig.params().len() as u16, is_varargs: sig.is_varargs },
728 Substs(sig.params_and_return), 729 Substs(sig.params_and_return),
729 ) 730 )
730 } 731 }
@@ -821,7 +822,9 @@ impl Ty {
821 fn callable_sig(&self, db: &dyn HirDatabase) -> Option<FnSig> { 822 fn callable_sig(&self, db: &dyn HirDatabase) -> Option<FnSig> {
822 match self { 823 match self {
823 Ty::Apply(a_ty) => match a_ty.ctor { 824 Ty::Apply(a_ty) => match a_ty.ctor {
824 TypeCtor::FnPtr { .. } => Some(FnSig::from_fn_ptr_substs(&a_ty.parameters)), 825 TypeCtor::FnPtr { is_varargs, .. } => {
826 Some(FnSig::from_fn_ptr_substs(&a_ty.parameters, is_varargs))
827 }
825 TypeCtor::FnDef(def) => { 828 TypeCtor::FnDef(def) => {
826 let sig = db.callable_item_signature(def); 829 let sig = db.callable_item_signature(def);
827 Some(sig.subst(&a_ty.parameters)) 830 Some(sig.subst(&a_ty.parameters))