diff options
Diffstat (limited to 'crates/ra_hir/src/source_binder.rs')
-rw-r--r-- | crates/ra_hir/src/source_binder.rs | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 2959e3eca..06d99351e 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs | |||
@@ -10,7 +10,7 @@ use std::sync::Arc; | |||
10 | use rustc_hash::{FxHashSet, FxHashMap}; | 10 | use rustc_hash::{FxHashSet, FxHashMap}; |
11 | use ra_db::{FileId, FilePosition}; | 11 | use ra_db::{FileId, FilePosition}; |
12 | use ra_syntax::{ | 12 | use ra_syntax::{ |
13 | SyntaxNode, AstPtr, TextUnit, SyntaxNodePtr, TextRange, | 13 | SyntaxNode, AstPtr, TextUnit, SyntaxNodePtr, TextRange,TreeArc, |
14 | ast::{self, AstNode, NameOwner}, | 14 | ast::{self, AstNode, NameOwner}, |
15 | algo::find_node_at_offset, | 15 | algo::find_node_at_offset, |
16 | SyntaxKind::*, | 16 | SyntaxKind::*, |
@@ -18,9 +18,10 @@ use ra_syntax::{ | |||
18 | 18 | ||
19 | use crate::{ | 19 | use crate::{ |
20 | HirDatabase, Function, Struct, Enum, Const, Static, Either, DefWithBody, PerNs, Name, | 20 | HirDatabase, Function, Struct, Enum, Const, Static, Either, DefWithBody, PerNs, Name, |
21 | AsName, Module, HirFileId, Crate, Trait, Resolver, Ty, | 21 | AsName, Module, HirFileId, Crate, Trait, Resolver, Ty,Path, |
22 | expr::{BodySourceMap, scope::{ScopeId, ExprScopes}}, | 22 | expr::{BodySourceMap, scope::{ScopeId, ExprScopes}}, |
23 | ids::LocationCtx, | 23 | ids::{LocationCtx,MacroCallId}, |
24 | docs::{docs_from_ast,Documentation}, | ||
24 | expr, AstId, | 25 | expr, AstId, |
25 | }; | 26 | }; |
26 | 27 | ||
@@ -184,9 +185,28 @@ pub enum PathResolution { | |||
184 | /// A generic parameter | 185 | /// A generic parameter |
185 | GenericParam(u32), | 186 | GenericParam(u32), |
186 | SelfType(crate::ImplBlock), | 187 | SelfType(crate::ImplBlock), |
188 | Macro(MacroByExampleDef), | ||
187 | AssocItem(crate::ImplItem), | 189 | AssocItem(crate::ImplItem), |
188 | } | 190 | } |
189 | 191 | ||
192 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
193 | pub struct MacroByExampleDef { | ||
194 | pub(crate) id: MacroCallId, | ||
195 | } | ||
196 | |||
197 | impl MacroByExampleDef { | ||
198 | pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc<ast::MacroCall>) { | ||
199 | let loc = self.id.loc(db); | ||
200 | (self.id.into(), loc.def.0.to_node(db)) | ||
201 | } | ||
202 | } | ||
203 | |||
204 | impl crate::Docs for MacroByExampleDef { | ||
205 | fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> { | ||
206 | docs_from_ast(&*self.source(db).1) | ||
207 | } | ||
208 | } | ||
209 | |||
190 | #[derive(Debug, Clone, PartialEq, Eq)] | 210 | #[derive(Debug, Clone, PartialEq, Eq)] |
191 | pub struct ScopeEntryWithSyntax { | 211 | pub struct ScopeEntryWithSyntax { |
192 | pub(crate) name: Name, | 212 | pub(crate) name: Name, |
@@ -264,6 +284,23 @@ impl SourceAnalyzer { | |||
264 | self.infer.as_ref()?.field_resolution(expr_id) | 284 | self.infer.as_ref()?.field_resolution(expr_id) |
265 | } | 285 | } |
266 | 286 | ||
287 | pub fn resolve_macro_call( | ||
288 | &self, | ||
289 | db: &impl HirDatabase, | ||
290 | file_id: FileId, | ||
291 | macro_call: &ast::MacroCall, | ||
292 | ) -> Option<MacroByExampleDef> { | ||
293 | let hir_id = file_id.into(); | ||
294 | let ast_id = db.ast_id_map(hir_id).ast_id(macro_call).with_file_id(hir_id); | ||
295 | let call_id = self.resolver.resolve_macro_call( | ||
296 | db, | ||
297 | macro_call.path().and_then(Path::from_ast), | ||
298 | ast_id, | ||
299 | ); | ||
300 | |||
301 | call_id.map(|id| MacroByExampleDef { id }) | ||
302 | } | ||
303 | |||
267 | pub fn resolve_hir_path( | 304 | pub fn resolve_hir_path( |
268 | &self, | 305 | &self, |
269 | db: &impl HirDatabase, | 306 | db: &impl HirDatabase, |