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