diff options
Diffstat (limited to 'crates/hir_ty/src/infer/expr.rs')
-rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 216 |
1 files changed, 113 insertions, 103 deletions
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs index 3f3187ea2..9841988c5 100644 --- a/crates/hir_ty/src/infer/expr.rs +++ b/crates/hir_ty/src/infer/expr.rs | |||
@@ -15,15 +15,16 @@ use stdx::always; | |||
15 | use syntax::ast::RangeOp; | 15 | use syntax::ast::RangeOp; |
16 | 16 | ||
17 | use crate::{ | 17 | use crate::{ |
18 | autoderef, | 18 | autoderef, dummy_usize_const, |
19 | lower::lower_to_chalk_mutability, | 19 | lower::lower_to_chalk_mutability, |
20 | method_resolution, op, | 20 | method_resolution, op, |
21 | primitive::{self, UintTy}, | 21 | primitive::{self, UintTy}, |
22 | to_assoc_type_id, to_chalk_trait_id, | 22 | static_lifetime, to_chalk_trait_id, |
23 | traits::{chalk::from_chalk, FnTrait, InEnvironment}, | 23 | traits::{chalk::from_chalk, FnTrait}, |
24 | utils::{generics, variant_data, Generics}, | 24 | utils::{generics, Generics}, |
25 | AdtId, Binders, CallableDefId, DomainGoal, FnPointer, FnSig, Interner, Rawness, Scalar, | 25 | AdtId, Binders, CallableDefId, FnPointer, FnSig, FnSubst, InEnvironment, Interner, |
26 | Substitution, TraitRef, Ty, TyKind, | 26 | ProjectionTyExt, Rawness, Scalar, Substitution, TraitRef, Ty, TyBuilder, TyExt, TyKind, |
27 | TypeWalk, | ||
27 | }; | 28 | }; |
28 | 29 | ||
29 | use super::{ | 30 | use super::{ |
@@ -73,38 +74,33 @@ impl<'a> InferenceContext<'a> { | |||
73 | let fn_once_trait = FnTrait::FnOnce.get_id(self.db, krate)?; | 74 | let fn_once_trait = FnTrait::FnOnce.get_id(self.db, krate)?; |
74 | let output_assoc_type = | 75 | let output_assoc_type = |
75 | self.db.trait_data(fn_once_trait).associated_type_by_name(&name![Output])?; | 76 | self.db.trait_data(fn_once_trait).associated_type_by_name(&name![Output])?; |
76 | let generic_params = generics(self.db.upcast(), fn_once_trait.into()); | ||
77 | if generic_params.len() != 2 { | ||
78 | return None; | ||
79 | } | ||
80 | 77 | ||
81 | let mut param_builder = Substitution::builder(num_args); | ||
82 | let mut arg_tys = vec![]; | 78 | let mut arg_tys = vec![]; |
83 | for _ in 0..num_args { | 79 | let arg_ty = TyBuilder::tuple(num_args) |
84 | let arg = self.table.new_type_var(); | 80 | .fill(repeat_with(|| { |
85 | param_builder = param_builder.push(arg.clone()); | 81 | let arg = self.table.new_type_var(); |
86 | arg_tys.push(arg); | 82 | arg_tys.push(arg.clone()); |
87 | } | 83 | arg |
88 | let parameters = param_builder.build(); | 84 | })) |
89 | let arg_ty = TyKind::Tuple(num_args, parameters).intern(&Interner); | 85 | .build(); |
90 | let substs = | 86 | |
91 | Substitution::build_for_generics(&generic_params).push(ty.clone()).push(arg_ty).build(); | 87 | let projection = { |
88 | let b = TyBuilder::assoc_type_projection(self.db, output_assoc_type); | ||
89 | if b.remaining() != 2 { | ||
90 | return None; | ||
91 | } | ||
92 | b.push(ty.clone()).push(arg_ty).build() | ||
93 | }; | ||
92 | 94 | ||
93 | let trait_env = self.trait_env.env.clone(); | 95 | let trait_env = self.trait_env.env.clone(); |
94 | let implements_fn_trait: DomainGoal = | 96 | let obligation = InEnvironment { |
95 | TraitRef { trait_id: to_chalk_trait_id(fn_once_trait), substitution: substs.clone() } | 97 | goal: projection.trait_ref(self.db).cast(&Interner), |
96 | .cast(&Interner); | ||
97 | let goal = self.canonicalizer().canonicalize_obligation(InEnvironment { | ||
98 | goal: implements_fn_trait.clone(), | ||
99 | environment: trait_env, | 98 | environment: trait_env, |
100 | }); | 99 | }; |
101 | if self.db.trait_solve(krate, goal.value).is_some() { | 100 | let canonical = self.canonicalizer().canonicalize_obligation(obligation.clone()); |
102 | self.obligations.push(implements_fn_trait); | 101 | if self.db.trait_solve(krate, canonical.value).is_some() { |
103 | let output_proj_ty = crate::ProjectionTy { | 102 | self.push_obligation(obligation.goal); |
104 | associated_ty_id: to_assoc_type_id(output_assoc_type), | 103 | let return_ty = self.normalize_projection_ty(projection); |
105 | substitution: substs, | ||
106 | }; | ||
107 | let return_ty = self.normalize_projection_ty(output_proj_ty); | ||
108 | Some((arg_tys, return_ty)) | 104 | Some((arg_tys, return_ty)) |
109 | } else { | 105 | } else { |
110 | None | 106 | None |
@@ -119,6 +115,8 @@ impl<'a> InferenceContext<'a> { | |||
119 | } | 115 | } |
120 | 116 | ||
121 | fn infer_expr_inner(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty { | 117 | fn infer_expr_inner(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty { |
118 | self.db.check_canceled(); | ||
119 | |||
122 | let body = Arc::clone(&self.body); // avoid borrow checker problem | 120 | let body = Arc::clone(&self.body); // avoid borrow checker problem |
123 | let ty = match &body[tgt_expr] { | 121 | let ty = match &body[tgt_expr] { |
124 | Expr::Missing => self.err_ty(), | 122 | Expr::Missing => self.err_ty(), |
@@ -136,7 +134,7 @@ impl<'a> InferenceContext<'a> { | |||
136 | both_arms_diverge &= mem::replace(&mut self.diverges, Diverges::Maybe); | 134 | both_arms_diverge &= mem::replace(&mut self.diverges, Diverges::Maybe); |
137 | let else_ty = match else_branch { | 135 | let else_ty = match else_branch { |
138 | Some(else_branch) => self.infer_expr_inner(*else_branch, &expected), | 136 | Some(else_branch) => self.infer_expr_inner(*else_branch, &expected), |
139 | None => Ty::unit(), | 137 | None => TyBuilder::unit(), |
140 | }; | 138 | }; |
141 | both_arms_diverge &= self.diverges; | 139 | both_arms_diverge &= self.diverges; |
142 | 140 | ||
@@ -183,7 +181,8 @@ impl<'a> InferenceContext<'a> { | |||
183 | let inner_ty = self.infer_expr(*body, &Expectation::none()); | 181 | let inner_ty = self.infer_expr(*body, &Expectation::none()); |
184 | let impl_trait_id = crate::ImplTraitId::AsyncBlockTypeImplTrait(self.owner, *body); | 182 | let impl_trait_id = crate::ImplTraitId::AsyncBlockTypeImplTrait(self.owner, *body); |
185 | let opaque_ty_id = self.db.intern_impl_trait_id(impl_trait_id).into(); | 183 | let opaque_ty_id = self.db.intern_impl_trait_id(impl_trait_id).into(); |
186 | TyKind::OpaqueType(opaque_ty_id, Substitution::single(inner_ty)).intern(&Interner) | 184 | TyKind::OpaqueType(opaque_ty_id, Substitution::from1(&Interner, inner_ty)) |
185 | .intern(&Interner) | ||
187 | } | 186 | } |
188 | Expr::Loop { body, label } => { | 187 | Expr::Loop { body, label } => { |
189 | self.breakables.push(BreakableContext { | 188 | self.breakables.push(BreakableContext { |
@@ -191,7 +190,7 @@ impl<'a> InferenceContext<'a> { | |||
191 | break_ty: self.table.new_type_var(), | 190 | break_ty: self.table.new_type_var(), |
192 | label: label.map(|label| self.body[label].name.clone()), | 191 | label: label.map(|label| self.body[label].name.clone()), |
193 | }); | 192 | }); |
194 | self.infer_expr(*body, &Expectation::has_type(Ty::unit())); | 193 | self.infer_expr(*body, &Expectation::has_type(TyBuilder::unit())); |
195 | 194 | ||
196 | let ctxt = self.breakables.pop().expect("breakable stack broken"); | 195 | let ctxt = self.breakables.pop().expect("breakable stack broken"); |
197 | if ctxt.may_break { | 196 | if ctxt.may_break { |
@@ -215,11 +214,11 @@ impl<'a> InferenceContext<'a> { | |||
215 | *condition, | 214 | *condition, |
216 | &Expectation::has_type(TyKind::Scalar(Scalar::Bool).intern(&Interner)), | 215 | &Expectation::has_type(TyKind::Scalar(Scalar::Bool).intern(&Interner)), |
217 | ); | 216 | ); |
218 | self.infer_expr(*body, &Expectation::has_type(Ty::unit())); | 217 | self.infer_expr(*body, &Expectation::has_type(TyBuilder::unit())); |
219 | let _ctxt = self.breakables.pop().expect("breakable stack broken"); | 218 | let _ctxt = self.breakables.pop().expect("breakable stack broken"); |
220 | // the body may not run, so it diverging doesn't mean we diverge | 219 | // the body may not run, so it diverging doesn't mean we diverge |
221 | self.diverges = Diverges::Maybe; | 220 | self.diverges = Diverges::Maybe; |
222 | Ty::unit() | 221 | TyBuilder::unit() |
223 | } | 222 | } |
224 | Expr::For { iterable, body, pat, label } => { | 223 | Expr::For { iterable, body, pat, label } => { |
225 | let iterable_ty = self.infer_expr(*iterable, &Expectation::none()); | 224 | let iterable_ty = self.infer_expr(*iterable, &Expectation::none()); |
@@ -234,11 +233,11 @@ impl<'a> InferenceContext<'a> { | |||
234 | 233 | ||
235 | self.infer_pat(*pat, &pat_ty, BindingMode::default()); | 234 | self.infer_pat(*pat, &pat_ty, BindingMode::default()); |
236 | 235 | ||
237 | self.infer_expr(*body, &Expectation::has_type(Ty::unit())); | 236 | self.infer_expr(*body, &Expectation::has_type(TyBuilder::unit())); |
238 | let _ctxt = self.breakables.pop().expect("breakable stack broken"); | 237 | let _ctxt = self.breakables.pop().expect("breakable stack broken"); |
239 | // the body may not run, so it diverging doesn't mean we diverge | 238 | // the body may not run, so it diverging doesn't mean we diverge |
240 | self.diverges = Diverges::Maybe; | 239 | self.diverges = Diverges::Maybe; |
241 | Ty::unit() | 240 | TyBuilder::unit() |
242 | } | 241 | } |
243 | Expr::Lambda { body, args, ret_type, arg_types } => { | 242 | Expr::Lambda { body, args, ret_type, arg_types } => { |
244 | assert_eq!(args.len(), arg_types.len()); | 243 | assert_eq!(args.len(), arg_types.len()); |
@@ -262,14 +261,17 @@ impl<'a> InferenceContext<'a> { | |||
262 | }; | 261 | }; |
263 | sig_tys.push(ret_ty.clone()); | 262 | sig_tys.push(ret_ty.clone()); |
264 | let sig_ty = TyKind::Function(FnPointer { | 263 | let sig_ty = TyKind::Function(FnPointer { |
265 | num_args: sig_tys.len() - 1, | 264 | num_binders: 0, |
266 | sig: FnSig { abi: (), safety: chalk_ir::Safety::Safe, variadic: false }, | 265 | sig: FnSig { abi: (), safety: chalk_ir::Safety::Safe, variadic: false }, |
267 | substs: Substitution(sig_tys.clone().into()), | 266 | substitution: FnSubst( |
267 | Substitution::from_iter(&Interner, sig_tys.clone()).shifted_in(&Interner), | ||
268 | ), | ||
268 | }) | 269 | }) |
269 | .intern(&Interner); | 270 | .intern(&Interner); |
270 | let closure_id = self.db.intern_closure((self.owner, tgt_expr)).into(); | 271 | let closure_id = self.db.intern_closure((self.owner, tgt_expr)).into(); |
271 | let closure_ty = | 272 | let closure_ty = |
272 | TyKind::Closure(closure_id, Substitution::single(sig_ty)).intern(&Interner); | 273 | TyKind::Closure(closure_id, Substitution::from1(&Interner, sig_ty)) |
274 | .intern(&Interner); | ||
273 | 275 | ||
274 | // Eagerly try to relate the closure type with the expected | 276 | // Eagerly try to relate the closure type with the expected |
275 | // type, otherwise we often won't have enough information to | 277 | // type, otherwise we often won't have enough information to |
@@ -316,7 +318,13 @@ impl<'a> InferenceContext<'a> { | |||
316 | self.normalize_associated_types_in(ret_ty) | 318 | self.normalize_associated_types_in(ret_ty) |
317 | } | 319 | } |
318 | Expr::MethodCall { receiver, args, method_name, generic_args } => self | 320 | Expr::MethodCall { receiver, args, method_name, generic_args } => self |
319 | .infer_method_call(tgt_expr, *receiver, &args, &method_name, generic_args.as_ref()), | 321 | .infer_method_call( |
322 | tgt_expr, | ||
323 | *receiver, | ||
324 | &args, | ||
325 | &method_name, | ||
326 | generic_args.as_deref(), | ||
327 | ), | ||
320 | Expr::Match { expr, arms } => { | 328 | Expr::Match { expr, arms } => { |
321 | let input_ty = self.infer_expr(*expr, &Expectation::none()); | 329 | let input_ty = self.infer_expr(*expr, &Expectation::none()); |
322 | 330 | ||
@@ -358,7 +366,7 @@ impl<'a> InferenceContext<'a> { | |||
358 | let val_ty = if let Some(expr) = expr { | 366 | let val_ty = if let Some(expr) = expr { |
359 | self.infer_expr(*expr, &Expectation::none()) | 367 | self.infer_expr(*expr, &Expectation::none()) |
360 | } else { | 368 | } else { |
361 | Ty::unit() | 369 | TyBuilder::unit() |
362 | }; | 370 | }; |
363 | 371 | ||
364 | let last_ty = | 372 | let last_ty = |
@@ -384,7 +392,7 @@ impl<'a> InferenceContext<'a> { | |||
384 | if let Some(expr) = expr { | 392 | if let Some(expr) = expr { |
385 | self.infer_expr_coerce(*expr, &Expectation::has_type(self.return_ty.clone())); | 393 | self.infer_expr_coerce(*expr, &Expectation::has_type(self.return_ty.clone())); |
386 | } else { | 394 | } else { |
387 | let unit = Ty::unit(); | 395 | let unit = TyBuilder::unit(); |
388 | self.coerce(&unit, &self.return_ty.clone()); | 396 | self.coerce(&unit, &self.return_ty.clone()); |
389 | } | 397 | } |
390 | TyKind::Never.intern(&Interner) | 398 | TyKind::Never.intern(&Interner) |
@@ -397,16 +405,19 @@ impl<'a> InferenceContext<'a> { | |||
397 | TyKind::Never.intern(&Interner) | 405 | TyKind::Never.intern(&Interner) |
398 | } | 406 | } |
399 | Expr::RecordLit { path, fields, spread } => { | 407 | Expr::RecordLit { path, fields, spread } => { |
400 | let (ty, def_id) = self.resolve_variant(path.as_ref()); | 408 | let (ty, def_id) = self.resolve_variant(path.as_deref()); |
401 | if let Some(variant) = def_id { | 409 | if let Some(variant) = def_id { |
402 | self.write_variant_resolution(tgt_expr.into(), variant); | 410 | self.write_variant_resolution(tgt_expr.into(), variant); |
403 | } | 411 | } |
404 | 412 | ||
405 | self.unify(&ty, &expected.ty); | 413 | self.unify(&ty, &expected.ty); |
406 | 414 | ||
407 | let substs = ty.substs().cloned().unwrap_or_else(Substitution::empty); | 415 | let substs = ty |
416 | .as_adt() | ||
417 | .map(|(_, s)| s.clone()) | ||
418 | .unwrap_or_else(|| Substitution::empty(&Interner)); | ||
408 | let field_types = def_id.map(|it| self.db.field_types(it)).unwrap_or_default(); | 419 | let field_types = def_id.map(|it| self.db.field_types(it)).unwrap_or_default(); |
409 | let variant_data = def_id.map(|it| variant_data(self.db.upcast(), it)); | 420 | let variant_data = def_id.map(|it| it.variant_data(self.db.upcast())); |
410 | for field in fields.iter() { | 421 | for field in fields.iter() { |
411 | let field_def = | 422 | let field_def = |
412 | variant_data.as_ref().and_then(|it| match it.field(&field.name) { | 423 | variant_data.as_ref().and_then(|it| match it.field(&field.name) { |
@@ -418,11 +429,8 @@ impl<'a> InferenceContext<'a> { | |||
418 | None | 429 | None |
419 | } | 430 | } |
420 | }); | 431 | }); |
421 | if let Some(field_def) = field_def { | ||
422 | self.result.record_field_resolutions.insert(field.expr, field_def); | ||
423 | } | ||
424 | let field_ty = field_def.map_or(self.err_ty(), |it| { | 432 | let field_ty = field_def.map_or(self.err_ty(), |it| { |
425 | field_types[it.local_id].clone().subst(&substs) | 433 | field_types[it.local_id].clone().substitute(&Interner, &substs) |
426 | }); | 434 | }); |
427 | self.infer_expr_coerce(field.expr, &Expectation::has_type(field_ty)); | 435 | self.infer_expr_coerce(field.expr, &Expectation::has_type(field_ty)); |
428 | } | 436 | } |
@@ -453,10 +461,10 @@ impl<'a> InferenceContext<'a> { | |||
453 | }) | 461 | }) |
454 | .unwrap_or(true) | 462 | .unwrap_or(true) |
455 | }; | 463 | }; |
456 | match canonicalized.decanonicalize_ty(derefed_ty.value).interned(&Interner) { | 464 | match canonicalized.decanonicalize_ty(derefed_ty.value).kind(&Interner) { |
457 | TyKind::Tuple(_, substs) => { | 465 | TyKind::Tuple(_, substs) => name.as_tuple_index().and_then(|idx| { |
458 | name.as_tuple_index().and_then(|idx| substs.0.get(idx).cloned()) | 466 | substs.interned().get(idx).map(|a| a.assert_ty_ref(&Interner)).cloned() |
459 | } | 467 | }), |
460 | TyKind::Adt(AdtId(hir_def::AdtId::StructId(s)), parameters) => { | 468 | TyKind::Adt(AdtId(hir_def::AdtId::StructId(s)), parameters) => { |
461 | let local_id = self.db.struct_data(*s).variant_data.field(name)?; | 469 | let local_id = self.db.struct_data(*s).variant_data.field(name)?; |
462 | let field = FieldId { parent: (*s).into(), local_id }; | 470 | let field = FieldId { parent: (*s).into(), local_id }; |
@@ -465,7 +473,7 @@ impl<'a> InferenceContext<'a> { | |||
465 | Some( | 473 | Some( |
466 | self.db.field_types((*s).into())[field.local_id] | 474 | self.db.field_types((*s).into())[field.local_id] |
467 | .clone() | 475 | .clone() |
468 | .subst(¶meters), | 476 | .substitute(&Interner, ¶meters), |
469 | ) | 477 | ) |
470 | } else { | 478 | } else { |
471 | None | 479 | None |
@@ -479,7 +487,7 @@ impl<'a> InferenceContext<'a> { | |||
479 | Some( | 487 | Some( |
480 | self.db.field_types((*u).into())[field.local_id] | 488 | self.db.field_types((*u).into())[field.local_id] |
481 | .clone() | 489 | .clone() |
482 | .subst(¶meters), | 490 | .substitute(&Interner, ¶meters), |
483 | ) | 491 | ) |
484 | } else { | 492 | } else { |
485 | None | 493 | None |
@@ -526,24 +534,17 @@ impl<'a> InferenceContext<'a> { | |||
526 | let inner_ty = self.infer_expr_inner(*expr, &expectation); | 534 | let inner_ty = self.infer_expr_inner(*expr, &expectation); |
527 | match rawness { | 535 | match rawness { |
528 | Rawness::RawPtr => TyKind::Raw(mutability, inner_ty), | 536 | Rawness::RawPtr => TyKind::Raw(mutability, inner_ty), |
529 | Rawness::Ref => TyKind::Ref(mutability, inner_ty), | 537 | Rawness::Ref => TyKind::Ref(mutability, static_lifetime(), inner_ty), |
530 | } | 538 | } |
531 | .intern(&Interner) | 539 | .intern(&Interner) |
532 | } | 540 | } |
533 | Expr::Box { expr } => { | 541 | Expr::Box { expr } => { |
534 | let inner_ty = self.infer_expr_inner(*expr, &Expectation::none()); | 542 | let inner_ty = self.infer_expr_inner(*expr, &Expectation::none()); |
535 | if let Some(box_) = self.resolve_boxed_box() { | 543 | if let Some(box_) = self.resolve_boxed_box() { |
536 | let mut sb = | 544 | TyBuilder::adt(self.db, box_) |
537 | Substitution::build_for_generics(&generics(self.db.upcast(), box_.into())); | 545 | .push(inner_ty) |
538 | sb = sb.push(inner_ty); | 546 | .fill_with_defaults(self.db, || self.table.new_type_var()) |
539 | match self.db.generic_defaults(box_.into()).get(1) { | 547 | .build() |
540 | Some(alloc_ty) if !alloc_ty.value.is_unknown() && sb.remaining() > 0 => { | ||
541 | sb = sb.push(alloc_ty.value.clone()); | ||
542 | } | ||
543 | _ => (), | ||
544 | } | ||
545 | sb = sb.fill(repeat_with(|| self.table.new_type_var())); | ||
546 | Ty::adt_ty(box_, sb.build()) | ||
547 | } else { | 548 | } else { |
548 | self.err_ty() | 549 | self.err_ty() |
549 | } | 550 | } |
@@ -571,7 +572,7 @@ impl<'a> InferenceContext<'a> { | |||
571 | None => self.err_ty(), | 572 | None => self.err_ty(), |
572 | }, | 573 | }, |
573 | UnaryOp::Neg => { | 574 | UnaryOp::Neg => { |
574 | match inner_ty.interned(&Interner) { | 575 | match inner_ty.kind(&Interner) { |
575 | // Fast path for builtins | 576 | // Fast path for builtins |
576 | TyKind::Scalar(Scalar::Int(_)) | 577 | TyKind::Scalar(Scalar::Int(_)) |
577 | | TyKind::Scalar(Scalar::Uint(_)) | 578 | | TyKind::Scalar(Scalar::Uint(_)) |
@@ -584,7 +585,7 @@ impl<'a> InferenceContext<'a> { | |||
584 | } | 585 | } |
585 | } | 586 | } |
586 | UnaryOp::Not => { | 587 | UnaryOp::Not => { |
587 | match inner_ty.interned(&Interner) { | 588 | match inner_ty.kind(&Interner) { |
588 | // Fast path for builtins | 589 | // Fast path for builtins |
589 | TyKind::Scalar(Scalar::Bool) | 590 | TyKind::Scalar(Scalar::Bool) |
590 | | TyKind::Scalar(Scalar::Int(_)) | 591 | | TyKind::Scalar(Scalar::Int(_)) |
@@ -633,31 +634,31 @@ impl<'a> InferenceContext<'a> { | |||
633 | let rhs_ty = rhs.map(|e| self.infer_expr(e, &rhs_expect)); | 634 | let rhs_ty = rhs.map(|e| self.infer_expr(e, &rhs_expect)); |
634 | match (range_type, lhs_ty, rhs_ty) { | 635 | match (range_type, lhs_ty, rhs_ty) { |
635 | (RangeOp::Exclusive, None, None) => match self.resolve_range_full() { | 636 | (RangeOp::Exclusive, None, None) => match self.resolve_range_full() { |
636 | Some(adt) => Ty::adt_ty(adt, Substitution::empty()), | 637 | Some(adt) => TyBuilder::adt(self.db, adt).build(), |
637 | None => self.err_ty(), | 638 | None => self.err_ty(), |
638 | }, | 639 | }, |
639 | (RangeOp::Exclusive, None, Some(ty)) => match self.resolve_range_to() { | 640 | (RangeOp::Exclusive, None, Some(ty)) => match self.resolve_range_to() { |
640 | Some(adt) => Ty::adt_ty(adt, Substitution::single(ty)), | 641 | Some(adt) => TyBuilder::adt(self.db, adt).push(ty).build(), |
641 | None => self.err_ty(), | 642 | None => self.err_ty(), |
642 | }, | 643 | }, |
643 | (RangeOp::Inclusive, None, Some(ty)) => { | 644 | (RangeOp::Inclusive, None, Some(ty)) => { |
644 | match self.resolve_range_to_inclusive() { | 645 | match self.resolve_range_to_inclusive() { |
645 | Some(adt) => Ty::adt_ty(adt, Substitution::single(ty)), | 646 | Some(adt) => TyBuilder::adt(self.db, adt).push(ty).build(), |
646 | None => self.err_ty(), | 647 | None => self.err_ty(), |
647 | } | 648 | } |
648 | } | 649 | } |
649 | (RangeOp::Exclusive, Some(_), Some(ty)) => match self.resolve_range() { | 650 | (RangeOp::Exclusive, Some(_), Some(ty)) => match self.resolve_range() { |
650 | Some(adt) => Ty::adt_ty(adt, Substitution::single(ty)), | 651 | Some(adt) => TyBuilder::adt(self.db, adt).push(ty).build(), |
651 | None => self.err_ty(), | 652 | None => self.err_ty(), |
652 | }, | 653 | }, |
653 | (RangeOp::Inclusive, Some(_), Some(ty)) => { | 654 | (RangeOp::Inclusive, Some(_), Some(ty)) => { |
654 | match self.resolve_range_inclusive() { | 655 | match self.resolve_range_inclusive() { |
655 | Some(adt) => Ty::adt_ty(adt, Substitution::single(ty)), | 656 | Some(adt) => TyBuilder::adt(self.db, adt).push(ty).build(), |
656 | None => self.err_ty(), | 657 | None => self.err_ty(), |
657 | } | 658 | } |
658 | } | 659 | } |
659 | (RangeOp::Exclusive, Some(ty), None) => match self.resolve_range_from() { | 660 | (RangeOp::Exclusive, Some(ty), None) => match self.resolve_range_from() { |
660 | Some(adt) => Ty::adt_ty(adt, Substitution::single(ty)), | 661 | Some(adt) => TyBuilder::adt(self.db, adt).push(ty).build(), |
661 | None => self.err_ty(), | 662 | None => self.err_ty(), |
662 | }, | 663 | }, |
663 | (RangeOp::Inclusive, _, None) => self.err_ty(), | 664 | (RangeOp::Inclusive, _, None) => self.err_ty(), |
@@ -690,10 +691,10 @@ impl<'a> InferenceContext<'a> { | |||
690 | } | 691 | } |
691 | } | 692 | } |
692 | Expr::Tuple { exprs } => { | 693 | Expr::Tuple { exprs } => { |
693 | let mut tys = match expected.ty.interned(&Interner) { | 694 | let mut tys = match expected.ty.kind(&Interner) { |
694 | TyKind::Tuple(_, substs) => substs | 695 | TyKind::Tuple(_, substs) => substs |
695 | .iter() | 696 | .iter(&Interner) |
696 | .cloned() | 697 | .map(|a| a.assert_ty_ref(&Interner).clone()) |
697 | .chain(repeat_with(|| self.table.new_type_var())) | 698 | .chain(repeat_with(|| self.table.new_type_var())) |
698 | .take(exprs.len()) | 699 | .take(exprs.len()) |
699 | .collect::<Vec<_>>(), | 700 | .collect::<Vec<_>>(), |
@@ -704,11 +705,11 @@ impl<'a> InferenceContext<'a> { | |||
704 | self.infer_expr_coerce(*expr, &Expectation::has_type(ty.clone())); | 705 | self.infer_expr_coerce(*expr, &Expectation::has_type(ty.clone())); |
705 | } | 706 | } |
706 | 707 | ||
707 | TyKind::Tuple(tys.len(), Substitution(tys.into())).intern(&Interner) | 708 | TyKind::Tuple(tys.len(), Substitution::from_iter(&Interner, tys)).intern(&Interner) |
708 | } | 709 | } |
709 | Expr::Array(array) => { | 710 | Expr::Array(array) => { |
710 | let elem_ty = match expected.ty.interned(&Interner) { | 711 | let elem_ty = match expected.ty.kind(&Interner) { |
711 | TyKind::Array(st) | TyKind::Slice(st) => st.clone(), | 712 | TyKind::Array(st, _) | TyKind::Slice(st) => st.clone(), |
712 | _ => self.table.new_type_var(), | 713 | _ => self.table.new_type_var(), |
713 | }; | 714 | }; |
714 | 715 | ||
@@ -732,17 +733,19 @@ impl<'a> InferenceContext<'a> { | |||
732 | } | 733 | } |
733 | } | 734 | } |
734 | 735 | ||
735 | TyKind::Array(elem_ty).intern(&Interner) | 736 | TyKind::Array(elem_ty, dummy_usize_const()).intern(&Interner) |
736 | } | 737 | } |
737 | Expr::Literal(lit) => match lit { | 738 | Expr::Literal(lit) => match lit { |
738 | Literal::Bool(..) => TyKind::Scalar(Scalar::Bool).intern(&Interner), | 739 | Literal::Bool(..) => TyKind::Scalar(Scalar::Bool).intern(&Interner), |
739 | Literal::String(..) => { | 740 | Literal::String(..) => { |
740 | TyKind::Ref(Mutability::Not, TyKind::Str.intern(&Interner)).intern(&Interner) | 741 | TyKind::Ref(Mutability::Not, static_lifetime(), TyKind::Str.intern(&Interner)) |
742 | .intern(&Interner) | ||
741 | } | 743 | } |
742 | Literal::ByteString(..) => { | 744 | Literal::ByteString(..) => { |
743 | let byte_type = TyKind::Scalar(Scalar::Uint(UintTy::U8)).intern(&Interner); | 745 | let byte_type = TyKind::Scalar(Scalar::Uint(UintTy::U8)).intern(&Interner); |
744 | let array_type = TyKind::Array(byte_type).intern(&Interner); | 746 | let array_type = |
745 | TyKind::Ref(Mutability::Not, array_type).intern(&Interner) | 747 | TyKind::Array(byte_type, dummy_usize_const()).intern(&Interner); |
748 | TyKind::Ref(Mutability::Not, static_lifetime(), array_type).intern(&Interner) | ||
746 | } | 749 | } |
747 | Literal::Char(..) => TyKind::Scalar(Scalar::Char).intern(&Interner), | 750 | Literal::Char(..) => TyKind::Scalar(Scalar::Char).intern(&Interner), |
748 | Literal::Int(_v, ty) => match ty { | 751 | Literal::Int(_v, ty) => match ty { |
@@ -767,6 +770,7 @@ impl<'a> InferenceContext<'a> { | |||
767 | None => self.table.new_float_var(), | 770 | None => self.table.new_float_var(), |
768 | }, | 771 | }, |
769 | }, | 772 | }, |
773 | Expr::MacroStmts { tail } => self.infer_expr(*tail, expected), | ||
770 | }; | 774 | }; |
771 | // use a new type variable if we got unknown here | 775 | // use a new type variable if we got unknown here |
772 | let ty = self.insert_type_vars_shallow(ty); | 776 | let ty = self.insert_type_vars_shallow(ty); |
@@ -821,8 +825,8 @@ impl<'a> InferenceContext<'a> { | |||
821 | // we don't even make an attempt at coercion | 825 | // we don't even make an attempt at coercion |
822 | self.table.new_maybe_never_var() | 826 | self.table.new_maybe_never_var() |
823 | } else { | 827 | } else { |
824 | self.coerce(&Ty::unit(), &expected.coercion_target()); | 828 | self.coerce(&TyBuilder::unit(), &expected.coercion_target()); |
825 | Ty::unit() | 829 | TyBuilder::unit() |
826 | } | 830 | } |
827 | }; | 831 | }; |
828 | ty | 832 | ty |
@@ -858,10 +862,10 @@ impl<'a> InferenceContext<'a> { | |||
858 | self.write_method_resolution(tgt_expr, func); | 862 | self.write_method_resolution(tgt_expr, func); |
859 | (ty, self.db.value_ty(func.into()), Some(generics(self.db.upcast(), func.into()))) | 863 | (ty, self.db.value_ty(func.into()), Some(generics(self.db.upcast(), func.into()))) |
860 | } | 864 | } |
861 | None => (receiver_ty, Binders::new(0, self.err_ty()), None), | 865 | None => (receiver_ty, Binders::empty(&Interner, self.err_ty()), None), |
862 | }; | 866 | }; |
863 | let substs = self.substs_for_method_call(def_generics, generic_args, &derefed_receiver_ty); | 867 | let substs = self.substs_for_method_call(def_generics, generic_args, &derefed_receiver_ty); |
864 | let method_ty = method_ty.subst(&substs); | 868 | let method_ty = method_ty.substitute(&Interner, &substs); |
865 | let method_ty = self.insert_type_vars(method_ty); | 869 | let method_ty = self.insert_type_vars(method_ty); |
866 | self.register_obligations_for_call(&method_ty); | 870 | self.register_obligations_for_call(&method_ty); |
867 | let (expected_receiver_ty, param_tys, ret_ty) = match method_ty.callable_sig(self.db) { | 871 | let (expected_receiver_ty, param_tys, ret_ty) = match method_ty.callable_sig(self.db) { |
@@ -877,7 +881,9 @@ impl<'a> InferenceContext<'a> { | |||
877 | // Apply autoref so the below unification works correctly | 881 | // Apply autoref so the below unification works correctly |
878 | // FIXME: return correct autorefs from lookup_method | 882 | // FIXME: return correct autorefs from lookup_method |
879 | let actual_receiver_ty = match expected_receiver_ty.as_reference() { | 883 | let actual_receiver_ty = match expected_receiver_ty.as_reference() { |
880 | Some((_, mutability)) => TyKind::Ref(mutability, derefed_receiver_ty).intern(&Interner), | 884 | Some((_, lifetime, mutability)) => { |
885 | TyKind::Ref(mutability, lifetime, derefed_receiver_ty).intern(&Interner) | ||
886 | } | ||
881 | _ => derefed_receiver_ty, | 887 | _ => derefed_receiver_ty, |
882 | }; | 888 | }; |
883 | self.unify(&expected_receiver_ty, &actual_receiver_ty); | 889 | self.unify(&expected_receiver_ty, &actual_receiver_ty); |
@@ -950,18 +956,20 @@ impl<'a> InferenceContext<'a> { | |||
950 | substs.push(self.err_ty()); | 956 | substs.push(self.err_ty()); |
951 | } | 957 | } |
952 | assert_eq!(substs.len(), total_len); | 958 | assert_eq!(substs.len(), total_len); |
953 | Substitution(substs.into()) | 959 | Substitution::from_iter(&Interner, substs) |
954 | } | 960 | } |
955 | 961 | ||
956 | fn register_obligations_for_call(&mut self, callable_ty: &Ty) { | 962 | fn register_obligations_for_call(&mut self, callable_ty: &Ty) { |
957 | if let TyKind::FnDef(fn_def, parameters) = callable_ty.interned(&Interner) { | 963 | if let TyKind::FnDef(fn_def, parameters) = callable_ty.kind(&Interner) { |
958 | let def: CallableDefId = from_chalk(self.db, *fn_def); | 964 | let def: CallableDefId = from_chalk(self.db, *fn_def); |
959 | let generic_predicates = self.db.generic_predicates(def.into()); | 965 | let generic_predicates = self.db.generic_predicates(def.into()); |
960 | for predicate in generic_predicates.iter() { | 966 | for predicate in generic_predicates.iter() { |
961 | let (predicate, binders) = | 967 | let (predicate, binders) = predicate |
962 | predicate.clone().subst(parameters).into_value_and_skipped_binders(); | 968 | .clone() |
963 | always!(binders == 0); // quantified where clauses not yet handled | 969 | .substitute(&Interner, parameters) |
964 | self.obligations.push(predicate.cast(&Interner)); | 970 | .into_value_and_skipped_binders(); |
971 | always!(binders.len(&Interner) == 0); // quantified where clauses not yet handled | ||
972 | self.push_obligation(predicate.cast(&Interner)); | ||
965 | } | 973 | } |
966 | // add obligation for trait implementation, if this is a trait method | 974 | // add obligation for trait implementation, if this is a trait method |
967 | match def { | 975 | match def { |
@@ -969,9 +977,11 @@ impl<'a> InferenceContext<'a> { | |||
969 | if let AssocContainerId::TraitId(trait_) = f.lookup(self.db.upcast()).container | 977 | if let AssocContainerId::TraitId(trait_) = f.lookup(self.db.upcast()).container |
970 | { | 978 | { |
971 | // construct a TraitRef | 979 | // construct a TraitRef |
972 | let substs = | 980 | let substs = crate::subst_prefix( |
973 | parameters.prefix(generics(self.db.upcast(), trait_.into()).len()); | 981 | &*parameters, |
974 | self.obligations.push( | 982 | generics(self.db.upcast(), trait_.into()).len(), |
983 | ); | ||
984 | self.push_obligation( | ||
975 | TraitRef { trait_id: to_chalk_trait_id(trait_), substitution: substs } | 985 | TraitRef { trait_id: to_chalk_trait_id(trait_), substitution: substs } |
976 | .cast(&Interner), | 986 | .cast(&Interner), |
977 | ); | 987 | ); |