diff options
author | Florian Diebold <[email protected]> | 2019-09-07 15:24:26 +0100 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-09-07 15:30:31 +0100 |
commit | a1776b27c7d7c266d751360b80cc573b1520ef65 (patch) | |
tree | 743356958f4968ae08f5891f10a09bfbc6eb6443 /crates/ra_hir/src/code_model.rs | |
parent | d21cdf3c998bb24e48e81a7e6909df2146ce097c (diff) |
Use traits from where clauses for method resolution
E.g. if we have `T: some::Trait`, we can call methods from that trait without it
needing to be in scope.
Diffstat (limited to 'crates/ra_hir/src/code_model.rs')
-rw-r--r-- | crates/ra_hir/src/code_model.rs | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 4739246cb..52ee1834f 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs | |||
@@ -847,16 +847,22 @@ impl Trait { | |||
847 | .collect() | 847 | .collect() |
848 | } | 848 | } |
849 | 849 | ||
850 | /// Returns an iterator over the whole super trait hierarchy (not including | 850 | /// Returns an iterator over the whole super trait hierarchy (including the |
851 | /// the trait itself). (This iterator may be infinite in case of circular | 851 | /// trait itself). |
852 | /// super trait dependencies, which are possible in malformed code.) | ||
853 | pub fn all_super_traits<'a>( | 852 | pub fn all_super_traits<'a>( |
854 | self, | 853 | self, |
855 | db: &'a impl HirDatabase, | 854 | db: &'a impl HirDatabase, |
856 | ) -> impl Iterator<Item = Trait> + 'a { | 855 | ) -> impl Iterator<Item = Trait> + 'a { |
857 | self.direct_super_traits(db).into_iter().flat_map(move |t| { | 856 | self.all_super_traits_inner(db).unique() |
857 | } | ||
858 | |||
859 | fn all_super_traits_inner<'a>( | ||
860 | self, | ||
861 | db: &'a impl HirDatabase, | ||
862 | ) -> impl Iterator<Item = Trait> + 'a { | ||
863 | iter::once(self).chain(self.direct_super_traits(db).into_iter().flat_map(move |t| { | ||
858 | iter::once(t).chain(Box::new(t.all_super_traits(db)) as Box<dyn Iterator<Item = Trait>>) | 864 | iter::once(t).chain(Box::new(t.all_super_traits(db)) as Box<dyn Iterator<Item = Trait>>) |
859 | }) | 865 | })) |
860 | } | 866 | } |
861 | 867 | ||
862 | pub fn associated_type_by_name(self, db: &impl DefDatabase, name: &Name) -> Option<TypeAlias> { | 868 | pub fn associated_type_by_name(self, db: &impl DefDatabase, name: &Name) -> Option<TypeAlias> { |
@@ -876,10 +882,7 @@ impl Trait { | |||
876 | db: &impl HirDatabase, | 882 | db: &impl HirDatabase, |
877 | name: &Name, | 883 | name: &Name, |
878 | ) -> Option<TypeAlias> { | 884 | ) -> Option<TypeAlias> { |
879 | iter::once(self) | 885 | self.all_super_traits(db).find_map(|t| t.associated_type_by_name(db, name)) |
880 | .chain(self.all_super_traits(db)) | ||
881 | .unique() | ||
882 | .find_map(|t| t.associated_type_by_name(db, name)) | ||
883 | } | 886 | } |
884 | 887 | ||
885 | pub(crate) fn trait_data(self, db: &impl DefDatabase) -> Arc<TraitData> { | 888 | pub(crate) fn trait_data(self, db: &impl DefDatabase) -> Arc<TraitData> { |