Unnamed repository; edit this file 'description' to name the repository.
slightly improve highlighting performance for derive annotated items
| -rw-r--r-- | crates/ide/src/syntax_highlighting.rs | 16 | ||||
| -rw-r--r-- | crates/ide/src/syntax_highlighting/test_data/highlight_lifetimes.html | 5 | ||||
| -rw-r--r-- | crates/ide/src/syntax_highlighting/tests.rs | 4 |
3 files changed, 13 insertions, 12 deletions
diff --git a/crates/ide/src/syntax_highlighting.rs b/crates/ide/src/syntax_highlighting.rs index 59d1696618..776a0f8295 100644 --- a/crates/ide/src/syntax_highlighting.rs +++ b/crates/ide/src/syntax_highlighting.rs @@ -206,6 +206,7 @@ fn traverse( let mut current_macro_call: Option<ast::MacroCall> = None; let mut current_attr_call = None; + let mut current_derive_call = None; let mut current_macro: Option<ast::Macro> = None; let mut macro_highlighter = MacroHighlighter::default(); let mut inside_attribute = false; @@ -249,7 +250,7 @@ fn traverse( }; match adt { Some(adt) if sema.is_derive_annotated(&adt) => { - current_attr_call = Some(adt.into()); + current_derive_call = Some(ast::Item::from(adt)); } _ => (), } @@ -273,7 +274,10 @@ fn traverse( macro_highlighter = MacroHighlighter::default(); } Some(item) if current_attr_call.as_ref().map_or(false, |it| *it == item) => { - current_attr_call = None + current_attr_call = None; + } + Some(item) if current_derive_call.as_ref().map_or(false, |it| *it == item) => { + current_derive_call = None; } None if ast::Attr::can_cast(node.kind()) => inside_attribute = false, _ => (), @@ -301,17 +305,19 @@ fn traverse( // as calling `descend_into_macros_single` gets rather expensive if done for every single token // additionally, do not descend into comments, descending maps down to doc attributes which get // tagged as string literals. - let descend_token = (current_macro_call.is_some() || current_attr_call.is_some()) + let descend_token = (current_macro_call.is_some() + || current_attr_call.is_some() + || current_derive_call.is_some()) && element.kind() != COMMENT; let element_to_highlight = if descend_token { let token = match &element { NodeOrToken::Node(_) => continue, NodeOrToken::Token(tok) => tok.clone(), }; - let in_mcall_outside_tt = current_macro_call.is_some() + let in_mcall_outside_tt = current_attr_call.is_none() && token.parent().as_ref().map(SyntaxNode::kind) != Some(TOKEN_TREE); let token = match in_mcall_outside_tt { - // not in the macros token tree, don't attempt to descend + // not in the macros/derives token tree, don't attempt to descend true => token, false => sema.descend_into_macros_single(token), }; diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_lifetimes.html b/crates/ide/src/syntax_highlighting/test_data/highlight_lifetimes.html index a9fcf8d2b1..9e36b56d28 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_lifetimes.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlight_lifetimes.html @@ -51,7 +51,4 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd <span class="keyword">where</span> <span class="lifetime">'a</span><span class="colon">:</span> <span class="lifetime">'a</span><span class="comma">,</span> <span class="lifetime">'static</span><span class="colon">:</span> <span class="lifetime">'static</span> -<span class="brace">{</span> - -<span class="brace">}</span> -</code></pre>
\ No newline at end of file +<span class="brace">{</span><span class="brace">}</span></code></pre>
\ No newline at end of file diff --git a/crates/ide/src/syntax_highlighting/tests.rs b/crates/ide/src/syntax_highlighting/tests.rs index 874eaf8cf7..27686ab944 100644 --- a/crates/ide/src/syntax_highlighting/tests.rs +++ b/crates/ide/src/syntax_highlighting/tests.rs @@ -327,9 +327,7 @@ impl<'a> Foo<'_, 'a, 'static> where 'a: 'a, 'static: 'static -{ - -} +{} "#, expect_file!["./test_data/highlight_lifetimes.html"], false, |