diff options
Diffstat (limited to 'crates/ra_hir/src/code_model.rs')
-rw-r--r-- | crates/ra_hir/src/code_model.rs | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index a132d128b..92860fb59 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs | |||
@@ -10,10 +10,12 @@ use hir_def::{ | |||
10 | adt::VariantData, | 10 | adt::VariantData, |
11 | body::scope::ExprScopes, | 11 | body::scope::ExprScopes, |
12 | builtin_type::BuiltinType, | 12 | builtin_type::BuiltinType, |
13 | nameres::per_ns::PerNs, | ||
14 | resolver::{HasResolver, TypeNs}, | ||
13 | traits::TraitData, | 15 | traits::TraitData, |
14 | type_ref::{Mutability, TypeRef}, | 16 | type_ref::{Mutability, TypeRef}, |
15 | AssocItemId, ContainerId, CrateModuleId, HasModule, ImplId, LocalEnumVariantId, | 17 | ContainerId, CrateModuleId, HasModule, ImplId, LocalEnumVariantId, LocalStructFieldId, Lookup, |
16 | LocalStructFieldId, Lookup, ModuleId, UnionId, | 18 | ModuleId, UnionId, |
17 | }; | 19 | }; |
18 | use hir_expand::{ | 20 | use hir_expand::{ |
19 | diagnostics::DiagnosticSink, | 21 | diagnostics::DiagnosticSink, |
@@ -30,9 +32,8 @@ use crate::{ | |||
30 | AstItemDef, ConstId, EnumId, FunctionId, MacroDefId, StaticId, StructId, TraitId, | 32 | AstItemDef, ConstId, EnumId, FunctionId, MacroDefId, StaticId, StructId, TraitId, |
31 | TypeAliasId, | 33 | TypeAliasId, |
32 | }, | 34 | }, |
33 | resolve::{HasResolver, TypeNs}, | ||
34 | ty::{InferenceResult, Namespace, TraitRef}, | 35 | ty::{InferenceResult, Namespace, TraitRef}, |
35 | Either, HasSource, ImportId, Name, ScopeDef, Source, Ty, | 36 | Either, HasSource, ImportId, Name, Source, Ty, |
36 | }; | 37 | }; |
37 | 38 | ||
38 | /// hir::Crate describes a single crate. It's the main interface with which | 39 | /// hir::Crate describes a single crate. It's the main interface with which |
@@ -829,7 +830,7 @@ impl Trait { | |||
829 | } | 830 | } |
830 | 831 | ||
831 | fn direct_super_traits(self, db: &impl HirDatabase) -> Vec<Trait> { | 832 | fn direct_super_traits(self, db: &impl HirDatabase) -> Vec<Trait> { |
832 | let resolver = self.resolver(db); | 833 | let resolver = self.id.resolver(db); |
833 | // returning the iterator directly doesn't easily work because of | 834 | // returning the iterator directly doesn't easily work because of |
834 | // lifetime problems, but since there usually shouldn't be more than a | 835 | // lifetime problems, but since there usually shouldn't be more than a |
835 | // few direct traits this should be fine (we could even use some kind of | 836 | // few direct traits this should be fine (we could even use some kind of |
@@ -842,9 +843,10 @@ impl Trait { | |||
842 | _ => None, | 843 | _ => None, |
843 | }) | 844 | }) |
844 | .filter_map(|path| match resolver.resolve_path_in_type_ns_fully(db, path) { | 845 | .filter_map(|path| match resolver.resolve_path_in_type_ns_fully(db, path) { |
845 | Some(TypeNs::Trait(t)) => Some(t), | 846 | Some(TypeNs::TraitId(t)) => Some(t), |
846 | _ => None, | 847 | _ => None, |
847 | }) | 848 | }) |
849 | .map(Trait::from) | ||
848 | .collect() | 850 | .collect() |
849 | } | 851 | } |
850 | 852 | ||
@@ -871,14 +873,9 @@ impl Trait { | |||
871 | 873 | ||
872 | pub fn associated_type_by_name(self, db: &impl DefDatabase, name: &Name) -> Option<TypeAlias> { | 874 | pub fn associated_type_by_name(self, db: &impl DefDatabase, name: &Name) -> Option<TypeAlias> { |
873 | let trait_data = self.trait_data(db); | 875 | let trait_data = self.trait_data(db); |
874 | trait_data | 876 | let res = |
875 | .items | 877 | trait_data.associated_types().map(TypeAlias::from).find(|t| &t.name(db) == name)?; |
876 | .iter() | 878 | Some(res) |
877 | .filter_map(|item| match item { | ||
878 | AssocItemId::TypeAliasId(t) => Some(TypeAlias::from(*t)), | ||
879 | _ => None, | ||
880 | }) | ||
881 | .find(|t| &t.name(db) == name) | ||
882 | } | 879 | } |
883 | 880 | ||
884 | pub fn associated_type_by_name_including_super_traits( | 881 | pub fn associated_type_by_name_including_super_traits( |
@@ -1068,3 +1065,26 @@ pub struct GenericParam { | |||
1068 | pub struct ImplBlock { | 1065 | pub struct ImplBlock { |
1069 | pub(crate) id: ImplId, | 1066 | pub(crate) id: ImplId, |
1070 | } | 1067 | } |
1068 | |||
1069 | /// For IDE only | ||
1070 | pub enum ScopeDef { | ||
1071 | ModuleDef(ModuleDef), | ||
1072 | MacroDef(MacroDef), | ||
1073 | GenericParam(GenericParam), | ||
1074 | ImplSelfType(ImplBlock), | ||
1075 | AdtSelfType(Adt), | ||
1076 | Local(Local), | ||
1077 | Unknown, | ||
1078 | } | ||
1079 | |||
1080 | impl From<PerNs> for ScopeDef { | ||
1081 | fn from(def: PerNs) -> Self { | ||
1082 | def.take_types() | ||
1083 | .or_else(|| def.take_values()) | ||
1084 | .map(|module_def_id| ScopeDef::ModuleDef(module_def_id.into())) | ||
1085 | .or_else(|| { | ||
1086 | def.get_macros().map(|macro_def_id| ScopeDef::MacroDef(macro_def_id.into())) | ||
1087 | }) | ||
1088 | .unwrap_or(ScopeDef::Unknown) | ||
1089 | } | ||
1090 | } | ||