aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/infer
diff options
context:
space:
mode:
authoroxalica <[email protected]>2019-11-28 19:10:16 +0000
committeroxalica <[email protected]>2019-11-28 19:10:16 +0000
commit4992d2bf79e9da6db759eb8e1715f90f31ec7eb9 (patch)
tree9396eb224a6865aa76c64937bc88c02b6ade04b8 /crates/ra_hir_ty/src/infer
parent8b278b1ab660df0728508e45e88ac769a2e03a58 (diff)
Infer range types
Diffstat (limited to 'crates/ra_hir_ty/src/infer')
-rw-r--r--crates/ra_hir_ty/src/infer/expr.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/crates/ra_hir_ty/src/infer/expr.rs b/crates/ra_hir_ty/src/infer/expr.rs
index 2f9ca4bbb..a00aa426a 100644
--- a/crates/ra_hir_ty/src/infer/expr.rs
+++ b/crates/ra_hir_ty/src/infer/expr.rs
@@ -415,6 +415,47 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
415 } 415 }
416 _ => Ty::Unknown, 416 _ => Ty::Unknown,
417 }, 417 },
418 Expr::RangeFull => match self.resolve_range_full() {
419 Some(adt) => Ty::simple(TypeCtor::Adt(adt)),
420 None => Ty::Unknown,
421 },
422 Expr::Range { lhs, rhs } => {
423 let lhs_ty = self.infer_expr(*lhs, &Expectation::none());
424 let rhs_ty = self.infer_expr(*rhs, &Expectation::has_type(lhs_ty));
425 match self.resolve_range() {
426 Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), rhs_ty),
427 None => Ty::Unknown,
428 }
429 }
430 Expr::RangeInclusive { lhs, rhs } => {
431 let lhs_ty = self.infer_expr(*lhs, &Expectation::none());
432 let rhs_ty = self.infer_expr(*rhs, &Expectation::has_type(lhs_ty));
433 match self.resolve_range_inclusive() {
434 Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), rhs_ty),
435 None => Ty::Unknown,
436 }
437 }
438 Expr::RangeFrom { lhs } => {
439 let ty = self.infer_expr(*lhs, &Expectation::none());
440 match self.resolve_range_from() {
441 Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
442 None => Ty::Unknown,
443 }
444 }
445 Expr::RangeTo { rhs } => {
446 let ty = self.infer_expr(*rhs, &Expectation::none());
447 match self.resolve_range_to() {
448 Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
449 None => Ty::Unknown,
450 }
451 }
452 Expr::RangeToInclusive { rhs } => {
453 let ty = self.infer_expr(*rhs, &Expectation::none());
454 match self.resolve_range_to_inclusive() {
455 Some(adt) => Ty::apply_one(TypeCtor::Adt(adt), ty),
456 None => Ty::Unknown,
457 }
458 }
418 Expr::Index { base, index } => { 459 Expr::Index { base, index } => {
419 let _base_ty = self.infer_expr(*base, &Expectation::none()); 460 let _base_ty = self.infer_expr(*base, &Expectation::none());
420 let _index_ty = self.infer_expr(*index, &Expectation::none()); 461 let _index_ty = self.infer_expr(*index, &Expectation::none());