Skip to content

Commit e9f9bc2

Browse files
committed
Auto merge of rust-lang#14795 - Veykril:hl-macros, r=Veykril
fix: Add macro modifier for highlighting tokens in macro calls Followup to rust-lang/rust-analyzer#14777 we have to tell the client about the semantic tokens inside macro calls as those can be remapped. Adding a modifier will force this behavior.
2 parents 884dd8c + 8e11685 commit e9f9bc2

12 files changed

+172
-131
lines changed

crates/ide/src/syntax_highlighting.rs

+45-33
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ pub struct HighlightConfig {
166166
// injected:: Emitted for doc-string injected highlighting like rust source blocks in documentation.
167167
// intraDocLink:: Emitted for intra doc links in doc-strings.
168168
// library:: Emitted for items that are defined outside of the current crate.
169+
// macro:: Emitted for tokens inside macro calls.
169170
// mutable:: Emitted for mutable locals and statics as well as functions taking `&mut self`.
170171
// public:: Emitted for items that are from the current crate and are `pub`.
171172
// reference:: Emitted for locals behind a reference and functions taking `self` by reference.
@@ -240,6 +241,7 @@ fn traverse(
240241
let mut current_macro: Option<ast::Macro> = None;
241242
let mut macro_highlighter = MacroHighlighter::default();
242243
let mut inside_attribute = false;
244+
let mut inside_macro_call = false;
243245

244246
// Walk all nodes, keeping track of whether we are inside a macro or not.
245247
// If in macro, expand it first and highlight the expanded code.
@@ -270,46 +272,50 @@ fn traverse(
270272
inside_attribute = false
271273
}
272274

273-
Enter(NodeOrToken::Node(node)) if ast::Item::can_cast(node.kind()) => {
274-
match ast::Item::cast(node.clone()) {
275-
Some(ast::Item::MacroRules(mac)) => {
276-
macro_highlighter.init();
277-
current_macro = Some(mac.into());
278-
continue;
279-
}
280-
Some(ast::Item::MacroDef(mac)) => {
281-
macro_highlighter.init();
282-
current_macro = Some(mac.into());
283-
continue;
284-
}
285-
Some(item) => {
286-
if matches!(node.kind(), FN | CONST | STATIC) {
287-
bindings_shadow_count.clear();
275+
Enter(NodeOrToken::Node(node)) => match ast::Item::cast(node.clone()) {
276+
Some(item) => {
277+
match item {
278+
ast::Item::MacroRules(mac) => {
279+
macro_highlighter.init();
280+
current_macro = Some(mac.into());
281+
continue;
282+
}
283+
ast::Item::MacroDef(mac) => {
284+
macro_highlighter.init();
285+
current_macro = Some(mac.into());
286+
continue;
288287
}
288+
ast::Item::Fn(_) | ast::Item::Const(_) | ast::Item::Static(_) => {
289+
bindings_shadow_count.clear()
290+
}
291+
ast::Item::MacroCall(_) => {
292+
inside_macro_call = true;
293+
}
294+
_ => (),
295+
}
289296

290-
if attr_or_derive_item.is_none() {
291-
if sema.is_attr_macro_call(&item) {
292-
attr_or_derive_item = Some(AttrOrDerive::Attr(item));
293-
} else {
294-
let adt = match item {
295-
ast::Item::Enum(it) => Some(ast::Adt::Enum(it)),
296-
ast::Item::Struct(it) => Some(ast::Adt::Struct(it)),
297-
ast::Item::Union(it) => Some(ast::Adt::Union(it)),
298-
_ => None,
299-
};
300-
match adt {
301-
Some(adt) if sema.is_derive_annotated(&adt) => {
302-
attr_or_derive_item =
303-
Some(AttrOrDerive::Derive(ast::Item::from(adt)));
304-
}
305-
_ => (),
297+
if attr_or_derive_item.is_none() {
298+
if sema.is_attr_macro_call(&item) {
299+
attr_or_derive_item = Some(AttrOrDerive::Attr(item));
300+
} else {
301+
let adt = match item {
302+
ast::Item::Enum(it) => Some(ast::Adt::Enum(it)),
303+
ast::Item::Struct(it) => Some(ast::Adt::Struct(it)),
304+
ast::Item::Union(it) => Some(ast::Adt::Union(it)),
305+
_ => None,
306+
};
307+
match adt {
308+
Some(adt) if sema.is_derive_annotated(&adt) => {
309+
attr_or_derive_item =
310+
Some(AttrOrDerive::Derive(ast::Item::from(adt)));
306311
}
312+
_ => (),
307313
}
308314
}
309315
}
310-
_ => (),
311316
}
312-
}
317+
_ => (),
318+
},
313319
Leave(NodeOrToken::Node(node)) if ast::Item::can_cast(node.kind()) => {
314320
match ast::Item::cast(node.clone()) {
315321
Some(ast::Item::MacroRules(mac)) => {
@@ -327,6 +333,9 @@ fn traverse(
327333
{
328334
attr_or_derive_item = None;
329335
}
336+
Some(ast::Item::MacroCall(_)) => {
337+
inside_macro_call = false;
338+
}
330339
_ => (),
331340
}
332341
}
@@ -476,6 +485,9 @@ fn traverse(
476485
if inside_attribute {
477486
highlight |= HlMod::Attribute
478487
}
488+
if inside_macro_call && tt_level > 0 {
489+
highlight |= HlMod::Macro
490+
}
479491

480492
hl.add(HlRange { range, highlight, binding_hash });
481493
}

crates/ide/src/syntax_highlighting/inject.rs

+26-3
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,11 @@ pub(super) fn ra_fixture(
5252

5353
if let Some(next) = text.strip_prefix(marker) {
5454
if let Some(range) = literal.map_range_up(TextRange::at(offset, TextSize::of(marker))) {
55-
hl.add(HlRange { range, highlight: HlTag::Keyword.into(), binding_hash: None });
55+
hl.add(HlRange {
56+
range,
57+
highlight: HlTag::Keyword | HlMod::Injected,
58+
binding_hash: None,
59+
});
5660
}
5761

5862
text = next;
@@ -66,14 +70,24 @@ pub(super) fn ra_fixture(
6670

6771
for mut hl_range in analysis
6872
.highlight(
69-
HighlightConfig { syntactic_name_ref_highlighting: false, ..config },
73+
HighlightConfig {
74+
syntactic_name_ref_highlighting: false,
75+
punctuation: true,
76+
operator: true,
77+
strings: true,
78+
specialize_punctuation: config.specialize_punctuation,
79+
specialize_operator: config.operator,
80+
inject_doc_comment: config.inject_doc_comment,
81+
macro_bang: config.macro_bang,
82+
},
7083
tmp_file_id,
7184
)
7285
.unwrap()
7386
{
7487
for range in inj.map_range_up(hl_range.range) {
7588
if let Some(range) = literal.map_range_up(range) {
7689
hl_range.range = range;
90+
hl_range.highlight |= HlMod::Injected;
7791
hl.add(hl_range);
7892
}
7993
}
@@ -217,7 +231,16 @@ pub(super) fn doc_comment(
217231
if let Ok(ranges) = analysis.with_db(|db| {
218232
super::highlight(
219233
db,
220-
HighlightConfig { syntactic_name_ref_highlighting: true, ..config },
234+
HighlightConfig {
235+
syntactic_name_ref_highlighting: true,
236+
punctuation: true,
237+
operator: true,
238+
strings: true,
239+
specialize_punctuation: config.specialize_punctuation,
240+
specialize_operator: config.operator,
241+
inject_doc_comment: config.inject_doc_comment,
242+
macro_bang: config.macro_bang,
243+
},
221244
tmp_file_id,
222245
None,
223246
)

crates/ide/src/syntax_highlighting/tags.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ pub enum HlMod {
4949
Associated = 0,
5050
/// Used with keywords like `async` and `await`.
5151
Async,
52-
/// Used to differentiate individual elements within attributes.
52+
/// Used to differentiate individual elements within attribute calls.
5353
Attribute,
5454
/// Callable item or value.
5555
Callable,
@@ -72,6 +72,8 @@ pub enum HlMod {
7272
IntraDocLink,
7373
/// Used for items from other crates.
7474
Library,
75+
/// Used to differentiate individual elements within macro calls.
76+
Macro,
7577
/// Mutable binding.
7678
Mutable,
7779
/// Used for public items.
@@ -200,7 +202,7 @@ impl fmt::Display for HlTag {
200202
}
201203

202204
impl HlMod {
203-
const ALL: &'static [HlMod; 19] = &[
205+
const ALL: &'static [HlMod; HlMod::Unsafe as usize + 1] = &[
204206
HlMod::Associated,
205207
HlMod::Async,
206208
HlMod::Attribute,
@@ -214,6 +216,7 @@ impl HlMod {
214216
HlMod::Injected,
215217
HlMod::IntraDocLink,
216218
HlMod::Library,
219+
HlMod::Macro,
217220
HlMod::Mutable,
218221
HlMod::Public,
219222
HlMod::Reference,
@@ -237,6 +240,7 @@ impl HlMod {
237240
HlMod::Injected => "injected",
238241
HlMod::IntraDocLink => "intra_doc_link",
239242
HlMod::Library => "library",
243+
HlMod::Macro => "macro",
240244
HlMod::Mutable => "mutable",
241245
HlMod::Public => "public",
242246
HlMod::Reference => "reference",

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="keyword injected">let</span><span class="none injected"> </span><span class="variable declaration injected">foo</span><span class="none injected"> </span><span class="operator injected">=</span><span class="none injected"> </span><span class="struct injected">Foo</span><span class="operator injected">::</span><span class="function injected">new</span><span class="parenthesis injected">(</span><span class="parenthesis injected">)</span><span class="semicolon injected">;</span>
9494
<span class="comment documentation">///</span>
9595
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="comment injected">// calls bar on foo</span>
96-
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="macro injected">assert</span><span class="macro_bang injected">!</span><span class="parenthesis injected">(</span><span class="none injected">foo</span><span class="operator injected">.</span><span class="none injected">bar</span><span class="parenthesis injected">(</span><span class="parenthesis injected">)</span><span class="parenthesis injected">)</span><span class="semicolon injected">;</span>
96+
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="macro injected">assert</span><span class="macro_bang injected">!</span><span class="parenthesis injected macro">(</span><span class="none injected macro">foo</span><span class="operator injected macro">.</span><span class="none injected macro">bar</span><span class="parenthesis injected macro">(</span><span class="parenthesis injected macro">)</span><span class="parenthesis injected macro">)</span><span class="semicolon injected">;</span>
9797
<span class="comment documentation">///</span>
9898
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="keyword injected">let</span><span class="none injected"> </span><span class="variable declaration injected">bar</span><span class="none injected"> </span><span class="operator injected">=</span><span class="none injected"> </span><span class="variable injected">foo</span><span class="operator injected">.</span><span class="field injected">bar</span><span class="none injected"> </span><span class="logical injected">||</span><span class="none injected"> </span><span class="struct injected">Foo</span><span class="operator injected">::</span><span class="constant injected">bar</span><span class="semicolon injected">;</span>
9999
<span class="comment documentation">///</span>
@@ -145,7 +145,7 @@
145145

146146
<span class="comment documentation">/// ```</span>
147147
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="keyword injected">macro_rules</span><span class="macro_bang injected">!</span><span class="none injected"> </span><span class="macro declaration injected">noop</span><span class="none injected"> </span><span class="brace injected">{</span><span class="none injected"> </span><span class="parenthesis injected">(</span><span class="punctuation injected">$</span><span class="none injected">expr</span><span class="colon injected">:</span><span class="none injected">expr</span><span class="parenthesis injected">)</span><span class="none injected"> </span><span class="operator injected">=</span><span class="angle injected">&gt;</span><span class="none injected"> </span><span class="brace injected">{</span><span class="none injected"> </span><span class="punctuation injected">$</span><span class="none injected">expr </span><span class="brace injected">}</span><span class="brace injected">}</span>
148-
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="macro injected">noop</span><span class="macro_bang injected">!</span><span class="parenthesis injected">(</span><span class="numeric_literal injected">1</span><span class="parenthesis injected">)</span><span class="semicolon injected">;</span>
148+
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="macro injected">noop</span><span class="macro_bang injected">!</span><span class="parenthesis injected macro">(</span><span class="numeric_literal injected macro">1</span><span class="parenthesis injected macro">)</span><span class="semicolon injected">;</span>
149149
<span class="comment documentation">/// ```</span>
150150
<span class="keyword">macro_rules</span><span class="macro_bang">!</span> <span class="macro declaration">noop</span> <span class="brace">{</span>
151151
<span class="parenthesis">(</span><span class="punctuation">$</span>expr<span class="colon">:</span>expr<span class="parenthesis">)</span> <span class="operator">=</span><span class="angle">&gt;</span> <span class="brace">{</span>
@@ -165,7 +165,7 @@
165165
<span class="comment documentation">///</span>
166166
<span class="attribute_bracket attribute">#</span><span class="attribute_bracket attribute">[</span><span class="builtin_attr attribute library">cfg_attr</span><span class="parenthesis attribute">(</span><span class="none attribute">feature</span> <span class="operator attribute">=</span> <span class="string_literal attribute">"alloc"</span><span class="comma attribute">,</span> <span class="none attribute">doc</span> <span class="operator attribute">=</span> <span class="string_literal attribute">"```rust"</span><span class="parenthesis attribute">)</span><span class="attribute_bracket attribute">]</span>
167167
<span class="attribute_bracket attribute">#</span><span class="attribute_bracket attribute">[</span><span class="builtin_attr attribute library">cfg_attr</span><span class="parenthesis attribute">(</span><span class="none attribute">not</span><span class="parenthesis attribute">(</span><span class="none attribute">feature</span> <span class="operator attribute">=</span> <span class="string_literal attribute">"alloc"</span><span class="parenthesis attribute">)</span><span class="comma attribute">,</span> <span class="none attribute">doc</span> <span class="operator attribute">=</span> <span class="string_literal attribute">"```ignore"</span><span class="parenthesis attribute">)</span><span class="attribute_bracket attribute">]</span>
168-
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="keyword injected">let</span><span class="none injected"> </span><span class="punctuation injected">_</span><span class="none injected"> </span><span class="operator injected">=</span><span class="none injected"> </span><span class="function injected">example</span><span class="parenthesis injected">(</span><span class="operator injected">&</span><span class="module injected">alloc</span><span class="operator injected">::</span><span class="macro injected">vec</span><span class="macro_bang injected">!</span><span class="bracket injected">[</span><span class="numeric_literal injected">1</span><span class="comma injected">,</span><span class="none injected"> </span><span class="numeric_literal injected">2</span><span class="comma injected">,</span><span class="none injected"> </span><span class="numeric_literal injected">3</span><span class="bracket injected">]</span><span class="parenthesis injected">)</span><span class="semicolon injected">;</span>
168+
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="keyword injected">let</span><span class="none injected"> </span><span class="punctuation injected">_</span><span class="none injected"> </span><span class="operator injected">=</span><span class="none injected"> </span><span class="function injected">example</span><span class="parenthesis injected">(</span><span class="operator injected">&</span><span class="module injected">alloc</span><span class="operator injected">::</span><span class="macro injected">vec</span><span class="macro_bang injected">!</span><span class="bracket injected macro">[</span><span class="numeric_literal injected macro">1</span><span class="comma injected macro">,</span><span class="none injected"> </span><span class="numeric_literal injected macro">2</span><span class="comma injected macro">,</span><span class="none injected"> </span><span class="numeric_literal injected macro">3</span><span class="bracket injected macro">]</span><span class="parenthesis injected">)</span><span class="semicolon injected">;</span>
169169
<span class="comment documentation">/// ```</span>
170170
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function declaration public">mix_and_match</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
171171

0 commit comments

Comments
 (0)