prettyplease icon indicating copy to clipboard operation
prettyplease copied to clipboard

bug: Dropping semicolons for macros in non-let positions

Open jkelleyrtp opened this issue 7 months ago • 0 comments

This input:

#[test]
fn weird_macro() {
    let contents = r##"
    fn main() {
        move |_| {
            drop_macro_semi! {
                "something_very_long_something_very_long_something_very_long_something_very_long"
            }; // <--- semicolon here
            let _ = drop_macro_semi! {
                "something_very_long_something_very_long_something_very_long_something_very_long"
            };
            drop_macro_semi! {
                "something_very_long_something_very_long_something_very_long_something_very_long"
            };
        };
    }
"##;

    let expr: File = syn::parse_file(contents).unwrap();
    let out = unparse(&expr);
    println!("{}", out);
}

Returns

fn main() {
    move |_| {
        drop_macro_semi! {
            "something_very_long_something_very_long_something_very_long_something_very_long"
        } // <--- no semicolon here
        let _ = drop_macro_semi! {
            "something_very_long_something_very_long_something_very_long_something_very_long"
        };
        drop_macro_semi! {
            "something_very_long_something_very_long_something_very_long_something_very_long"
        }
    };
}

Dropping the semicolon on the first macro leads to semantically different code and thus compile errors.

This is likely because we're dropping the semicolon explicitly depending on the delimiter which just seems wrong to me - can't a macro have any delimiter without its semantic meaning changing?

https://github.com/dtolnay/prettyplease/blob/master/src/mac.rs#L46C17-L46C31

jkelleyrtp avatar Jul 30 '24 07:07 jkelleyrtp