minor: Add more proc-macro tests for parsing negative literals

This commit is contained in:
Lukas Wirth 2025-05-05 13:39:38 +02:00
parent 9d1364b730
commit cb18ead726
4 changed files with 341 additions and 26 deletions

View file

@ -31,12 +31,17 @@ pub fn fn_like_mk_literals(_args: TokenStream) -> TokenStream {
TokenTree::from(Literal::byte_string(b"byte_string")),
TokenTree::from(Literal::character('c')),
TokenTree::from(Literal::string("string")),
TokenTree::from(Literal::c_string(c"cstring")),
// as of 2022-07-21, there's no method on `Literal` to build a raw
// string or a raw byte string
TokenTree::from(Literal::f64_suffixed(3.14)),
TokenTree::from(Literal::f64_suffixed(-3.14)),
TokenTree::from(Literal::f64_unsuffixed(3.14)),
TokenTree::from(Literal::f64_unsuffixed(-3.14)),
TokenTree::from(Literal::i64_suffixed(123)),
TokenTree::from(Literal::i64_suffixed(-123)),
TokenTree::from(Literal::i64_unsuffixed(123)),
TokenTree::from(Literal::i64_unsuffixed(-123)),
];
TokenStream::from_iter(trees)
}

View file

@ -11,8 +11,24 @@ fn test_derive_empty() {
assert_expand(
"DeriveEmpty",
r#"struct S;"#,
expect!["SUBTREE $$ 1 1"],
expect!["SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024"],
expect![[r#"
SUBTREE $$ 1 1
IDENT struct 1
IDENT S 1
PUNCH ; [alone] 1
SUBTREE $$ 1 1"#]],
expect![[r#"
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT struct 42:2@0..6#ROOT2024
IDENT S 42:2@7..8#ROOT2024
PUNCH ; [alone] 42:2@8..9#ROOT2024
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024"#]],
);
}
@ -22,6 +38,13 @@ fn test_derive_error() {
"DeriveError",
r#"struct S;"#,
expect![[r#"
SUBTREE $$ 1 1
IDENT struct 1
IDENT S 1
PUNCH ; [alone] 1
SUBTREE $$ 1 1
IDENT compile_error 1
PUNCH ! [alone] 1
@ -29,6 +52,13 @@ fn test_derive_error() {
LITERAL Str #[derive(DeriveError)] struct S ; 1
PUNCH ; [alone] 1"#]],
expect![[r#"
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT struct 42:2@0..6#ROOT2024
IDENT S 42:2@7..8#ROOT2024
PUNCH ; [alone] 42:2@8..9#ROOT2024
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT compile_error 42:2@0..100#ROOT2024
PUNCH ! [alone] 42:2@0..100#ROOT2024
@ -44,6 +74,17 @@ fn test_fn_like_macro_noop() {
"fn_like_noop",
r#"ident, 0, 1, []"#,
expect![[r#"
SUBTREE $$ 1 1
IDENT ident 1
PUNCH , [alone] 1
LITERAL Integer 0 1
PUNCH , [alone] 1
LITERAL Integer 1 1
PUNCH , [alone] 1
SUBTREE [] 1 1
SUBTREE $$ 1 1
IDENT ident 1
PUNCH , [alone] 1
@ -53,6 +94,17 @@ fn test_fn_like_macro_noop() {
PUNCH , [alone] 1
SUBTREE [] 1 1"#]],
expect![[r#"
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT ident 42:2@0..5#ROOT2024
PUNCH , [alone] 42:2@5..6#ROOT2024
LITERAL Integer 0 42:2@7..8#ROOT2024
PUNCH , [alone] 42:2@8..9#ROOT2024
LITERAL Integer 1 42:2@10..11#ROOT2024
PUNCH , [alone] 42:2@11..12#ROOT2024
SUBTREE [] 42:2@13..14#ROOT2024 42:2@14..15#ROOT2024
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT ident 42:2@0..5#ROOT2024
PUNCH , [alone] 42:2@5..6#ROOT2024
@ -70,11 +122,25 @@ fn test_fn_like_macro_clone_ident_subtree() {
"fn_like_clone_tokens",
r#"ident, []"#,
expect![[r#"
SUBTREE $$ 1 1
IDENT ident 1
PUNCH , [alone] 1
SUBTREE [] 1 1
SUBTREE $$ 1 1
IDENT ident 1
PUNCH , [alone] 1
SUBTREE [] 1 1"#]],
expect![[r#"
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT ident 42:2@0..5#ROOT2024
PUNCH , [alone] 42:2@5..6#ROOT2024
SUBTREE [] 42:2@7..8#ROOT2024 42:2@8..9#ROOT2024
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT ident 42:2@0..5#ROOT2024
PUNCH , [alone] 42:2@5..6#ROOT2024
@ -88,9 +154,19 @@ fn test_fn_like_macro_clone_raw_ident() {
"fn_like_clone_tokens",
"r#async",
expect![[r#"
SUBTREE $$ 1 1
IDENT r#async 1
SUBTREE $$ 1 1
IDENT r#async 1"#]],
expect![[r#"
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT r#async 42:2@0..7#ROOT2024
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT r#async 42:2@0..7#ROOT2024"#]],
);
@ -103,9 +179,21 @@ fn test_fn_like_fn_like_span_join() {
"fn_like_span_join",
"foo bar",
expect![[r#"
SUBTREE $$ 1 1
IDENT foo 1
IDENT bar 1
SUBTREE $$ 1 1
IDENT r#joined 1"#]],
expect![[r#"
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT foo 42:2@0..3#ROOT2024
IDENT bar 42:2@8..11#ROOT2024
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT r#joined 42:2@0..11#ROOT2024"#]],
);
@ -118,11 +206,25 @@ fn test_fn_like_fn_like_span_ops() {
"fn_like_span_ops",
"set_def_site resolved_at_def_site start_span",
expect![[r#"
SUBTREE $$ 1 1
IDENT set_def_site 1
IDENT resolved_at_def_site 1
IDENT start_span 1
SUBTREE $$ 1 1
IDENT set_def_site 0
IDENT resolved_at_def_site 1
IDENT start_span 1"#]],
expect![[r#"
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT set_def_site 42:2@0..12#ROOT2024
IDENT resolved_at_def_site 42:2@13..33#ROOT2024
IDENT start_span 42:2@34..44#ROOT2024
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT set_def_site 41:1@0..150#ROOT2024
IDENT resolved_at_def_site 42:2@13..33#ROOT2024
@ -136,23 +238,41 @@ fn test_fn_like_mk_literals() {
"fn_like_mk_literals",
r#""#,
expect![[r#"
SUBTREE $$ 1 1
SUBTREE $$ 1 1
LITERAL ByteStr byte_string 1
LITERAL Char c 1
LITERAL Str string 1
LITERAL CStr cstring 1
LITERAL Float 3.14f64 1
LITERAL Float -3.14f64 1
LITERAL Float 3.14 1
LITERAL Float -3.14 1
LITERAL Integer 123i64 1
LITERAL Integer 123 1"#]],
LITERAL Integer -123i64 1
LITERAL Integer 123 1
LITERAL Integer -123 1"#]],
expect![[r#"
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
LITERAL ByteStr byte_string 42:2@0..100#ROOT2024
LITERAL Char c 42:2@0..100#ROOT2024
LITERAL Str string 42:2@0..100#ROOT2024
LITERAL CStr cstring 42:2@0..100#ROOT2024
LITERAL Float 3.14f64 42:2@0..100#ROOT2024
LITERAL Float -3.14f64 42:2@0..100#ROOT2024
LITERAL Float 3.14 42:2@0..100#ROOT2024
LITERAL Float -3.14 42:2@0..100#ROOT2024
LITERAL Integer 123i64 42:2@0..100#ROOT2024
LITERAL Integer 123 42:2@0..100#ROOT2024"#]],
LITERAL Integer -123i64 42:2@0..100#ROOT2024
LITERAL Integer 123 42:2@0..100#ROOT2024
LITERAL Integer -123 42:2@0..100#ROOT2024"#]],
);
}
@ -162,10 +282,18 @@ fn test_fn_like_mk_idents() {
"fn_like_mk_idents",
r#""#,
expect![[r#"
SUBTREE $$ 1 1
SUBTREE $$ 1 1
IDENT standard 1
IDENT r#raw 1"#]],
expect![[r#"
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT standard 42:2@0..100#ROOT2024
IDENT r#raw 42:2@0..100#ROOT2024"#]],
@ -178,6 +306,30 @@ fn test_fn_like_macro_clone_literals() {
"fn_like_clone_tokens",
r###"1u16, 2_u32, -4i64, 3.14f32, "hello bridge", "suffixed"suffix, r##"raw"##, 'a', b'b', c"null""###,
expect![[r#"
SUBTREE $$ 1 1
LITERAL Integer 1u16 1
PUNCH , [alone] 1
LITERAL Integer 2_u32 1
PUNCH , [alone] 1
PUNCH - [alone] 1
LITERAL Integer 4i64 1
PUNCH , [alone] 1
LITERAL Float 3.14f32 1
PUNCH , [alone] 1
LITERAL Str hello bridge 1
PUNCH , [alone] 1
LITERAL Str suffixedsuffix 1
PUNCH , [alone] 1
LITERAL StrRaw(2) raw 1
PUNCH , [alone] 1
LITERAL Char a 1
PUNCH , [alone] 1
LITERAL Byte b 1
PUNCH , [alone] 1
LITERAL CStr null 1
SUBTREE $$ 1 1
LITERAL Integer 1u16 1
PUNCH , [alone] 1
@ -200,6 +352,30 @@ fn test_fn_like_macro_clone_literals() {
PUNCH , [alone] 1
LITERAL CStr null 1"#]],
expect![[r#"
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
LITERAL Integer 1u16 42:2@0..4#ROOT2024
PUNCH , [alone] 42:2@4..5#ROOT2024
LITERAL Integer 2_u32 42:2@6..11#ROOT2024
PUNCH , [alone] 42:2@11..12#ROOT2024
PUNCH - [alone] 42:2@13..14#ROOT2024
LITERAL Integer 4i64 42:2@14..18#ROOT2024
PUNCH , [alone] 42:2@18..19#ROOT2024
LITERAL Float 3.14f32 42:2@20..27#ROOT2024
PUNCH , [alone] 42:2@27..28#ROOT2024
LITERAL Str hello bridge 42:2@29..43#ROOT2024
PUNCH , [alone] 42:2@43..44#ROOT2024
LITERAL Str suffixedsuffix 42:2@45..61#ROOT2024
PUNCH , [alone] 42:2@61..62#ROOT2024
LITERAL StrRaw(2) raw 42:2@63..73#ROOT2024
PUNCH , [alone] 42:2@73..74#ROOT2024
LITERAL Char a 42:2@75..78#ROOT2024
PUNCH , [alone] 42:2@78..79#ROOT2024
LITERAL Byte b 42:2@80..84#ROOT2024
PUNCH , [alone] 42:2@84..85#ROOT2024
LITERAL CStr null 42:2@86..93#ROOT2024
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
LITERAL Integer 1u16 42:2@0..4#ROOT2024
PUNCH , [alone] 42:2@4..5#ROOT2024
@ -224,6 +400,71 @@ fn test_fn_like_macro_clone_literals() {
);
}
#[test]
fn test_fn_like_macro_negative_literals() {
assert_expand(
"fn_like_clone_tokens",
r###"-1u16, - 2_u32, -3.14f32, - 2.7"###,
expect![[r#"
SUBTREE $$ 1 1
PUNCH - [alone] 1
LITERAL Integer 1u16 1
PUNCH , [alone] 1
PUNCH - [alone] 1
LITERAL Integer 2_u32 1
PUNCH , [alone] 1
PUNCH - [alone] 1
LITERAL Float 3.14f32 1
PUNCH , [alone] 1
PUNCH - [alone] 1
LITERAL Float 2.7 1
SUBTREE $$ 1 1
PUNCH - [alone] 1
LITERAL Integer 1u16 1
PUNCH , [alone] 1
PUNCH - [alone] 1
LITERAL Integer 2_u32 1
PUNCH , [alone] 1
PUNCH - [alone] 1
LITERAL Float 3.14f32 1
PUNCH , [alone] 1
PUNCH - [alone] 1
LITERAL Float 2.7 1"#]],
expect![[r#"
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
PUNCH - [alone] 42:2@0..1#ROOT2024
LITERAL Integer 1u16 42:2@1..5#ROOT2024
PUNCH , [alone] 42:2@5..6#ROOT2024
PUNCH - [alone] 42:2@7..8#ROOT2024
LITERAL Integer 2_u32 42:2@9..14#ROOT2024
PUNCH , [alone] 42:2@14..15#ROOT2024
PUNCH - [alone] 42:2@16..17#ROOT2024
LITERAL Float 3.14f32 42:2@17..24#ROOT2024
PUNCH , [alone] 42:2@24..25#ROOT2024
PUNCH - [alone] 42:2@26..27#ROOT2024
LITERAL Float 2.7 42:2@28..31#ROOT2024
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
PUNCH - [alone] 42:2@0..1#ROOT2024
LITERAL Integer 1u16 42:2@1..5#ROOT2024
PUNCH , [alone] 42:2@5..6#ROOT2024
PUNCH - [alone] 42:2@7..8#ROOT2024
LITERAL Integer 2_u32 42:2@9..14#ROOT2024
PUNCH , [alone] 42:2@14..15#ROOT2024
PUNCH - [alone] 42:2@16..17#ROOT2024
LITERAL Float 3.14f32 42:2@17..24#ROOT2024
PUNCH , [alone] 42:2@24..25#ROOT2024
PUNCH - [alone] 42:2@26..27#ROOT2024
LITERAL Float 2.7 42:2@28..31#ROOT2024"#]],
);
}
#[test]
fn test_attr_macro() {
// Corresponds to
@ -234,6 +475,15 @@ fn test_attr_macro() {
r#"mod m {}"#,
r#"some arguments"#,
expect![[r#"
SUBTREE $$ 1 1
IDENT mod 1
IDENT m 1
SUBTREE {} 1 1
SUBTREE $$ 1 1
IDENT some 1
IDENT arguments 1
SUBTREE $$ 1 1
IDENT compile_error 1
PUNCH ! [alone] 1
@ -241,6 +491,15 @@ fn test_attr_macro() {
LITERAL Str #[attr_error(some arguments)] mod m {} 1
PUNCH ; [alone] 1"#]],
expect![[r#"
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT mod 42:2@0..3#ROOT2024
IDENT m 42:2@4..5#ROOT2024
SUBTREE {} 42:2@6..7#ROOT2024 42:2@7..8#ROOT2024
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT some 42:2@0..4#ROOT2024
IDENT arguments 42:2@5..14#ROOT2024
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT compile_error 42:2@0..100#ROOT2024
PUNCH ! [alone] 42:2@0..100#ROOT2024

View file

@ -32,9 +32,9 @@ pub fn assert_expand(
macro_name: &str,
#[rust_analyzer::rust_fixture] ra_fixture: &str,
expect: Expect,
expect_s: Expect,
expect_spanned: Expect,
) {
assert_expand_impl(macro_name, ra_fixture, None, expect, expect_s);
assert_expand_impl(macro_name, ra_fixture, None, expect, expect_spanned);
}
pub fn assert_expand_attr(
@ -42,9 +42,9 @@ pub fn assert_expand_attr(
#[rust_analyzer::rust_fixture] ra_fixture: &str,
attr_args: &str,
expect: Expect,
expect_s: Expect,
expect_spanned: Expect,
) {
assert_expand_impl(macro_name, ra_fixture, Some(attr_args), expect, expect_s);
assert_expand_impl(macro_name, ra_fixture, Some(attr_args), expect, expect_spanned);
}
fn assert_expand_impl(
@ -52,7 +52,7 @@ fn assert_expand_impl(
input: &str,
attr: Option<&str>,
expect: Expect,
expect_s: Expect,
expect_spanned: Expect,
) {
let path = proc_macro_test_dylib_path();
let expander = dylib::Expander::new(&path).unwrap();
@ -60,20 +60,17 @@ fn assert_expand_impl(
let def_site = TokenId(0);
let call_site = TokenId(1);
let mixed_site = TokenId(2);
let input_ts = parse_string(call_site, input);
let input_ts = parse_string(call_site, input).into_subtree(call_site);
let attr_ts = attr.map(|attr| parse_string(call_site, attr).into_subtree(call_site));
let input_ts_string = format!("{input_ts:?}");
let attr_ts_string = attr_ts.as_ref().map(|it| format!("{it:?}"));
let res = expander
.expand(
macro_name,
input_ts.into_subtree(call_site),
attr_ts,
def_site,
call_site,
mixed_site,
)
.unwrap();
expect.assert_eq(&format!("{res:?}"));
let res =
expander.expand(macro_name, input_ts, attr_ts, def_site, call_site, mixed_site).unwrap();
expect.assert_eq(&format!(
"{input_ts_string}\n\n{}\n\n{res:?}",
attr_ts_string.unwrap_or_default()
));
let def_site = Span {
range: TextRange::new(0.into(), 150.into()),
@ -93,15 +90,17 @@ fn assert_expand_impl(
};
let mixed_site = call_site;
let fixture = parse_string_spanned(call_site.anchor, call_site.ctx, input);
let fixture =
parse_string_spanned(call_site.anchor, call_site.ctx, input).into_subtree(call_site);
let attr = attr.map(|attr| {
parse_string_spanned(call_site.anchor, call_site.ctx, attr).into_subtree(call_site)
});
let fixture_string = format!("{fixture:?}");
let attr_string = attr.as_ref().map(|it| format!("{it:?}"));
let res = expander
.expand(macro_name, fixture.into_subtree(call_site), attr, def_site, call_site, mixed_site)
.unwrap();
expect_s.assert_eq(&format!("{res:#?}"));
let res = expander.expand(macro_name, fixture, attr, def_site, call_site, mixed_site).unwrap();
expect_spanned
.assert_eq(&format!("{fixture_string}\n\n{}\n\n{res:#?}", attr_string.unwrap_or_default()));
}
pub(crate) fn list() -> Vec<String> {