aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/resolve.rs
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-09-16 20:38:27 +0100
committerFlorian Diebold <[email protected]>2019-09-17 18:47:45 +0100
commitfe1dfd2b20b256b99f40f6f6421f7c7e12c23e41 (patch)
tree4ac1178549999db25d67fd7358c4a705cfe629fc /crates/ra_hir/src/resolve.rs
parent406280e52f20e25af609d947efbed8b352ca1249 (diff)
Refactor some more
Type-relative paths (`<T>::foo`) also need to work in type context, for example `<T>::Item` is legal. So rather than returning the type ref from the resolver function, just check it before.
Diffstat (limited to 'crates/ra_hir/src/resolve.rs')
-rw-r--r--crates/ra_hir/src/resolve.rs16
1 files changed, 8 insertions, 8 deletions
diff --git a/crates/ra_hir/src/resolve.rs b/crates/ra_hir/src/resolve.rs
index 7f4c78859..a23c8792a 100644
--- a/crates/ra_hir/src/resolve.rs
+++ b/crates/ra_hir/src/resolve.rs
@@ -15,7 +15,6 @@ use crate::{
15 name::{Name, SELF_PARAM, SELF_TYPE}, 15 name::{Name, SELF_PARAM, SELF_TYPE},
16 nameres::{CrateDefMap, CrateModuleId, PerNs}, 16 nameres::{CrateDefMap, CrateModuleId, PerNs},
17 path::{Path, PathKind}, 17 path::{Path, PathKind},
18 type_ref::TypeRef,
19 Adt, BuiltinType, Const, Enum, EnumVariant, Function, MacroDef, ModuleDef, Static, Struct, 18 Adt, BuiltinType, Const, Enum, EnumVariant, Function, MacroDef, ModuleDef, Static, Struct,
20 Trait, TypeAlias, 19 Trait, TypeAlias,
21}; 20};
@@ -65,10 +64,9 @@ pub enum TypeNs {
65} 64}
66 65
67#[derive(Debug, Clone, PartialEq, Eq, Hash)] 66#[derive(Debug, Clone, PartialEq, Eq, Hash)]
68pub enum ResolveValueResult<'a> { 67pub enum ResolveValueResult {
69 ValueNs(ValueNs), 68 ValueNs(ValueNs),
70 Partial(TypeNs, usize), 69 Partial(TypeNs, usize),
71 TypeRef(&'a TypeRef),
72} 70}
73 71
74#[derive(Debug, Clone, PartialEq, Eq, Hash)] 72#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -131,6 +129,9 @@ impl Resolver {
131 db: &impl HirDatabase, 129 db: &impl HirDatabase,
132 path: &Path, 130 path: &Path,
133 ) -> Option<(TypeNs, Option<usize>)> { 131 ) -> Option<(TypeNs, Option<usize>)> {
132 if path.is_type_relative() {
133 return None;
134 }
134 let first_name = &path.segments.first()?.name; 135 let first_name = &path.segments.first()?.name;
135 let skip_to_mod = path.kind != PathKind::Plain; 136 let skip_to_mod = path.kind != PathKind::Plain;
136 for scope in self.scopes.iter().rev() { 137 for scope in self.scopes.iter().rev() {
@@ -189,11 +190,10 @@ impl Resolver {
189 &self, 190 &self,
190 db: &impl HirDatabase, 191 db: &impl HirDatabase,
191 path: &'p Path, 192 path: &'p Path,
192 ) -> Option<ResolveValueResult<'p>> { 193 ) -> Option<ResolveValueResult> {
193 if let PathKind::Type(type_ref) = &path.kind { 194 if path.is_type_relative() {
194 return Some(ResolveValueResult::TypeRef(type_ref)); 195 return None;
195 } 196 }
196
197 let n_segments = path.segments.len(); 197 let n_segments = path.segments.len();
198 let tmp = SELF_PARAM; 198 let tmp = SELF_PARAM;
199 let first_name = if path.is_self() { &tmp } else { &path.segments.first()?.name }; 199 let first_name = if path.is_self() { &tmp } else { &path.segments.first()?.name };
@@ -284,7 +284,7 @@ impl Resolver {
284 ) -> Option<ValueNs> { 284 ) -> Option<ValueNs> {
285 match self.resolve_path_in_value_ns(db, path)? { 285 match self.resolve_path_in_value_ns(db, path)? {
286 ResolveValueResult::ValueNs(it) => Some(it), 286 ResolveValueResult::ValueNs(it) => Some(it),
287 ResolveValueResult::Partial(..) | ResolveValueResult::TypeRef(_) => None, 287 ResolveValueResult::Partial(..) => None,
288 } 288 }
289 } 289 }
290 290