aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/ty.rs')
-rw-r--r--crates/ra_hir/src/ty.rs1468
1 files changed, 18 insertions, 1450 deletions
diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs
index 34f9ccd07..e505c86e3 100644
--- a/crates/ra_hir/src/ty.rs
+++ b/crates/ra_hir/src/ty.rs
@@ -1,171 +1,24 @@
1//! The type system. We currently use this to infer types for completion. 1//! The type system. We currently use this to infer types for completion, hover
2//! 2//! information and various assists.
3//! For type inference, compare the implementations in rustc (the various
4//! check_* methods in librustc_typeck/check/mod.rs are a good entry point) and
5//! IntelliJ-Rust (org.rust.lang.core.types.infer). Our entry point for
6//! inference here is the `infer` function, which infers the types of all
7//! expressions in a given function.
8//!
9//! The central struct here is `Ty`, which represents a type. During inference,
10//! it can contain type 'variables' which represent currently unknown types; as
11//! we walk through the expressions, we might determine that certain variables
12//! need to be equal to each other, or to certain types. To record this, we use
13//! the union-find implementation from the `ena` crate, which is extracted from
14//! rustc.
15 3
16mod autoderef; 4mod autoderef;
17pub(crate) mod primitive; 5pub(crate) mod primitive;
18#[cfg(test)] 6#[cfg(test)]
19mod tests; 7mod tests;
20pub(crate) mod method_resolution; 8pub(crate) mod method_resolution;
9mod op;
10mod lower;
11mod infer;
21 12
22use std::borrow::Cow;
23use std::iter::repeat;
24use std::ops::Index;
25use std::sync::Arc; 13use std::sync::Arc;
26use std::{fmt, mem}; 14use std::{fmt, mem};
27 15
28use ena::unify::{InPlaceUnificationTable, UnifyKey, UnifyValue, NoError};
29use ra_arena::map::ArenaMap;
30use join_to_string::join; 16use join_to_string::join;
31use rustc_hash::FxHashMap;
32 17
33use test_utils::tested_by; 18use crate::{Name, AdtDef, type_ref::Mutability};
34 19
35use crate::{ 20pub(crate) use lower::{TypableDef, CallableDef, type_for_def, type_for_field};
36 Function, Struct, StructField, Enum, EnumVariant, Path, Name, 21pub(crate) use infer::{infer, InferenceResult, InferTy};
37 FnSignature, ModuleDef, AdtDef,
38 HirDatabase,
39 type_ref::{TypeRef, Mutability},
40 name::{KnownName},
41 expr::{Body, Expr, BindingAnnotation, Literal, ExprId, Pat, PatId, UnaryOp, BinaryOp, Statement, FieldPat, self},
42 generics::GenericParams,
43 path::{ GenericArgs, GenericArg},
44 adt::VariantDef,
45 resolve::{Resolver, Resolution}, nameres::Namespace
46};
47
48/// The ID of a type variable.
49#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
50pub struct TypeVarId(u32);
51
52impl UnifyKey for TypeVarId {
53 type Value = TypeVarValue;
54
55 fn index(&self) -> u32 {
56 self.0
57 }
58
59 fn from_index(i: u32) -> Self {
60 TypeVarId(i)
61 }
62
63 fn tag() -> &'static str {
64 "TypeVarId"
65 }
66}
67
68/// The value of a type variable: either we already know the type, or we don't
69/// know it yet.
70#[derive(Clone, PartialEq, Eq, Debug)]
71pub enum TypeVarValue {
72 Known(Ty),
73 Unknown,
74}
75
76impl TypeVarValue {
77 fn known(&self) -> Option<&Ty> {
78 match self {
79 TypeVarValue::Known(ty) => Some(ty),
80 TypeVarValue::Unknown => None,
81 }
82 }
83}
84
85impl UnifyValue for TypeVarValue {
86 type Error = NoError;
87
88 fn unify_values(value1: &Self, value2: &Self) -> Result<Self, NoError> {
89 match (value1, value2) {
90 // We should never equate two type variables, both of which have
91 // known types. Instead, we recursively equate those types.
92 (TypeVarValue::Known(t1), TypeVarValue::Known(t2)) => panic!(
93 "equating two type variables, both of which have known types: {:?} and {:?}",
94 t1, t2
95 ),
96
97 // If one side is known, prefer that one.
98 (TypeVarValue::Known(..), TypeVarValue::Unknown) => Ok(value1.clone()),
99 (TypeVarValue::Unknown, TypeVarValue::Known(..)) => Ok(value2.clone()),
100
101 (TypeVarValue::Unknown, TypeVarValue::Unknown) => Ok(TypeVarValue::Unknown),
102 }
103 }
104}
105
106/// The kinds of placeholders we need during type inference. There's separate
107/// values for general types, and for integer and float variables. The latter
108/// two are used for inference of literal values (e.g. `100` could be one of
109/// several integer types).
110#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
111pub enum InferTy {
112 TypeVar(TypeVarId),
113 IntVar(TypeVarId),
114 FloatVar(TypeVarId),
115}
116
117impl InferTy {
118 fn to_inner(self) -> TypeVarId {
119 match self {
120 InferTy::TypeVar(ty) | InferTy::IntVar(ty) | InferTy::FloatVar(ty) => ty,
121 }
122 }
123
124 fn fallback_value(self) -> Ty {
125 match self {
126 InferTy::TypeVar(..) => Ty::Unknown,
127 InferTy::IntVar(..) => {
128 Ty::Int(primitive::UncertainIntTy::Signed(primitive::IntTy::I32))
129 }
130 InferTy::FloatVar(..) => {
131 Ty::Float(primitive::UncertainFloatTy::Known(primitive::FloatTy::F64))
132 }
133 }
134 }
135}
136
137/// When inferring an expression, we propagate downward whatever type hint we
138/// are able in the form of an `Expectation`.
139#[derive(Clone, PartialEq, Eq, Debug)]
140struct Expectation {
141 ty: Ty,
142 // TODO: In some cases, we need to be aware whether the expectation is that
143 // the type match exactly what we passed, or whether it just needs to be
144 // coercible to the expected type. See Expectation::rvalue_hint in rustc.
145}
146
147impl Expectation {
148 /// The expectation that the type of the expression needs to equal the given
149 /// type.
150 fn has_type(ty: Ty) -> Self {
151 Expectation { ty }
152 }
153
154 /// This expresses no expectation on the type.
155 fn none() -> Self {
156 Expectation { ty: Ty::Unknown }
157 }
158}
159
160/// A list of substitutions for generic parameters.
161#[derive(Clone, PartialEq, Eq, Debug)]
162pub struct Substs(Arc<[Ty]>);
163
164impl Substs {
165 pub fn empty() -> Substs {
166 Substs(Arc::new([]))
167 }
168}
169 22
170/// A type. This is based on the `TyKind` enum in rustc (librustc/ty/sty.rs). 23/// A type. This is based on the `TyKind` enum in rustc (librustc/ty/sty.rs).
171/// 24///
@@ -295,6 +148,16 @@ pub enum Ty {
295 Unknown, 148 Unknown,
296} 149}
297 150
151/// A list of substitutions for generic parameters.
152#[derive(Clone, PartialEq, Eq, Debug)]
153pub struct Substs(Arc<[Ty]>);
154
155impl Substs {
156 pub fn empty() -> Substs {
157 Substs(Arc::new([]))
158 }
159}
160
298/// A function signature. 161/// A function signature.
299#[derive(Clone, PartialEq, Eq, Debug)] 162#[derive(Clone, PartialEq, Eq, Debug)]
300pub struct FnSig { 163pub struct FnSig {
@@ -303,150 +166,6 @@ pub struct FnSig {
303} 166}
304 167
305impl Ty { 168impl Ty {
306 pub(crate) fn from_hir(db: &impl HirDatabase, resolver: &Resolver, type_ref: &TypeRef) -> Self {
307 match type_ref {
308 TypeRef::Never => Ty::Never,
309 TypeRef::Tuple(inner) => {
310 let inner_tys =
311 inner.iter().map(|tr| Ty::from_hir(db, resolver, tr)).collect::<Vec<_>>();
312 Ty::Tuple(inner_tys.into())
313 }
314 TypeRef::Path(path) => Ty::from_hir_path(db, resolver, path),
315 TypeRef::RawPtr(inner, mutability) => {
316 let inner_ty = Ty::from_hir(db, resolver, inner);
317 Ty::RawPtr(Arc::new(inner_ty), *mutability)
318 }
319 TypeRef::Array(inner) => {
320 let inner_ty = Ty::from_hir(db, resolver, inner);
321 Ty::Array(Arc::new(inner_ty))
322 }
323 TypeRef::Slice(inner) => {
324 let inner_ty = Ty::from_hir(db, resolver, inner);
325 Ty::Slice(Arc::new(inner_ty))
326 }
327 TypeRef::Reference(inner, mutability) => {
328 let inner_ty = Ty::from_hir(db, resolver, inner);
329 Ty::Ref(Arc::new(inner_ty), *mutability)
330 }
331 TypeRef::Placeholder => Ty::Unknown,
332 TypeRef::Fn(params) => {
333 let mut inner_tys =
334 params.iter().map(|tr| Ty::from_hir(db, resolver, tr)).collect::<Vec<_>>();
335 let return_ty =
336 inner_tys.pop().expect("TypeRef::Fn should always have at least return type");
337 let sig = FnSig { input: inner_tys, output: return_ty };
338 Ty::FnPtr(Arc::new(sig))
339 }
340 TypeRef::Error => Ty::Unknown,
341 }
342 }
343
344 pub(crate) fn from_hir_path(db: &impl HirDatabase, resolver: &Resolver, path: &Path) -> Self {
345 if let Some(name) = path.as_ident() {
346 // TODO handle primitive type names in resolver as well?
347 if let Some(int_ty) = primitive::UncertainIntTy::from_name(name) {
348 return Ty::Int(int_ty);
349 } else if let Some(float_ty) = primitive::UncertainFloatTy::from_name(name) {
350 return Ty::Float(float_ty);
351 } else if let Some(known) = name.as_known_name() {
352 match known {
353 KnownName::Bool => return Ty::Bool,
354 KnownName::Char => return Ty::Char,
355 KnownName::Str => return Ty::Str,
356 _ => {}
357 }
358 }
359 }
360
361 // Resolve the path (in type namespace)
362 let resolution = resolver.resolve_path(db, path).take_types();
363
364 let def = match resolution {
365 Some(Resolution::Def(def)) => def,
366 Some(Resolution::LocalBinding(..)) => {
367 // this should never happen
368 panic!("path resolved to local binding in type ns");
369 }
370 Some(Resolution::GenericParam(idx)) => {
371 return Ty::Param {
372 idx,
373 // TODO: maybe return name in resolution?
374 name: path
375 .as_ident()
376 .expect("generic param should be single-segment path")
377 .clone(),
378 };
379 }
380 Some(Resolution::SelfType(impl_block)) => {
381 return impl_block.target_ty(db);
382 }
383 None => return Ty::Unknown,
384 };
385
386 let typable: TypableDef = match def.into() {
387 None => return Ty::Unknown,
388 Some(it) => it,
389 };
390 let ty = db.type_for_def(typable, Namespace::Types);
391 let substs = Ty::substs_from_path(db, resolver, path, typable);
392 ty.apply_substs(substs)
393 }
394
395 /// Collect generic arguments from a path into a `Substs`. See also
396 /// `create_substs_for_ast_path` and `def_to_ty` in rustc.
397 fn substs_from_path(
398 db: &impl HirDatabase,
399 resolver: &Resolver,
400 path: &Path,
401 resolved: TypableDef,
402 ) -> Substs {
403 let mut substs = Vec::new();
404 let last = path.segments.last().expect("path should have at least one segment");
405 let (def_generics, segment) = match resolved {
406 TypableDef::Function(func) => (func.generic_params(db), last),
407 TypableDef::Struct(s) => (s.generic_params(db), last),
408 TypableDef::Enum(e) => (e.generic_params(db), last),
409 TypableDef::EnumVariant(var) => {
410 // the generic args for an enum variant may be either specified
411 // on the segment referring to the enum, or on the segment
412 // referring to the variant. So `Option::<T>::None` and
413 // `Option::None::<T>` are both allowed (though the former is
414 // preferred). See also `def_ids_for_path_segments` in rustc.
415 let len = path.segments.len();
416 let segment = if len >= 2 && path.segments[len - 2].args_and_bindings.is_some() {
417 // Option::<T>::None
418 &path.segments[len - 2]
419 } else {
420 // Option::None::<T>
421 last
422 };
423 (var.parent_enum(db).generic_params(db), segment)
424 }
425 };
426 let parent_param_count = def_generics.count_parent_params();
427 substs.extend((0..parent_param_count).map(|_| Ty::Unknown));
428 if let Some(generic_args) = &segment.args_and_bindings {
429 // if args are provided, it should be all of them, but we can't rely on that
430 let param_count = def_generics.params.len();
431 for arg in generic_args.args.iter().take(param_count) {
432 match arg {
433 GenericArg::Type(type_ref) => {
434 let ty = Ty::from_hir(db, resolver, type_ref);
435 substs.push(ty);
436 }
437 }
438 }
439 }
440 // add placeholders for args that were not provided
441 // TODO: handle defaults
442 let supplied_params = substs.len();
443 for _ in supplied_params..def_generics.count_params_including_parent() {
444 substs.push(Ty::Unknown);
445 }
446 assert_eq!(substs.len(), def_generics.count_params_including_parent());
447 Substs(substs.into())
448 }
449
450 pub fn unit() -> Self { 169 pub fn unit() -> Self {
451 Ty::Tuple(Arc::new([])) 170 Ty::Tuple(Arc::new([]))
452 } 171 }
@@ -652,1154 +371,3 @@ impl fmt::Display for Ty {
652 } 371 }
653 } 372 }
654} 373}
655
656// Functions returning declared types for items
657
658/// Compute the declared type of a function. This should not need to look at the
659/// function body.
660fn type_for_fn(db: &impl HirDatabase, def: Function) -> Ty {
661 let signature = def.signature(db);
662 let resolver = def.resolver(db);
663 let generics = def.generic_params(db);
664 let name = def.name(db);
665 let input =
666 signature.params().iter().map(|tr| Ty::from_hir(db, &resolver, tr)).collect::<Vec<_>>();
667 let output = Ty::from_hir(db, &resolver, signature.ret_type());
668 let sig = Arc::new(FnSig { input, output });
669 let substs = make_substs(&generics);
670 Ty::FnDef { def: def.into(), sig, name, substs }
671}
672
673/// Compute the type of a tuple struct constructor.
674fn type_for_struct_constructor(db: &impl HirDatabase, def: Struct) -> Ty {
675 let var_data = def.variant_data(db);
676 let fields = match var_data.fields() {
677 Some(fields) => fields,
678 None => return type_for_struct(db, def), // Unit struct
679 };
680 let resolver = def.resolver(db);
681 let generics = def.generic_params(db);
682 let name = def.name(db).unwrap_or_else(Name::missing);
683 let input = fields
684 .iter()
685 .map(|(_, field)| Ty::from_hir(db, &resolver, &field.type_ref))
686 .collect::<Vec<_>>();
687 let output = type_for_struct(db, def);
688 let sig = Arc::new(FnSig { input, output });
689 let substs = make_substs(&generics);
690 Ty::FnDef { def: def.into(), sig, name, substs }
691}
692
693/// Compute the type of a tuple enum variant constructor.
694fn type_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariant) -> Ty {
695 let var_data = def.variant_data(db);
696 let fields = match var_data.fields() {
697 Some(fields) => fields,
698 None => return type_for_enum(db, def.parent_enum(db)), // Unit variant
699 };
700 let resolver = def.parent_enum(db).resolver(db);
701 let generics = def.parent_enum(db).generic_params(db);
702 let name = def.name(db).unwrap_or_else(Name::missing);
703 let input = fields
704 .iter()
705 .map(|(_, field)| Ty::from_hir(db, &resolver, &field.type_ref))
706 .collect::<Vec<_>>();
707 let substs = make_substs(&generics);
708 let output = type_for_enum(db, def.parent_enum(db)).apply_substs(substs.clone());
709 let sig = Arc::new(FnSig { input, output });
710 Ty::FnDef { def: def.into(), sig, name, substs }
711}
712
713fn make_substs(generics: &GenericParams) -> Substs {
714 Substs(
715 generics
716 .params_including_parent()
717 .into_iter()
718 .map(|p| Ty::Param { idx: p.idx, name: p.name.clone() })
719 .collect::<Vec<_>>()
720 .into(),
721 )
722}
723
724fn type_for_struct(db: &impl HirDatabase, s: Struct) -> Ty {
725 let generics = s.generic_params(db);
726 Ty::Adt {
727 def_id: s.into(),
728 name: s.name(db).unwrap_or_else(Name::missing),
729 substs: make_substs(&generics),
730 }
731}
732
733fn type_for_enum(db: &impl HirDatabase, s: Enum) -> Ty {
734 let generics = s.generic_params(db);
735 Ty::Adt {
736 def_id: s.into(),
737 name: s.name(db).unwrap_or_else(Name::missing),
738 substs: make_substs(&generics),
739 }
740}
741
742#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
743pub enum TypableDef {
744 Function(Function),
745 Struct(Struct),
746 Enum(Enum),
747 EnumVariant(EnumVariant),
748}
749impl_froms!(TypableDef: Function, Struct, Enum, EnumVariant);
750
751impl From<ModuleDef> for Option<TypableDef> {
752 fn from(def: ModuleDef) -> Option<TypableDef> {
753 let res = match def {
754 ModuleDef::Function(f) => f.into(),
755 ModuleDef::Struct(s) => s.into(),
756 ModuleDef::Enum(e) => e.into(),
757 ModuleDef::EnumVariant(v) => v.into(),
758 ModuleDef::Const(_)
759 | ModuleDef::Static(_)
760 | ModuleDef::Module(_)
761 | ModuleDef::Trait(_)
762 | ModuleDef::Type(_) => return None,
763 };
764 Some(res)
765 }
766}
767
768#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
769pub enum CallableDef {
770 Function(Function),
771 Struct(Struct),
772 EnumVariant(EnumVariant),
773}
774impl_froms!(CallableDef: Function, Struct, EnumVariant);
775
776pub(super) fn type_for_def(db: &impl HirDatabase, def: TypableDef, ns: Namespace) -> Ty {
777 match (def, ns) {
778 (TypableDef::Function(f), Namespace::Values) => type_for_fn(db, f),
779 (TypableDef::Struct(s), Namespace::Types) => type_for_struct(db, s),
780 (TypableDef::Struct(s), Namespace::Values) => type_for_struct_constructor(db, s),
781 (TypableDef::Enum(e), Namespace::Types) => type_for_enum(db, e),
782 (TypableDef::EnumVariant(v), Namespace::Values) => type_for_enum_variant_constructor(db, v),
783
784 // 'error' cases:
785 (TypableDef::Function(_), Namespace::Types) => Ty::Unknown,
786 (TypableDef::Enum(_), Namespace::Values) => Ty::Unknown,
787 (TypableDef::EnumVariant(_), Namespace::Types) => Ty::Unknown,
788 }
789}
790
791pub(super) fn type_for_field(db: &impl HirDatabase, field: StructField) -> Ty {
792 let parent_def = field.parent_def(db);
793 let resolver = match parent_def {
794 VariantDef::Struct(it) => it.resolver(db),
795 VariantDef::EnumVariant(it) => it.parent_enum(db).resolver(db),
796 };
797 let var_data = parent_def.variant_data(db);
798 let type_ref = &var_data.fields().unwrap()[field.id].type_ref;
799 Ty::from_hir(db, &resolver, type_ref)
800}
801
802/// The result of type inference: A mapping from expressions and patterns to types.
803#[derive(Clone, PartialEq, Eq, Debug)]
804pub struct InferenceResult {
805 /// For each method call expr, records the function it resolves to.
806 method_resolutions: FxHashMap<ExprId, Function>,
807 /// For each field access expr, records the field it resolves to.
808 field_resolutions: FxHashMap<ExprId, StructField>,
809 type_of_expr: ArenaMap<ExprId, Ty>,
810 type_of_pat: ArenaMap<PatId, Ty>,
811}
812
813impl InferenceResult {
814 pub fn method_resolution(&self, expr: ExprId) -> Option<Function> {
815 self.method_resolutions.get(&expr).map(|it| *it)
816 }
817 pub fn field_resolution(&self, expr: ExprId) -> Option<StructField> {
818 self.field_resolutions.get(&expr).map(|it| *it)
819 }
820}
821
822impl Index<ExprId> for InferenceResult {
823 type Output = Ty;
824
825 fn index(&self, expr: ExprId) -> &Ty {
826 self.type_of_expr.get(expr).unwrap_or(&Ty::Unknown)
827 }
828}
829
830impl Index<PatId> for InferenceResult {
831 type Output = Ty;
832
833 fn index(&self, pat: PatId) -> &Ty {
834 self.type_of_pat.get(pat).unwrap_or(&Ty::Unknown)
835 }
836}
837
838/// The inference context contains all information needed during type inference.
839#[derive(Clone, Debug)]
840struct InferenceContext<'a, D: HirDatabase> {
841 db: &'a D,
842 body: Arc<Body>,
843 resolver: Resolver,
844 var_unification_table: InPlaceUnificationTable<TypeVarId>,
845 method_resolutions: FxHashMap<ExprId, Function>,
846 field_resolutions: FxHashMap<ExprId, StructField>,
847 type_of_expr: ArenaMap<ExprId, Ty>,
848 type_of_pat: ArenaMap<PatId, Ty>,
849 /// The return type of the function being inferred.
850 return_ty: Ty,
851}
852
853fn binary_op_return_ty(op: BinaryOp, rhs_ty: Ty) -> Ty {
854 match op {
855 BinaryOp::BooleanOr
856 | BinaryOp::BooleanAnd
857 | BinaryOp::EqualityTest
858 | BinaryOp::NegatedEqualityTest
859 | BinaryOp::LesserEqualTest
860 | BinaryOp::GreaterEqualTest
861 | BinaryOp::LesserTest
862 | BinaryOp::GreaterTest => Ty::Bool,
863 BinaryOp::Assignment
864 | BinaryOp::AddAssign
865 | BinaryOp::SubAssign
866 | BinaryOp::DivAssign
867 | BinaryOp::MulAssign
868 | BinaryOp::RemAssign
869 | BinaryOp::ShrAssign
870 | BinaryOp::ShlAssign
871 | BinaryOp::BitAndAssign
872 | BinaryOp::BitOrAssign
873 | BinaryOp::BitXorAssign => Ty::unit(),
874 BinaryOp::Addition
875 | BinaryOp::Subtraction
876 | BinaryOp::Multiplication
877 | BinaryOp::Division
878 | BinaryOp::Remainder
879 | BinaryOp::LeftShift
880 | BinaryOp::RightShift
881 | BinaryOp::BitwiseAnd
882 | BinaryOp::BitwiseOr
883 | BinaryOp::BitwiseXor => match rhs_ty {
884 Ty::Int(..)
885 | Ty::Float(..)
886 | Ty::Infer(InferTy::IntVar(..))
887 | Ty::Infer(InferTy::FloatVar(..)) => rhs_ty,
888 _ => Ty::Unknown,
889 },
890 BinaryOp::RangeRightOpen | BinaryOp::RangeRightClosed => Ty::Unknown,
891 }
892}
893
894fn binary_op_rhs_expectation(op: BinaryOp, lhs_ty: Ty) -> Ty {
895 match op {
896 BinaryOp::BooleanAnd | BinaryOp::BooleanOr => Ty::Bool,
897 BinaryOp::Assignment | BinaryOp::EqualityTest => match lhs_ty {
898 Ty::Int(..) | Ty::Float(..) | Ty::Str | Ty::Char | Ty::Bool => lhs_ty,
899 _ => Ty::Unknown,
900 },
901 BinaryOp::LesserEqualTest
902 | BinaryOp::GreaterEqualTest
903 | BinaryOp::LesserTest
904 | BinaryOp::GreaterTest
905 | BinaryOp::AddAssign
906 | BinaryOp::SubAssign
907 | BinaryOp::DivAssign
908 | BinaryOp::MulAssign
909 | BinaryOp::RemAssign
910 | BinaryOp::ShrAssign
911 | BinaryOp::ShlAssign
912 | BinaryOp::BitAndAssign
913 | BinaryOp::BitOrAssign
914 | BinaryOp::BitXorAssign
915 | BinaryOp::Addition
916 | BinaryOp::Subtraction
917 | BinaryOp::Multiplication
918 | BinaryOp::Division
919 | BinaryOp::Remainder
920 | BinaryOp::LeftShift
921 | BinaryOp::RightShift
922 | BinaryOp::BitwiseAnd
923 | BinaryOp::BitwiseOr
924 | BinaryOp::BitwiseXor => match lhs_ty {
925 Ty::Int(..) | Ty::Float(..) => lhs_ty,
926 _ => Ty::Unknown,
927 },
928 _ => Ty::Unknown,
929 }
930}
931
932impl<'a, D: HirDatabase> InferenceContext<'a, D> {
933 fn new(db: &'a D, body: Arc<Body>, resolver: Resolver) -> Self {
934 InferenceContext {
935 method_resolutions: FxHashMap::default(),
936 field_resolutions: FxHashMap::default(),
937 type_of_expr: ArenaMap::default(),
938 type_of_pat: ArenaMap::default(),
939 var_unification_table: InPlaceUnificationTable::new(),
940 return_ty: Ty::Unknown, // set in collect_fn_signature
941 db,
942 body,
943 resolver,
944 }
945 }
946
947 fn resolve_all(mut self) -> InferenceResult {
948 let mut tv_stack = Vec::new();
949 let mut expr_types = mem::replace(&mut self.type_of_expr, ArenaMap::default());
950 for ty in expr_types.values_mut() {
951 let resolved = self.resolve_ty_completely(&mut tv_stack, mem::replace(ty, Ty::Unknown));
952 *ty = resolved;
953 }
954 let mut pat_types = mem::replace(&mut self.type_of_pat, ArenaMap::default());
955 for ty in pat_types.values_mut() {
956 let resolved = self.resolve_ty_completely(&mut tv_stack, mem::replace(ty, Ty::Unknown));
957 *ty = resolved;
958 }
959 InferenceResult {
960 method_resolutions: self.method_resolutions,
961 field_resolutions: self.field_resolutions,
962 type_of_expr: expr_types,
963 type_of_pat: pat_types,
964 }
965 }
966
967 fn write_expr_ty(&mut self, expr: ExprId, ty: Ty) {
968 self.type_of_expr.insert(expr, ty);
969 }
970
971 fn write_method_resolution(&mut self, expr: ExprId, func: Function) {
972 self.method_resolutions.insert(expr, func);
973 }
974
975 fn write_field_resolution(&mut self, expr: ExprId, field: StructField) {
976 self.field_resolutions.insert(expr, field);
977 }
978
979 fn write_pat_ty(&mut self, pat: PatId, ty: Ty) {
980 self.type_of_pat.insert(pat, ty);
981 }
982
983 fn make_ty(&mut self, type_ref: &TypeRef) -> Ty {
984 let ty = Ty::from_hir(
985 self.db,
986 // TODO use right resolver for block
987 &self.resolver,
988 type_ref,
989 );
990 let ty = self.insert_type_vars(ty);
991 ty
992 }
993
994 fn unify_substs(&mut self, substs1: &Substs, substs2: &Substs, depth: usize) -> bool {
995 substs1.0.iter().zip(substs2.0.iter()).all(|(t1, t2)| self.unify_inner(t1, t2, depth))
996 }
997
998 fn unify(&mut self, ty1: &Ty, ty2: &Ty) -> bool {
999 self.unify_inner(ty1, ty2, 0)
1000 }
1001
1002 fn unify_inner(&mut self, ty1: &Ty, ty2: &Ty, depth: usize) -> bool {
1003 if depth > 1000 {
1004 // prevent stackoverflows
1005 panic!("infinite recursion in unification");
1006 }
1007 if ty1 == ty2 {
1008 return true;
1009 }
1010 // try to resolve type vars first
1011 let ty1 = self.resolve_ty_shallow(ty1);
1012 let ty2 = self.resolve_ty_shallow(ty2);
1013 match (&*ty1, &*ty2) {
1014 (Ty::Unknown, ..) => true,
1015 (.., Ty::Unknown) => true,
1016 (Ty::Int(t1), Ty::Int(t2)) => match (t1, t2) {
1017 (primitive::UncertainIntTy::Unknown, _)
1018 | (_, primitive::UncertainIntTy::Unknown) => true,
1019 _ => t1 == t2,
1020 },
1021 (Ty::Float(t1), Ty::Float(t2)) => match (t1, t2) {
1022 (primitive::UncertainFloatTy::Unknown, _)
1023 | (_, primitive::UncertainFloatTy::Unknown) => true,
1024 _ => t1 == t2,
1025 },
1026 (Ty::Bool, _) | (Ty::Str, _) | (Ty::Never, _) | (Ty::Char, _) => ty1 == ty2,
1027 (
1028 Ty::Adt { def_id: def_id1, substs: substs1, .. },
1029 Ty::Adt { def_id: def_id2, substs: substs2, .. },
1030 ) if def_id1 == def_id2 => self.unify_substs(substs1, substs2, depth + 1),
1031 (Ty::Slice(t1), Ty::Slice(t2)) => self.unify_inner(t1, t2, depth + 1),
1032 (Ty::RawPtr(t1, m1), Ty::RawPtr(t2, m2)) if m1 == m2 => {
1033 self.unify_inner(t1, t2, depth + 1)
1034 }
1035 (Ty::Ref(t1, m1), Ty::Ref(t2, m2)) if m1 == m2 => self.unify_inner(t1, t2, depth + 1),
1036 (Ty::FnPtr(sig1), Ty::FnPtr(sig2)) if sig1 == sig2 => true,
1037 (Ty::Tuple(ts1), Ty::Tuple(ts2)) if ts1.len() == ts2.len() => {
1038 ts1.iter().zip(ts2.iter()).all(|(t1, t2)| self.unify_inner(t1, t2, depth + 1))
1039 }
1040 (Ty::Infer(InferTy::TypeVar(tv1)), Ty::Infer(InferTy::TypeVar(tv2)))
1041 | (Ty::Infer(InferTy::IntVar(tv1)), Ty::Infer(InferTy::IntVar(tv2)))
1042 | (Ty::Infer(InferTy::FloatVar(tv1)), Ty::Infer(InferTy::FloatVar(tv2))) => {
1043 // both type vars are unknown since we tried to resolve them
1044 self.var_unification_table.union(*tv1, *tv2);
1045 true
1046 }
1047 (Ty::Infer(InferTy::TypeVar(tv)), other)
1048 | (other, Ty::Infer(InferTy::TypeVar(tv)))
1049 | (Ty::Infer(InferTy::IntVar(tv)), other)
1050 | (other, Ty::Infer(InferTy::IntVar(tv)))
1051 | (Ty::Infer(InferTy::FloatVar(tv)), other)
1052 | (other, Ty::Infer(InferTy::FloatVar(tv))) => {
1053 // the type var is unknown since we tried to resolve it
1054 self.var_unification_table.union_value(*tv, TypeVarValue::Known(other.clone()));
1055 true
1056 }
1057 _ => false,
1058 }
1059 }
1060
1061 fn new_type_var(&mut self) -> Ty {
1062 Ty::Infer(InferTy::TypeVar(self.var_unification_table.new_key(TypeVarValue::Unknown)))
1063 }
1064
1065 fn new_integer_var(&mut self) -> Ty {
1066 Ty::Infer(InferTy::IntVar(self.var_unification_table.new_key(TypeVarValue::Unknown)))
1067 }
1068
1069 fn new_float_var(&mut self) -> Ty {
1070 Ty::Infer(InferTy::FloatVar(self.var_unification_table.new_key(TypeVarValue::Unknown)))
1071 }
1072
1073 /// Replaces Ty::Unknown by a new type var, so we can maybe still infer it.
1074 fn insert_type_vars_shallow(&mut self, ty: Ty) -> Ty {
1075 match ty {
1076 Ty::Unknown => self.new_type_var(),
1077 Ty::Int(primitive::UncertainIntTy::Unknown) => self.new_integer_var(),
1078 Ty::Float(primitive::UncertainFloatTy::Unknown) => self.new_float_var(),
1079 _ => ty,
1080 }
1081 }
1082
1083 fn insert_type_vars(&mut self, ty: Ty) -> Ty {
1084 ty.fold(&mut |ty| self.insert_type_vars_shallow(ty))
1085 }
1086
1087 /// Resolves the type as far as currently possible, replacing type variables
1088 /// by their known types. All types returned by the infer_* functions should
1089 /// be resolved as far as possible, i.e. contain no type variables with
1090 /// known type.
1091 fn resolve_ty_as_possible(&mut self, tv_stack: &mut Vec<TypeVarId>, ty: Ty) -> Ty {
1092 ty.fold(&mut |ty| match ty {
1093 Ty::Infer(tv) => {
1094 let inner = tv.to_inner();
1095 if tv_stack.contains(&inner) {
1096 tested_by!(type_var_cycles_resolve_as_possible);
1097 // recursive type
1098 return tv.fallback_value();
1099 }
1100 if let Some(known_ty) = self.var_unification_table.probe_value(inner).known() {
1101 // known_ty may contain other variables that are known by now
1102 tv_stack.push(inner);
1103 let result = self.resolve_ty_as_possible(tv_stack, known_ty.clone());
1104 tv_stack.pop();
1105 result
1106 } else {
1107 ty
1108 }
1109 }
1110 _ => ty,
1111 })
1112 }
1113
1114 /// If `ty` is a type variable with known type, returns that type;
1115 /// otherwise, return ty.
1116 fn resolve_ty_shallow<'b>(&mut self, ty: &'b Ty) -> Cow<'b, Ty> {
1117 let mut ty = Cow::Borrowed(ty);
1118 // The type variable could resolve to a int/float variable. Hence try
1119 // resolving up to three times; each type of variable shouldn't occur
1120 // more than once
1121 for i in 0..3 {
1122 if i > 0 {
1123 tested_by!(type_var_resolves_to_int_var);
1124 }
1125 match &*ty {
1126 Ty::Infer(tv) => {
1127 let inner = tv.to_inner();
1128 match self.var_unification_table.probe_value(inner).known() {
1129 Some(known_ty) => {
1130 // The known_ty can't be a type var itself
1131 ty = Cow::Owned(known_ty.clone());
1132 }
1133 _ => return ty,
1134 }
1135 }
1136 _ => return ty,
1137 }
1138 }
1139 log::error!("Inference variable still not resolved: {:?}", ty);
1140 ty
1141 }
1142
1143 /// Resolves the type completely; type variables without known type are
1144 /// replaced by Ty::Unknown.
1145 fn resolve_ty_completely(&mut self, tv_stack: &mut Vec<TypeVarId>, ty: Ty) -> Ty {
1146 ty.fold(&mut |ty| match ty {
1147 Ty::Infer(tv) => {
1148 let inner = tv.to_inner();
1149 if tv_stack.contains(&inner) {
1150 tested_by!(type_var_cycles_resolve_completely);
1151 // recursive type
1152 return tv.fallback_value();
1153 }
1154 if let Some(known_ty) = self.var_unification_table.probe_value(inner).known() {
1155 // known_ty may contain other variables that are known by now
1156 tv_stack.push(inner);
1157 let result = self.resolve_ty_completely(tv_stack, known_ty.clone());
1158 tv_stack.pop();
1159 result
1160 } else {
1161 tv.fallback_value()
1162 }
1163 }
1164 _ => ty,
1165 })
1166 }
1167
1168 fn infer_path_expr(&mut self, resolver: &Resolver, path: &Path) -> Option<Ty> {
1169 let resolved = resolver.resolve_path_segments(self.db, &path);
1170
1171 let (def, remaining_index) = resolved.into_inner();
1172
1173 log::debug!(
1174 "path {:?} resolved to {:?} with remaining index {:?}",
1175 path,
1176 def,
1177 remaining_index
1178 );
1179
1180 // if the remaining_index is None, we expect the path
1181 // to be fully resolved, in this case we continue with
1182 // the default by attempting to `take_values´ from the resolution.
1183 // Otherwise the path was partially resolved, which means
1184 // we might have resolved into a type for which
1185 // we may find some associated item starting at the
1186 // path.segment pointed to by `remaining_index´
1187 let resolved =
1188 if remaining_index.is_none() { def.take_values()? } else { def.take_types()? };
1189
1190 match resolved {
1191 Resolution::Def(def) => {
1192 let typable: Option<TypableDef> = def.into();
1193 let typable = typable?;
1194
1195 if let Some(remaining_index) = remaining_index {
1196 let ty = self.db.type_for_def(typable, Namespace::Types);
1197 // TODO: Keep resolving the segments
1198 // if we have more segments to process
1199 let segment = &path.segments[remaining_index];
1200
1201 log::debug!("looking for path segment: {:?}", segment);
1202
1203 // Attempt to find an impl_item for the type which has a name matching
1204 // the current segment
1205 let ty = ty.iterate_impl_items(self.db, |item| match item {
1206 crate::ImplItem::Method(func) => {
1207 let sig = func.signature(self.db);
1208 if segment.name == *sig.name() {
1209 return Some(type_for_fn(self.db, func));
1210 }
1211 None
1212 }
1213
1214 // TODO: Resolve associated const
1215 crate::ImplItem::Const(_) => None,
1216
1217 // TODO: Resolve associated types
1218 crate::ImplItem::Type(_) => None,
1219 });
1220 ty
1221 } else {
1222 let substs = Ty::substs_from_path(self.db, &self.resolver, path, typable);
1223 let ty = self.db.type_for_def(typable, Namespace::Values).apply_substs(substs);
1224 let ty = self.insert_type_vars(ty);
1225 Some(ty)
1226 }
1227 }
1228 Resolution::LocalBinding(pat) => {
1229 let ty = self.type_of_pat.get(pat)?;
1230 let ty = self.resolve_ty_as_possible(&mut vec![], ty.clone());
1231 Some(ty)
1232 }
1233 Resolution::GenericParam(..) => {
1234 // generic params can't refer to values... yet
1235 None
1236 }
1237 Resolution::SelfType(_) => {
1238 log::error!("path expr {:?} resolved to Self type in values ns", path);
1239 None
1240 }
1241 }
1242 }
1243
1244 fn resolve_variant(&mut self, path: Option<&Path>) -> (Ty, Option<VariantDef>) {
1245 let path = match path {
1246 Some(path) => path,
1247 None => return (Ty::Unknown, None),
1248 };
1249 let resolver = &self.resolver;
1250 let typable: Option<TypableDef> = match resolver.resolve_path(self.db, &path).take_types() {
1251 Some(Resolution::Def(def)) => def.into(),
1252 Some(Resolution::LocalBinding(..)) => {
1253 // this cannot happen
1254 log::error!("path resolved to local binding in type ns");
1255 return (Ty::Unknown, None);
1256 }
1257 Some(Resolution::GenericParam(..)) => {
1258 // generic params can't be used in struct literals
1259 return (Ty::Unknown, None);
1260 }
1261 Some(Resolution::SelfType(..)) => {
1262 // TODO this is allowed in an impl for a struct, handle this
1263 return (Ty::Unknown, None);
1264 }
1265 None => return (Ty::Unknown, None),
1266 };
1267 let def = match typable {
1268 None => return (Ty::Unknown, None),
1269 Some(it) => it,
1270 };
1271 // TODO remove the duplication between here and `Ty::from_path`?
1272 let substs = Ty::substs_from_path(self.db, resolver, path, def);
1273 match def {
1274 TypableDef::Struct(s) => {
1275 let ty = s.ty(self.db);
1276 let ty = self.insert_type_vars(ty.apply_substs(substs));
1277 (ty, Some(s.into()))
1278 }
1279 TypableDef::EnumVariant(var) => {
1280 let ty = var.parent_enum(self.db).ty(self.db);
1281 let ty = self.insert_type_vars(ty.apply_substs(substs));
1282 (ty, Some(var.into()))
1283 }
1284 TypableDef::Function(_) | TypableDef::Enum(_) => (Ty::Unknown, None),
1285 }
1286 }
1287
1288 fn infer_tuple_struct_pat(
1289 &mut self,
1290 path: Option<&Path>,
1291 subpats: &[PatId],
1292 expected: &Ty,
1293 ) -> Ty {
1294 let (ty, def) = self.resolve_variant(path);
1295
1296 self.unify(&ty, expected);
1297
1298 let substs = ty.substs().unwrap_or_else(Substs::empty);
1299
1300 for (i, &subpat) in subpats.iter().enumerate() {
1301 let expected_ty = def
1302 .and_then(|d| d.field(self.db, &Name::tuple_field_name(i)))
1303 .map_or(Ty::Unknown, |field| field.ty(self.db))
1304 .subst(&substs);
1305 self.infer_pat(subpat, &expected_ty);
1306 }
1307
1308 ty
1309 }
1310
1311 fn infer_struct_pat(&mut self, path: Option<&Path>, subpats: &[FieldPat], expected: &Ty) -> Ty {
1312 let (ty, def) = self.resolve_variant(path);
1313
1314 self.unify(&ty, expected);
1315
1316 let substs = ty.substs().unwrap_or_else(Substs::empty);
1317
1318 for subpat in subpats {
1319 let matching_field = def.and_then(|it| it.field(self.db, &subpat.name));
1320 let expected_ty =
1321 matching_field.map_or(Ty::Unknown, |field| field.ty(self.db)).subst(&substs);
1322 self.infer_pat(subpat.pat, &expected_ty);
1323 }
1324
1325 ty
1326 }
1327
1328 fn infer_pat(&mut self, pat: PatId, expected: &Ty) -> Ty {
1329 let body = Arc::clone(&self.body); // avoid borrow checker problem
1330
1331 let ty = match &body[pat] {
1332 Pat::Tuple(ref args) => {
1333 let expectations = match *expected {
1334 Ty::Tuple(ref tuple_args) => &**tuple_args,
1335 _ => &[],
1336 };
1337 let expectations_iter = expectations.iter().chain(repeat(&Ty::Unknown));
1338
1339 let inner_tys = args
1340 .iter()
1341 .zip(expectations_iter)
1342 .map(|(&pat, ty)| self.infer_pat(pat, ty))
1343 .collect::<Vec<_>>()
1344 .into();
1345
1346 Ty::Tuple(inner_tys)
1347 }
1348 Pat::Ref { pat, mutability } => {
1349 let expectation = match *expected {
1350 Ty::Ref(ref sub_ty, exp_mut) => {
1351 if *mutability != exp_mut {
1352 // TODO: emit type error?
1353 }
1354 &**sub_ty
1355 }
1356 _ => &Ty::Unknown,
1357 };
1358 let subty = self.infer_pat(*pat, expectation);
1359 Ty::Ref(subty.into(), *mutability)
1360 }
1361 Pat::TupleStruct { path: ref p, args: ref subpats } => {
1362 self.infer_tuple_struct_pat(p.as_ref(), subpats, expected)
1363 }
1364 Pat::Struct { path: ref p, args: ref fields } => {
1365 self.infer_struct_pat(p.as_ref(), fields, expected)
1366 }
1367 Pat::Path(path) => {
1368 // TODO use correct resolver for the surrounding expression
1369 let resolver = self.resolver.clone();
1370 self.infer_path_expr(&resolver, &path).unwrap_or(Ty::Unknown)
1371 }
1372 Pat::Bind { mode, name: _name, subpat } => {
1373 let inner_ty = if let Some(subpat) = subpat {
1374 self.infer_pat(*subpat, expected)
1375 } else {
1376 expected.clone()
1377 };
1378 let inner_ty = self.insert_type_vars_shallow(inner_ty);
1379
1380 let bound_ty = match mode {
1381 BindingAnnotation::Ref => Ty::Ref(inner_ty.clone().into(), Mutability::Shared),
1382 BindingAnnotation::RefMut => Ty::Ref(inner_ty.clone().into(), Mutability::Mut),
1383 BindingAnnotation::Mutable | BindingAnnotation::Unannotated => inner_ty.clone(),
1384 };
1385 let bound_ty = self.resolve_ty_as_possible(&mut vec![], bound_ty);
1386 self.write_pat_ty(pat, bound_ty);
1387 return inner_ty;
1388 }
1389 _ => Ty::Unknown,
1390 };
1391 // use a new type variable if we got Ty::Unknown here
1392 let ty = self.insert_type_vars_shallow(ty);
1393 self.unify(&ty, expected);
1394 let ty = self.resolve_ty_as_possible(&mut vec![], ty);
1395 self.write_pat_ty(pat, ty.clone());
1396 ty
1397 }
1398
1399 fn substs_for_method_call(
1400 &mut self,
1401 def_generics: Option<Arc<GenericParams>>,
1402 generic_args: &Option<GenericArgs>,
1403 ) -> Substs {
1404 let (parent_param_count, param_count) =
1405 def_generics.map_or((0, 0), |g| (g.count_parent_params(), g.params.len()));
1406 let mut substs = Vec::with_capacity(parent_param_count + param_count);
1407 for _ in 0..parent_param_count {
1408 substs.push(Ty::Unknown);
1409 }
1410 // handle provided type arguments
1411 if let Some(generic_args) = generic_args {
1412 // if args are provided, it should be all of them, but we can't rely on that
1413 for arg in generic_args.args.iter().take(param_count) {
1414 match arg {
1415 GenericArg::Type(type_ref) => {
1416 let ty = self.make_ty(type_ref);
1417 substs.push(ty);
1418 }
1419 }
1420 }
1421 };
1422 let supplied_params = substs.len();
1423 for _ in supplied_params..parent_param_count + param_count {
1424 substs.push(Ty::Unknown);
1425 }
1426 assert_eq!(substs.len(), parent_param_count + param_count);
1427 Substs(substs.into())
1428 }
1429
1430 fn infer_expr(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty {
1431 let body = Arc::clone(&self.body); // avoid borrow checker problem
1432 let ty = match &body[tgt_expr] {
1433 Expr::Missing => Ty::Unknown,
1434 Expr::If { condition, then_branch, else_branch } => {
1435 // if let is desugared to match, so this is always simple if
1436 self.infer_expr(*condition, &Expectation::has_type(Ty::Bool));
1437 let then_ty = self.infer_expr(*then_branch, expected);
1438 match else_branch {
1439 Some(else_branch) => {
1440 self.infer_expr(*else_branch, expected);
1441 }
1442 None => {
1443 // no else branch -> unit
1444 self.unify(&then_ty, &Ty::unit()); // actually coerce
1445 }
1446 };
1447 then_ty
1448 }
1449 Expr::Block { statements, tail } => self.infer_block(statements, *tail, expected),
1450 Expr::Loop { body } => {
1451 self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
1452 // TODO handle break with value
1453 Ty::Never
1454 }
1455 Expr::While { condition, body } => {
1456 // while let is desugared to a match loop, so this is always simple while
1457 self.infer_expr(*condition, &Expectation::has_type(Ty::Bool));
1458 self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
1459 Ty::unit()
1460 }
1461 Expr::For { iterable, body, pat } => {
1462 let _iterable_ty = self.infer_expr(*iterable, &Expectation::none());
1463 self.infer_pat(*pat, &Ty::Unknown);
1464 self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
1465 Ty::unit()
1466 }
1467 Expr::Lambda { body, args, arg_types } => {
1468 assert_eq!(args.len(), arg_types.len());
1469
1470 for (arg_pat, arg_type) in args.iter().zip(arg_types.iter()) {
1471 let expected = if let Some(type_ref) = arg_type {
1472 let ty = self.make_ty(type_ref);
1473 ty
1474 } else {
1475 Ty::Unknown
1476 };
1477 self.infer_pat(*arg_pat, &expected);
1478 }
1479
1480 // TODO: infer lambda type etc.
1481 let _body_ty = self.infer_expr(*body, &Expectation::none());
1482 Ty::Unknown
1483 }
1484 Expr::Call { callee, args } => {
1485 let callee_ty = self.infer_expr(*callee, &Expectation::none());
1486 let (param_tys, ret_ty) = match &callee_ty {
1487 Ty::FnPtr(sig) => (sig.input.clone(), sig.output.clone()),
1488 Ty::FnDef { substs, sig, .. } => {
1489 let ret_ty = sig.output.clone().subst(&substs);
1490 let param_tys =
1491 sig.input.iter().map(|ty| ty.clone().subst(&substs)).collect();
1492 (param_tys, ret_ty)
1493 }
1494 _ => {
1495 // not callable
1496 // TODO report an error?
1497 (Vec::new(), Ty::Unknown)
1498 }
1499 };
1500 let param_iter = param_tys.into_iter().chain(repeat(Ty::Unknown));
1501 for (arg, param) in args.iter().zip(param_iter) {
1502 self.infer_expr(*arg, &Expectation::has_type(param));
1503 }
1504 ret_ty
1505 }
1506 Expr::MethodCall { receiver, args, method_name, generic_args } => {
1507 let receiver_ty = self.infer_expr(*receiver, &Expectation::none());
1508 let resolved = receiver_ty.clone().lookup_method(self.db, method_name);
1509 let (derefed_receiver_ty, method_ty, def_generics) = match resolved {
1510 Some((ty, func)) => {
1511 self.write_method_resolution(tgt_expr, func);
1512 (
1513 ty,
1514 self.db.type_for_def(func.into(), Namespace::Values),
1515 Some(func.generic_params(self.db)),
1516 )
1517 }
1518 None => (Ty::Unknown, receiver_ty, None),
1519 };
1520 let substs = self.substs_for_method_call(def_generics, generic_args);
1521 let method_ty = method_ty.apply_substs(substs);
1522 let method_ty = self.insert_type_vars(method_ty);
1523 let (expected_receiver_ty, param_tys, ret_ty) = match &method_ty {
1524 Ty::FnPtr(sig) => {
1525 if !sig.input.is_empty() {
1526 (sig.input[0].clone(), sig.input[1..].to_vec(), sig.output.clone())
1527 } else {
1528 (Ty::Unknown, Vec::new(), sig.output.clone())
1529 }
1530 }
1531 Ty::FnDef { substs, sig, .. } => {
1532 let ret_ty = sig.output.clone().subst(&substs);
1533
1534 if !sig.input.is_empty() {
1535 let mut arg_iter = sig.input.iter().map(|ty| ty.clone().subst(&substs));
1536 let receiver_ty = arg_iter.next().unwrap();
1537 (receiver_ty, arg_iter.collect(), ret_ty)
1538 } else {
1539 (Ty::Unknown, Vec::new(), ret_ty)
1540 }
1541 }
1542 _ => (Ty::Unknown, Vec::new(), Ty::Unknown),
1543 };
1544 // Apply autoref so the below unification works correctly
1545 let actual_receiver_ty = match expected_receiver_ty {
1546 Ty::Ref(_, mutability) => Ty::Ref(Arc::new(derefed_receiver_ty), mutability),
1547 _ => derefed_receiver_ty,
1548 };
1549 self.unify(&expected_receiver_ty, &actual_receiver_ty);
1550
1551 let param_iter = param_tys.into_iter().chain(repeat(Ty::Unknown));
1552 for (arg, param) in args.iter().zip(param_iter) {
1553 self.infer_expr(*arg, &Expectation::has_type(param));
1554 }
1555 ret_ty
1556 }
1557 Expr::Match { expr, arms } => {
1558 let expected = if expected.ty == Ty::Unknown {
1559 Expectation::has_type(self.new_type_var())
1560 } else {
1561 expected.clone()
1562 };
1563 let input_ty = self.infer_expr(*expr, &Expectation::none());
1564
1565 for arm in arms {
1566 for &pat in &arm.pats {
1567 let _pat_ty = self.infer_pat(pat, &input_ty);
1568 }
1569 if let Some(guard_expr) = arm.guard {
1570 self.infer_expr(guard_expr, &Expectation::has_type(Ty::Bool));
1571 }
1572 self.infer_expr(arm.expr, &expected);
1573 }
1574
1575 expected.ty
1576 }
1577 Expr::Path(p) => {
1578 // TODO this could be more efficient...
1579 let resolver = expr::resolver_for_expr(self.body.clone(), self.db, tgt_expr);
1580 self.infer_path_expr(&resolver, p).unwrap_or(Ty::Unknown)
1581 }
1582 Expr::Continue => Ty::Never,
1583 Expr::Break { expr } => {
1584 if let Some(expr) = expr {
1585 // TODO handle break with value
1586 self.infer_expr(*expr, &Expectation::none());
1587 }
1588 Ty::Never
1589 }
1590 Expr::Return { expr } => {
1591 if let Some(expr) = expr {
1592 self.infer_expr(*expr, &Expectation::has_type(self.return_ty.clone()));
1593 }
1594 Ty::Never
1595 }
1596 Expr::StructLit { path, fields, spread } => {
1597 let (ty, def_id) = self.resolve_variant(path.as_ref());
1598 let substs = ty.substs().unwrap_or_else(Substs::empty);
1599 for field in fields {
1600 let field_ty = def_id
1601 .and_then(|it| it.field(self.db, &field.name))
1602 .map_or(Ty::Unknown, |field| field.ty(self.db))
1603 .subst(&substs);
1604 self.infer_expr(field.expr, &Expectation::has_type(field_ty));
1605 }
1606 if let Some(expr) = spread {
1607 self.infer_expr(*expr, &Expectation::has_type(ty.clone()));
1608 }
1609 ty
1610 }
1611 Expr::Field { expr, name } => {
1612 let receiver_ty = self.infer_expr(*expr, &Expectation::none());
1613 let ty = receiver_ty
1614 .autoderef(self.db)
1615 .find_map(|derefed_ty| match derefed_ty {
1616 Ty::Tuple(fields) => {
1617 let i = name.to_string().parse::<usize>().ok();
1618 i.and_then(|i| fields.get(i).cloned())
1619 }
1620 Ty::Adt { def_id: AdtDef::Struct(s), ref substs, .. } => {
1621 s.field(self.db, name).map(|field| {
1622 self.write_field_resolution(tgt_expr, field);
1623 field.ty(self.db).subst(substs)
1624 })
1625 }
1626 _ => None,
1627 })
1628 .unwrap_or(Ty::Unknown);
1629 self.insert_type_vars(ty)
1630 }
1631 Expr::Try { expr } => {
1632 let _inner_ty = self.infer_expr(*expr, &Expectation::none());
1633 Ty::Unknown
1634 }
1635 Expr::Cast { expr, type_ref } => {
1636 let _inner_ty = self.infer_expr(*expr, &Expectation::none());
1637 let cast_ty = self.make_ty(type_ref);
1638 // TODO check the cast...
1639 cast_ty
1640 }
1641 Expr::Ref { expr, mutability } => {
1642 let expectation = if let Ty::Ref(ref subty, expected_mutability) = expected.ty {
1643 if expected_mutability == Mutability::Mut && *mutability == Mutability::Shared {
1644 // TODO: throw type error - expected mut reference but found shared ref,
1645 // which cannot be coerced
1646 }
1647 Expectation::has_type((**subty).clone())
1648 } else {
1649 Expectation::none()
1650 };
1651 // TODO reference coercions etc.
1652 let inner_ty = self.infer_expr(*expr, &expectation);
1653 Ty::Ref(Arc::new(inner_ty), *mutability)
1654 }
1655 Expr::UnaryOp { expr, op } => {
1656 let inner_ty = self.infer_expr(*expr, &Expectation::none());
1657 match op {
1658 UnaryOp::Deref => {
1659 if let Some(derefed_ty) = inner_ty.builtin_deref() {
1660 derefed_ty
1661 } else {
1662 // TODO Deref::deref
1663 Ty::Unknown
1664 }
1665 }
1666 UnaryOp::Neg => {
1667 match inner_ty {
1668 Ty::Int(primitive::UncertainIntTy::Unknown)
1669 | Ty::Int(primitive::UncertainIntTy::Signed(..))
1670 | Ty::Infer(InferTy::IntVar(..))
1671 | Ty::Infer(InferTy::FloatVar(..))
1672 | Ty::Float(..) => inner_ty,
1673 // TODO: resolve ops::Neg trait
1674 _ => Ty::Unknown,
1675 }
1676 }
1677 UnaryOp::Not => {
1678 match inner_ty {
1679 Ty::Bool | Ty::Int(_) | Ty::Infer(InferTy::IntVar(..)) => inner_ty,
1680 // TODO: resolve ops::Not trait for inner_ty
1681 _ => Ty::Unknown,
1682 }
1683 }
1684 }
1685 }
1686 Expr::BinaryOp { lhs, rhs, op } => match op {
1687 Some(op) => {
1688 let lhs_expectation = match op {
1689 BinaryOp::BooleanAnd | BinaryOp::BooleanOr => {
1690 Expectation::has_type(Ty::Bool)
1691 }
1692 _ => Expectation::none(),
1693 };
1694 let lhs_ty = self.infer_expr(*lhs, &lhs_expectation);
1695 // TODO: find implementation of trait corresponding to operation
1696 // symbol and resolve associated `Output` type
1697 let rhs_expectation = binary_op_rhs_expectation(*op, lhs_ty);
1698 let rhs_ty = self.infer_expr(*rhs, &Expectation::has_type(rhs_expectation));
1699
1700 // TODO: similar as above, return ty is often associated trait type
1701 binary_op_return_ty(*op, rhs_ty)
1702 }
1703 _ => Ty::Unknown,
1704 },
1705 Expr::Tuple { exprs } => {
1706 let mut ty_vec = Vec::with_capacity(exprs.len());
1707 for arg in exprs.iter() {
1708 ty_vec.push(self.infer_expr(*arg, &Expectation::none()));
1709 }
1710
1711 Ty::Tuple(Arc::from(ty_vec))
1712 }
1713 Expr::Array { exprs } => {
1714 let elem_ty = match &expected.ty {
1715 Ty::Slice(inner) | Ty::Array(inner) => Ty::clone(&inner),
1716 _ => self.new_type_var(),
1717 };
1718
1719 for expr in exprs.iter() {
1720 self.infer_expr(*expr, &Expectation::has_type(elem_ty.clone()));
1721 }
1722
1723 Ty::Array(Arc::new(elem_ty))
1724 }
1725 Expr::Literal(lit) => match lit {
1726 Literal::Bool(..) => Ty::Bool,
1727 Literal::String(..) => Ty::Ref(Arc::new(Ty::Str), Mutability::Shared),
1728 Literal::ByteString(..) => {
1729 let byte_type = Arc::new(Ty::Int(primitive::UncertainIntTy::Unsigned(
1730 primitive::UintTy::U8,
1731 )));
1732 let slice_type = Arc::new(Ty::Slice(byte_type));
1733 Ty::Ref(slice_type, Mutability::Shared)
1734 }
1735 Literal::Char(..) => Ty::Char,
1736 Literal::Int(_v, ty) => Ty::Int(*ty),
1737 Literal::Float(_v, ty) => Ty::Float(*ty),
1738 },
1739 };
1740 // use a new type variable if we got Ty::Unknown here
1741 let ty = self.insert_type_vars_shallow(ty);
1742 self.unify(&ty, &expected.ty);
1743 let ty = self.resolve_ty_as_possible(&mut vec![], ty);
1744 self.write_expr_ty(tgt_expr, ty.clone());
1745 ty
1746 }
1747
1748 fn infer_block(
1749 &mut self,
1750 statements: &[Statement],
1751 tail: Option<ExprId>,
1752 expected: &Expectation,
1753 ) -> Ty {
1754 for stmt in statements {
1755 match stmt {
1756 Statement::Let { pat, type_ref, initializer } => {
1757 let decl_ty =
1758 type_ref.as_ref().map(|tr| self.make_ty(tr)).unwrap_or(Ty::Unknown);
1759 let decl_ty = self.insert_type_vars(decl_ty);
1760 let ty = if let Some(expr) = initializer {
1761 let expr_ty = self.infer_expr(*expr, &Expectation::has_type(decl_ty));
1762 expr_ty
1763 } else {
1764 decl_ty
1765 };
1766
1767 self.infer_pat(*pat, &ty);
1768 }
1769 Statement::Expr(expr) => {
1770 self.infer_expr(*expr, &Expectation::none());
1771 }
1772 }
1773 }
1774 let ty = if let Some(expr) = tail { self.infer_expr(expr, expected) } else { Ty::unit() };
1775 ty
1776 }
1777
1778 fn collect_fn_signature(&mut self, signature: &FnSignature) {
1779 let body = Arc::clone(&self.body); // avoid borrow checker problem
1780 for (type_ref, pat) in signature.params().iter().zip(body.params()) {
1781 let ty = self.make_ty(type_ref);
1782
1783 self.infer_pat(*pat, &ty);
1784 }
1785 self.return_ty = self.make_ty(signature.ret_type());
1786 }
1787
1788 fn infer_body(&mut self) {
1789 self.infer_expr(self.body.body_expr(), &Expectation::has_type(self.return_ty.clone()));
1790 }
1791}
1792
1793pub fn infer(db: &impl HirDatabase, func: Function) -> Arc<InferenceResult> {
1794 db.check_canceled();
1795 let body = func.body(db);
1796 let resolver = func.resolver(db);
1797 let mut ctx = InferenceContext::new(db, body, resolver);
1798
1799 let signature = func.signature(db);
1800 ctx.collect_fn_signature(&signature);
1801
1802 ctx.infer_body();
1803
1804 Arc::new(ctx.resolve_all())
1805}