diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_hir/src/source_binder.rs | 11 | ||||
-rw-r--r-- | crates/ra_hir_def/src/path.rs | 2 | ||||
-rw-r--r-- | crates/ra_ide_api/src/call_info.rs | 9 | ||||
-rw-r--r-- | crates/ra_ide_api/src/expand_macro.rs | 23 | ||||
-rw-r--r-- | crates/ra_ide_api/src/references/classify.rs | 2 |
5 files changed, 34 insertions, 13 deletions
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 95a94c3f0..82cb66583 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs | |||
@@ -14,7 +14,8 @@ use hir_def::{ | |||
14 | DefWithBodyId, | 14 | DefWithBodyId, |
15 | }; | 15 | }; |
16 | use hir_expand::{ | 16 | use hir_expand::{ |
17 | name::AsName, AstId, HirFileId, MacroCallId, MacroCallLoc, MacroFileKind, Source, | 17 | hygiene::Hygiene, name::AsName, AstId, HirFileId, MacroCallId, MacroCallLoc, MacroFileKind, |
18 | Source, | ||
18 | }; | 19 | }; |
19 | use ra_syntax::{ | 20 | use ra_syntax::{ |
20 | ast::{self, AstNode}, | 21 | ast::{self, AstNode}, |
@@ -240,10 +241,10 @@ impl SourceAnalyzer { | |||
240 | pub fn resolve_macro_call( | 241 | pub fn resolve_macro_call( |
241 | &self, | 242 | &self, |
242 | db: &impl HirDatabase, | 243 | db: &impl HirDatabase, |
243 | macro_call: &ast::MacroCall, | 244 | macro_call: Source<&ast::MacroCall>, |
244 | ) -> Option<MacroDef> { | 245 | ) -> Option<MacroDef> { |
245 | // This must be a normal source file rather than macro file. | 246 | let hygiene = Hygiene::new(db, macro_call.file_id); |
246 | let path = macro_call.path().and_then(Path::from_ast)?; | 247 | let path = macro_call.value.path().and_then(|ast| Path::from_src(ast, &hygiene))?; |
247 | self.resolver.resolve_path_as_macro(db, &path).map(|it| it.into()) | 248 | self.resolver.resolve_path_as_macro(db, &path).map(|it| it.into()) |
248 | } | 249 | } |
249 | 250 | ||
@@ -445,7 +446,7 @@ impl SourceAnalyzer { | |||
445 | db: &impl HirDatabase, | 446 | db: &impl HirDatabase, |
446 | macro_call: Source<&ast::MacroCall>, | 447 | macro_call: Source<&ast::MacroCall>, |
447 | ) -> Option<Expansion> { | 448 | ) -> Option<Expansion> { |
448 | let def = self.resolve_macro_call(db, macro_call.value)?.id; | 449 | let def = self.resolve_macro_call(db, macro_call)?.id; |
449 | let ast_id = AstId::new( | 450 | let ast_id = AstId::new( |
450 | macro_call.file_id, | 451 | macro_call.file_id, |
451 | db.ast_id_map(macro_call.file_id).ast_id(macro_call.value), | 452 | db.ast_id_map(macro_call.file_id).ast_id(macro_call.value), |
diff --git a/crates/ra_hir_def/src/path.rs b/crates/ra_hir_def/src/path.rs index 0e606fd0e..6810a26db 100644 --- a/crates/ra_hir_def/src/path.rs +++ b/crates/ra_hir_def/src/path.rs | |||
@@ -97,7 +97,7 @@ impl Path { | |||
97 | 97 | ||
98 | /// Converts an `ast::Path` to `Path`. Works with use trees. | 98 | /// Converts an `ast::Path` to `Path`. Works with use trees. |
99 | /// It correctly handles `$crate` based path from macro call. | 99 | /// It correctly handles `$crate` based path from macro call. |
100 | pub(crate) fn from_src(mut path: ast::Path, hygiene: &Hygiene) -> Option<Path> { | 100 | pub fn from_src(mut path: ast::Path, hygiene: &Hygiene) -> Option<Path> { |
101 | let mut kind = PathKind::Plain; | 101 | let mut kind = PathKind::Plain; |
102 | let mut segments = Vec::new(); | 102 | let mut segments = Vec::new(); |
103 | loop { | 103 | loop { |
diff --git a/crates/ra_ide_api/src/call_info.rs b/crates/ra_ide_api/src/call_info.rs index d0283e410..d559dc4d0 100644 --- a/crates/ra_ide_api/src/call_info.rs +++ b/crates/ra_ide_api/src/call_info.rs | |||
@@ -18,12 +18,9 @@ pub(crate) fn call_info(db: &RootDatabase, position: FilePosition) -> Option<Cal | |||
18 | // Find the calling expression and it's NameRef | 18 | // Find the calling expression and it's NameRef |
19 | let calling_node = FnCallNode::with_node(&syntax, position.offset)?; | 19 | let calling_node = FnCallNode::with_node(&syntax, position.offset)?; |
20 | let name_ref = calling_node.name_ref()?; | 20 | let name_ref = calling_node.name_ref()?; |
21 | let name_ref = hir::Source::new(position.file_id.into(), name_ref.syntax()); | ||
21 | 22 | ||
22 | let analyzer = hir::SourceAnalyzer::new( | 23 | let analyzer = hir::SourceAnalyzer::new(db, name_ref, None); |
23 | db, | ||
24 | hir::Source::new(position.file_id.into(), name_ref.syntax()), | ||
25 | None, | ||
26 | ); | ||
27 | let (mut call_info, has_self) = match &calling_node { | 24 | let (mut call_info, has_self) = match &calling_node { |
28 | FnCallNode::CallExpr(expr) => { | 25 | FnCallNode::CallExpr(expr) => { |
29 | //FIXME: Type::as_callable is broken | 26 | //FIXME: Type::as_callable is broken |
@@ -44,7 +41,7 @@ pub(crate) fn call_info(db: &RootDatabase, position: FilePosition) -> Option<Cal | |||
44 | (CallInfo::with_fn(db, function), function.has_self_param(db)) | 41 | (CallInfo::with_fn(db, function), function.has_self_param(db)) |
45 | } | 42 | } |
46 | FnCallNode::MacroCallExpr(expr) => { | 43 | FnCallNode::MacroCallExpr(expr) => { |
47 | let macro_def = analyzer.resolve_macro_call(db, &expr)?; | 44 | let macro_def = analyzer.resolve_macro_call(db, name_ref.with_value(&expr))?; |
48 | (CallInfo::with_macro(db, macro_def)?, false) | 45 | (CallInfo::with_macro(db, macro_def)?, false) |
49 | } | 46 | } |
50 | }; | 47 | }; |
diff --git a/crates/ra_ide_api/src/expand_macro.rs b/crates/ra_ide_api/src/expand_macro.rs index 0b540b8cd..abc602244 100644 --- a/crates/ra_ide_api/src/expand_macro.rs +++ b/crates/ra_ide_api/src/expand_macro.rs | |||
@@ -269,4 +269,27 @@ fn some_thing() -> u32 { | |||
269 | assert_eq!(res.name, "foo"); | 269 | assert_eq!(res.name, "foo"); |
270 | assert_snapshot!(res.expansion, @r###"bar!()"###); | 270 | assert_snapshot!(res.expansion, @r###"bar!()"###); |
271 | } | 271 | } |
272 | |||
273 | #[test] | ||
274 | fn macro_expand_with_dollar_crate() { | ||
275 | let res = check_expand_macro( | ||
276 | r#" | ||
277 | //- /lib.rs | ||
278 | #[macro_export] | ||
279 | macro_rules! bar { | ||
280 | () => {0}; | ||
281 | } | ||
282 | macro_rules! foo { | ||
283 | () => {$crate::bar!()}; | ||
284 | } | ||
285 | |||
286 | fn main() { | ||
287 | let res = fo<|>o!(); | ||
288 | } | ||
289 | "#, | ||
290 | ); | ||
291 | |||
292 | assert_eq!(res.name, "foo"); | ||
293 | assert_snapshot!(res.expansion, @r###"0"###); | ||
294 | } | ||
272 | } | 295 | } |
diff --git a/crates/ra_ide_api/src/references/classify.rs b/crates/ra_ide_api/src/references/classify.rs index cab06dea9..227737ad2 100644 --- a/crates/ra_ide_api/src/references/classify.rs +++ b/crates/ra_ide_api/src/references/classify.rs | |||
@@ -152,7 +152,7 @@ pub(crate) fn classify_name_ref( | |||
152 | 152 | ||
153 | if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) { | 153 | if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) { |
154 | tested_by!(goto_definition_works_for_macros); | 154 | tested_by!(goto_definition_works_for_macros); |
155 | if let Some(macro_def) = analyzer.resolve_macro_call(db, ¯o_call) { | 155 | if let Some(macro_def) = analyzer.resolve_macro_call(db, name_ref.with_value(¯o_call)) { |
156 | let kind = NameKind::Macro(macro_def); | 156 | let kind = NameKind::Macro(macro_def); |
157 | return Some(NameDefinition { kind, container, visibility }); | 157 | return Some(NameDefinition { kind, container, visibility }); |
158 | } | 158 | } |