diff options
Diffstat (limited to 'crates/ra_hir_ty/src/infer.rs')
-rw-r--r-- | crates/ra_hir_ty/src/infer.rs | 52 |
1 files changed, 13 insertions, 39 deletions
diff --git a/crates/ra_hir_ty/src/infer.rs b/crates/ra_hir_ty/src/infer.rs index dc77e88e5..3719f76a6 100644 --- a/crates/ra_hir_ty/src/infer.rs +++ b/crates/ra_hir_ty/src/infer.rs | |||
@@ -39,8 +39,7 @@ use ra_syntax::SmolStr; | |||
39 | use super::{ | 39 | use super::{ |
40 | primitive::{FloatTy, IntTy}, | 40 | primitive::{FloatTy, IntTy}, |
41 | traits::{Guidance, Obligation, ProjectionPredicate, Solution}, | 41 | traits::{Guidance, Obligation, ProjectionPredicate, Solution}, |
42 | ApplicationTy, GenericPredicate, InEnvironment, ProjectionTy, Substs, TraitEnvironment, | 42 | InEnvironment, ProjectionTy, Substs, TraitEnvironment, TraitRef, Ty, TypeCtor, TypeWalk, |
43 | TraitRef, Ty, TypeCtor, TypeWalk, Uncertain, | ||
44 | }; | 43 | }; |
45 | use crate::{ | 44 | use crate::{ |
46 | db::HirDatabase, infer::diagnostics::InferenceDiagnostic, lower::ImplTraitLoweringMode, | 45 | db::HirDatabase, infer::diagnostics::InferenceDiagnostic, lower::ImplTraitLoweringMode, |
@@ -312,12 +311,6 @@ impl<'a> InferenceContext<'a> { | |||
312 | fn insert_type_vars_shallow(&mut self, ty: Ty) -> Ty { | 311 | fn insert_type_vars_shallow(&mut self, ty: Ty) -> Ty { |
313 | match ty { | 312 | match ty { |
314 | Ty::Unknown => self.table.new_type_var(), | 313 | Ty::Unknown => self.table.new_type_var(), |
315 | Ty::Apply(ApplicationTy { ctor: TypeCtor::Int(Uncertain::Unknown), .. }) => { | ||
316 | self.table.new_integer_var() | ||
317 | } | ||
318 | Ty::Apply(ApplicationTy { ctor: TypeCtor::Float(Uncertain::Unknown), .. }) => { | ||
319 | self.table.new_float_var() | ||
320 | } | ||
321 | _ => ty, | 314 | _ => ty, |
322 | } | 315 | } |
323 | } | 316 | } |
@@ -383,25 +376,6 @@ impl<'a> InferenceContext<'a> { | |||
383 | ) -> Ty { | 376 | ) -> Ty { |
384 | match assoc_ty { | 377 | match assoc_ty { |
385 | Some(res_assoc_ty) => { | 378 | Some(res_assoc_ty) => { |
386 | // FIXME: | ||
387 | // Check if inner_ty is is `impl Trait` and contained input TypeAlias id | ||
388 | // this is a workaround while Chalk assoc type projection doesn't always work yet, | ||
389 | // but once that is fixed I don't think we should keep this | ||
390 | // (we'll probably change how associated types are resolved anyway) | ||
391 | if let Ty::Opaque(ref predicates) = inner_ty { | ||
392 | for p in predicates.iter() { | ||
393 | if let GenericPredicate::Projection(projection) = p { | ||
394 | if projection.projection_ty.associated_ty == res_assoc_ty { | ||
395 | if let ty_app!(_, params) = &projection.ty { | ||
396 | if params.len() == 0 { | ||
397 | return projection.ty.clone(); | ||
398 | } | ||
399 | } | ||
400 | } | ||
401 | } | ||
402 | } | ||
403 | } | ||
404 | |||
405 | let ty = self.table.new_type_var(); | 379 | let ty = self.table.new_type_var(); |
406 | let builder = Substs::build_for_def(self.db, res_assoc_ty) | 380 | let builder = Substs::build_for_def(self.db, res_assoc_ty) |
407 | .push(inner_ty) | 381 | .push(inner_ty) |
@@ -458,13 +432,13 @@ impl<'a> InferenceContext<'a> { | |||
458 | }; | 432 | }; |
459 | return match resolution { | 433 | return match resolution { |
460 | TypeNs::AdtId(AdtId::StructId(strukt)) => { | 434 | TypeNs::AdtId(AdtId::StructId(strukt)) => { |
461 | let substs = Ty::substs_from_path(&ctx, path, strukt.into()); | 435 | let substs = Ty::substs_from_path(&ctx, path, strukt.into(), true); |
462 | let ty = self.db.ty(strukt.into()); | 436 | let ty = self.db.ty(strukt.into()); |
463 | let ty = self.insert_type_vars(ty.subst(&substs)); | 437 | let ty = self.insert_type_vars(ty.subst(&substs)); |
464 | forbid_unresolved_segments((ty, Some(strukt.into())), unresolved) | 438 | forbid_unresolved_segments((ty, Some(strukt.into())), unresolved) |
465 | } | 439 | } |
466 | TypeNs::EnumVariantId(var) => { | 440 | TypeNs::EnumVariantId(var) => { |
467 | let substs = Ty::substs_from_path(&ctx, path, var.into()); | 441 | let substs = Ty::substs_from_path(&ctx, path, var.into(), true); |
468 | let ty = self.db.ty(var.parent.into()); | 442 | let ty = self.db.ty(var.parent.into()); |
469 | let ty = self.insert_type_vars(ty.subst(&substs)); | 443 | let ty = self.insert_type_vars(ty.subst(&substs)); |
470 | forbid_unresolved_segments((ty, Some(var.into())), unresolved) | 444 | forbid_unresolved_segments((ty, Some(var.into())), unresolved) |
@@ -581,13 +555,13 @@ impl<'a> InferenceContext<'a> { | |||
581 | } | 555 | } |
582 | 556 | ||
583 | fn resolve_into_iter_item(&self) -> Option<TypeAliasId> { | 557 | fn resolve_into_iter_item(&self) -> Option<TypeAliasId> { |
584 | let path = path![std::iter::IntoIterator]; | 558 | let path = path![core::iter::IntoIterator]; |
585 | let trait_ = self.resolver.resolve_known_trait(self.db.upcast(), &path)?; | 559 | let trait_ = self.resolver.resolve_known_trait(self.db.upcast(), &path)?; |
586 | self.db.trait_data(trait_).associated_type_by_name(&name![Item]) | 560 | self.db.trait_data(trait_).associated_type_by_name(&name![Item]) |
587 | } | 561 | } |
588 | 562 | ||
589 | fn resolve_ops_try_ok(&self) -> Option<TypeAliasId> { | 563 | fn resolve_ops_try_ok(&self) -> Option<TypeAliasId> { |
590 | let path = path![std::ops::Try]; | 564 | let path = path![core::ops::Try]; |
591 | let trait_ = self.resolver.resolve_known_trait(self.db.upcast(), &path)?; | 565 | let trait_ = self.resolver.resolve_known_trait(self.db.upcast(), &path)?; |
592 | self.db.trait_data(trait_).associated_type_by_name(&name![Ok]) | 566 | self.db.trait_data(trait_).associated_type_by_name(&name![Ok]) |
593 | } | 567 | } |
@@ -613,37 +587,37 @@ impl<'a> InferenceContext<'a> { | |||
613 | } | 587 | } |
614 | 588 | ||
615 | fn resolve_range_full(&self) -> Option<AdtId> { | 589 | fn resolve_range_full(&self) -> Option<AdtId> { |
616 | let path = path![std::ops::RangeFull]; | 590 | let path = path![core::ops::RangeFull]; |
617 | let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?; | 591 | let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?; |
618 | Some(struct_.into()) | 592 | Some(struct_.into()) |
619 | } | 593 | } |
620 | 594 | ||
621 | fn resolve_range(&self) -> Option<AdtId> { | 595 | fn resolve_range(&self) -> Option<AdtId> { |
622 | let path = path![std::ops::Range]; | 596 | let path = path![core::ops::Range]; |
623 | let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?; | 597 | let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?; |
624 | Some(struct_.into()) | 598 | Some(struct_.into()) |
625 | } | 599 | } |
626 | 600 | ||
627 | fn resolve_range_inclusive(&self) -> Option<AdtId> { | 601 | fn resolve_range_inclusive(&self) -> Option<AdtId> { |
628 | let path = path![std::ops::RangeInclusive]; | 602 | let path = path![core::ops::RangeInclusive]; |
629 | let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?; | 603 | let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?; |
630 | Some(struct_.into()) | 604 | Some(struct_.into()) |
631 | } | 605 | } |
632 | 606 | ||
633 | fn resolve_range_from(&self) -> Option<AdtId> { | 607 | fn resolve_range_from(&self) -> Option<AdtId> { |
634 | let path = path![std::ops::RangeFrom]; | 608 | let path = path![core::ops::RangeFrom]; |
635 | let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?; | 609 | let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?; |
636 | Some(struct_.into()) | 610 | Some(struct_.into()) |
637 | } | 611 | } |
638 | 612 | ||
639 | fn resolve_range_to(&self) -> Option<AdtId> { | 613 | fn resolve_range_to(&self) -> Option<AdtId> { |
640 | let path = path![std::ops::RangeTo]; | 614 | let path = path![core::ops::RangeTo]; |
641 | let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?; | 615 | let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?; |
642 | Some(struct_.into()) | 616 | Some(struct_.into()) |
643 | } | 617 | } |
644 | 618 | ||
645 | fn resolve_range_to_inclusive(&self) -> Option<AdtId> { | 619 | fn resolve_range_to_inclusive(&self) -> Option<AdtId> { |
646 | let path = path![std::ops::RangeToInclusive]; | 620 | let path = path![core::ops::RangeToInclusive]; |
647 | let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?; | 621 | let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?; |
648 | Some(struct_.into()) | 622 | Some(struct_.into()) |
649 | } | 623 | } |
@@ -683,8 +657,8 @@ impl InferTy { | |||
683 | fn fallback_value(self) -> Ty { | 657 | fn fallback_value(self) -> Ty { |
684 | match self { | 658 | match self { |
685 | InferTy::TypeVar(..) => Ty::Unknown, | 659 | InferTy::TypeVar(..) => Ty::Unknown, |
686 | InferTy::IntVar(..) => Ty::simple(TypeCtor::Int(Uncertain::Known(IntTy::i32()))), | 660 | InferTy::IntVar(..) => Ty::simple(TypeCtor::Int(IntTy::i32())), |
687 | InferTy::FloatVar(..) => Ty::simple(TypeCtor::Float(Uncertain::Known(FloatTy::f64()))), | 661 | InferTy::FloatVar(..) => Ty::simple(TypeCtor::Float(FloatTy::f64())), |
688 | InferTy::MaybeNeverTypeVar(..) => Ty::simple(TypeCtor::Never), | 662 | InferTy::MaybeNeverTypeVar(..) => Ty::simple(TypeCtor::Never), |
689 | } | 663 | } |
690 | } | 664 | } |