aboutsummaryrefslogtreecommitdiff
path: root/crates/mbe/src/tests/rule.rs
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-03-21 00:10:14 +0000
committerGitHub <[email protected]>2021-03-21 00:10:14 +0000
commit787bd3c5516d250245f6070308d689311b638fbe (patch)
tree3513cb44470b7ff148258bc300402be778c7f097 /crates/mbe/src/tests/rule.rs
parent090e013161ab5b1679554ddd53683e81e3fe845a (diff)
parent0a7f28620a7002f47890c2030862052bcbf25cdb (diff)
Merge #8122
8122: Make bare underscore token an Ident rather than Punct in proc-macro r=edwin0cheng a=kevinmehall In rustc and proc-macro2, a bare `_` token is parsed for procedural macro purposes as `Ident` rather than `Punct` (see https://github.com/rust-lang/rust/pull/48842). This changes rust-analyzer to match rustc's behavior and implementation by handling `_` as an Ident in token trees, but explicitly preventing `$x:ident` from matching it in MBE. proc macro crate: ```rust #[proc_macro] pub fn input(input: proc_macro::TokenStream) -> proc_macro::TokenStream { dbg!(input) } ``` test crate: ```rust test_proc_macro::input!(_); ``` output (rustc): ```rust [test-proc-macro/src/lib.rs:10] input = TokenStream [ Ident { ident: "_", span: #0 bytes(173..174), }, ] ``` output (rust-analyzer before this change): ```rust [test-proc-macro/src/lib.rs:10] input = TokenStream [ Punct { ch: '_', spacing: Joint, span: 4294967295, }, ] ``` output (rust-analyzer after this change): ```rust [test-proc-macro/src/lib.rs:10] input = TokenStream [ Ident { ident: "_", span: 4294967295, }, ] ``` Co-authored-by: Kevin Mehall <[email protected]>
Diffstat (limited to 'crates/mbe/src/tests/rule.rs')
-rw-r--r--crates/mbe/src/tests/rule.rs4
1 files changed, 4 insertions, 0 deletions
diff --git a/crates/mbe/src/tests/rule.rs b/crates/mbe/src/tests/rule.rs
index 07277966d..bf48112b3 100644
--- a/crates/mbe/src/tests/rule.rs
+++ b/crates/mbe/src/tests/rule.rs
@@ -12,6 +12,9 @@ fn test_valid_arms() {
12 } 12 }
13 13
14 check("($i:ident) => ()"); 14 check("($i:ident) => ()");
15 check("($(x),*) => ()");
16 check("($(x)_*) => ()");
17 check("($(x)i*) => ()");
15 check("($($i:ident)*) => ($_)"); 18 check("($($i:ident)*) => ($_)");
16 check("($($true:ident)*) => ($true)"); 19 check("($($true:ident)*) => ($true)");
17 check("($($false:ident)*) => ($false)"); 20 check("($($false:ident)*) => ($false)");
@@ -32,6 +35,7 @@ fn test_invalid_arms() {
32 35
33 check("($i) => ($i)", ParseError::UnexpectedToken("bad fragment specifier 1".into())); 36 check("($i) => ($i)", ParseError::UnexpectedToken("bad fragment specifier 1".into()));
34 check("($i:) => ($i)", ParseError::UnexpectedToken("bad fragment specifier 1".into())); 37 check("($i:) => ($i)", ParseError::UnexpectedToken("bad fragment specifier 1".into()));
38 check("($i:_) => ()", ParseError::UnexpectedToken("bad fragment specifier 1".into()));
35} 39}
36 40
37fn parse_macro_arm(arm_definition: &str) -> Result<crate::MacroRules, ParseError> { 41fn parse_macro_arm(arm_definition: &str) -> Result<crate::MacroRules, ParseError> {