diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-11-21 12:50:12 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2019-11-21 12:50:12 +0000 |
commit | 1f61915bde4c5d8d4fe2e9b8dfa9445008730b79 (patch) | |
tree | a6fd0b6ad8b6c87d28e6e1b36bb9b2fbae2c1b09 /crates/ra_hir/src/ty/infer/path.rs | |
parent | 612a72fc4ea4376920f2a7da7b3c334227c1716c (diff) | |
parent | c37d1c5b381365ce2d07dfe4b871e43995ccea2d (diff) |
Merge #2337
2337: Move resolver to hir_def r=matklad a=matklad
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_hir/src/ty/infer/path.rs')
-rw-r--r-- | crates/ra_hir/src/ty/infer/path.rs | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/crates/ra_hir/src/ty/infer/path.rs b/crates/ra_hir/src/ty/infer/path.rs index 31ca675aa..70136e514 100644 --- a/crates/ra_hir/src/ty/infer/path.rs +++ b/crates/ra_hir/src/ty/infer/path.rs | |||
@@ -1,16 +1,19 @@ | |||
1 | //! Path expression resolution. | 1 | //! Path expression resolution. |
2 | 2 | ||
3 | use hir_def::path::PathSegment; | 3 | use hir_def::{ |
4 | path::PathSegment, | ||
5 | resolver::{ResolveValueResult, Resolver, TypeNs, ValueNs}, | ||
6 | }; | ||
4 | 7 | ||
5 | use super::{ExprOrPatId, InferenceContext, TraitRef}; | ||
6 | use crate::{ | 8 | use crate::{ |
7 | db::HirDatabase, | 9 | db::HirDatabase, |
8 | generics::HasGenericParams, | 10 | generics::HasGenericParams, |
9 | resolve::{ResolveValueResult, Resolver, TypeNs, ValueNs}, | ||
10 | ty::{method_resolution, Namespace, Substs, Ty, TypableDef, TypeWalk}, | 11 | ty::{method_resolution, Namespace, Substs, Ty, TypableDef, TypeWalk}, |
11 | AssocItem, Container, Name, Path, | 12 | AssocItem, Container, Function, Name, Path, |
12 | }; | 13 | }; |
13 | 14 | ||
15 | use super::{ExprOrPatId, InferenceContext, TraitRef}; | ||
16 | |||
14 | impl<'a, D: HirDatabase> InferenceContext<'a, D> { | 17 | impl<'a, D: HirDatabase> InferenceContext<'a, D> { |
15 | pub(super) fn infer_path( | 18 | pub(super) fn infer_path( |
16 | &mut self, | 19 | &mut self, |
@@ -60,11 +63,11 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
60 | let ty = self.resolve_ty_as_possible(&mut vec![], ty); | 63 | let ty = self.resolve_ty_as_possible(&mut vec![], ty); |
61 | return Some(ty); | 64 | return Some(ty); |
62 | } | 65 | } |
63 | ValueNs::Function(it) => it.into(), | 66 | ValueNs::FunctionId(it) => it.into(), |
64 | ValueNs::Const(it) => it.into(), | 67 | ValueNs::ConstId(it) => it.into(), |
65 | ValueNs::Static(it) => it.into(), | 68 | ValueNs::StaticId(it) => it.into(), |
66 | ValueNs::Struct(it) => it.into(), | 69 | ValueNs::StructId(it) => it.into(), |
67 | ValueNs::EnumVariant(it) => it.into(), | 70 | ValueNs::EnumVariantId(it) => it.into(), |
68 | }; | 71 | }; |
69 | 72 | ||
70 | let mut ty = self.db.type_for_def(typable, Namespace::Values); | 73 | let mut ty = self.db.type_for_def(typable, Namespace::Values); |
@@ -94,13 +97,13 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
94 | let is_before_last = remaining_segments.len() == 1; | 97 | let is_before_last = remaining_segments.len() == 1; |
95 | 98 | ||
96 | match (def, is_before_last) { | 99 | match (def, is_before_last) { |
97 | (TypeNs::Trait(trait_), true) => { | 100 | (TypeNs::TraitId(trait_), true) => { |
98 | let segment = | 101 | let segment = |
99 | remaining_segments.last().expect("there should be at least one segment here"); | 102 | remaining_segments.last().expect("there should be at least one segment here"); |
100 | let trait_ref = TraitRef::from_resolved_path( | 103 | let trait_ref = TraitRef::from_resolved_path( |
101 | self.db, | 104 | self.db, |
102 | &self.resolver, | 105 | &self.resolver, |
103 | trait_, | 106 | trait_.into(), |
104 | resolved_segment, | 107 | resolved_segment, |
105 | None, | 108 | None, |
106 | ); | 109 | ); |
@@ -160,8 +163,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
160 | AssocItem::TypeAlias(_) => None, | 163 | AssocItem::TypeAlias(_) => None, |
161 | })?; | 164 | })?; |
162 | let def = match item { | 165 | let def = match item { |
163 | AssocItem::Function(f) => ValueNs::Function(f), | 166 | AssocItem::Function(f) => ValueNs::FunctionId(f.id), |
164 | AssocItem::Const(c) => ValueNs::Const(c), | 167 | AssocItem::Const(c) => ValueNs::ConstId(c.id), |
165 | AssocItem::TypeAlias(_) => unreachable!(), | 168 | AssocItem::TypeAlias(_) => unreachable!(), |
166 | }; | 169 | }; |
167 | let substs = Substs::build_for_def(self.db, item) | 170 | let substs = Substs::build_for_def(self.db, item) |
@@ -193,8 +196,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
193 | method_resolution::LookupMode::Path, | 196 | method_resolution::LookupMode::Path, |
194 | move |_ty, item| { | 197 | move |_ty, item| { |
195 | let def = match item { | 198 | let def = match item { |
196 | AssocItem::Function(f) => ValueNs::Function(f), | 199 | AssocItem::Function(f) => ValueNs::FunctionId(f.id), |
197 | AssocItem::Const(c) => ValueNs::Const(c), | 200 | AssocItem::Const(c) => ValueNs::ConstId(c.id), |
198 | AssocItem::TypeAlias(_) => unreachable!(), | 201 | AssocItem::TypeAlias(_) => unreachable!(), |
199 | }; | 202 | }; |
200 | let substs = match item.container(self.db) { | 203 | let substs = match item.container(self.db) { |
@@ -224,7 +227,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
224 | } | 227 | } |
225 | 228 | ||
226 | fn find_self_types(&self, def: &ValueNs, actual_def_ty: Ty) -> Option<Substs> { | 229 | fn find_self_types(&self, def: &ValueNs, actual_def_ty: Ty) -> Option<Substs> { |
227 | if let ValueNs::Function(func) = def { | 230 | if let ValueNs::FunctionId(func) = def { |
231 | let func = Function::from(*func); | ||
228 | // We only do the infer if parent has generic params | 232 | // We only do the infer if parent has generic params |
229 | let gen = func.generic_params(self.db); | 233 | let gen = func.generic_params(self.db); |
230 | if gen.count_parent_params() == 0 { | 234 | if gen.count_parent_params() == 0 { |