rustfmt icon indicating copy to clipboard operation
rustfmt copied to clipboard

Fmt failure with wrap_comments = true

Open sander2 opened this issue 3 years ago • 5 comments
trafficstars

When having wrap_comments = true, running rustfmt on the following code produces an error:

fn f() {
    g({
        // some trailing spaces on the line below - this needs to be inside the g call
    
        SomeStruct {
            a: b, // // This needs two sets of the slash-slash comments, and this needs to be a very long sentence so bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
        };
    })
    .x; // the .something needs to be here
}

The produces error is error[internal]: left behind trailing whitespace

sander2 avatar Aug 10 '22 08:08 sander2

Thanks for the report.

Stripping back the example to just the following:

fn f() {
    {
        {
            SomeStruct {
                a: b, // // This needs two sets of the slash-slash comments, and this needs to be a very long sentence so bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
            };
         }
    }
}

when we run rustfmt the line comment is changed into a block comment, but it isn't wrapped so it stays really long:

fn f() {
    {
        {
            SomeStruct {
                a: b, /* // This needs two sets of the slash-slash comments, and this needs to be a very long sentence so bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla */
            };
        }
    }
}

Then because we're dealing with a chain e.g. g().x, we hit the same issues that's causing #3863, and we don't reformat the any part of the chain, which means we leave the trailing whitespace. which is causing the warning that you're seeing.

ytmimi avatar Aug 10 '22 13:08 ytmimi

But I can also confirm that with the original example using wrap_comment=false the trailing whitespace is removed, and with wrap_comments=true the trailing whitespace remains after formatting. Interesting 🤔

ytmimi avatar Aug 10 '22 13:08 ytmimi

if it helps at all, I believe I encountered the same bug.

This code:

mod phase {
    pub trait Phase {
        const RUN: &'static str;
        const FAIL: &'static str;

        fn to_style(&self, template: &str);
    }

    pub struct Updating {}

    impl Phase for Updating {
        const RUN: &'static str = "";
        const FAIL: &'static str = "";
            
        #[rustfmt::skip]
        fn to_style(&self, template: &str) {}
    }
}

fn main() {}

produces this error:

error[internal]: left behind trailing whitespace
  --> /tmp/arif/src/main.rs:14:14:1
   |
14 |             
   | ^^^^^^^^^^^^
   |

arifd avatar Aug 28 '22 11:08 arifd

@arifd Thanks for providing another example. I think the error[internal]: left behind trailing whitespace you're getting is unrelated to the original issue. Your error is unrelated to wrap_comments=true as I was able to reproduce it with wrap_comments=false. Your input snippet contained whitespace on line 14 that rustfmt was unable to remove. I haven't looked into this at all, but I'd assume it has to do with the #[rustfmt::skip] attribute.

I think it would be best to file a new issue for your case.

ytmimi avatar Aug 28 '22 13:08 ytmimi

Okay, thanks. created: https://github.com/rust-lang/rustfmt/issues/5521

arifd avatar Aug 28 '22 14:08 arifd