From 33be5762e579a9e03288ba27821951ca7db3a68e Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Mon, 7 Jun 2021 19:32:28 +0200 Subject: Attempt to track attr macros during highlighting --- crates/ide/src/syntax_highlighting.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'crates/ide') 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( let mut bindings_shadow_count: FxHashMap = FxHashMap::default(); let mut current_macro_call: Option = None; + let mut current_attr_macro_call = None; let mut current_macro: Option = None; let mut macro_highlighter = MacroHighlighter::default(); let mut inside_attribute = false; @@ -227,6 +228,19 @@ fn traverse( } _ => (), } + match event.clone().map(|it| it.into_node().and_then(ast::Item::cast)) { + WalkEvent::Enter(Some(item)) => { + if sema.is_attr_macro_call(&item) { + current_attr_macro_call = Some(item); + } + } + WalkEvent::Leave(Some(item)) => { + if current_attr_macro_call == Some(item) { + current_attr_macro_call = None; + } + } + _ => (), + } match event.clone().map(|it| it.into_node().and_then(ast::Macro::cast)) { WalkEvent::Enter(Some(mac)) => { @@ -286,6 +300,22 @@ fn traverse( } None => token.into(), } + } else if current_attr_macro_call.is_some() { + let token = match element.clone().into_token() { + Some(it) => it, + _ => continue, + }; + let token = sema.descend_into_macros(token.clone()); + match token.parent() { + Some(parent) => { + // We only care Name and Name_ref + match (token.kind(), parent.kind()) { + (IDENT, NAME) | (IDENT, NAME_REF) => parent.into(), + _ => token.into(), + } + } + None => token.into(), + } } else { element.clone() }; -- cgit v1.2.3