Skip to content

Needs two passes to correctly format. #3868

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Closed
iago-lito opened this issue Oct 17, 2019 · 2 comments · Fixed by #3878
Closed

Needs two passes to correctly format. #3868

iago-lito opened this issue Oct 17, 2019 · 2 comments · Fixed by #3878
Labels
bug Panic, non-idempotency, invalid code, etc.
Milestone

Comments

@iago-lito
Copy link

I'm not sure whether this is expected behaviour or not, but the following code:

fn main() {
    for _ in 0..1 {
        ;
    }
}

Is first reformatted as

fn main() {
    for _ in 0..1 {
    }
}

And only then as

fn main() {
    for _ in 0..1 {}
}

If I need to run rustfmt twice in this case, how am I sure that I have run it enough times in other cases? Do I need to repeat every rustfmt until the file is stable?

@calebcartwright
Copy link
Member

Thanks @iago-lito - that's a bug (at least IMO)

@topecongiro topecongiro added the bug Panic, non-idempotency, invalid code, etc. label Oct 19, 2019
@topecongiro
Copy link
Contributor

Here the single ; is treated as an empty statement, and in the first run, rustfmt misunderstands that the for block is not empty. In the second run, since the single ; gets removed and the block is empty, rustfmt squashes the block into a single line.

To fix this, we should filter out the empty statements from the block when checking its emptiness.

@calebcartwright calebcartwright modified the milestones: 1.4.32, 1.4.33 Jan 10, 2021
JohnTitor added a commit to JohnTitor/rust that referenced this issue Jan 30, 2021
…anxiyn

update rustfmt to v1.4.34

Short summary: Various formatting fixes (several const generic related) and introduction of `imports_granularity` config option

Long summary copied from changelog:

#### Changed
- `merge_imports` configuration has been deprecated in favor of the new `imports_granularity` option. Any existing usage of `merge_imports` will be automatically mapped to the corresponding value on `imports_granularity` with a warning message printed to encourage users to update their config files.

#### Added
- New `imports_granularity` option has been added which succeeds `merge_imports`. This new option supports several additional variants which allow users to merge imports at different levels (crate or module), and even flatten imports to have a single use statement per item. ([PR rust-lang/rustfmt#4634](rust-lang/rustfmt#4634), [PR rust-lang/rustfmt#4639](rust-lang/rustfmt#4639))

See the section on the configuration site for more information
https://rust-lang.github.io/rustfmt/?version=v1.4.33&search=#imports_granularity

#### Fixed
- Fix erroneous removal of `const` keyword on const trait impl ([rust-lang/rustfmt#4084](rust-lang/rustfmt#4084))
- Fix incorrect span usage wit const generics in supertraits ([rust-lang/rustfmt#4204](rust-lang/rustfmt#4204))
- Use correct span for const generic params ([rust-lang/rustfmt#4263](rust-lang/rustfmt#4263))
- Correct span on const generics to include type bounds ([rust-lang/rustfmt#4310](rust-lang/rustfmt#4310))
- Idempotence issue on blocks containing only empty statements ([rust-lang/rustfmt#4627](rust-lang/rustfmt#4627) and [rust-lang#3868](rust-lang/rustfmt#3868))
- Fix issue with semicolon placement on required functions that have a trailing comment that ends in a line-style comment before the semicolon ([rust-lang/rustfmt#4646](rust-lang/rustfmt#4646))
- Avoid shared interned cfg_if symbol since rustfmt can re-initialize the rustc_ast globals on multiple inputs ([rust-lang/rustfmt#4656](rust-lang/rustfmt#4656))
- Don't insert trailing comma on (base-less) rest in struct literals within macros ([rust-lang/rustfmt#4675](rust-lang/rustfmt#4675))
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
bug Panic, non-idempotency, invalid code, etc.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants