]> git.lizzy.rs Git - rust.git/blob - crates/hir_ty/src/infer/expr.rs
2cdce2cefcee0dbc65c82a07085069f39dd9fb87
[rust.git] / crates / hir_ty / src / infer / expr.rs
1 //! Type inference for expressions.
2
3 use std::iter::{repeat, repeat_with};
4 use std::{mem, sync::Arc};
5
6 use hir_def::{
7     builtin_type::Signedness,
8     expr::{Array, BinaryOp, Expr, ExprId, Literal, Statement, UnaryOp},
9     path::{GenericArg, GenericArgs},
10     resolver::resolver_for_expr,
11     AdtId, AssocContainerId, FieldId, Lookup,
12 };
13 use hir_expand::name::{name, Name};
14 use syntax::ast::RangeOp;
15 use test_utils::mark;
16
17 use crate::{
18     autoderef, method_resolution, op,
19     traits::{FnTrait, InEnvironment},
20     utils::{generics, variant_data, Generics},
21     ApplicationTy, Binders, CallableDefId, InferTy, IntTy, Mutability, Obligation, OpaqueTyId,
22     Rawness, Substs, TraitRef, Ty, TypeCtor,
23 };
24
25 use super::{
26     find_breakable, BindingMode, BreakableContext, Diverges, Expectation, InferenceContext,
27     InferenceDiagnostic, TypeMismatch,
28 };
29
30 impl<'a> InferenceContext<'a> {
31     pub(super) fn infer_expr(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty {
32         let ty = self.infer_expr_inner(tgt_expr, expected);
33         if ty.is_never() {
34             // Any expression that produces a value of type `!` must have diverged
35             self.diverges = Diverges::Always;
36         }
37         let could_unify = self.unify(&ty, &expected.ty);
38         if !could_unify {
39             self.result.type_mismatches.insert(
40                 tgt_expr,
41                 TypeMismatch { expected: expected.ty.clone(), actual: ty.clone() },
42             );
43         }
44         self.resolve_ty_as_possible(ty)
45     }
46
47     /// Infer type of expression with possibly implicit coerce to the expected type.
48     /// Return the type after possible coercion.
49     pub(super) fn infer_expr_coerce(&mut self, expr: ExprId, expected: &Expectation) -> Ty {
50         let ty = self.infer_expr_inner(expr, &expected);
51         let ty = if !self.coerce(&ty, &expected.coercion_target()) {
52             self.result
53                 .type_mismatches
54                 .insert(expr, TypeMismatch { expected: expected.ty.clone(), actual: ty.clone() });
55             // Return actual type when type mismatch.
56             // This is needed for diagnostic when return type mismatch.
57             ty
58         } else if expected.coercion_target() == &Ty::Unknown {
59             ty
60         } else {
61             expected.ty.clone()
62         };
63
64         self.resolve_ty_as_possible(ty)
65     }
66
67     fn callable_sig_from_fn_trait(&mut self, ty: &Ty, num_args: usize) -> Option<(Vec<Ty>, Ty)> {
68         let krate = self.resolver.krate()?;
69         let fn_once_trait = FnTrait::FnOnce.get_id(self.db, krate)?;
70         let output_assoc_type =
71             self.db.trait_data(fn_once_trait).associated_type_by_name(&name![Output])?;
72         let generic_params = generics(self.db.upcast(), fn_once_trait.into());
73         if generic_params.len() != 2 {
74             return None;
75         }
76
77         let mut param_builder = Substs::builder(num_args);
78         let mut arg_tys = vec![];
79         for _ in 0..num_args {
80             let arg = self.table.new_type_var();
81             param_builder = param_builder.push(arg.clone());
82             arg_tys.push(arg);
83         }
84         let parameters = param_builder.build();
85         let arg_ty = Ty::Apply(ApplicationTy {
86             ctor: TypeCtor::Tuple { cardinality: num_args as u16 },
87             parameters,
88         });
89         let substs =
90             Substs::build_for_generics(&generic_params).push(ty.clone()).push(arg_ty).build();
91
92         let trait_env = Arc::clone(&self.trait_env);
93         let implements_fn_trait =
94             Obligation::Trait(TraitRef { trait_: fn_once_trait, substs: substs.clone() });
95         let goal = self.canonicalizer().canonicalize_obligation(InEnvironment {
96             value: implements_fn_trait.clone(),
97             environment: trait_env,
98         });
99         if self.db.trait_solve(krate, goal.value).is_some() {
100             self.obligations.push(implements_fn_trait);
101             let output_proj_ty =
102                 crate::ProjectionTy { associated_ty: output_assoc_type, parameters: substs };
103             let return_ty = self.normalize_projection_ty(output_proj_ty);
104             Some((arg_tys, return_ty))
105         } else {
106             None
107         }
108     }
109
110     pub(crate) fn callable_sig(&mut self, ty: &Ty, num_args: usize) -> Option<(Vec<Ty>, Ty)> {
111         match ty.callable_sig(self.db) {
112             Some(sig) => Some((sig.params().to_vec(), sig.ret().clone())),
113             None => self.callable_sig_from_fn_trait(ty, num_args),
114         }
115     }
116
117     fn infer_expr_inner(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty {
118         let body = Arc::clone(&self.body); // avoid borrow checker problem
119         let ty = match &body[tgt_expr] {
120             Expr::Missing => Ty::Unknown,
121             Expr::If { condition, then_branch, else_branch } => {
122                 // if let is desugared to match, so this is always simple if
123                 self.infer_expr(*condition, &Expectation::has_type(Ty::simple(TypeCtor::Bool)));
124
125                 let condition_diverges = mem::replace(&mut self.diverges, Diverges::Maybe);
126                 let mut both_arms_diverge = Diverges::Always;
127
128                 let then_ty = self.infer_expr_inner(*then_branch, &expected);
129                 both_arms_diverge &= mem::replace(&mut self.diverges, Diverges::Maybe);
130                 let else_ty = match else_branch {
131                     Some(else_branch) => self.infer_expr_inner(*else_branch, &expected),
132                     None => Ty::unit(),
133                 };
134                 both_arms_diverge &= self.diverges;
135
136                 self.diverges = condition_diverges | both_arms_diverge;
137
138                 self.coerce_merge_branch(&then_ty, &else_ty)
139             }
140             Expr::Block { statements, tail, label } => match label {
141                 Some(_) => {
142                     let break_ty = self.table.new_type_var();
143                     self.breakables.push(BreakableContext {
144                         may_break: false,
145                         break_ty: break_ty.clone(),
146                         label: label.clone(),
147                     });
148                     let ty = self.infer_block(statements, *tail, &Expectation::has_type(break_ty));
149                     let ctxt = self.breakables.pop().expect("breakable stack broken");
150                     if ctxt.may_break {
151                         ctxt.break_ty
152                     } else {
153                         ty
154                     }
155                 }
156                 None => self.infer_block(statements, *tail, expected),
157             },
158             Expr::Unsafe { body } => self.infer_expr(*body, expected),
159             Expr::TryBlock { body } => {
160                 let _inner = self.infer_expr(*body, expected);
161                 // FIXME should be std::result::Result<{inner}, _>
162                 Ty::Unknown
163             }
164             Expr::Async { body } => {
165                 // Use the first type parameter as the output type of future.
166                 // existenail type AsyncBlockImplTrait<InnerType>: Future<Output = InnerType>
167                 let inner_ty = self.infer_expr(*body, &Expectation::none());
168                 let opaque_ty_id = OpaqueTyId::AsyncBlockTypeImplTrait(self.owner, *body);
169                 Ty::apply_one(TypeCtor::OpaqueType(opaque_ty_id), inner_ty)
170             }
171             Expr::Loop { body, label } => {
172                 self.breakables.push(BreakableContext {
173                     may_break: false,
174                     break_ty: self.table.new_type_var(),
175                     label: label.clone(),
176                 });
177                 self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
178
179                 let ctxt = self.breakables.pop().expect("breakable stack broken");
180                 if ctxt.may_break {
181                     self.diverges = Diverges::Maybe;
182                 }
183
184                 if ctxt.may_break {
185                     ctxt.break_ty
186                 } else {
187                     Ty::simple(TypeCtor::Never)
188                 }
189             }
190             Expr::While { condition, body, label } => {
191                 self.breakables.push(BreakableContext {
192                     may_break: false,
193                     break_ty: Ty::Unknown,
194                     label: label.clone(),
195                 });
196                 // while let is desugared to a match loop, so this is always simple while
197                 self.infer_expr(*condition, &Expectation::has_type(Ty::simple(TypeCtor::Bool)));
198                 self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
199                 let _ctxt = self.breakables.pop().expect("breakable stack broken");
200                 // the body may not run, so it diverging doesn't mean we diverge
201                 self.diverges = Diverges::Maybe;
202                 Ty::unit()
203             }
204             Expr::For { iterable, body, pat, label } => {
205                 let iterable_ty = self.infer_expr(*iterable, &Expectation::none());
206
207                 self.breakables.push(BreakableContext {
208                     may_break: false,
209                     break_ty: Ty::Unknown,
210                     label: label.clone(),
211                 });
212                 let pat_ty =
213                     self.resolve_associated_type(iterable_ty, self.resolve_into_iter_item());
214
215                 self.infer_pat(*pat, &pat_ty, BindingMode::default());
216
217                 self.infer_expr(*body, &Expectation::has_type(Ty::unit()));
218                 let _ctxt = self.breakables.pop().expect("breakable stack broken");
219                 // the body may not run, so it diverging doesn't mean we diverge
220                 self.diverges = Diverges::Maybe;
221                 Ty::unit()
222             }
223             Expr::Lambda { body, args, ret_type, arg_types } => {
224                 assert_eq!(args.len(), arg_types.len());
225
226                 let mut sig_tys = Vec::new();
227
228                 // collect explicitly written argument types
229                 for arg_type in arg_types.iter() {
230                     let arg_ty = if let Some(type_ref) = arg_type {
231                         self.make_ty(type_ref)
232                     } else {
233                         self.table.new_type_var()
234                     };
235                     sig_tys.push(arg_ty);
236                 }
237
238                 // add return type
239                 let ret_ty = match ret_type {
240                     Some(type_ref) => self.make_ty(type_ref),
241                     None => self.table.new_type_var(),
242                 };
243                 sig_tys.push(ret_ty.clone());
244                 let sig_ty = Ty::apply(
245                     TypeCtor::FnPtr { num_args: sig_tys.len() as u16 - 1, is_varargs: false },
246                     Substs(sig_tys.clone().into()),
247                 );
248                 let closure_ty =
249                     Ty::apply_one(TypeCtor::Closure { def: self.owner, expr: tgt_expr }, sig_ty);
250
251                 // Eagerly try to relate the closure type with the expected
252                 // type, otherwise we often won't have enough information to
253                 // infer the body.
254                 self.coerce(&closure_ty, &expected.ty);
255
256                 // Now go through the argument patterns
257                 for (arg_pat, arg_ty) in args.iter().zip(sig_tys) {
258                     let resolved = self.resolve_ty_as_possible(arg_ty);
259                     self.infer_pat(*arg_pat, &resolved, BindingMode::default());
260                 }
261
262                 let prev_diverges = mem::replace(&mut self.diverges, Diverges::Maybe);
263                 let prev_ret_ty = mem::replace(&mut self.return_ty, ret_ty.clone());
264
265                 self.infer_expr_coerce(*body, &Expectation::has_type(ret_ty));
266
267                 self.diverges = prev_diverges;
268                 self.return_ty = prev_ret_ty;
269
270                 closure_ty
271             }
272             Expr::Call { callee, args } => {
273                 let callee_ty = self.infer_expr(*callee, &Expectation::none());
274                 let canonicalized = self.canonicalizer().canonicalize_ty(callee_ty.clone());
275                 let mut derefs = autoderef(
276                     self.db,
277                     self.resolver.krate(),
278                     InEnvironment {
279                         value: canonicalized.value.clone(),
280                         environment: self.trait_env.clone(),
281                     },
282                 );
283                 let (param_tys, ret_ty): (Vec<Ty>, Ty) = derefs
284                     .find_map(|callee_deref_ty| {
285                         self.callable_sig(
286                             &canonicalized.decanonicalize_ty(callee_deref_ty.value),
287                             args.len(),
288                         )
289                     })
290                     .unwrap_or((Vec::new(), Ty::Unknown));
291                 self.register_obligations_for_call(&callee_ty);
292                 self.check_call_arguments(args, &param_tys);
293                 self.normalize_associated_types_in(ret_ty)
294             }
295             Expr::MethodCall { receiver, args, method_name, generic_args } => self
296                 .infer_method_call(tgt_expr, *receiver, &args, &method_name, generic_args.as_ref()),
297             Expr::Match { expr, arms } => {
298                 let input_ty = self.infer_expr(*expr, &Expectation::none());
299
300                 let mut result_ty = if arms.is_empty() {
301                     Ty::simple(TypeCtor::Never)
302                 } else {
303                     self.table.new_type_var()
304                 };
305
306                 let matchee_diverges = self.diverges;
307                 let mut all_arms_diverge = Diverges::Always;
308
309                 for arm in arms {
310                     self.diverges = Diverges::Maybe;
311                     let _pat_ty = self.infer_pat(arm.pat, &input_ty, BindingMode::default());
312                     if let Some(guard_expr) = arm.guard {
313                         self.infer_expr(
314                             guard_expr,
315                             &Expectation::has_type(Ty::simple(TypeCtor::Bool)),
316                         );
317                     }
318
319                     let arm_ty = self.infer_expr_inner(arm.expr, &expected);
320                     all_arms_diverge &= self.diverges;
321                     result_ty = self.coerce_merge_branch(&result_ty, &arm_ty);
322                 }
323
324                 self.diverges = matchee_diverges | all_arms_diverge;
325
326                 result_ty
327             }
328             Expr::Path(p) => {
329                 // FIXME this could be more efficient...
330                 let resolver = resolver_for_expr(self.db.upcast(), self.owner, tgt_expr);
331                 self.infer_path(&resolver, p, tgt_expr.into()).unwrap_or(Ty::Unknown)
332             }
333             Expr::Continue { .. } => Ty::simple(TypeCtor::Never),
334             Expr::Break { expr, label } => {
335                 let val_ty = if let Some(expr) = expr {
336                     self.infer_expr(*expr, &Expectation::none())
337                 } else {
338                     Ty::unit()
339                 };
340
341                 let last_ty =
342                     if let Some(ctxt) = find_breakable(&mut self.breakables, label.as_ref()) {
343                         ctxt.break_ty.clone()
344                     } else {
345                         Ty::Unknown
346                     };
347
348                 let merged_type = self.coerce_merge_branch(&last_ty, &val_ty);
349
350                 if let Some(ctxt) = find_breakable(&mut self.breakables, label.as_ref()) {
351                     ctxt.break_ty = merged_type;
352                     ctxt.may_break = true;
353                 } else {
354                     self.push_diagnostic(InferenceDiagnostic::BreakOutsideOfLoop {
355                         expr: tgt_expr,
356                     });
357                 }
358
359                 Ty::simple(TypeCtor::Never)
360             }
361             Expr::Return { expr } => {
362                 if let Some(expr) = expr {
363                     self.infer_expr_coerce(*expr, &Expectation::has_type(self.return_ty.clone()));
364                 } else {
365                     let unit = Ty::unit();
366                     self.coerce(&unit, &self.return_ty.clone());
367                 }
368                 Ty::simple(TypeCtor::Never)
369             }
370             Expr::RecordLit { path, fields, spread } => {
371                 let (ty, def_id) = self.resolve_variant(path.as_ref());
372                 if let Some(variant) = def_id {
373                     self.write_variant_resolution(tgt_expr.into(), variant);
374                 }
375
376                 self.unify(&ty, &expected.ty);
377
378                 let substs = ty.substs().unwrap_or_else(Substs::empty);
379                 let field_types = def_id.map(|it| self.db.field_types(it)).unwrap_or_default();
380                 let variant_data = def_id.map(|it| variant_data(self.db.upcast(), it));
381                 for (field_idx, field) in fields.iter().enumerate() {
382                     let field_def =
383                         variant_data.as_ref().and_then(|it| match it.field(&field.name) {
384                             Some(local_id) => Some(FieldId { parent: def_id.unwrap(), local_id }),
385                             None => {
386                                 self.push_diagnostic(InferenceDiagnostic::NoSuchField {
387                                     expr: tgt_expr,
388                                     field: field_idx,
389                                 });
390                                 None
391                             }
392                         });
393                     if let Some(field_def) = field_def {
394                         self.result.record_field_resolutions.insert(field.expr, field_def);
395                     }
396                     let field_ty = field_def
397                         .map_or(Ty::Unknown, |it| field_types[it.local_id].clone().subst(&substs));
398                     self.infer_expr_coerce(field.expr, &Expectation::has_type(field_ty));
399                 }
400                 if let Some(expr) = spread {
401                     self.infer_expr(*expr, &Expectation::has_type(ty.clone()));
402                 }
403                 ty
404             }
405             Expr::Field { expr, name } => {
406                 let receiver_ty = self.infer_expr_inner(*expr, &Expectation::none());
407                 let canonicalized = self.canonicalizer().canonicalize_ty(receiver_ty);
408                 let ty = autoderef::autoderef(
409                     self.db,
410                     self.resolver.krate(),
411                     InEnvironment {
412                         value: canonicalized.value.clone(),
413                         environment: self.trait_env.clone(),
414                     },
415                 )
416                 .find_map(|derefed_ty| match canonicalized.decanonicalize_ty(derefed_ty.value) {
417                     Ty::Apply(a_ty) => match a_ty.ctor {
418                         TypeCtor::Tuple { .. } => name
419                             .as_tuple_index()
420                             .and_then(|idx| a_ty.parameters.0.get(idx).cloned()),
421                         TypeCtor::Adt(AdtId::StructId(s)) => {
422                             self.db.struct_data(s).variant_data.field(name).map(|local_id| {
423                                 let field = FieldId { parent: s.into(), local_id };
424                                 self.write_field_resolution(tgt_expr, field);
425                                 self.db.field_types(s.into())[field.local_id]
426                                     .clone()
427                                     .subst(&a_ty.parameters)
428                             })
429                         }
430                         TypeCtor::Adt(AdtId::UnionId(u)) => {
431                             self.db.union_data(u).variant_data.field(name).map(|local_id| {
432                                 let field = FieldId { parent: u.into(), local_id };
433                                 self.write_field_resolution(tgt_expr, field);
434                                 self.db.field_types(u.into())[field.local_id]
435                                     .clone()
436                                     .subst(&a_ty.parameters)
437                             })
438                         }
439                         _ => None,
440                     },
441                     _ => None,
442                 })
443                 .unwrap_or(Ty::Unknown);
444                 let ty = self.insert_type_vars(ty);
445                 self.normalize_associated_types_in(ty)
446             }
447             Expr::Await { expr } => {
448                 let inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
449                 self.resolve_associated_type(inner_ty, self.resolve_future_future_output())
450             }
451             Expr::Try { expr } => {
452                 let inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
453                 self.resolve_associated_type(inner_ty, self.resolve_ops_try_ok())
454             }
455             Expr::Cast { expr, type_ref } => {
456                 let _inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
457                 let cast_ty = self.make_ty(type_ref);
458                 // FIXME check the cast...
459                 cast_ty
460             }
461             Expr::Ref { expr, rawness, mutability } => {
462                 let expectation = if let Some((exp_inner, exp_rawness, exp_mutability)) =
463                     &expected.ty.as_reference_or_ptr()
464                 {
465                     if *exp_mutability == Mutability::Mut && *mutability == Mutability::Shared {
466                         // FIXME: throw type error - expected mut reference but found shared ref,
467                         // which cannot be coerced
468                     }
469                     if *exp_rawness == Rawness::Ref && *rawness == Rawness::RawPtr {
470                         // FIXME: throw type error - expected reference but found ptr,
471                         // which cannot be coerced
472                     }
473                     Expectation::rvalue_hint(Ty::clone(exp_inner))
474                 } else {
475                     Expectation::none()
476                 };
477                 let inner_ty = self.infer_expr_inner(*expr, &expectation);
478                 let ty = match rawness {
479                     Rawness::RawPtr => TypeCtor::RawPtr(*mutability),
480                     Rawness::Ref => TypeCtor::Ref(*mutability),
481                 };
482                 Ty::apply_one(ty, inner_ty)
483             }
484             Expr::Box { expr } => {
485                 let inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
486                 if let Some(box_) = self.resolve_boxed_box() {
487                     Ty::apply_one(TypeCtor::Adt(box_), inner_ty)
488                 } else {
489                     Ty::Unknown
490                 }
491             }
492             Expr::UnaryOp { expr, op } => {
493                 let inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
494                 match op {
495                     UnaryOp::Deref => match self.resolver.krate() {
496                         Some(krate) => {
497                             let canonicalized = self.canonicalizer().canonicalize_ty(inner_ty);
498                             match autoderef::deref(
499                                 self.db,
500                                 krate,
501                                 InEnvironment {
502                                     value: &canonicalized.value,
503                                     environment: self.trait_env.clone(),
504                                 },
505                             ) {
506                                 Some(derefed_ty) => {
507                                     canonicalized.decanonicalize_ty(derefed_ty.value)
508                                 }
509                                 None => Ty::Unknown,
510                             }
511                         }
512                         None => Ty::Unknown,
513                     },
514                     UnaryOp::Neg => {
515                         match &inner_ty {
516                             // Fast path for builtins
517                             Ty::Apply(ApplicationTy {
518                                 ctor: TypeCtor::Int(IntTy { signedness: Signedness::Signed, .. }),
519                                 ..
520                             })
521                             | Ty::Apply(ApplicationTy { ctor: TypeCtor::Float(_), .. })
522                             | Ty::Infer(InferTy::IntVar(..))
523                             | Ty::Infer(InferTy::FloatVar(..)) => inner_ty,
524                             // Otherwise we resolve via the std::ops::Neg trait
525                             _ => self
526                                 .resolve_associated_type(inner_ty, self.resolve_ops_neg_output()),
527                         }
528                     }
529                     UnaryOp::Not => {
530                         match &inner_ty {
531                             // Fast path for builtins
532                             Ty::Apply(ApplicationTy { ctor: TypeCtor::Bool, .. })
533                             | Ty::Apply(ApplicationTy { ctor: TypeCtor::Int(_), .. })
534                             | Ty::Infer(InferTy::IntVar(..)) => inner_ty,
535                             // Otherwise we resolve via the std::ops::Not trait
536                             _ => self
537                                 .resolve_associated_type(inner_ty, self.resolve_ops_not_output()),
538                         }
539                     }
540                 }
541             }
542             Expr::BinaryOp { lhs, rhs, op } => match op {
543                 Some(op) => {
544                     let lhs_expectation = match op {
545                         BinaryOp::LogicOp(..) => Expectation::has_type(Ty::simple(TypeCtor::Bool)),
546                         _ => Expectation::none(),
547                     };
548                     let lhs_ty = self.infer_expr(*lhs, &lhs_expectation);
549                     let rhs_expectation = op::binary_op_rhs_expectation(*op, lhs_ty.clone());
550                     let rhs_ty = self.infer_expr(*rhs, &Expectation::has_type(rhs_expectation));
551
552                     let ret = op::binary_op_return_ty(*op, lhs_ty.clone(), rhs_ty.clone());
553
554                     if ret == Ty::Unknown {
555                         mark::hit!(infer_expr_inner_binary_operator_overload);
556
557                         self.resolve_associated_type_with_params(
558                             lhs_ty,
559                             self.resolve_binary_op_output(op),
560                             &[rhs_ty],
561                         )
562                     } else {
563                         ret
564                     }
565                 }
566                 _ => Ty::Unknown,
567             },
568             Expr::Range { lhs, rhs, range_type } => {
569                 let lhs_ty = lhs.map(|e| self.infer_expr_inner(e, &Expectation::none()));
570                 let rhs_expect = lhs_ty
571                     .as_ref()
572                     .map_or_else(Expectation::none, |ty| Expectation::has_type(ty.clone()));
573                 let rhs_ty = rhs.map(|e| self.infer_expr(e, &rhs_expect));
574                 match (range_type, lhs_ty, rhs_ty) {
575                     (RangeOp::Exclusive, None, None) => match self.resolve_range_full() {
576                         Some(adt) => Ty::simple(TypeCtor::Adt(adt)),
577                         None => Ty::Unknown,
578                     },
579                     (RangeOp::Exclusive, None, Some(ty)) => match self.resolve_range_to() {
580                         Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
581                         None => Ty::Unknown,
582                     },
583                     (RangeOp::Inclusive, None, Some(ty)) => {
584                         match self.resolve_range_to_inclusive() {
585                             Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
586                             None => Ty::Unknown,
587                         }
588                     }
589                     (RangeOp::Exclusive, Some(_), Some(ty)) => match self.resolve_range() {
590                         Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
591                         None => Ty::Unknown,
592                     },
593                     (RangeOp::Inclusive, Some(_), Some(ty)) => {
594                         match self.resolve_range_inclusive() {
595                             Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
596                             None => Ty::Unknown,
597                         }
598                     }
599                     (RangeOp::Exclusive, Some(ty), None) => match self.resolve_range_from() {
600                         Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
601                         None => Ty::Unknown,
602                     },
603                     (RangeOp::Inclusive, _, None) => Ty::Unknown,
604                 }
605             }
606             Expr::Index { base, index } => {
607                 let base_ty = self.infer_expr_inner(*base, &Expectation::none());
608                 let index_ty = self.infer_expr(*index, &Expectation::none());
609
610                 if let (Some(index_trait), Some(krate)) =
611                     (self.resolve_ops_index(), self.resolver.krate())
612                 {
613                     let canonicalized = self.canonicalizer().canonicalize_ty(base_ty);
614                     let self_ty = method_resolution::resolve_indexing_op(
615                         self.db,
616                         &canonicalized.value,
617                         self.trait_env.clone(),
618                         krate,
619                         index_trait,
620                     );
621                     let self_ty =
622                         self_ty.map_or(Ty::Unknown, |t| canonicalized.decanonicalize_ty(t.value));
623                     self.resolve_associated_type_with_params(
624                         self_ty,
625                         self.resolve_ops_index_output(),
626                         &[index_ty],
627                     )
628                 } else {
629                     Ty::Unknown
630                 }
631             }
632             Expr::Tuple { exprs } => {
633                 let mut tys = match &expected.ty {
634                     ty_app!(TypeCtor::Tuple { .. }, st) => st
635                         .iter()
636                         .cloned()
637                         .chain(repeat_with(|| self.table.new_type_var()))
638                         .take(exprs.len())
639                         .collect::<Vec<_>>(),
640                     _ => (0..exprs.len()).map(|_| self.table.new_type_var()).collect(),
641                 };
642
643                 for (expr, ty) in exprs.iter().zip(tys.iter_mut()) {
644                     self.infer_expr_coerce(*expr, &Expectation::has_type(ty.clone()));
645                 }
646
647                 Ty::apply(TypeCtor::Tuple { cardinality: tys.len() as u16 }, Substs(tys.into()))
648             }
649             Expr::Array(array) => {
650                 let elem_ty = match &expected.ty {
651                     ty_app!(TypeCtor::Array, st) | ty_app!(TypeCtor::Slice, st) => {
652                         st.as_single().clone()
653                     }
654                     _ => self.table.new_type_var(),
655                 };
656
657                 match array {
658                     Array::ElementList(items) => {
659                         for expr in items.iter() {
660                             self.infer_expr_coerce(*expr, &Expectation::has_type(elem_ty.clone()));
661                         }
662                     }
663                     Array::Repeat { initializer, repeat } => {
664                         self.infer_expr_coerce(
665                             *initializer,
666                             &Expectation::has_type(elem_ty.clone()),
667                         );
668                         self.infer_expr(
669                             *repeat,
670                             &Expectation::has_type(Ty::simple(TypeCtor::Int(IntTy::usize()))),
671                         );
672                     }
673                 }
674
675                 Ty::apply_one(TypeCtor::Array, elem_ty)
676             }
677             Expr::Literal(lit) => match lit {
678                 Literal::Bool(..) => Ty::simple(TypeCtor::Bool),
679                 Literal::String(..) => {
680                     Ty::apply_one(TypeCtor::Ref(Mutability::Shared), Ty::simple(TypeCtor::Str))
681                 }
682                 Literal::ByteString(..) => {
683                     let byte_type = Ty::simple(TypeCtor::Int(IntTy::u8()));
684                     let array_type = Ty::apply_one(TypeCtor::Array, byte_type);
685                     Ty::apply_one(TypeCtor::Ref(Mutability::Shared), array_type)
686                 }
687                 Literal::Char(..) => Ty::simple(TypeCtor::Char),
688                 Literal::Int(_v, ty) => match ty {
689                     Some(int_ty) => Ty::simple(TypeCtor::Int((*int_ty).into())),
690                     None => self.table.new_integer_var(),
691                 },
692                 Literal::Float(_v, ty) => match ty {
693                     Some(float_ty) => Ty::simple(TypeCtor::Float((*float_ty).into())),
694                     None => self.table.new_float_var(),
695                 },
696             },
697         };
698         // use a new type variable if we got Ty::Unknown here
699         let ty = self.insert_type_vars_shallow(ty);
700         let ty = self.resolve_ty_as_possible(ty);
701         self.write_expr_ty(tgt_expr, ty.clone());
702         ty
703     }
704
705     fn infer_block(
706         &mut self,
707         statements: &[Statement],
708         tail: Option<ExprId>,
709         expected: &Expectation,
710     ) -> Ty {
711         for stmt in statements {
712             match stmt {
713                 Statement::Let { pat, type_ref, initializer } => {
714                     let decl_ty =
715                         type_ref.as_ref().map(|tr| self.make_ty(tr)).unwrap_or(Ty::Unknown);
716
717                     // Always use the declared type when specified
718                     let mut ty = decl_ty.clone();
719
720                     if let Some(expr) = initializer {
721                         let actual_ty =
722                             self.infer_expr_coerce(*expr, &Expectation::has_type(decl_ty.clone()));
723                         if decl_ty == Ty::Unknown {
724                             ty = actual_ty;
725                         }
726                     }
727
728                     let ty = self.resolve_ty_as_possible(ty);
729                     self.infer_pat(*pat, &ty, BindingMode::default());
730                 }
731                 Statement::Expr(expr) => {
732                     self.infer_expr(*expr, &Expectation::none());
733                 }
734             }
735         }
736
737         let ty = if let Some(expr) = tail {
738             self.infer_expr_coerce(expr, expected)
739         } else {
740             // Citing rustc: if there is no explicit tail expression,
741             // that is typically equivalent to a tail expression
742             // of `()` -- except if the block diverges. In that
743             // case, there is no value supplied from the tail
744             // expression (assuming there are no other breaks,
745             // this implies that the type of the block will be
746             // `!`).
747             if self.diverges.is_always() {
748                 // we don't even make an attempt at coercion
749                 self.table.new_maybe_never_type_var()
750             } else {
751                 self.coerce(&Ty::unit(), expected.coercion_target());
752                 Ty::unit()
753             }
754         };
755         ty
756     }
757
758     fn infer_method_call(
759         &mut self,
760         tgt_expr: ExprId,
761         receiver: ExprId,
762         args: &[ExprId],
763         method_name: &Name,
764         generic_args: Option<&GenericArgs>,
765     ) -> Ty {
766         let receiver_ty = self.infer_expr(receiver, &Expectation::none());
767         let canonicalized_receiver = self.canonicalizer().canonicalize_ty(receiver_ty.clone());
768
769         let traits_in_scope = self.resolver.traits_in_scope(self.db.upcast());
770
771         let resolved = self.resolver.krate().and_then(|krate| {
772             method_resolution::lookup_method(
773                 &canonicalized_receiver.value,
774                 self.db,
775                 self.trait_env.clone(),
776                 krate,
777                 &traits_in_scope,
778                 method_name,
779             )
780         });
781         let (derefed_receiver_ty, method_ty, def_generics) = match resolved {
782             Some((ty, func)) => {
783                 let ty = canonicalized_receiver.decanonicalize_ty(ty);
784                 self.write_method_resolution(tgt_expr, func);
785                 (ty, self.db.value_ty(func.into()), Some(generics(self.db.upcast(), func.into())))
786             }
787             None => (receiver_ty, Binders::new(0, Ty::Unknown), None),
788         };
789         let substs = self.substs_for_method_call(def_generics, generic_args, &derefed_receiver_ty);
790         let method_ty = method_ty.subst(&substs);
791         let method_ty = self.insert_type_vars(method_ty);
792         self.register_obligations_for_call(&method_ty);
793         let (expected_receiver_ty, param_tys, ret_ty) = match method_ty.callable_sig(self.db) {
794             Some(sig) => {
795                 if !sig.params().is_empty() {
796                     (sig.params()[0].clone(), sig.params()[1..].to_vec(), sig.ret().clone())
797                 } else {
798                     (Ty::Unknown, Vec::new(), sig.ret().clone())
799                 }
800             }
801             None => (Ty::Unknown, Vec::new(), Ty::Unknown),
802         };
803         // Apply autoref so the below unification works correctly
804         // FIXME: return correct autorefs from lookup_method
805         let actual_receiver_ty = match expected_receiver_ty.as_reference() {
806             Some((_, mutability)) => Ty::apply_one(TypeCtor::Ref(mutability), derefed_receiver_ty),
807             _ => derefed_receiver_ty,
808         };
809         self.unify(&expected_receiver_ty, &actual_receiver_ty);
810
811         self.check_call_arguments(args, &param_tys);
812         self.normalize_associated_types_in(ret_ty)
813     }
814
815     fn check_call_arguments(&mut self, args: &[ExprId], param_tys: &[Ty]) {
816         // Quoting https://github.com/rust-lang/rust/blob/6ef275e6c3cb1384ec78128eceeb4963ff788dca/src/librustc_typeck/check/mod.rs#L3325 --
817         // We do this in a pretty awful way: first we type-check any arguments
818         // that are not closures, then we type-check the closures. This is so
819         // that we have more information about the types of arguments when we
820         // type-check the functions. This isn't really the right way to do this.
821         for &check_closures in &[false, true] {
822             let param_iter = param_tys.iter().cloned().chain(repeat(Ty::Unknown));
823             for (&arg, param_ty) in args.iter().zip(param_iter) {
824                 let is_closure = matches!(&self.body[arg], Expr::Lambda { .. });
825                 if is_closure != check_closures {
826                     continue;
827                 }
828
829                 let param_ty = self.normalize_associated_types_in(param_ty);
830                 self.infer_expr_coerce(arg, &Expectation::has_type(param_ty.clone()));
831             }
832         }
833     }
834
835     fn substs_for_method_call(
836         &mut self,
837         def_generics: Option<Generics>,
838         generic_args: Option<&GenericArgs>,
839         receiver_ty: &Ty,
840     ) -> Substs {
841         let (parent_params, self_params, type_params, impl_trait_params) =
842             def_generics.as_ref().map_or((0, 0, 0, 0), |g| g.provenance_split());
843         assert_eq!(self_params, 0); // method shouldn't have another Self param
844         let total_len = parent_params + type_params + impl_trait_params;
845         let mut substs = Vec::with_capacity(total_len);
846         // Parent arguments are unknown, except for the receiver type
847         if let Some(parent_generics) = def_generics.as_ref().map(|p| p.iter_parent()) {
848             for (_id, param) in parent_generics {
849                 if param.provenance == hir_def::generics::TypeParamProvenance::TraitSelf {
850                     substs.push(receiver_ty.clone());
851                 } else {
852                     substs.push(Ty::Unknown);
853                 }
854             }
855         }
856         // handle provided type arguments
857         if let Some(generic_args) = generic_args {
858             // if args are provided, it should be all of them, but we can't rely on that
859             for arg in generic_args
860                 .args
861                 .iter()
862                 .filter(|arg| matches!(arg, GenericArg::Type(_)))
863                 .take(type_params)
864             {
865                 match arg {
866                     GenericArg::Type(type_ref) => {
867                         let ty = self.make_ty(type_ref);
868                         substs.push(ty);
869                     }
870                     GenericArg::Lifetime(_) => {}
871                 }
872             }
873         };
874         let supplied_params = substs.len();
875         for _ in supplied_params..total_len {
876             substs.push(Ty::Unknown);
877         }
878         assert_eq!(substs.len(), total_len);
879         Substs(substs.into())
880     }
881
882     fn register_obligations_for_call(&mut self, callable_ty: &Ty) {
883         if let Ty::Apply(a_ty) = callable_ty {
884             if let TypeCtor::FnDef(def) = a_ty.ctor {
885                 let generic_predicates = self.db.generic_predicates(def.into());
886                 for predicate in generic_predicates.iter() {
887                     let predicate = predicate.clone().subst(&a_ty.parameters);
888                     if let Some(obligation) = Obligation::from_predicate(predicate) {
889                         self.obligations.push(obligation);
890                     }
891                 }
892                 // add obligation for trait implementation, if this is a trait method
893                 match def {
894                     CallableDefId::FunctionId(f) => {
895                         if let AssocContainerId::TraitId(trait_) =
896                             f.lookup(self.db.upcast()).container
897                         {
898                             // construct a TraitDef
899                             let substs = a_ty
900                                 .parameters
901                                 .prefix(generics(self.db.upcast(), trait_.into()).len());
902                             self.obligations.push(Obligation::Trait(TraitRef { trait_, substs }));
903                         }
904                     }
905                     CallableDefId::StructId(_) | CallableDefId::EnumVariantId(_) => {}
906                 }
907             }
908         }
909     }
910 }