diff options
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/hir/src/semantics.rs | 10 | ||||
| -rw-r--r-- | crates/ide/src/syntax_highlighting.rs | 30 |
2 files changed, 40 insertions, 0 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index 920e18208..2d08a7704 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs | |||
| @@ -123,6 +123,10 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> { | |||
| 123 | self.imp.expand_attr_macro(item) | 123 | self.imp.expand_attr_macro(item) |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | pub fn is_attr_macro_call(&self, item: &ast::Item) -> bool { | ||
| 127 | self.imp.is_attr_macro_call(item) | ||
| 128 | } | ||
| 129 | |||
| 126 | pub fn speculative_expand( | 130 | pub fn speculative_expand( |
| 127 | &self, | 131 | &self, |
| 128 | actual_macro_call: &ast::MacroCall, | 132 | actual_macro_call: &ast::MacroCall, |
| @@ -348,6 +352,12 @@ impl<'db> SemanticsImpl<'db> { | |||
| 348 | Some(node) | 352 | Some(node) |
| 349 | } | 353 | } |
| 350 | 354 | ||
| 355 | fn is_attr_macro_call(&self, item: &ast::Item) -> bool { | ||
| 356 | let sa = self.analyze(item.syntax()); | ||
| 357 | let src = InFile::new(sa.file_id, item.clone()); | ||
| 358 | self.with_ctx(|ctx| ctx.item_to_macro_call(src).is_some()) | ||
| 359 | } | ||
| 360 | |||
| 351 | fn speculative_expand( | 361 | fn speculative_expand( |
| 352 | &self, | 362 | &self, |
| 353 | actual_macro_call: &ast::MacroCall, | 363 | actual_macro_call: &ast::MacroCall, |
diff --git a/crates/ide/src/syntax_highlighting.rs b/crates/ide/src/syntax_highlighting.rs index 79c2f4a1e..b03f1c71f 100644 --- a/crates/ide/src/syntax_highlighting.rs +++ b/crates/ide/src/syntax_highlighting.rs | |||
| @@ -192,6 +192,7 @@ fn traverse( | |||
| 192 | let mut bindings_shadow_count: FxHashMap<Name, u32> = FxHashMap::default(); | 192 | let mut bindings_shadow_count: FxHashMap<Name, u32> = FxHashMap::default(); |
| 193 | 193 | ||
| 194 | let mut current_macro_call: Option<ast::MacroCall> = None; | 194 | let mut current_macro_call: Option<ast::MacroCall> = None; |
| 195 | let mut current_attr_macro_call = None; | ||
| 195 | let mut current_macro: Option<ast::Macro> = None; | 196 | let mut current_macro: Option<ast::Macro> = None; |
| 196 | let mut macro_highlighter = MacroHighlighter::default(); | 197 | let mut macro_highlighter = MacroHighlighter::default(); |
| 197 | let mut inside_attribute = false; | 198 | let mut inside_attribute = false; |
| @@ -227,6 +228,19 @@ fn traverse( | |||
| 227 | } | 228 | } |
| 228 | _ => (), | 229 | _ => (), |
| 229 | } | 230 | } |
| 231 | match event.clone().map(|it| it.into_node().and_then(ast::Item::cast)) { | ||
| 232 | WalkEvent::Enter(Some(item)) => { | ||
| 233 | if sema.is_attr_macro_call(&item) { | ||
| 234 | current_attr_macro_call = Some(item); | ||
| 235 | } | ||
| 236 | } | ||
| 237 | WalkEvent::Leave(Some(item)) => { | ||
| 238 | if current_attr_macro_call == Some(item) { | ||
| 239 | current_attr_macro_call = None; | ||
| 240 | } | ||
| 241 | } | ||
| 242 | _ => (), | ||
| 243 | } | ||
| 230 | 244 | ||
| 231 | match event.clone().map(|it| it.into_node().and_then(ast::Macro::cast)) { | 245 | match event.clone().map(|it| it.into_node().and_then(ast::Macro::cast)) { |
| 232 | WalkEvent::Enter(Some(mac)) => { | 246 | WalkEvent::Enter(Some(mac)) => { |
| @@ -286,6 +300,22 @@ fn traverse( | |||
| 286 | } | 300 | } |
| 287 | None => token.into(), | 301 | None => token.into(), |
| 288 | } | 302 | } |
| 303 | } else if current_attr_macro_call.is_some() { | ||
| 304 | let token = match element.clone().into_token() { | ||
| 305 | Some(it) => it, | ||
| 306 | _ => continue, | ||
| 307 | }; | ||
| 308 | let token = sema.descend_into_macros(token.clone()); | ||
| 309 | match token.parent() { | ||
| 310 | Some(parent) => { | ||
| 311 | // We only care Name and Name_ref | ||
| 312 | match (token.kind(), parent.kind()) { | ||
| 313 | (IDENT, NAME) | (IDENT, NAME_REF) => parent.into(), | ||
| 314 | _ => token.into(), | ||
| 315 | } | ||
| 316 | } | ||
| 317 | None => token.into(), | ||
| 318 | } | ||
| 289 | } else { | 319 | } else { |
| 290 | element.clone() | 320 | element.clone() |
| 291 | }; | 321 | }; |
