diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-12-15 14:45:09 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2020-12-15 14:45:09 +0000 |
commit | bd4c352831662762ee7a66da77ec9adf623b0a0a (patch) | |
tree | 725dfad20b95344ad363b35860cf7e57067bb5e5 /crates/ide | |
parent | 39aae835fd70d06092c1be1add6eef3984439529 (diff) | |
parent | 479babf8740a4d3cf6fc03a5f4a2fca00d387501 (diff) |
Merge #6893
6893: Move to upstream `macro_rules!` model r=matklad a=jonas-schievink
This changes `macro_rules!` from being treated as a macro invocation to being a first-class item. It also disallows using an additional ident argument for regular macros, so `m! ident(...);` now fails to parse.
This matches upstream Rust, and makes the code somewhat simpler by removing repeated "is this a `macro_rules!` call" checks. It will also simplify allowing visibilities on macros, which is currently being proposed in https://github.com/rust-lang/rust/pull/78166.
Co-authored-by: Jonas Schievink <[email protected]>
Diffstat (limited to 'crates/ide')
6 files changed, 41 insertions, 41 deletions
diff --git a/crates/ide/src/file_structure.rs b/crates/ide/src/file_structure.rs index 415795e8c..c51531391 100644 --- a/crates/ide/src/file_structure.rs +++ b/crates/ide/src/file_structure.rs | |||
@@ -150,13 +150,7 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> { | |||
150 | }; | 150 | }; |
151 | Some(node) | 151 | Some(node) |
152 | }, | 152 | }, |
153 | ast::MacroCall(it) => { | 153 | ast::MacroRules(it) => decl(it), |
154 | match it.path().and_then(|it| it.segment()).and_then(|it| it.name_ref()) { | ||
155 | Some(path_segment) if path_segment.text() == "macro_rules" | ||
156 | => decl(it), | ||
157 | _ => None, | ||
158 | } | ||
159 | }, | ||
160 | _ => None, | 154 | _ => None, |
161 | } | 155 | } |
162 | } | 156 | } |
@@ -380,7 +374,7 @@ fn very_obsolete() {} | |||
380 | label: "mc", | 374 | label: "mc", |
381 | navigation_range: 284..286, | 375 | navigation_range: 284..286, |
382 | node_range: 271..303, | 376 | node_range: 271..303, |
383 | kind: MACRO_CALL, | 377 | kind: MACRO_RULES, |
384 | detail: None, | 378 | detail: None, |
385 | deprecated: false, | 379 | deprecated: false, |
386 | }, | 380 | }, |
@@ -389,7 +383,7 @@ fn very_obsolete() {} | |||
389 | label: "mcexp", | 383 | label: "mcexp", |
390 | navigation_range: 334..339, | 384 | navigation_range: 334..339, |
391 | node_range: 305..356, | 385 | node_range: 305..356, |
392 | kind: MACRO_CALL, | 386 | kind: MACRO_RULES, |
393 | detail: None, | 387 | detail: None, |
394 | deprecated: false, | 388 | deprecated: false, |
395 | }, | 389 | }, |
@@ -398,7 +392,7 @@ fn very_obsolete() {} | |||
398 | label: "mcexp", | 392 | label: "mcexp", |
399 | navigation_range: 387..392, | 393 | navigation_range: 387..392, |
400 | node_range: 358..409, | 394 | node_range: 358..409, |
401 | kind: MACRO_CALL, | 395 | kind: MACRO_RULES, |
402 | detail: None, | 396 | detail: None, |
403 | deprecated: false, | 397 | deprecated: false, |
404 | }, | 398 | }, |
diff --git a/crates/ide/src/references.rs b/crates/ide/src/references.rs index 66f0f7950..675957fff 100644 --- a/crates/ide/src/references.rs +++ b/crates/ide/src/references.rs | |||
@@ -770,7 +770,7 @@ fn foo() { | |||
770 | } | 770 | } |
771 | "#, | 771 | "#, |
772 | expect![[r#" | 772 | expect![[r#" |
773 | m1 MACRO_CALL FileId(0) 0..46 29..31 Other | 773 | m1 MACRO_RULES FileId(0) 0..46 29..31 Other |
774 | 774 | ||
775 | FileId(0) 63..65 StructLiteral | 775 | FileId(0) 63..65 StructLiteral |
776 | FileId(0) 73..75 StructLiteral | 776 | FileId(0) 73..75 StructLiteral |
diff --git a/crates/ide/src/syntax_highlighting.rs b/crates/ide/src/syntax_highlighting.rs index f5c6eabef..990b0f7d9 100644 --- a/crates/ide/src/syntax_highlighting.rs +++ b/crates/ide/src/syntax_highlighting.rs | |||
@@ -74,6 +74,7 @@ pub(crate) fn highlight( | |||
74 | let mut stack = HighlightedRangeStack::new(); | 74 | let mut stack = HighlightedRangeStack::new(); |
75 | 75 | ||
76 | let mut current_macro_call: Option<ast::MacroCall> = None; | 76 | let mut current_macro_call: Option<ast::MacroCall> = None; |
77 | let mut current_macro_rules: Option<ast::MacroRules> = None; | ||
77 | let mut format_string_highlighter = FormatStringHighlighter::default(); | 78 | let mut format_string_highlighter = FormatStringHighlighter::default(); |
78 | let mut macro_rules_highlighter = MacroRulesHighlighter::default(); | 79 | let mut macro_rules_highlighter = MacroRulesHighlighter::default(); |
79 | let mut inside_attribute = false; | 80 | let mut inside_attribute = false; |
@@ -106,28 +107,26 @@ pub(crate) fn highlight( | |||
106 | binding_hash: None, | 107 | binding_hash: None, |
107 | }); | 108 | }); |
108 | } | 109 | } |
109 | if let Some(name) = mc.is_macro_rules() { | ||
110 | macro_rules_highlighter.init(); | ||
111 | if let Some((highlight, binding_hash)) = highlight_element( | ||
112 | &sema, | ||
113 | &mut bindings_shadow_count, | ||
114 | syntactic_name_ref_highlighting, | ||
115 | name.syntax().clone().into(), | ||
116 | ) { | ||
117 | stack.add(HighlightedRange { | ||
118 | range: name.syntax().text_range(), | ||
119 | highlight, | ||
120 | binding_hash, | ||
121 | }); | ||
122 | } | ||
123 | } | ||
124 | current_macro_call = Some(mc.clone()); | 110 | current_macro_call = Some(mc.clone()); |
125 | continue; | 111 | continue; |
126 | } | 112 | } |
127 | WalkEvent::Leave(Some(mc)) => { | 113 | WalkEvent::Leave(Some(mc)) => { |
128 | assert!(current_macro_call == Some(mc)); | 114 | assert_eq!(current_macro_call, Some(mc)); |
129 | current_macro_call = None; | 115 | current_macro_call = None; |
130 | format_string_highlighter = FormatStringHighlighter::default(); | 116 | format_string_highlighter = FormatStringHighlighter::default(); |
117 | } | ||
118 | _ => (), | ||
119 | } | ||
120 | |||
121 | match event.clone().map(|it| it.into_node().and_then(ast::MacroRules::cast)) { | ||
122 | WalkEvent::Enter(Some(mac)) => { | ||
123 | macro_rules_highlighter.init(); | ||
124 | current_macro_rules = Some(mac); | ||
125 | continue; | ||
126 | } | ||
127 | WalkEvent::Leave(Some(mac)) => { | ||
128 | assert_eq!(current_macro_rules, Some(mac)); | ||
129 | current_macro_rules = None; | ||
131 | macro_rules_highlighter = MacroRulesHighlighter::default(); | 130 | macro_rules_highlighter = MacroRulesHighlighter::default(); |
132 | } | 131 | } |
133 | _ => (), | 132 | _ => (), |
@@ -163,6 +162,12 @@ pub(crate) fn highlight( | |||
163 | 162 | ||
164 | let range = element.text_range(); | 163 | let range = element.text_range(); |
165 | 164 | ||
165 | if current_macro_rules.is_some() { | ||
166 | if let Some(tok) = element.as_token() { | ||
167 | macro_rules_highlighter.advance(tok); | ||
168 | } | ||
169 | } | ||
170 | |||
166 | let element_to_highlight = if current_macro_call.is_some() && element.kind() != COMMENT { | 171 | let element_to_highlight = if current_macro_call.is_some() && element.kind() != COMMENT { |
167 | // Inside a macro -- expand it first | 172 | // Inside a macro -- expand it first |
168 | let token = match element.clone().into_token() { | 173 | let token = match element.clone().into_token() { |
@@ -173,9 +178,6 @@ pub(crate) fn highlight( | |||
173 | let parent = token.parent(); | 178 | let parent = token.parent(); |
174 | 179 | ||
175 | format_string_highlighter.check_for_format_string(&parent); | 180 | format_string_highlighter.check_for_format_string(&parent); |
176 | if let Some(tok) = element.as_token() { | ||
177 | macro_rules_highlighter.advance(tok); | ||
178 | } | ||
179 | 181 | ||
180 | // We only care Name and Name_ref | 182 | // We only care Name and Name_ref |
181 | match (token.kind(), parent.kind()) { | 183 | match (token.kind(), parent.kind()) { |
@@ -386,10 +388,14 @@ impl HighlightedRangeStack { | |||
386 | let mut res = self.stack.pop().unwrap(); | 388 | let mut res = self.stack.pop().unwrap(); |
387 | res.sort_by_key(|range| range.range.start()); | 389 | res.sort_by_key(|range| range.range.start()); |
388 | // Check that ranges are sorted and disjoint | 390 | // Check that ranges are sorted and disjoint |
389 | assert!(res | 391 | for (left, right) in res.iter().zip(res.iter().skip(1)) { |
390 | .iter() | 392 | assert!( |
391 | .zip(res.iter().skip(1)) | 393 | left.range.end() <= right.range.start(), |
392 | .all(|(left, right)| left.range.end() <= right.range.start())); | 394 | "left: {:#?}, right: {:#?}", |
395 | left, | ||
396 | right | ||
397 | ); | ||
398 | } | ||
393 | res | 399 | res |
394 | } | 400 | } |
395 | } | 401 | } |
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html b/crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html index 396fd46fb..920956b51 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html | |||
@@ -95,7 +95,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd | |||
95 | <span class="comment documentation">/// ```</span> | 95 | <span class="comment documentation">/// ```</span> |
96 | <span class="comment documentation">/// </span><span class="macro injected">noop!</span><span class="punctuation injected">(</span><span class="numeric_literal injected">1</span><span class="punctuation injected">)</span><span class="punctuation injected">;</span><span class="punctuation injected"> | 96 | <span class="comment documentation">/// </span><span class="macro injected">noop!</span><span class="punctuation injected">(</span><span class="numeric_literal injected">1</span><span class="punctuation injected">)</span><span class="punctuation injected">;</span><span class="punctuation injected"> |
97 | </span><span class="comment documentation">/// ```</span> | 97 | </span><span class="comment documentation">/// ```</span> |
98 | <span class="macro">macro_rules!</span> <span class="macro declaration">noop</span> <span class="punctuation">{</span> | 98 | <span class="keyword">macro_rules</span><span class="punctuation">!</span> <span class="macro declaration">noop</span> <span class="punctuation">{</span> |
99 | <span class="punctuation">(</span><span class="punctuation">$</span>expr<span class="punctuation">:</span>expr<span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">{</span> | 99 | <span class="punctuation">(</span><span class="punctuation">$</span>expr<span class="punctuation">:</span>expr<span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">{</span> |
100 | <span class="punctuation">$</span>expr | 100 | <span class="punctuation">$</span>expr |
101 | <span class="punctuation">}</span> | 101 | <span class="punctuation">}</span> |
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html b/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html index d398e1ec8..c843b5085 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html | |||
@@ -35,13 +35,13 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd | |||
35 | 35 | ||
36 | .unresolved_reference { color: #FC5555; text-decoration: wavy underline; } | 36 | .unresolved_reference { color: #FC5555; text-decoration: wavy underline; } |
37 | </style> | 37 | </style> |
38 | <pre><code><span class="macro">macro_rules!</span> <span class="macro declaration">println</span> <span class="punctuation">{</span> | 38 | <pre><code><span class="keyword">macro_rules</span><span class="punctuation">!</span> <span class="macro declaration">println</span> <span class="punctuation">{</span> |
39 | <span class="punctuation">(</span><span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>arg<span class="punctuation">:</span>tt<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">(</span><span class="punctuation">{</span> | 39 | <span class="punctuation">(</span><span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>arg<span class="punctuation">:</span>tt<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">(</span><span class="punctuation">{</span> |
40 | <span class="punctuation">$</span>crate<span class="punctuation">:</span><span class="punctuation">:</span>io<span class="punctuation">:</span><span class="punctuation">:</span>_print<span class="punctuation">(</span><span class="punctuation">$</span>crate<span class="punctuation">:</span><span class="punctuation">:</span>format_args_nl<span class="punctuation">!</span><span class="punctuation">(</span><span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>arg<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="punctuation">;</span> | 40 | <span class="punctuation">$</span>crate<span class="punctuation">:</span><span class="punctuation">:</span>io<span class="punctuation">:</span><span class="punctuation">:</span>_print<span class="punctuation">(</span><span class="punctuation">$</span>crate<span class="punctuation">:</span><span class="punctuation">:</span>format_args_nl<span class="punctuation">!</span><span class="punctuation">(</span><span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>arg<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="punctuation">;</span> |
41 | <span class="punctuation">}</span><span class="punctuation">)</span> | 41 | <span class="punctuation">}</span><span class="punctuation">)</span> |
42 | <span class="punctuation">}</span> | 42 | <span class="punctuation">}</span> |
43 | #[rustc_builtin_macro] | 43 | <span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="function attribute">rustc_builtin_macro</span><span class="attribute attribute">]</span> |
44 | <span class="macro">macro_rules!</span> <span class="macro declaration">format_args_nl</span> <span class="punctuation">{</span> | 44 | <span class="keyword">macro_rules</span><span class="punctuation">!</span> <span class="macro declaration">format_args_nl</span> <span class="punctuation">{</span> |
45 | <span class="punctuation">(</span><span class="punctuation">$</span>fmt<span class="punctuation">:</span>expr<span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">{</span><span class="punctuation">{</span> <span class="comment">/* compiler built-in */</span> <span class="punctuation">}</span><span class="punctuation">}</span><span class="punctuation">;</span> | 45 | <span class="punctuation">(</span><span class="punctuation">$</span>fmt<span class="punctuation">:</span>expr<span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">{</span><span class="punctuation">{</span> <span class="comment">/* compiler built-in */</span> <span class="punctuation">}</span><span class="punctuation">}</span><span class="punctuation">;</span> |
46 | <span class="punctuation">(</span><span class="punctuation">$</span>fmt<span class="punctuation">:</span>expr<span class="punctuation">,</span> <span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>args<span class="punctuation">:</span>tt<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">{</span><span class="punctuation">{</span> <span class="comment">/* compiler built-in */</span> <span class="punctuation">}</span><span class="punctuation">}</span><span class="punctuation">;</span> | 46 | <span class="punctuation">(</span><span class="punctuation">$</span>fmt<span class="punctuation">:</span>expr<span class="punctuation">,</span> <span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>args<span class="punctuation">:</span>tt<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">{</span><span class="punctuation">{</span> <span class="comment">/* compiler built-in */</span> <span class="punctuation">}</span><span class="punctuation">}</span><span class="punctuation">;</span> |
47 | <span class="punctuation">}</span> | 47 | <span class="punctuation">}</span> |
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlighting.html b/crates/ide/src/syntax_highlighting/test_data/highlighting.html index a3b4f20e8..0569cf1e5 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlighting.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlighting.html | |||
@@ -125,7 +125,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd | |||
125 | <span class="keyword">let</span> <span class="variable declaration">bar</span> <span class="operator">=</span> <span class="function">foobar</span><span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">;</span> | 125 | <span class="keyword">let</span> <span class="variable declaration">bar</span> <span class="operator">=</span> <span class="function">foobar</span><span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">;</span> |
126 | <span class="punctuation">}</span> | 126 | <span class="punctuation">}</span> |
127 | 127 | ||
128 | <span class="macro">macro_rules!</span> <span class="macro declaration">def_fn</span> <span class="punctuation">{</span> | 128 | <span class="keyword">macro_rules</span><span class="punctuation">!</span> <span class="macro declaration">def_fn</span> <span class="punctuation">{</span> |
129 | <span class="punctuation">(</span><span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>tt<span class="punctuation">:</span>tt<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">{</span><span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>tt<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">}</span> | 129 | <span class="punctuation">(</span><span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>tt<span class="punctuation">:</span>tt<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">{</span><span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>tt<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">}</span> |
130 | <span class="punctuation">}</span> | 130 | <span class="punctuation">}</span> |
131 | 131 | ||
@@ -135,13 +135,13 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd | |||
135 | <span class="punctuation">}</span> | 135 | <span class="punctuation">}</span> |
136 | <span class="punctuation">}</span> | 136 | <span class="punctuation">}</span> |
137 | 137 | ||
138 | <span class="macro">macro_rules!</span> <span class="macro declaration">noop</span> <span class="punctuation">{</span> | 138 | <span class="keyword">macro_rules</span><span class="punctuation">!</span> <span class="macro declaration">noop</span> <span class="punctuation">{</span> |
139 | <span class="punctuation">(</span><span class="punctuation">$</span>expr<span class="punctuation">:</span>expr<span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">{</span> | 139 | <span class="punctuation">(</span><span class="punctuation">$</span>expr<span class="punctuation">:</span>expr<span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">{</span> |
140 | <span class="punctuation">$</span>expr | 140 | <span class="punctuation">$</span>expr |
141 | <span class="punctuation">}</span> | 141 | <span class="punctuation">}</span> |
142 | <span class="punctuation">}</span> | 142 | <span class="punctuation">}</span> |
143 | 143 | ||
144 | <span class="macro">macro_rules!</span> <span class="macro declaration">keyword_frag</span> <span class="punctuation">{</span> | 144 | <span class="keyword">macro_rules</span><span class="punctuation">!</span> <span class="macro declaration">keyword_frag</span> <span class="punctuation">{</span> |
145 | <span class="punctuation">(</span><span class="punctuation">$</span>type<span class="punctuation">:</span>ty<span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">(</span><span class="punctuation">$</span>type<span class="punctuation">)</span> | 145 | <span class="punctuation">(</span><span class="punctuation">$</span>type<span class="punctuation">:</span>ty<span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">></span> <span class="punctuation">(</span><span class="punctuation">$</span>type<span class="punctuation">)</span> |
146 | <span class="punctuation">}</span> | 146 | <span class="punctuation">}</span> |
147 | 147 | ||