aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/code_model.rs
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-09-07 15:24:26 +0100
committerFlorian Diebold <[email protected]>2019-09-07 15:30:31 +0100
commita1776b27c7d7c266d751360b80cc573b1520ef65 (patch)
tree743356958f4968ae08f5891f10a09bfbc6eb6443 /crates/ra_hir/src/code_model.rs
parentd21cdf3c998bb24e48e81a7e6909df2146ce097c (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.rs21
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> {