Skip to content

Commit 9b7ec5e

Browse files
committed
Ignore strings in token trees in syntax highlighting
1 parent 4525787 commit 9b7ec5e

File tree

4 files changed

+30
-8
lines changed

4 files changed

+30
-8
lines changed

crates/hir/src/semantics.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,8 +606,8 @@ impl<'db> SemanticsImpl<'db> {
606606
}
607607
Dp::None => true,
608608
};
609+
res = value;
609610
if is_a_match {
610-
res = value;
611611
ControlFlow::Break(())
612612
} else {
613613
ControlFlow::Continue(())

crates/ide/src/syntax_highlighting.rs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -393,13 +393,25 @@ fn traverse(
393393
// Attempt to descend tokens into macro-calls.
394394
let res = match element {
395395
NodeOrToken::Token(token) if token.kind() != COMMENT => {
396-
let token = sema.descend_into_macros_single(
397-
match attr_or_derive_item {
398-
Some(AttrOrDerive::Attr(_)) => DescendPreference::SameKind,
399-
Some(AttrOrDerive::Derive(_)) | None => DescendPreference::None,
400-
},
401-
token,
402-
);
396+
let token = if token.kind() == STRING {
397+
// for strings, try to prefer a string that has not been lost in a token
398+
// tree
399+
// FIXME: This should be done for everything, but check perf first
400+
sema.descend_into_macros(DescendPreference::SameKind, token)
401+
.into_iter()
402+
.max_by_key(|it| {
403+
it.parent().map_or(false, |it| it.kind() != TOKEN_TREE)
404+
})
405+
.unwrap()
406+
} else {
407+
sema.descend_into_macros_single(
408+
match attr_or_derive_item {
409+
Some(AttrOrDerive::Attr(_)) => DescendPreference::SameKind,
410+
Some(AttrOrDerive::Derive(_)) | None => DescendPreference::None,
411+
},
412+
token,
413+
)
414+
};
403415
match token.parent().and_then(ast::NameLike::cast) {
404416
// Remap the token into the wrapping single token nodes
405417
Some(parent) => match (token.kind(), parent.syntax().kind()) {

crates/ide/src/syntax_highlighting/test_data/highlight_strings.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@
7676
<span class="parenthesis">(</span><span class="punctuation">$</span><span class="parenthesis">(</span><span class="punctuation">$</span>arg<span class="colon">:</span>tt<span class="parenthesis">)</span><span class="punctuation">+</span><span class="parenthesis">)</span> <span class="operator">=</span><span class="angle">&gt;</span> <span class="parenthesis">(</span><span class="punctuation">$</span>crate<span class="colon">:</span><span class="colon">:</span>panic<span class="punctuation">!</span><span class="parenthesis">(</span><span class="string_literal">"not yet implemented: {}"</span><span class="comma">,</span> format_args<span class="punctuation">!</span><span class="parenthesis">(</span><span class="punctuation">$</span><span class="parenthesis">(</span><span class="punctuation">$</span>arg<span class="parenthesis">)</span><span class="punctuation">+</span><span class="parenthesis">)</span><span class="parenthesis">)</span><span class="parenthesis">)</span><span class="semicolon">;</span>
7777
<span class="brace">}</span>
7878

79+
<span class="keyword">macro_rules</span><span class="macro_bang">!</span> <span class="macro declaration">reuse_twice</span> <span class="brace">{</span>
80+
<span class="parenthesis">(</span><span class="punctuation">$</span>literal<span class="colon">:</span>literal<span class="parenthesis">)</span> <span class="operator">=</span><span class="angle">&gt;</span> <span class="brace">{</span><span class="brace">{</span>stringify<span class="punctuation">!</span><span class="parenthesis">(</span><span class="punctuation">$</span>literal<span class="parenthesis">)</span><span class="semicolon">;</span> format_args<span class="punctuation">!</span><span class="parenthesis">(</span><span class="punctuation">$</span>literal<span class="parenthesis">)</span><span class="brace">}</span><span class="brace">}</span><span class="semicolon">;</span>
81+
<span class="brace">}</span>
82+
7983
<span class="keyword">fn</span> <span class="function declaration">main</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
8084
<span class="keyword">let</span> <span class="variable declaration">a</span> <span class="operator">=</span> <span class="char_literal">'</span><span class="escape_sequence">\n</span><span class="char_literal">'</span><span class="semicolon">;</span>
8185
<span class="keyword">let</span> <span class="variable declaration">a</span> <span class="operator">=</span> <span class="char_literal">'</span><span class="escape_sequence">\t</span><span class="char_literal">'</span><span class="semicolon">;</span>
@@ -170,4 +174,5 @@
170174
<span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable declaration mutable">m</span> <span class="operator">=</span> <span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
171175
<span class="macro default_library library">format_args</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="macro default_library library macro">concat</span><span class="macro_bang macro">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"{}"</span><span class="parenthesis macro">)</span><span class="comma macro">,</span> <span class="string_literal macro">"{}"</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
172176
<span class="macro default_library library">format_args</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"</span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro"> </span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro"> </span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro"> </span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro"> </span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro"> </span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro"> </span><span class="format_specifier">{</span><span class="variable reference">backslash</span><span class="format_specifier">}</span><span class="string_literal macro"> </span><span class="format_specifier">{</span><span class="constant">CONSTANT</span><span class="format_specifier">}</span><span class="string_literal macro"> </span><span class="format_specifier">{</span><span class="variable mutable">m</span><span class="format_specifier">}</span><span class="string_literal macro">"</span><span class="comma macro">,</span> <span class="variable macro reference">backslash</span><span class="comma macro">,</span> <span class="macro default_library library macro">format_args</span><span class="macro_bang macro">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"</span><span class="format_specifier">{</span><span class="format_specifier">}</span><span class="string_literal macro">"</span><span class="comma macro">,</span> <span class="numeric_literal macro">0</span><span class="parenthesis macro">)</span><span class="comma macro">,</span> <span class="unresolved_reference macro">foo</span><span class="comma macro">,</span> <span class="string_literal macro">"bar"</span><span class="comma macro">,</span> <span class="macro macro">toho</span><span class="macro_bang macro">!</span><span class="parenthesis macro">(</span><span class="parenthesis macro">)</span><span class="comma macro">,</span> <span class="variable macro reference">backslash</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
177+
<span class="macro">reuse_twice</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="string_literal macro">"</span><span class="format_specifier">{</span><span class="variable reference">backslash</span><span class="format_specifier">}</span><span class="string_literal macro">"</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
173178
<span class="brace">}</span></code></pre>

crates/ide/src/syntax_highlighting/tests.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,10 @@ macro_rules! toho {
430430
($($arg:tt)+) => ($crate::panic!("not yet implemented: {}", format_args!($($arg)+)));
431431
}
432432
433+
macro_rules! reuse_twice {
434+
($literal:literal) => {{stringify!($literal); format_args!($literal)}};
435+
}
436+
433437
fn main() {
434438
let a = '\n';
435439
let a = '\t';
@@ -524,6 +528,7 @@ fn main() {
524528
let mut m = ();
525529
format_args!(concat!("{}"), "{}");
526530
format_args!("{} {} {} {} {} {} {backslash} {CONSTANT} {m}", backslash, format_args!("{}", 0), foo, "bar", toho!(), backslash);
531+
reuse_twice!("{backslash}");
527532
}"#,
528533
expect_file!["./test_data/highlight_strings.html"],
529534
false,

0 commit comments

Comments
 (0)