diff options
Diffstat (limited to 'crates/ra_hir_ty/src/lib.rs')
-rw-r--r-- | crates/ra_hir_ty/src/lib.rs | 19 |
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)] |
668 | pub struct FnSig { | 668 | pub 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. |
673 | pub type PolyFnSig = Binders<FnSig>; | 674 | pub type PolyFnSig = Binders<FnSig>; |
674 | 675 | ||
675 | impl FnSig { | 676 | impl 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)) |