diff options
Diffstat (limited to 'crates/ra_hir')
-rw-r--r-- | crates/ra_hir/src/semantics.rs | 8 | ||||
-rw-r--r-- | crates/ra_hir/src/source_analyzer.rs | 31 |
2 files changed, 32 insertions, 7 deletions
diff --git a/crates/ra_hir/src/semantics.rs b/crates/ra_hir/src/semantics.rs index eecccdae2..178d74be1 100644 --- a/crates/ra_hir/src/semantics.rs +++ b/crates/ra_hir/src/semantics.rs | |||
@@ -17,8 +17,8 @@ use crate::{ | |||
17 | db::HirDatabase, | 17 | db::HirDatabase, |
18 | source_analyzer::{resolve_hir_path, ReferenceDescriptor, SourceAnalyzer}, | 18 | source_analyzer::{resolve_hir_path, ReferenceDescriptor, SourceAnalyzer}, |
19 | source_binder::{ChildContainer, SourceBinder}, | 19 | source_binder::{ChildContainer, SourceBinder}, |
20 | Function, HirFileId, InFile, Local, MacroDef, Module, Name, Origin, Path, PathResolution, | 20 | Function, HirFileId, InFile, Local, MacroDef, Module, ModuleDef, Name, Origin, Path, |
21 | ScopeDef, StructField, Trait, Type, TypeParam, VariantDef, | 21 | PathResolution, ScopeDef, StructField, Trait, Type, TypeParam, VariantDef, |
22 | }; | 22 | }; |
23 | use hir_expand::ExpansionInfo; | 23 | use hir_expand::ExpansionInfo; |
24 | use ra_prof::profile; | 24 | use ra_prof::profile; |
@@ -129,6 +129,10 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> { | |||
129 | self.analyze(path.syntax()).resolve_path(self.db, path) | 129 | self.analyze(path.syntax()).resolve_path(self.db, path) |
130 | } | 130 | } |
131 | 131 | ||
132 | pub fn resolve_bind_pat_to_const(&self, pat: &ast::BindPat) -> Option<ModuleDef> { | ||
133 | self.analyze(pat.syntax()).resolve_bind_pat_to_const(self.db, pat) | ||
134 | } | ||
135 | |||
132 | // FIXME: use this instead? | 136 | // FIXME: use this instead? |
133 | // pub fn resolve_name_ref(&self, name_ref: &ast::NameRef) -> Option<???>; | 137 | // pub fn resolve_name_ref(&self, name_ref: &ast::NameRef) -> Option<???>; |
134 | 138 | ||
diff --git a/crates/ra_hir/src/source_analyzer.rs b/crates/ra_hir/src/source_analyzer.rs index b655e2c32..c650a9e08 100644 --- a/crates/ra_hir/src/source_analyzer.rs +++ b/crates/ra_hir/src/source_analyzer.rs | |||
@@ -11,9 +11,9 @@ use either::Either; | |||
11 | use hir_def::{ | 11 | use hir_def::{ |
12 | body::{ | 12 | body::{ |
13 | scope::{ExprScopes, ScopeId}, | 13 | scope::{ExprScopes, ScopeId}, |
14 | BodySourceMap, | 14 | Body, BodySourceMap, |
15 | }, | 15 | }, |
16 | expr::{ExprId, PatId}, | 16 | expr::{ExprId, Pat, PatId}, |
17 | resolver::{resolver_for_scope, Resolver, TypeNs, ValueNs}, | 17 | resolver::{resolver_for_scope, Resolver, TypeNs, ValueNs}, |
18 | AsMacroCall, DefWithBodyId, | 18 | AsMacroCall, DefWithBodyId, |
19 | }; | 19 | }; |
@@ -25,8 +25,8 @@ use ra_syntax::{ | |||
25 | }; | 25 | }; |
26 | 26 | ||
27 | use crate::{ | 27 | use crate::{ |
28 | db::HirDatabase, Adt, Const, EnumVariant, Function, Local, MacroDef, Path, Static, Struct, | 28 | db::HirDatabase, Adt, Const, EnumVariant, Function, Local, MacroDef, ModuleDef, Path, Static, |
29 | Trait, Type, TypeAlias, TypeParam, | 29 | Struct, Trait, Type, TypeAlias, TypeParam, |
30 | }; | 30 | }; |
31 | 31 | ||
32 | /// `SourceAnalyzer` is a convenience wrapper which exposes HIR API in terms of | 32 | /// `SourceAnalyzer` is a convenience wrapper which exposes HIR API in terms of |
@@ -35,6 +35,7 @@ use crate::{ | |||
35 | pub(crate) struct SourceAnalyzer { | 35 | pub(crate) struct SourceAnalyzer { |
36 | file_id: HirFileId, | 36 | file_id: HirFileId, |
37 | pub(crate) resolver: Resolver, | 37 | pub(crate) resolver: Resolver, |
38 | body: Option<Arc<Body>>, | ||
38 | body_source_map: Option<Arc<BodySourceMap>>, | 39 | body_source_map: Option<Arc<BodySourceMap>>, |
39 | infer: Option<Arc<InferenceResult>>, | 40 | infer: Option<Arc<InferenceResult>>, |
40 | scopes: Option<Arc<ExprScopes>>, | 41 | scopes: Option<Arc<ExprScopes>>, |
@@ -66,7 +67,7 @@ impl SourceAnalyzer { | |||
66 | node: InFile<&SyntaxNode>, | 67 | node: InFile<&SyntaxNode>, |
67 | offset: Option<TextUnit>, | 68 | offset: Option<TextUnit>, |
68 | ) -> SourceAnalyzer { | 69 | ) -> SourceAnalyzer { |
69 | let (_body, source_map) = db.body_with_source_map(def); | 70 | let (body, source_map) = db.body_with_source_map(def); |
70 | let scopes = db.expr_scopes(def); | 71 | let scopes = db.expr_scopes(def); |
71 | let scope = match offset { | 72 | let scope = match offset { |
72 | None => scope_for(&scopes, &source_map, node), | 73 | None => scope_for(&scopes, &source_map, node), |
@@ -75,6 +76,7 @@ impl SourceAnalyzer { | |||
75 | let resolver = resolver_for_scope(db, def, scope); | 76 | let resolver = resolver_for_scope(db, def, scope); |
76 | SourceAnalyzer { | 77 | SourceAnalyzer { |
77 | resolver, | 78 | resolver, |
79 | body: Some(body), | ||
78 | body_source_map: Some(source_map), | 80 | body_source_map: Some(source_map), |
79 | infer: Some(db.infer(def)), | 81 | infer: Some(db.infer(def)), |
80 | scopes: Some(scopes), | 82 | scopes: Some(scopes), |
@@ -88,6 +90,7 @@ impl SourceAnalyzer { | |||
88 | ) -> SourceAnalyzer { | 90 | ) -> SourceAnalyzer { |
89 | SourceAnalyzer { | 91 | SourceAnalyzer { |
90 | resolver, | 92 | resolver, |
93 | body: None, | ||
91 | body_source_map: None, | 94 | body_source_map: None, |
92 | infer: None, | 95 | infer: None, |
93 | scopes: None, | 96 | scopes: None, |
@@ -197,6 +200,24 @@ impl SourceAnalyzer { | |||
197 | self.resolver.resolve_path_as_macro(db, path.mod_path()).map(|it| it.into()) | 200 | self.resolver.resolve_path_as_macro(db, path.mod_path()).map(|it| it.into()) |
198 | } | 201 | } |
199 | 202 | ||
203 | pub(crate) fn resolve_bind_pat_to_const( | ||
204 | &self, | ||
205 | db: &impl HirDatabase, | ||
206 | pat: &ast::BindPat, | ||
207 | ) -> Option<ModuleDef> { | ||
208 | let pat_id = self.pat_id(&pat.clone().into())?; | ||
209 | let body = self.body.as_ref()?; | ||
210 | let path = match &body[pat_id] { | ||
211 | Pat::Path(path) => path, | ||
212 | _ => return None, | ||
213 | }; | ||
214 | let res = resolve_hir_path(db, &self.resolver, &path)?; | ||
215 | match res { | ||
216 | PathResolution::Def(def) => Some(def), | ||
217 | _ => None, | ||
218 | } | ||
219 | } | ||
220 | |||
200 | pub(crate) fn resolve_path( | 221 | pub(crate) fn resolve_path( |
201 | &self, | 222 | &self, |
202 | db: &impl HirDatabase, | 223 | db: &impl HirDatabase, |