diff options
author | Zac Pullar-Strecker <[email protected]> | 2020-07-31 03:12:44 +0100 |
---|---|---|
committer | Zac Pullar-Strecker <[email protected]> | 2020-07-31 03:12:44 +0100 |
commit | f05d7b41a719d848844b054a16477b29d0f063c6 (patch) | |
tree | 0a8a0946e8aef2ce64d4c13d0035ba41cce2daf3 /crates/ra_hir_ty/src/lib.rs | |
parent | 73ff610e41959e3e7c78a2b4b25b086883132956 (diff) | |
parent | 6b7cb8b5ab539fc4333ce34bc29bf77c976f232a (diff) |
Merge remote-tracking branch 'upstream/master' into 503-hover-doc-links
Hasn't fixed tests yet.
Diffstat (limited to 'crates/ra_hir_ty/src/lib.rs')
-rw-r--r-- | crates/ra_hir_ty/src/lib.rs | 107 |
1 files changed, 40 insertions, 67 deletions
diff --git a/crates/ra_hir_ty/src/lib.rs b/crates/ra_hir_ty/src/lib.rs index c9513b752..7698cb0d4 100644 --- a/crates/ra_hir_ty/src/lib.rs +++ b/crates/ra_hir_ty/src/lib.rs | |||
@@ -6,25 +6,6 @@ macro_rules! eprintln { | |||
6 | ($($tt:tt)*) => { stdx::eprintln!($($tt)*) }; | 6 | ($($tt:tt)*) => { stdx::eprintln!($($tt)*) }; |
7 | } | 7 | } |
8 | 8 | ||
9 | macro_rules! impl_froms { | ||
10 | ($e:ident: $($v:ident $(($($sv:ident),*))?),*) => { | ||
11 | $( | ||
12 | impl From<$v> for $e { | ||
13 | fn from(it: $v) -> $e { | ||
14 | $e::$v(it) | ||
15 | } | ||
16 | } | ||
17 | $($( | ||
18 | impl From<$sv> for $e { | ||
19 | fn from(it: $sv) -> $e { | ||
20 | $e::$v($v::$sv(it)) | ||
21 | } | ||
22 | } | ||
23 | )*)? | ||
24 | )* | ||
25 | } | ||
26 | } | ||
27 | |||
28 | mod autoderef; | 9 | mod autoderef; |
29 | pub mod primitive; | 10 | pub mod primitive; |
30 | pub mod traits; | 11 | pub mod traits; |
@@ -32,22 +13,18 @@ pub mod method_resolution; | |||
32 | mod op; | 13 | mod op; |
33 | mod lower; | 14 | mod lower; |
34 | pub(crate) mod infer; | 15 | pub(crate) mod infer; |
35 | pub mod display; | ||
36 | pub(crate) mod utils; | 16 | pub(crate) mod utils; |
17 | |||
18 | pub mod display; | ||
37 | pub mod db; | 19 | pub mod db; |
38 | pub mod diagnostics; | 20 | pub mod diagnostics; |
39 | pub mod expr; | ||
40 | pub mod unsafe_validation; | ||
41 | 21 | ||
42 | #[cfg(test)] | 22 | #[cfg(test)] |
43 | mod tests; | 23 | mod tests; |
44 | #[cfg(test)] | 24 | #[cfg(test)] |
45 | mod test_db; | 25 | mod test_db; |
46 | mod _match; | ||
47 | 26 | ||
48 | use std::ops::Deref; | 27 | use std::{iter, mem, ops::Deref, sync::Arc}; |
49 | use std::sync::Arc; | ||
50 | use std::{iter, mem}; | ||
51 | 28 | ||
52 | use hir_def::{ | 29 | use hir_def::{ |
53 | expr::ExprId, | 30 | expr::ExprId, |
@@ -55,18 +32,19 @@ use hir_def::{ | |||
55 | AdtId, AssocContainerId, DefWithBodyId, GenericDefId, HasModule, Lookup, TraitId, TypeAliasId, | 32 | AdtId, AssocContainerId, DefWithBodyId, GenericDefId, HasModule, Lookup, TraitId, TypeAliasId, |
56 | TypeParamId, | 33 | TypeParamId, |
57 | }; | 34 | }; |
58 | use ra_db::{impl_intern_key, salsa, CrateId}; | 35 | use itertools::Itertools; |
36 | use ra_db::{salsa, CrateId}; | ||
59 | 37 | ||
60 | use crate::{ | 38 | use crate::{ |
61 | db::HirDatabase, | 39 | db::HirDatabase, |
40 | display::HirDisplay, | ||
62 | primitive::{FloatTy, IntTy}, | 41 | primitive::{FloatTy, IntTy}, |
63 | utils::{generics, make_mut_slice, Generics}, | 42 | utils::{generics, make_mut_slice, Generics}, |
64 | }; | 43 | }; |
65 | use display::HirDisplay; | ||
66 | 44 | ||
67 | pub use autoderef::autoderef; | 45 | pub use autoderef::autoderef; |
68 | pub use infer::{InferTy, InferenceResult}; | 46 | pub use infer::{InferTy, InferenceResult}; |
69 | pub use lower::CallableDef; | 47 | pub use lower::CallableDefId; |
70 | pub use lower::{ | 48 | pub use lower::{ |
71 | associated_type_shorthand_candidates, callable_item_sig, ImplTraitLoweringMode, TyDefId, | 49 | associated_type_shorthand_candidates, callable_item_sig, ImplTraitLoweringMode, TyDefId, |
72 | TyLoweringContext, ValueTyDefId, | 50 | TyLoweringContext, ValueTyDefId, |
@@ -74,7 +52,6 @@ pub use lower::{ | |||
74 | pub use traits::{InEnvironment, Obligation, ProjectionPredicate, TraitEnvironment}; | 52 | pub use traits::{InEnvironment, Obligation, ProjectionPredicate, TraitEnvironment}; |
75 | 53 | ||
76 | pub use chalk_ir::{BoundVar, DebruijnIndex}; | 54 | pub use chalk_ir::{BoundVar, DebruijnIndex}; |
77 | use itertools::Itertools; | ||
78 | 55 | ||
79 | /// A type constructor or type name: this might be something like the primitive | 56 | /// A type constructor or type name: this might be something like the primitive |
80 | /// type `bool`, a struct like `Vec`, or things like function pointers or | 57 | /// type `bool`, a struct like `Vec`, or things like function pointers or |
@@ -125,7 +102,7 @@ pub enum TypeCtor { | |||
125 | /// fn foo() -> i32 { 1 } | 102 | /// fn foo() -> i32 { 1 } |
126 | /// let bar = foo; // bar: fn() -> i32 {foo} | 103 | /// let bar = foo; // bar: fn() -> i32 {foo} |
127 | /// ``` | 104 | /// ``` |
128 | FnDef(CallableDef), | 105 | FnDef(CallableDefId), |
129 | 106 | ||
130 | /// A pointer to a function. Written as `fn() -> i32`. | 107 | /// A pointer to a function. Written as `fn() -> i32`. |
131 | /// | 108 | /// |
@@ -135,7 +112,8 @@ pub enum TypeCtor { | |||
135 | /// fn foo() -> i32 { 1 } | 112 | /// fn foo() -> i32 { 1 } |
136 | /// let bar: fn() -> i32 = foo; | 113 | /// let bar: fn() -> i32 = foo; |
137 | /// ``` | 114 | /// ``` |
138 | FnPtr { num_args: u16 }, | 115 | // FIXME make this a Ty variant like in Chalk |
116 | FnPtr { num_args: u16, is_varargs: bool }, | ||
139 | 117 | ||
140 | /// The never type `!`. | 118 | /// The never type `!`. |
141 | Never, | 119 | Never, |
@@ -162,19 +140,6 @@ pub enum TypeCtor { | |||
162 | Closure { def: DefWithBodyId, expr: ExprId }, | 140 | Closure { def: DefWithBodyId, expr: ExprId }, |
163 | } | 141 | } |
164 | 142 | ||
165 | /// This exists just for Chalk, because Chalk just has a single `StructId` where | ||
166 | /// we have different kinds of ADTs, primitive types and special type | ||
167 | /// constructors like tuples and function pointers. | ||
168 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)] | ||
169 | pub struct TypeCtorId(salsa::InternId); | ||
170 | impl_intern_key!(TypeCtorId); | ||
171 | |||
172 | /// This exists just for Chalk, because Chalk just has a single `FnDefId` where | ||
173 | /// we have different IDs for struct and enum variant constructors. | ||
174 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)] | ||
175 | pub struct CallableDefId(salsa::InternId); | ||
176 | impl_intern_key!(CallableDefId); | ||
177 | |||
178 | impl TypeCtor { | 143 | impl TypeCtor { |
179 | pub fn num_ty_params(self, db: &dyn HirDatabase) -> usize { | 144 | pub fn num_ty_params(self, db: &dyn HirDatabase) -> usize { |
180 | match self { | 145 | match self { |
@@ -210,7 +175,7 @@ impl TypeCtor { | |||
210 | } | 175 | } |
211 | } | 176 | } |
212 | } | 177 | } |
213 | TypeCtor::FnPtr { num_args } => num_args as usize + 1, | 178 | TypeCtor::FnPtr { num_args, is_varargs: _ } => num_args as usize + 1, |
214 | TypeCtor::Tuple { cardinality } => cardinality as usize, | 179 | TypeCtor::Tuple { cardinality } => cardinality as usize, |
215 | } | 180 | } |
216 | } | 181 | } |
@@ -662,13 +627,27 @@ impl TypeWalk for GenericPredicate { | |||
662 | 627 | ||
663 | /// Basically a claim (currently not validated / checked) that the contained | 628 | /// Basically a claim (currently not validated / checked) that the contained |
664 | /// type / trait ref contains no inference variables; any inference variables it | 629 | /// type / trait ref contains no inference variables; any inference variables it |
665 | /// contained have been replaced by bound variables, and `num_vars` tells us how | 630 | /// contained have been replaced by bound variables, and `kinds` tells us how |
666 | /// many there are. This is used to erase irrelevant differences between types | 631 | /// many there are and whether they were normal or float/int variables. This is |
667 | /// before using them in queries. | 632 | /// used to erase irrelevant differences between types before using them in |
633 | /// queries. | ||
668 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 634 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
669 | pub struct Canonical<T> { | 635 | pub struct Canonical<T> { |
670 | pub value: T, | 636 | pub value: T, |
671 | pub num_vars: usize, | 637 | pub kinds: Arc<[TyKind]>, |
638 | } | ||
639 | |||
640 | impl<T> Canonical<T> { | ||
641 | pub fn new(value: T, kinds: impl IntoIterator<Item = TyKind>) -> Self { | ||
642 | Self { value, kinds: kinds.into_iter().collect() } | ||
643 | } | ||
644 | } | ||
645 | |||
646 | #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] | ||
647 | pub enum TyKind { | ||
648 | General, | ||
649 | Integer, | ||
650 | Float, | ||
672 | } | 651 | } |
673 | 652 | ||
674 | /// A function signature as seen by type inference: Several parameter types and | 653 | /// A function signature as seen by type inference: Several parameter types and |
@@ -676,19 +655,20 @@ pub struct Canonical<T> { | |||
676 | #[derive(Clone, PartialEq, Eq, Debug)] | 655 | #[derive(Clone, PartialEq, Eq, Debug)] |
677 | pub struct FnSig { | 656 | pub struct FnSig { |
678 | params_and_return: Arc<[Ty]>, | 657 | params_and_return: Arc<[Ty]>, |
658 | is_varargs: bool, | ||
679 | } | 659 | } |
680 | 660 | ||
681 | /// A polymorphic function signature. | 661 | /// A polymorphic function signature. |
682 | pub type PolyFnSig = Binders<FnSig>; | 662 | pub type PolyFnSig = Binders<FnSig>; |
683 | 663 | ||
684 | impl FnSig { | 664 | impl FnSig { |
685 | pub fn from_params_and_return(mut params: Vec<Ty>, ret: Ty) -> FnSig { | 665 | pub fn from_params_and_return(mut params: Vec<Ty>, ret: Ty, is_varargs: bool) -> FnSig { |
686 | params.push(ret); | 666 | params.push(ret); |
687 | FnSig { params_and_return: params.into() } | 667 | FnSig { params_and_return: params.into(), is_varargs } |
688 | } | 668 | } |
689 | 669 | ||
690 | pub fn from_fn_ptr_substs(substs: &Substs) -> FnSig { | 670 | pub fn from_fn_ptr_substs(substs: &Substs, is_varargs: bool) -> FnSig { |
691 | FnSig { params_and_return: Arc::clone(&substs.0) } | 671 | FnSig { params_and_return: Arc::clone(&substs.0), is_varargs } |
692 | } | 672 | } |
693 | 673 | ||
694 | pub fn params(&self) -> &[Ty] { | 674 | pub fn params(&self) -> &[Ty] { |
@@ -733,7 +713,7 @@ impl Ty { | |||
733 | } | 713 | } |
734 | pub fn fn_ptr(sig: FnSig) -> Self { | 714 | pub fn fn_ptr(sig: FnSig) -> Self { |
735 | Ty::apply( | 715 | Ty::apply( |
736 | TypeCtor::FnPtr { num_args: sig.params().len() as u16 }, | 716 | TypeCtor::FnPtr { num_args: sig.params().len() as u16, is_varargs: sig.is_varargs }, |
737 | Substs(sig.params_and_return), | 717 | Substs(sig.params_and_return), |
738 | ) | 718 | ) |
739 | } | 719 | } |
@@ -787,15 +767,6 @@ impl Ty { | |||
787 | } | 767 | } |
788 | } | 768 | } |
789 | 769 | ||
790 | pub fn as_callable(&self) -> Option<(CallableDef, &Substs)> { | ||
791 | match self { | ||
792 | Ty::Apply(ApplicationTy { ctor: TypeCtor::FnDef(callable_def), parameters }) => { | ||
793 | Some((*callable_def, parameters)) | ||
794 | } | ||
795 | _ => None, | ||
796 | } | ||
797 | } | ||
798 | |||
799 | pub fn is_never(&self) -> bool { | 770 | pub fn is_never(&self) -> bool { |
800 | matches!(self, Ty::Apply(ApplicationTy { ctor: TypeCtor::Never, .. })) | 771 | matches!(self, Ty::Apply(ApplicationTy { ctor: TypeCtor::Never, .. })) |
801 | } | 772 | } |
@@ -827,10 +798,12 @@ impl Ty { | |||
827 | } | 798 | } |
828 | } | 799 | } |
829 | 800 | ||
830 | fn callable_sig(&self, db: &dyn HirDatabase) -> Option<FnSig> { | 801 | pub fn callable_sig(&self, db: &dyn HirDatabase) -> Option<FnSig> { |
831 | match self { | 802 | match self { |
832 | Ty::Apply(a_ty) => match a_ty.ctor { | 803 | Ty::Apply(a_ty) => match a_ty.ctor { |
833 | TypeCtor::FnPtr { .. } => Some(FnSig::from_fn_ptr_substs(&a_ty.parameters)), | 804 | TypeCtor::FnPtr { is_varargs, .. } => { |
805 | Some(FnSig::from_fn_ptr_substs(&a_ty.parameters, is_varargs)) | ||
806 | } | ||
834 | TypeCtor::FnDef(def) => { | 807 | TypeCtor::FnDef(def) => { |
835 | let sig = db.callable_item_signature(def); | 808 | let sig = db.callable_item_signature(def); |
836 | Some(sig.subst(&a_ty.parameters)) | 809 | Some(sig.subst(&a_ty.parameters)) |
@@ -877,7 +850,7 @@ impl Ty { | |||
877 | let data = (*it) | 850 | let data = (*it) |
878 | .as_ref() | 851 | .as_ref() |
879 | .map(|rpit| rpit.impl_traits[idx as usize].bounds.clone()); | 852 | .map(|rpit| rpit.impl_traits[idx as usize].bounds.clone()); |
880 | data.clone().subst(&opaque_ty.parameters) | 853 | data.subst(&opaque_ty.parameters) |
881 | }) | 854 | }) |
882 | } | 855 | } |
883 | }; | 856 | }; |