mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
Merge commit 'efa8f5521d3813cc897ba29ea0ef98c7aef66bb6' into rustfmt-subtree
This commit is contained in:
parent
9060bc5583
commit
2b41b6d022
29
.github/workflows/upload-assets.yml
vendored
29
.github/workflows/upload-assets.yml
vendored
@ -1,8 +1,10 @@
|
||||
name: upload
|
||||
|
||||
on:
|
||||
push:
|
||||
release:
|
||||
types: [created]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-release:
|
||||
@ -14,42 +16,40 @@ jobs:
|
||||
- build: linux-x86_64
|
||||
os: ubuntu-latest
|
||||
rust: nightly
|
||||
target: x86_64-unknown-linux-gnu
|
||||
- build: macos-x86_64
|
||||
os: macos-latest
|
||||
rust: nightly
|
||||
target: x86_64-apple-darwin
|
||||
- build: windows-x86_64-gnu
|
||||
os: windows-latest
|
||||
rust: nightly-x86_64-gnu
|
||||
target: x86_64-pc-windows-gnu
|
||||
- build: windows-x86_64-msvc
|
||||
os: windows-latest
|
||||
rust: nightly-x86_64-msvc
|
||||
target: x86_64-pc-windows-msvc
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Install Rust
|
||||
uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: ${{ matrix.rust }}
|
||||
override: true
|
||||
# Run build
|
||||
- name: install rustup
|
||||
run: |
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > rustup-init.sh
|
||||
sh rustup-init.sh -y --default-toolchain none
|
||||
rustup target add ${{ matrix.target }}
|
||||
|
||||
- name: Add mingw64 to path for x86_64-gnu
|
||||
run: echo "C:\msys64\mingw64\bin" >> $GITHUB_PATH
|
||||
if: matrix.rust == 'nightly-x86_64-gnu'
|
||||
shell: bash
|
||||
|
||||
- name: Install cargo-make
|
||||
uses: actions-rs/cargo@v1
|
||||
with:
|
||||
command: install
|
||||
args: --force cargo-make
|
||||
|
||||
- name: Build release binaries
|
||||
uses: actions-rs/cargo@v1
|
||||
with:
|
||||
command: make
|
||||
args: release
|
||||
command: build
|
||||
args: --release
|
||||
|
||||
- name: Build archive
|
||||
shell: bash
|
||||
@ -70,6 +70,7 @@ jobs:
|
||||
fi
|
||||
|
||||
- name: Upload Release Asset
|
||||
if: github.event_name == 'release'
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
3
.github/workflows/windows.yml
vendored
3
.github/workflows/windows.yml
vendored
@ -54,9 +54,6 @@ jobs:
|
||||
if: matrix.target == 'x86_64-pc-windows-gnu' && matrix.channel == 'nightly'
|
||||
shell: bash
|
||||
|
||||
- name: cargo-make
|
||||
run: cargo install --force cargo-make
|
||||
|
||||
- name: build
|
||||
run: |
|
||||
rustc -Vv
|
||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -5,6 +5,7 @@
|
||||
# Generated by Cargo
|
||||
# will have compiled files and executables
|
||||
/target
|
||||
tests/cargo-fmt/**/target
|
||||
|
||||
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
|
||||
# More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
|
||||
|
67
CHANGELOG.md
67
CHANGELOG.md
@ -2,6 +2,73 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [1.4.38] 2021-10-20
|
||||
|
||||
### Changed
|
||||
|
||||
- Switched from `rustc-ap-*` crates to `rustc_private` for consumption model of rustc internals
|
||||
- `annotate-snippets` updated to v0.8 [PR #4762](https://github.com/rust-lang/rustfmt/pull/4762)
|
||||
- Greatly improved the performance of `cargo fmt` in large workspaces utilizing the `--all` flag by updating to a newer version of `cargo_metadata` that leverages updated `cargo` output from v1.51+ [PR #4997](https://github.com/rust-lang/rustfmt/pull/4997)
|
||||
- Improved formatting of long slice patterns [#4530](https://github.com/rust-lang/rustfmt/issues/4530)
|
||||
- **Note you must have `version = Two` in your configuration to take advantage of the new formatting**
|
||||
- Stabilized `match_block_trailing_comma` configuration option [#3380](https://github.com/rust-lang/rustfmt/issues/3380) - [https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#match_block_trailing_comma](https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#match_block_trailing_comma)
|
||||
- Stabilized `disable_all_formatting` configuration option [#5026](https://github.com/rust-lang/rustfmt/pull/5026) - [https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#disable_all_formatting](https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#disable_all_formatting)
|
||||
- Various improvements to the configuration documentation website [https://rust-lang.github.io/rustfmt/?version=v1.4.38]([https://rust-lang.github.io/rustfmt/?version=v1.4.38])
|
||||
- Addressed various clippy and rustc warnings
|
||||
|
||||
|
||||
### Fixed
|
||||
|
||||
- Resolved issue where specious whitespace would be inserted when a block style comment was terminated within string literal processing [#4312](https://github.com/rust-lang/rustfmt/issues/4312)
|
||||
- Nested out-of-line mods are again parsed and formatted [#4874](https://github.com/rust-lang/rustfmt/issues/4874)
|
||||
- Accepts `2021` for edition value from rustfmt command line [PR #4847](https://github.com/rust-lang/rustfmt/pull/4847)
|
||||
- Unstable command line options are no longer displayed in `--help` text on stable [PR #4798](https://github.com/rust-lang/rustfmt/issues/4798)
|
||||
- Stopped panicking on patterns in match arms which start with non-ascii characters [#4868](https://github.com/rust-lang/rustfmt/issues/4868)
|
||||
- Stopped stripping defaults on const params [#4816](https://github.com/rust-lang/rustfmt/issues/4816)
|
||||
- Fixed issue with dropped content with GAT aliases with self bounds in impls [#4911](https://github.com/rust-lang/rustfmt/issues/4911)
|
||||
- Stopped removing generic args on associated type constraints [#4943](https://github.com/rust-lang/rustfmt/issues/4943)
|
||||
- Stopped dropping visibility on certain trait and impl items [#4960](https://github.com/rust-lang/rustfmt/issues/4960)
|
||||
- Fixed dropping of qualified paths in struct patterns [#4908](https://github.com/rust-lang/rustfmt/issues/4908) and [#5005](https://github.com/rust-lang/rustfmt/issues/5005)
|
||||
- Fixed bug in line width calculation that was causing specious formatting of certain patterns [#4031](https://github.com/rust-lang/rustfmt/issues/4031)
|
||||
- **Note that this bug fix may cause observable formatting changes in cases where code had been formatted with prior versions of rustfmt that contained the bug**
|
||||
- Fixed bug where rustfmt would drop parameter attributes if they were too long in certain cases [#4579](https://github.com/rust-lang/rustfmt/issues/4579)
|
||||
- Resolved idempotency issue with extern body elements [#4963](https://github.com/rust-lang/rustfmt/issues/4963)
|
||||
- rustfmt will now handle doc-style comments on function parameters, since they could appear with certain macro usage patterns even though it's generally invalid syntax [#4936](https://github.com/rust-lang/rustfmt/issues/4936)
|
||||
- Fixed bug in `match_block_trailing_comma` where commas were not added to the blocks of bodies whose arm had a guard that did not fit on the same line as the pattern [#4998](https://github.com/rust-lang/rustfmt/pull/4998)
|
||||
- Fixed bug in cases where derive attributes started with a block style comment [#4984](https://github.com/rust-lang/rustfmt/issues/4984)
|
||||
- Fixed issue where the struct rest could be lost when `struct_field_align_threshold` was enabled [#4926](https://github.com/rust-lang/rustfmt/issues/4926)
|
||||
- Handles cases where certain control flow type expressions have comments between patterns/keywords and the pattern ident contains the keyword [#5009](https://github.com/rust-lang/rustfmt/issues/5009)
|
||||
- Handles tuple structs that have explicit visibilities and start with a block style comment [#5011](https://github.com/rust-lang/rustfmt/issues/5011)
|
||||
- Handles leading line-style comments in certain types of macro calls [#4615](https://github.com/rust-lang/rustfmt/issues/4615)
|
||||
|
||||
|
||||
### Added
|
||||
- Granular width heuristic options made available for user control [PR #4782](https://github.com/rust-lang/rustfmt/pull/4782). This includes the following:
|
||||
- [`array_width`](https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#array_width)
|
||||
- [`attr_fn_like_width`](https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#attr_fn_like_width)
|
||||
- [`chain_width`](https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#chain_width)
|
||||
- [`fn_call_width`](https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#fn_call_width)
|
||||
- [`single_line_if_else_max_width`](https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#single_line_if_else_max_width)
|
||||
- [`struct_lit_width`](https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#struct_lit_width)
|
||||
- [`struct_variant_width`](https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#struct_variant_width)
|
||||
|
||||
Note this hit the rustup distributions prior to the v1.4.38 release as part of an out-of-cycle updates, but is listed in this version because the feature was not in the other v1.4.37 releases. See also the `use_small_heuristics` section on the configuration site for more information
|
||||
[https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#use_small_heuristics](https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#use_small_heuristics)
|
||||
|
||||
- New `One` variant added to `imports_granularity` configuration option which can be used to reformat all imports into a single use statement [#4669](https://github.com/rust-lang/rustfmt/issues/4669)
|
||||
- rustfmt will now skip files that are annotated with `@generated` at the top of the file [#3958](https://github.com/rust-lang/rustfmt/issues/3958)
|
||||
- New configuration option `hex_literal_case` that allows user to control the casing utilized for hex literals [PR #4903](https://github.com/rust-lang/rustfmt/pull/4903)
|
||||
|
||||
See the section on the configuration site for more information
|
||||
https://rust-lang.github.io/rustfmt/?version=v1.4.38&search=#hex_literal_case
|
||||
|
||||
- `cargo fmt` now directly supports the `--check` flag, which means it's now possible to run `cargo fmt --check` instead of the more verbose `cargo fmt -- --check` [#3888](https://github.com/rust-lang/rustfmt/issues/3888)
|
||||
|
||||
### Install/Download Options
|
||||
- **rustup (nightly)** - *pending*
|
||||
- **GitHub Release Binaries** - [Release v1.4.38](https://github.com/rust-lang/rustfmt/releases/tag/v1.4.38)
|
||||
- **Build from source** - [Tag v1.4.38](https://github.com/rust-lang/rustfmt/tree/v1.4.38), see instructions for how to [install rustfmt from source][install-from-source]
|
||||
|
||||
## [1.4.37] 2021-04-03
|
||||
|
||||
### Changed
|
||||
|
376
Cargo.lock
generated
376
Cargo.lock
generated
@ -35,21 +35,6 @@ version = "1.0.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9267dff192e68f3399525901e709a48c1d3982c9c072fa32f2127a0cb0babf14"
|
||||
|
||||
[[package]]
|
||||
name = "arrayref"
|
||||
version = "0.3.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee"
|
||||
|
||||
[[package]]
|
||||
name = "arrayvec"
|
||||
version = "0.4.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9"
|
||||
dependencies = [
|
||||
"nodrop",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "atty"
|
||||
version = "0.2.13"
|
||||
@ -62,40 +47,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "0.1.7"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
|
||||
|
||||
[[package]]
|
||||
name = "backtrace"
|
||||
version = "0.3.40"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea"
|
||||
dependencies = [
|
||||
"backtrace-sys",
|
||||
"cfg-if 0.1.10",
|
||||
"libc",
|
||||
"rustc-demangle",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "backtrace-sys"
|
||||
version = "0.1.32"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
]
|
||||
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
@ -103,17 +57,6 @@ version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
|
||||
|
||||
[[package]]
|
||||
name = "blake2b_simd"
|
||||
version = "0.5.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5850aeee1552f495dd0250014cf64b82b7c8879a89d83b33bbdace2cc4f63182"
|
||||
dependencies = [
|
||||
"arrayref",
|
||||
"arrayvec",
|
||||
"constant_time_eq",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
version = "0.2.8"
|
||||
@ -125,37 +68,44 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "bytecount"
|
||||
version = "0.6.0"
|
||||
version = "0.6.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b0017894339f586ccb943b01b9555de56770c11cda818e7e3d8bd93f4ed7f46e"
|
||||
checksum = "72feb31ffc86498dacdbd0fcebb56138e7177a8cc5cea4516031d15ae85a742e"
|
||||
dependencies = [
|
||||
"packed_simd",
|
||||
"packed_simd_2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.3.2"
|
||||
name = "camino"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
|
||||
checksum = "52d74260d9bf6944e2208aa46841b4b8f0d7ffc0849a06837b2f510337f86b2b"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cargo-platform"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0226944a63d1bf35a3b5f948dd7c59e263db83695c9e8bffc4037de02e30f1d7"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cargo_metadata"
|
||||
version = "0.8.2"
|
||||
version = "0.14.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "700b3731fd7d357223d0000f4dbf1808401b694609035c3c411fbc0cd375c426"
|
||||
checksum = "c297bd3135f558552f99a0daa180876984ea2c4ffa7470314540dff8c654109a"
|
||||
dependencies = [
|
||||
"camino",
|
||||
"cargo-platform",
|
||||
"semver",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0213d356d3c4ea2c18c40b037c3be23cd639825c18f25ee670ac7813beeef99c"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "0.1.10"
|
||||
@ -183,48 +133,14 @@ dependencies = [
|
||||
"vec_map",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cloudabi"
|
||||
version = "0.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "constant_time_eq"
|
||||
version = "0.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "995a44c877f9212528ccc74b21a232f66ad69001e40ede5bcee2ac9ef2657120"
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-channel"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "acec9a3b0b3559f15aee4f90746c4e5e293b701c0f7d3925d24e01645267b68c"
|
||||
dependencies = [
|
||||
"crossbeam-utils 0.7.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.6.6"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10",
|
||||
"lazy_static",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4"
|
||||
checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"cfg-if 0.1.10",
|
||||
"cfg-if 1.0.0",
|
||||
"lazy_static",
|
||||
]
|
||||
|
||||
@ -257,11 +173,10 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "dirs-sys"
|
||||
version = "0.3.4"
|
||||
version = "0.3.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b"
|
||||
checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10",
|
||||
"libc",
|
||||
"redox_users",
|
||||
"winapi",
|
||||
@ -275,9 +190,9 @@ checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
|
||||
|
||||
[[package]]
|
||||
name = "env_logger"
|
||||
version = "0.6.2"
|
||||
version = "0.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3"
|
||||
checksum = "54532e3223c5af90a6a757c90b5c5521564b07e5e7a958681bcd2afad421cdcd"
|
||||
dependencies = [
|
||||
"atty",
|
||||
"humantime",
|
||||
@ -286,40 +201,12 @@ dependencies = [
|
||||
"termcolor",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "failure"
|
||||
version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9"
|
||||
dependencies = [
|
||||
"backtrace",
|
||||
"failure_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "failure_derive"
|
||||
version = "0.1.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"synstructure",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fnv"
|
||||
version = "1.0.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
|
||||
|
||||
[[package]]
|
||||
name = "fuchsia-cprng"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
|
||||
|
||||
[[package]]
|
||||
name = "getopts"
|
||||
version = "0.2.21"
|
||||
@ -330,10 +217,21 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "globset"
|
||||
version = "0.4.4"
|
||||
name = "getrandom"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "925aa2cac82d8834e2b2a4415b6f6879757fb5c0928fc445ae76461a12eed8f2"
|
||||
checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"libc",
|
||||
"wasi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "globset"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c152169ef1e421390738366d2f796655fec62621dabbd0fd476f905934061e4a"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"bstr",
|
||||
@ -353,36 +251,33 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "humantime"
|
||||
version = "1.3.0"
|
||||
version = "2.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
|
||||
dependencies = [
|
||||
"quick-error",
|
||||
]
|
||||
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
|
||||
|
||||
[[package]]
|
||||
name = "ignore"
|
||||
version = "0.4.11"
|
||||
version = "0.4.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "522daefc3b69036f80c7d2990b28ff9e0471c683bad05ca258e0a01dd22c5a1e"
|
||||
checksum = "b287fb45c60bb826a0dc68ff08742b9d88a2fea13d6e0c286b3172065aaf878c"
|
||||
dependencies = [
|
||||
"crossbeam-channel",
|
||||
"crossbeam-utils",
|
||||
"globset",
|
||||
"lazy_static",
|
||||
"log",
|
||||
"memchr",
|
||||
"regex",
|
||||
"same-file",
|
||||
"thread_local 1.0.1",
|
||||
"thread_local",
|
||||
"walkdir",
|
||||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.8.0"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358"
|
||||
checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
||||
@ -405,6 +300,12 @@ version = "0.2.77"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f2f96b10ec2560088a8e76961b00d47107b3a625fecb76dedb29ee7ccbf98235"
|
||||
|
||||
[[package]]
|
||||
name = "libm"
|
||||
version = "0.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a"
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.14"
|
||||
@ -421,18 +322,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
|
||||
|
||||
[[package]]
|
||||
name = "nodrop"
|
||||
version = "0.1.14"
|
||||
name = "packed_simd_2"
|
||||
version = "0.3.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
|
||||
|
||||
[[package]]
|
||||
name = "packed_simd"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a85ea9fc0d4ac0deb6fe7911d38786b32fc11119afd9e9d38b84ff691ce64220"
|
||||
checksum = "3278e0492f961fd4ae70909f56b2723a7e8d01a228427294e19cdfdebda89a17"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10",
|
||||
"libm",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -463,19 +359,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.6"
|
||||
version = "1.0.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27"
|
||||
checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quick-error"
|
||||
version = "1.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.6"
|
||||
@ -485,96 +375,42 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
|
||||
dependencies = [
|
||||
"rand_core 0.4.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
|
||||
|
||||
[[package]]
|
||||
name = "rand_os"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
|
||||
dependencies = [
|
||||
"cloudabi",
|
||||
"fuchsia-cprng",
|
||||
"libc",
|
||||
"rand_core 0.4.2",
|
||||
"rdrand",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rdrand"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
|
||||
dependencies = [
|
||||
"rand_core 0.3.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.1.56"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
|
||||
checksum = "05ec8ca9416c5ea37062b502703cd7fcb207736bc294f6e0cf367ac6fc234570"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_users"
|
||||
version = "0.3.1"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4ecedbca3bf205f8d8f5c2b44d83cd0690e39ee84b951ed649e9f1841132b66d"
|
||||
checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"
|
||||
dependencies = [
|
||||
"failure",
|
||||
"rand_os",
|
||||
"getrandom",
|
||||
"redox_syscall",
|
||||
"rust-argon2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.3.1"
|
||||
version = "1.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd"
|
||||
checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-syntax",
|
||||
"thread_local 0.3.6",
|
||||
"thread_local",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.6.12"
|
||||
version = "0.6.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716"
|
||||
|
||||
[[package]]
|
||||
name = "rust-argon2"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4ca4eaef519b494d1f2848fc602d18816fed808a981aedf4f1f00ceb7c9d32cf"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"blake2b_simd",
|
||||
"crossbeam-utils 0.6.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc-demangle"
|
||||
version = "0.1.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
|
||||
checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581"
|
||||
|
||||
[[package]]
|
||||
name = "rustc-workspace-hack"
|
||||
@ -593,7 +429,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustfmt-nightly"
|
||||
version = "1.4.37"
|
||||
version = "1.4.38"
|
||||
dependencies = [
|
||||
"annotate-snippets",
|
||||
"anyhow",
|
||||
@ -639,34 +475,27 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "semver"
|
||||
version = "0.9.0"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
|
||||
checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012"
|
||||
dependencies = [
|
||||
"semver-parser",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "semver-parser"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.101"
|
||||
version = "1.0.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9796c9b7ba2ffe7a9ce53c2287dfc48080f4b2b362fcc245a259b3a7201119dd"
|
||||
checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.101"
|
||||
version = "1.0.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4b133a43a1ecd55d4086bd5b4dc6c1751c68b1bfbeba7a5040442022c7e7c02e"
|
||||
checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -675,9 +504,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.41"
|
||||
version = "1.0.59"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2f72eb2a68a7dc3f9a691bfda9305a1c017a6215e5a4545c258500d2099a37c2"
|
||||
checksum = "dcac07dbffa1c65e7f816ab9eba78eb142c6d44410f4eeba1e26e4f5dfa56b95"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"ryu",
|
||||
@ -716,9 +545,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.11"
|
||||
version = "1.0.65"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238"
|
||||
checksum = "f3a1d708c221c5a612956ef9f75b37e454e88d1f7b899fbd3a18d4252012d663"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -736,18 +565,6 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "synstructure"
|
||||
version = "0.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3f085a5855930c0441ca1288cf044ea4aecf4f43a91668abdb870b4ba546a203"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "term"
|
||||
version = "0.6.1"
|
||||
@ -796,15 +613,6 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thread_local"
|
||||
version = "0.3.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
|
||||
dependencies = [
|
||||
"lazy_static",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thread_local"
|
||||
version = "1.0.1"
|
||||
@ -870,6 +678,12 @@ dependencies = [
|
||||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.10.2+wasi-snapshot-preview1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.8"
|
||||
|
10
Cargo.toml
10
Cargo.toml
@ -1,7 +1,7 @@
|
||||
[package]
|
||||
|
||||
name = "rustfmt-nightly"
|
||||
version = "1.4.37"
|
||||
version = "1.4.38"
|
||||
description = "Tool to find and fix Rust formatting issues"
|
||||
repository = "https://github.com/rust-lang/rustfmt"
|
||||
readme = "README.md"
|
||||
@ -33,7 +33,7 @@ rustfmt-format-diff = []
|
||||
generic-simd = ["bytecount/generic-simd"]
|
||||
|
||||
[dependencies]
|
||||
itertools = "0.8"
|
||||
itertools = "0.9"
|
||||
toml = "0.5"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
@ -42,15 +42,15 @@ regex = "1.0"
|
||||
term = "0.6"
|
||||
diff = "0.1"
|
||||
log = "0.4.14"
|
||||
env_logger = "0.6"
|
||||
env_logger = "0.8"
|
||||
getopts = "0.2"
|
||||
derive-new = "0.5"
|
||||
cargo_metadata = "0.8"
|
||||
cargo_metadata = "0.14"
|
||||
bytecount = "0.6"
|
||||
unicode-width = "0.1.5"
|
||||
unicode_categories = "0.1.1"
|
||||
dirs = "2.0.1"
|
||||
ignore = "0.4.11"
|
||||
ignore = "0.4.17"
|
||||
annotate-snippets = { version = "0.8", features = ["color"] }
|
||||
structopt = "0.3"
|
||||
rustfmt-config_proc_macro = { version = "0.2", path = "config_proc_macro" }
|
||||
|
@ -521,11 +521,13 @@ fn main() {
|
||||
|
||||
## `disable_all_formatting`
|
||||
|
||||
Don't reformat anything
|
||||
Don't reformat anything.
|
||||
|
||||
Note that this option may be soft-deprecated in the future once the [ignore](#ignore) option is stabilized. Nightly toolchain users are encouraged to use [ignore](#ignore) instead when possible.
|
||||
|
||||
- **Default value**: `false`
|
||||
- **Possible values**: `true`, `false`
|
||||
- **Stable**: No (tracking issue: #3388)
|
||||
- **Stable**: Yes
|
||||
|
||||
## `edition`
|
||||
|
||||
@ -924,6 +926,15 @@ fn add_one(x: i32) -> i32 {
|
||||
}
|
||||
```
|
||||
|
||||
## `format_generated_files`
|
||||
|
||||
Format generated files. A file is considered generated
|
||||
if any of the first five lines contains `@generated` marker.
|
||||
|
||||
- **Default value**: `false`
|
||||
- **Possible values**: `true`, `false`
|
||||
- **Stable**: No
|
||||
|
||||
## `format_macro_matchers`
|
||||
|
||||
Format the metavariable matching patterns in macros.
|
||||
@ -1047,6 +1058,13 @@ fn lorem() -> usize {
|
||||
|
||||
See also: [`tab_spaces`](#tab_spaces).
|
||||
|
||||
## `hex_literal_case`
|
||||
|
||||
Control the case of the letters in hexadecimal literal values
|
||||
|
||||
- **Default value**: `Preserve`
|
||||
- **Possible values**: `Upper`, `Lower`
|
||||
- **Stable**: No
|
||||
|
||||
## `hide_parse_errors`
|
||||
|
||||
@ -1610,7 +1628,7 @@ Put a trailing comma after a block based match arm (non-block arms are not affec
|
||||
|
||||
- **Default value**: `false`
|
||||
- **Possible values**: `true`, `false`
|
||||
- **Stable**: No (tracking issue: #3380)
|
||||
- **Stable**: Yes
|
||||
|
||||
#### `false` (default):
|
||||
|
||||
@ -1668,6 +1686,9 @@ pub enum Foo {}
|
||||
#### `false`:
|
||||
|
||||
```rust
|
||||
#[derive(Eq, PartialEq, Debug, Copy, Clone)]
|
||||
pub enum Bar {}
|
||||
|
||||
#[derive(Eq, PartialEq)]
|
||||
#[derive(Debug)]
|
||||
#[derive(Copy, Clone)]
|
||||
@ -1679,7 +1700,7 @@ pub enum Foo {}
|
||||
How imports should be grouped into `use` statements. Imports will be merged or split to the configured level of granularity.
|
||||
|
||||
- **Default value**: `Preserve`
|
||||
- **Possible values**: `Preserve`, `Crate`, `Module`, `Item`
|
||||
- **Possible values**: `Preserve`, `Crate`, `Module`, `Item`, `One`
|
||||
- **Stable**: No
|
||||
|
||||
#### `Preserve` (default):
|
||||
@ -1733,6 +1754,23 @@ use qux::h;
|
||||
use qux::i;
|
||||
```
|
||||
|
||||
#### `One`:
|
||||
|
||||
Merge all imports into a single `use` statement as long as they have the same visibility.
|
||||
|
||||
```rust
|
||||
pub use foo::{x, y};
|
||||
use {
|
||||
bar::{
|
||||
a,
|
||||
b::{self, f, g},
|
||||
c,
|
||||
d::e,
|
||||
},
|
||||
qux::{h, i},
|
||||
};
|
||||
```
|
||||
|
||||
## `merge_imports`
|
||||
|
||||
This option is deprecated. Use `imports_granularity = "Crate"` instead.
|
||||
@ -1824,6 +1862,9 @@ Convert `#![doc]` and `#[doc]` attributes to `//!` and `///` doc comments.
|
||||
#![doc = "Example documentation"]
|
||||
|
||||
#[doc = "Example item documentation"]
|
||||
pub enum Bar {}
|
||||
|
||||
/// Example item documentation
|
||||
pub enum Foo {}
|
||||
```
|
||||
|
||||
@ -1938,6 +1979,8 @@ fn main() {
|
||||
#### `false`:
|
||||
```rust
|
||||
fn main() {
|
||||
(foo());
|
||||
|
||||
((((foo()))));
|
||||
}
|
||||
```
|
||||
@ -1963,6 +2006,14 @@ impl Iterator for Dummy {
|
||||
|
||||
type Item = i32;
|
||||
}
|
||||
|
||||
impl Iterator for Dummy {
|
||||
type Item = i32;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
None
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### `true`
|
||||
@ -2519,7 +2570,8 @@ fn main() {
|
||||
let x = 1;
|
||||
let y = 2;
|
||||
let z = 3;
|
||||
let a = Foo { x: x, y: y, z: z };
|
||||
let a = Foo { x, y, z };
|
||||
let b = Foo { x: x, y: y, z: z };
|
||||
}
|
||||
```
|
||||
|
||||
@ -2688,6 +2740,8 @@ Replace uses of the try! macro by the ? shorthand
|
||||
|
||||
```rust
|
||||
fn main() {
|
||||
let lorem = ipsum.map(|dolor| dolor.sit())?;
|
||||
|
||||
let lorem = try!(ipsum.map(|dolor| dolor.sit()));
|
||||
}
|
||||
```
|
||||
@ -2759,6 +2813,12 @@ Break comments to fit on the line
|
||||
#### `false` (default):
|
||||
|
||||
```rust
|
||||
// Lorem ipsum dolor sit amet, consectetur adipiscing elit,
|
||||
// sed do eiusmod tempor incididunt ut labore et dolore
|
||||
// magna aliqua. Ut enim ad minim veniam, quis nostrud
|
||||
// exercitation ullamco laboris nisi ut aliquip ex ea
|
||||
// commodo consequat.
|
||||
|
||||
// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
```
|
||||
|
||||
|
49
appveyor.yml
49
appveyor.yml
@ -1,55 +1,8 @@
|
||||
# This is based on https://github.com/japaric/rust-everywhere/blob/master/appveyor.yml
|
||||
# and modified (mainly removal of deployment) to suit rustfmt.
|
||||
|
||||
environment:
|
||||
global:
|
||||
PROJECT_NAME: rustfmt
|
||||
matrix:
|
||||
# Stable channel
|
||||
# - TARGET: i686-pc-windows-gnu
|
||||
# CHANNEL: stable
|
||||
# - TARGET: i686-pc-windows-msvc
|
||||
# CHANNEL: stable
|
||||
# - TARGET: x86_64-pc-windows-gnu
|
||||
# CHANNEL: stable
|
||||
# - TARGET: x86_64-pc-windows-msvc
|
||||
# CHANNEL: stable
|
||||
# Beta channel
|
||||
# - TARGET: i686-pc-windows-gnu
|
||||
# CHANNEL: beta
|
||||
# - TARGET: i686-pc-windows-msvc
|
||||
# CHANNEL: beta
|
||||
# - TARGET: x86_64-pc-windows-gnu
|
||||
# CHANNEL: beta
|
||||
# - TARGET: x86_64-pc-windows-msvc
|
||||
# CHANNEL: beta
|
||||
# Nightly channel
|
||||
- TARGET: i686-pc-windows-gnu
|
||||
CHANNEL: nightly
|
||||
- TARGET: i686-pc-windows-msvc
|
||||
CHANNEL: nightly
|
||||
- TARGET: x86_64-pc-windows-gnu
|
||||
CHANNEL: nightly
|
||||
- TARGET: x86_64-pc-windows-msvc
|
||||
CHANNEL: nightly
|
||||
|
||||
# Install Rust and Cargo
|
||||
# (Based on from https://github.com/rust-lang/libc/blob/master/appveyor.yml)
|
||||
install:
|
||||
- appveyor-retry appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe
|
||||
- if "%TARGET%" == "i686-pc-windows-gnu" set PATH=%PATH%;C:\msys64\mingw32\bin
|
||||
- if "%TARGET%" == "x86_64-pc-windows-gnu" set PATH=%PATH%;C:\msys64\mingw64\bin
|
||||
- set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
|
||||
- rustup-init.exe --default-host %TARGET% --default-toolchain %CHANNEL% -y
|
||||
- rustc -Vv
|
||||
- cargo -V
|
||||
|
||||
# ???
|
||||
build: false
|
||||
|
||||
test_script:
|
||||
- set CFG_RELEASE_CHANNEL=nightly
|
||||
- set CFG_RELEASE=nightly
|
||||
- cargo build --verbose
|
||||
- cargo test
|
||||
- cargo test -- --ignored
|
||||
- echo Why does no one have access to delete me?
|
||||
|
208
docs/index.html
208
docs/index.html
@ -2,9 +2,13 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<title>Rustfmt</title>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/3.0.1/github-markdown.css" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/styles/github-gist.min.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
|
||||
<script src="https://unpkg.com/vue-async-computed@3.8.1"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/highlight.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
|
||||
<style>
|
||||
@media (max-width: 767px) {
|
||||
@ -38,6 +42,15 @@
|
||||
.searchCondition > div {
|
||||
margin-right: 30px;
|
||||
}
|
||||
.header-link {
|
||||
position: relative;
|
||||
}
|
||||
.header-link:hover::before {
|
||||
position: absolute;
|
||||
left: -2em;
|
||||
padding-right: 0.5em;
|
||||
content: '\2002\00a7\2002';
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@ -59,6 +72,14 @@
|
||||
<label for="stable">stable: </label>
|
||||
<input type="checkbox" id="stable" v-model="shouldStable">
|
||||
</div>
|
||||
<div>
|
||||
<label for="viewVersion">version: </label>
|
||||
<select name="viewVersion" id="viewVersion" v-model="viewVersion">
|
||||
<option v-for="option in versionOptions" v-bind:value="option">
|
||||
{{ option }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div v-html="aboutHtml"></div>
|
||||
<div v-html="configurationAboutHtml"></div>
|
||||
@ -66,63 +87,155 @@
|
||||
</article>
|
||||
</div>
|
||||
<script>
|
||||
const ConfigurationMdUrl = 'https://raw.githubusercontent.com/rust-lang/rustfmt/master/Configurations.md';
|
||||
const RusfmtTagsUrl = 'https://api.github.com/repos/rust-lang/rustfmt/tags';
|
||||
const RustfmtLatestUrl = 'https://api.github.com/repos/rust-lang/rustfmt/releases/latest';
|
||||
const UrlHash = window.location.hash.replace(/^#/, '');
|
||||
const queryParams = new URLSearchParams(window.location.search);
|
||||
const searchParam = queryParams.get('search');
|
||||
const searchTerm = null !== searchParam ? searchParam : '';
|
||||
const versionParam = queryParams.get('version');
|
||||
const parseVersionParam = (version) => {
|
||||
if (version === 'master') return 'master';
|
||||
if (version.startsWith('v')) return version;
|
||||
return `v${version}`;
|
||||
};
|
||||
const versionNumber = null !== versionParam ? parseVersionParam(versionParam) : 'master';
|
||||
new Vue({
|
||||
el: '#app',
|
||||
data() {
|
||||
const configurationDescriptions = [];
|
||||
configurationDescriptions.links = {};
|
||||
return {
|
||||
aboutHtml: '',
|
||||
configurationAboutHtml: '',
|
||||
searchCondition: UrlHash,
|
||||
configurationDescriptions,
|
||||
shouldStable: false
|
||||
}
|
||||
data: {
|
||||
aboutHtml: '',
|
||||
configurationAboutHtml: '',
|
||||
configurationDescriptions: [],
|
||||
searchCondition: searchTerm,
|
||||
shouldStable: false,
|
||||
viewVersion: versionNumber,
|
||||
oldViewVersion: undefined,
|
||||
versionOptions: ['master'],
|
||||
scrolledOnce: false,
|
||||
},
|
||||
computed: {
|
||||
outputHtml() {
|
||||
const ast = this.configurationDescriptions
|
||||
.filter(({ head, text, stable }) => {
|
||||
asyncComputed: {
|
||||
async updateVersion() {
|
||||
let latest;
|
||||
try {
|
||||
latest = (await axios.get(RustfmtLatestUrl)).data;
|
||||
} catch(err) {
|
||||
console.log(err);
|
||||
return;
|
||||
}
|
||||
if (versionParam == null) {
|
||||
this.viewVersion = latest.name;
|
||||
}
|
||||
},
|
||||
async outputHtml() {
|
||||
if (this.viewVersion !== this.oldViewVersion) {
|
||||
const ConfigurationMdUrl =
|
||||
`https://raw.githubusercontent.com/rust-lang/rustfmt/${this.viewVersion}/Configurations.md`;
|
||||
let res;
|
||||
try {
|
||||
res = await axios.get(ConfigurationMdUrl).catch(e => { throw e });
|
||||
} catch(e) {
|
||||
this.handleReqFailure(e);
|
||||
return;
|
||||
}
|
||||
const {
|
||||
about,
|
||||
configurationAbout,
|
||||
configurationDescriptions
|
||||
} = parseMarkdownAst(res.data);
|
||||
this.aboutHtml = marked.parser(about);
|
||||
this.configurationAboutHtml = marked.parser(configurationAbout);
|
||||
this.configurationDescriptions = configurationDescriptions;
|
||||
this.oldViewVersion = this.viewVersion;
|
||||
}
|
||||
|
||||
if (
|
||||
text.includes(this.searchCondition) === false &&
|
||||
head.includes(this.searchCondition) === false
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
return (this.shouldStable)
|
||||
? stable === true
|
||||
: true;
|
||||
})
|
||||
.reduce((stack, { value }) => {
|
||||
return stack.concat(value);
|
||||
}, []);
|
||||
const ast = this.configurationDescriptions
|
||||
.filter(({ head, text, stable }) => {
|
||||
if (text.includes(this.searchCondition) === false &&
|
||||
head.includes(this.searchCondition) === false) {
|
||||
return false;
|
||||
}
|
||||
return (this.shouldStable)
|
||||
? stable === true
|
||||
: true;
|
||||
})
|
||||
.reduce((stack, { value }) => {
|
||||
return stack.concat(value);
|
||||
}, []);
|
||||
ast.links = {};
|
||||
return marked.parser(ast);
|
||||
|
||||
queryParams.set('version', this.viewVersion);
|
||||
queryParams.set('search', this.searchCondition);
|
||||
const curUrl = window.location.pathname +
|
||||
'?' + queryParams.toString() + window.location.hash;
|
||||
history.pushState(null, '', curUrl);
|
||||
|
||||
const renderer = new marked.Renderer();
|
||||
renderer.heading = function(text, level) {
|
||||
const id = htmlToId(text);
|
||||
return `<h${level}>
|
||||
<a id="${id}" href="#${id}" name="${id}" class="header-link">${text}</a>
|
||||
</h${level}>`;
|
||||
};
|
||||
|
||||
return marked.parser(ast, {
|
||||
highlight(code, lang) {
|
||||
return hljs.highlight(lang ? lang : 'rust', code).value;
|
||||
},
|
||||
headerIds: true,
|
||||
headerPrefix: '',
|
||||
renderer,
|
||||
});
|
||||
}
|
||||
},
|
||||
created: async function() {
|
||||
const res = await axios.get(ConfigurationMdUrl);
|
||||
const {
|
||||
about,
|
||||
configurationAbout,
|
||||
configurationDescriptions
|
||||
} = parseMarkdownAst(res.data);
|
||||
this.aboutHtml = marked.parser(about);
|
||||
this.configurationAboutHtml = marked.parser(configurationAbout);
|
||||
this.configurationDescriptions = configurationDescriptions;
|
||||
let tags;
|
||||
try {
|
||||
tags = (await axios.get(RusfmtTagsUrl)).data;
|
||||
} catch(e) {
|
||||
this.handleReqFailure(e);
|
||||
return;
|
||||
}
|
||||
|
||||
const excludedTagVersions = new Set(['v0.7', 'v0.8.1']);
|
||||
|
||||
const tagOptions = tags
|
||||
.map(tag => tag.name)
|
||||
.filter(tag => tag.startsWith('v') && !excludedTagVersions.has(tag));
|
||||
this.versionOptions = this.versionOptions.concat(tagOptions);
|
||||
},
|
||||
mounted() {
|
||||
updated() {
|
||||
if (UrlHash === '') return;
|
||||
const interval = setInterval(() => {
|
||||
this.$nextTick(() => {
|
||||
const target = document.querySelector(`#${UrlHash}`);
|
||||
if (target != null) {
|
||||
if (target != null && !this.scrolledOnce) {
|
||||
target.scrollIntoView(true);
|
||||
clearInterval(interval);
|
||||
this.scrolledOnce = true;
|
||||
}
|
||||
}, 100);
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
handleReqFailure(e) {
|
||||
if (e.response.status === 404) {
|
||||
this.aboutHtml =
|
||||
"<p>Failed to get configuration options for this version, please select the version from the dropdown above.</p>";
|
||||
} else if (
|
||||
e.response.status === 403 &&
|
||||
e.response.headers["X-RateLimit-Remaining"] === 0
|
||||
) {
|
||||
const resetDate = new Date(
|
||||
e.response.headers['X-RateLimit-Reset'] * 1000
|
||||
).toLocaleString();
|
||||
this.aboutHtml =
|
||||
`<p>You have hit the GitHub API rate limit; documentation cannot be updated.` +
|
||||
`<p>The rate limit will be reset at ${resetDate}.</p>`;
|
||||
} else {
|
||||
this.aboutHtml =
|
||||
`<p>Ecountered an error when fetching documentation data:</p>` +
|
||||
`<pre><code>${e.response.data}</code></pre>` +
|
||||
`<p>We would appreciate <a href="https://github.com/rust-lang/rustfmt/issues/new?template=bug_report.md">a bug report</a>.` +
|
||||
`<p>Try refreshing the page.</p>`;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
const extractDepthOnes = (ast) => {
|
||||
@ -155,7 +268,9 @@
|
||||
head: val[0].text,
|
||||
value: val,
|
||||
stable: val.some((elem) => {
|
||||
return !!elem.text && elem.text.includes("**Stable**: Yes")
|
||||
return elem.type === "list" &&
|
||||
!!elem.raw &&
|
||||
elem.raw.includes("**Stable**: Yes");
|
||||
}),
|
||||
text: val.reduce((result, next) => {
|
||||
return next.text != null
|
||||
@ -186,6 +301,11 @@
|
||||
configurationDescriptions
|
||||
};
|
||||
}
|
||||
function htmlToId(text) {
|
||||
const tmpl = document.createElement('template');
|
||||
tmpl.innerHTML = text.trim();
|
||||
return encodeURIComponent(CSS.escape(tmpl.content.textContent));
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -1,3 +1,3 @@
|
||||
[toolchain]
|
||||
channel = "nightly-2021-07-23"
|
||||
channel = "nightly-2021-10-20"
|
||||
components = ["rustc-dev"]
|
||||
|
@ -13,6 +13,7 @@ use crate::lists::{definitive_tactic, itemize_list, write_list, ListFormatting,
|
||||
use crate::overflow;
|
||||
use crate::rewrite::{Rewrite, RewriteContext};
|
||||
use crate::shape::Shape;
|
||||
use crate::source_map::SpanUtils;
|
||||
use crate::types::{rewrite_path, PathContext};
|
||||
use crate::utils::{count_newlines, mk_sp};
|
||||
|
||||
@ -116,7 +117,9 @@ fn format_derive(
|
||||
|span| span.lo(),
|
||||
|span| span.hi(),
|
||||
|span| Some(context.snippet(*span).to_owned()),
|
||||
attr.span.lo(),
|
||||
// We update derive attribute spans to start after the opening '('
|
||||
// This helps us focus parsing to just what's inside #[derive(...)]
|
||||
context.snippet_provider.span_after(attr.span, "("),
|
||||
attr.span.hi(),
|
||||
false,
|
||||
);
|
||||
|
@ -121,7 +121,7 @@ fn make_opts() -> Options {
|
||||
found reverts to the input file path",
|
||||
"[Path for the configuration file]",
|
||||
);
|
||||
opts.optopt("", "edition", "Rust edition to use", "[2015|2018]");
|
||||
opts.optopt("", "edition", "Rust edition to use", "[2015|2018|2021]");
|
||||
opts.optopt(
|
||||
"",
|
||||
"color",
|
||||
|
@ -17,6 +17,10 @@ use std::str;
|
||||
|
||||
use structopt::StructOpt;
|
||||
|
||||
#[path = "test/mod.rs"]
|
||||
#[cfg(test)]
|
||||
mod cargo_fmt_tests;
|
||||
|
||||
#[derive(StructOpt, Debug)]
|
||||
#[structopt(
|
||||
bin_name = "cargo fmt",
|
||||
@ -36,7 +40,7 @@ pub struct Opts {
|
||||
#[structopt(long = "version")]
|
||||
version: bool,
|
||||
|
||||
/// Specify package to format (only usable in workspaces)
|
||||
/// Specify package to format
|
||||
#[structopt(short = "p", long = "package", value_name = "package")]
|
||||
packages: Vec<String>,
|
||||
|
||||
@ -53,9 +57,13 @@ pub struct Opts {
|
||||
#[structopt(name = "rustfmt_options", raw(true))]
|
||||
rustfmt_options: Vec<String>,
|
||||
|
||||
/// Format all packages (only usable in workspaces)
|
||||
/// Format all packages, and also their local path-based dependencies
|
||||
#[structopt(long = "all")]
|
||||
format_all: bool,
|
||||
|
||||
/// Run rustfmt in check mode
|
||||
#[structopt(long = "check")]
|
||||
check: bool,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
@ -104,6 +112,12 @@ fn execute() -> i32 {
|
||||
|
||||
let strategy = CargoFmtStrategy::from_opts(&opts);
|
||||
let mut rustfmt_args = opts.rustfmt_options;
|
||||
if opts.check {
|
||||
let check_flag = "--check";
|
||||
if !rustfmt_args.iter().any(|o| o == check_flag) {
|
||||
rustfmt_args.push(check_flag.to_owned());
|
||||
}
|
||||
}
|
||||
if let Some(message_format) = opts.message_format {
|
||||
if let Err(msg) = convert_message_format_to_rustfmt_args(&message_format, &mut rustfmt_args)
|
||||
{
|
||||
@ -346,7 +360,7 @@ fn get_targets_root_only(
|
||||
manifest_path: Option<&Path>,
|
||||
targets: &mut BTreeSet<Target>,
|
||||
) -> Result<(), io::Error> {
|
||||
let metadata = get_cargo_metadata(manifest_path, false)?;
|
||||
let metadata = get_cargo_metadata(manifest_path)?;
|
||||
let workspace_root_path = PathBuf::from(&metadata.workspace_root).canonicalize()?;
|
||||
let (in_workspace_root, current_dir_manifest) = if let Some(target_manifest) = manifest_path {
|
||||
(
|
||||
@ -390,34 +404,29 @@ fn get_targets_recursive(
|
||||
mut targets: &mut BTreeSet<Target>,
|
||||
visited: &mut BTreeSet<String>,
|
||||
) -> Result<(), io::Error> {
|
||||
let metadata = get_cargo_metadata(manifest_path, false)?;
|
||||
let metadata_with_deps = get_cargo_metadata(manifest_path, true)?;
|
||||
|
||||
for package in metadata.packages {
|
||||
let metadata = get_cargo_metadata(manifest_path)?;
|
||||
for package in &metadata.packages {
|
||||
add_targets(&package.targets, &mut targets);
|
||||
|
||||
// Look for local dependencies.
|
||||
for dependency in package.dependencies {
|
||||
if dependency.source.is_some() || visited.contains(&dependency.name) {
|
||||
// Look for local dependencies using information available since cargo v1.51
|
||||
// It's theoretically possible someone could use a newer version of rustfmt with
|
||||
// a much older version of `cargo`, but we don't try to explicitly support that scenario.
|
||||
// If someone reports an issue with path-based deps not being formatted, be sure to
|
||||
// confirm their version of `cargo` (not `cargo-fmt`) is >= v1.51
|
||||
// https://github.com/rust-lang/cargo/pull/8994
|
||||
for dependency in &package.dependencies {
|
||||
if dependency.path.is_none() || visited.contains(&dependency.name) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let dependency_package = metadata_with_deps
|
||||
.packages
|
||||
.iter()
|
||||
.find(|p| p.name == dependency.name && p.source.is_none());
|
||||
let manifest_path = if let Some(dep_pkg) = dependency_package {
|
||||
PathBuf::from(&dep_pkg.manifest_path)
|
||||
} else {
|
||||
let mut package_manifest_path = PathBuf::from(&package.manifest_path);
|
||||
package_manifest_path.pop();
|
||||
package_manifest_path.push(&dependency.name);
|
||||
package_manifest_path.push("Cargo.toml");
|
||||
package_manifest_path
|
||||
};
|
||||
|
||||
if manifest_path.exists() {
|
||||
visited.insert(dependency.name);
|
||||
let manifest_path = PathBuf::from(dependency.path.as_ref().unwrap()).join("Cargo.toml");
|
||||
if manifest_path.exists()
|
||||
&& !metadata
|
||||
.packages
|
||||
.iter()
|
||||
.any(|p| p.manifest_path.eq(&manifest_path))
|
||||
{
|
||||
visited.insert(dependency.name.to_owned());
|
||||
get_targets_recursive(Some(&manifest_path), &mut targets, visited)?;
|
||||
}
|
||||
}
|
||||
@ -431,8 +440,7 @@ fn get_targets_with_hitlist(
|
||||
hitlist: &[String],
|
||||
targets: &mut BTreeSet<Target>,
|
||||
) -> Result<(), io::Error> {
|
||||
let metadata = get_cargo_metadata(manifest_path, false)?;
|
||||
|
||||
let metadata = get_cargo_metadata(manifest_path)?;
|
||||
let mut workspace_hitlist: BTreeSet<&String> = BTreeSet::from_iter(hitlist);
|
||||
|
||||
for package in metadata.packages {
|
||||
@ -517,18 +525,13 @@ fn run_rustfmt(
|
||||
.unwrap_or(SUCCESS))
|
||||
}
|
||||
|
||||
fn get_cargo_metadata(
|
||||
manifest_path: Option<&Path>,
|
||||
include_deps: bool,
|
||||
) -> Result<cargo_metadata::Metadata, io::Error> {
|
||||
fn get_cargo_metadata(manifest_path: Option<&Path>) -> Result<cargo_metadata::Metadata, io::Error> {
|
||||
let mut cmd = cargo_metadata::MetadataCommand::new();
|
||||
if !include_deps {
|
||||
cmd.no_deps();
|
||||
}
|
||||
cmd.no_deps();
|
||||
if let Some(manifest_path) = manifest_path {
|
||||
cmd.manifest_path(manifest_path);
|
||||
}
|
||||
cmd.other_options(&[String::from("--offline")]);
|
||||
cmd.other_options(vec![String::from("--offline")]);
|
||||
|
||||
match cmd.exec() {
|
||||
Ok(metadata) => Ok(metadata),
|
||||
@ -541,221 +544,3 @@ fn get_cargo_metadata(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod cargo_fmt_tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn default_options() {
|
||||
let empty: Vec<String> = vec![];
|
||||
let o = Opts::from_iter(&empty);
|
||||
assert_eq!(false, o.quiet);
|
||||
assert_eq!(false, o.verbose);
|
||||
assert_eq!(false, o.version);
|
||||
assert_eq!(empty, o.packages);
|
||||
assert_eq!(empty, o.rustfmt_options);
|
||||
assert_eq!(false, o.format_all);
|
||||
assert_eq!(None, o.manifest_path);
|
||||
assert_eq!(None, o.message_format);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn good_options() {
|
||||
let o = Opts::from_iter(&[
|
||||
"test",
|
||||
"-q",
|
||||
"-p",
|
||||
"p1",
|
||||
"-p",
|
||||
"p2",
|
||||
"--message-format",
|
||||
"short",
|
||||
"--",
|
||||
"--edition",
|
||||
"2018",
|
||||
]);
|
||||
assert_eq!(true, o.quiet);
|
||||
assert_eq!(false, o.verbose);
|
||||
assert_eq!(false, o.version);
|
||||
assert_eq!(vec!["p1", "p2"], o.packages);
|
||||
assert_eq!(vec!["--edition", "2018"], o.rustfmt_options);
|
||||
assert_eq!(false, o.format_all);
|
||||
assert_eq!(Some(String::from("short")), o.message_format);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unexpected_option() {
|
||||
assert!(
|
||||
Opts::clap()
|
||||
.get_matches_from_safe(&["test", "unexpected"])
|
||||
.is_err()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unexpected_flag() {
|
||||
assert!(
|
||||
Opts::clap()
|
||||
.get_matches_from_safe(&["test", "--flag"])
|
||||
.is_err()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mandatory_separator() {
|
||||
assert!(
|
||||
Opts::clap()
|
||||
.get_matches_from_safe(&["test", "--check"])
|
||||
.is_err()
|
||||
);
|
||||
assert!(
|
||||
!Opts::clap()
|
||||
.get_matches_from_safe(&["test", "--", "--check"])
|
||||
.is_err()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn multiple_packages_one_by_one() {
|
||||
let o = Opts::from_iter(&[
|
||||
"test",
|
||||
"-p",
|
||||
"package1",
|
||||
"--package",
|
||||
"package2",
|
||||
"-p",
|
||||
"package3",
|
||||
]);
|
||||
assert_eq!(3, o.packages.len());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn multiple_packages_grouped() {
|
||||
let o = Opts::from_iter(&[
|
||||
"test",
|
||||
"--package",
|
||||
"package1",
|
||||
"package2",
|
||||
"-p",
|
||||
"package3",
|
||||
"package4",
|
||||
]);
|
||||
assert_eq!(4, o.packages.len());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_packages_1() {
|
||||
assert!(Opts::clap().get_matches_from_safe(&["test", "-p"]).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_packages_2() {
|
||||
assert!(
|
||||
Opts::clap()
|
||||
.get_matches_from_safe(&["test", "-p", "--", "--check"])
|
||||
.is_err()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_packages_3() {
|
||||
assert!(
|
||||
Opts::clap()
|
||||
.get_matches_from_safe(&["test", "-p", "--verbose"])
|
||||
.is_err()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_packages_4() {
|
||||
assert!(
|
||||
Opts::clap()
|
||||
.get_matches_from_safe(&["test", "-p", "--check"])
|
||||
.is_err()
|
||||
);
|
||||
}
|
||||
|
||||
mod convert_message_format_to_rustfmt_args_tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn invalid_message_format() {
|
||||
assert_eq!(
|
||||
convert_message_format_to_rustfmt_args("awesome", &mut vec![]),
|
||||
Err(String::from(
|
||||
"invalid --message-format value: awesome. Allowed values are: short|json|human"
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn json_message_format_and_check_arg() {
|
||||
let mut args = vec![String::from("--check")];
|
||||
assert_eq!(
|
||||
convert_message_format_to_rustfmt_args("json", &mut args),
|
||||
Err(String::from(
|
||||
"cannot include --check arg when --message-format is set to json"
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn json_message_format_and_emit_arg() {
|
||||
let mut args = vec![String::from("--emit"), String::from("checkstyle")];
|
||||
assert_eq!(
|
||||
convert_message_format_to_rustfmt_args("json", &mut args),
|
||||
Err(String::from(
|
||||
"cannot include --emit arg when --message-format is set to json"
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn json_message_format() {
|
||||
let mut args = vec![String::from("--edition"), String::from("2018")];
|
||||
assert!(convert_message_format_to_rustfmt_args("json", &mut args).is_ok());
|
||||
assert_eq!(
|
||||
args,
|
||||
vec![
|
||||
String::from("--edition"),
|
||||
String::from("2018"),
|
||||
String::from("--emit"),
|
||||
String::from("json")
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn human_message_format() {
|
||||
let exp_args = vec![String::from("--emit"), String::from("json")];
|
||||
let mut act_args = exp_args.clone();
|
||||
assert!(convert_message_format_to_rustfmt_args("human", &mut act_args).is_ok());
|
||||
assert_eq!(act_args, exp_args);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn short_message_format() {
|
||||
let mut args = vec![String::from("--check")];
|
||||
assert!(convert_message_format_to_rustfmt_args("short", &mut args).is_ok());
|
||||
assert_eq!(args, vec![String::from("--check"), String::from("-l")]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn short_message_format_included_short_list_files_flag() {
|
||||
let mut args = vec![String::from("--check"), String::from("-l")];
|
||||
assert!(convert_message_format_to_rustfmt_args("short", &mut args).is_ok());
|
||||
assert_eq!(args, vec![String::from("--check"), String::from("-l")]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn short_message_format_included_long_list_files_flag() {
|
||||
let mut args = vec![String::from("--check"), String::from("--files-with-diff")];
|
||||
assert!(convert_message_format_to_rustfmt_args("short", &mut args).is_ok());
|
||||
assert_eq!(
|
||||
args,
|
||||
vec![String::from("--check"), String::from("--files-with-diff")]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
80
src/cargo-fmt/test/message_format.rs
Normal file
80
src/cargo-fmt/test/message_format.rs
Normal file
@ -0,0 +1,80 @@
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn invalid_message_format() {
|
||||
assert_eq!(
|
||||
convert_message_format_to_rustfmt_args("awesome", &mut vec![]),
|
||||
Err(String::from(
|
||||
"invalid --message-format value: awesome. Allowed values are: short|json|human"
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn json_message_format_and_check_arg() {
|
||||
let mut args = vec![String::from("--check")];
|
||||
assert_eq!(
|
||||
convert_message_format_to_rustfmt_args("json", &mut args),
|
||||
Err(String::from(
|
||||
"cannot include --check arg when --message-format is set to json"
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn json_message_format_and_emit_arg() {
|
||||
let mut args = vec![String::from("--emit"), String::from("checkstyle")];
|
||||
assert_eq!(
|
||||
convert_message_format_to_rustfmt_args("json", &mut args),
|
||||
Err(String::from(
|
||||
"cannot include --emit arg when --message-format is set to json"
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn json_message_format() {
|
||||
let mut args = vec![String::from("--edition"), String::from("2018")];
|
||||
assert!(convert_message_format_to_rustfmt_args("json", &mut args).is_ok());
|
||||
assert_eq!(
|
||||
args,
|
||||
vec![
|
||||
String::from("--edition"),
|
||||
String::from("2018"),
|
||||
String::from("--emit"),
|
||||
String::from("json")
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn human_message_format() {
|
||||
let exp_args = vec![String::from("--emit"), String::from("json")];
|
||||
let mut act_args = exp_args.clone();
|
||||
assert!(convert_message_format_to_rustfmt_args("human", &mut act_args).is_ok());
|
||||
assert_eq!(act_args, exp_args);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn short_message_format() {
|
||||
let mut args = vec![String::from("--check")];
|
||||
assert!(convert_message_format_to_rustfmt_args("short", &mut args).is_ok());
|
||||
assert_eq!(args, vec![String::from("--check"), String::from("-l")]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn short_message_format_included_short_list_files_flag() {
|
||||
let mut args = vec![String::from("--check"), String::from("-l")];
|
||||
assert!(convert_message_format_to_rustfmt_args("short", &mut args).is_ok());
|
||||
assert_eq!(args, vec![String::from("--check"), String::from("-l")]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn short_message_format_included_long_list_files_flag() {
|
||||
let mut args = vec![String::from("--check"), String::from("--files-with-diff")];
|
||||
assert!(convert_message_format_to_rustfmt_args("short", &mut args).is_ok());
|
||||
assert_eq!(
|
||||
args,
|
||||
vec![String::from("--check"), String::from("--files-with-diff")]
|
||||
);
|
||||
}
|
137
src/cargo-fmt/test/mod.rs
Normal file
137
src/cargo-fmt/test/mod.rs
Normal file
@ -0,0 +1,137 @@
|
||||
use super::*;
|
||||
|
||||
mod message_format;
|
||||
mod targets;
|
||||
|
||||
#[test]
|
||||
fn default_options() {
|
||||
let empty: Vec<String> = vec![];
|
||||
let o = Opts::from_iter(&empty);
|
||||
assert_eq!(false, o.quiet);
|
||||
assert_eq!(false, o.verbose);
|
||||
assert_eq!(false, o.version);
|
||||
assert_eq!(false, o.check);
|
||||
assert_eq!(empty, o.packages);
|
||||
assert_eq!(empty, o.rustfmt_options);
|
||||
assert_eq!(false, o.format_all);
|
||||
assert_eq!(None, o.manifest_path);
|
||||
assert_eq!(None, o.message_format);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn good_options() {
|
||||
let o = Opts::from_iter(&[
|
||||
"test",
|
||||
"-q",
|
||||
"-p",
|
||||
"p1",
|
||||
"-p",
|
||||
"p2",
|
||||
"--message-format",
|
||||
"short",
|
||||
"--check",
|
||||
"--",
|
||||
"--edition",
|
||||
"2018",
|
||||
]);
|
||||
assert_eq!(true, o.quiet);
|
||||
assert_eq!(false, o.verbose);
|
||||
assert_eq!(false, o.version);
|
||||
assert_eq!(true, o.check);
|
||||
assert_eq!(vec!["p1", "p2"], o.packages);
|
||||
assert_eq!(vec!["--edition", "2018"], o.rustfmt_options);
|
||||
assert_eq!(false, o.format_all);
|
||||
assert_eq!(Some(String::from("short")), o.message_format);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unexpected_option() {
|
||||
assert!(
|
||||
Opts::clap()
|
||||
.get_matches_from_safe(&["test", "unexpected"])
|
||||
.is_err()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unexpected_flag() {
|
||||
assert!(
|
||||
Opts::clap()
|
||||
.get_matches_from_safe(&["test", "--flag"])
|
||||
.is_err()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mandatory_separator() {
|
||||
assert!(
|
||||
Opts::clap()
|
||||
.get_matches_from_safe(&["test", "--emit"])
|
||||
.is_err()
|
||||
);
|
||||
assert!(
|
||||
!Opts::clap()
|
||||
.get_matches_from_safe(&["test", "--", "--emit"])
|
||||
.is_err()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn multiple_packages_one_by_one() {
|
||||
let o = Opts::from_iter(&[
|
||||
"test",
|
||||
"-p",
|
||||
"package1",
|
||||
"--package",
|
||||
"package2",
|
||||
"-p",
|
||||
"package3",
|
||||
]);
|
||||
assert_eq!(3, o.packages.len());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn multiple_packages_grouped() {
|
||||
let o = Opts::from_iter(&[
|
||||
"test",
|
||||
"--package",
|
||||
"package1",
|
||||
"package2",
|
||||
"-p",
|
||||
"package3",
|
||||
"package4",
|
||||
]);
|
||||
assert_eq!(4, o.packages.len());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_packages_1() {
|
||||
assert!(Opts::clap().get_matches_from_safe(&["test", "-p"]).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_packages_2() {
|
||||
assert!(
|
||||
Opts::clap()
|
||||
.get_matches_from_safe(&["test", "-p", "--", "--check"])
|
||||
.is_err()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_packages_3() {
|
||||
assert!(
|
||||
Opts::clap()
|
||||
.get_matches_from_safe(&["test", "-p", "--verbose"])
|
||||
.is_err()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_packages_4() {
|
||||
assert!(
|
||||
Opts::clap()
|
||||
.get_matches_from_safe(&["test", "-p", "--check"])
|
||||
.is_err()
|
||||
);
|
||||
}
|
134
src/cargo-fmt/test/targets.rs
Normal file
134
src/cargo-fmt/test/targets.rs
Normal file
@ -0,0 +1,134 @@
|
||||
use super::*;
|
||||
|
||||
struct ExpTarget {
|
||||
path: &'static str,
|
||||
edition: &'static str,
|
||||
kind: &'static str,
|
||||
}
|
||||
|
||||
mod all_targets {
|
||||
use super::*;
|
||||
|
||||
fn assert_correct_targets_loaded(
|
||||
manifest_suffix: &str,
|
||||
source_root: &str,
|
||||
exp_targets: &[ExpTarget],
|
||||
exp_num_targets: usize,
|
||||
) {
|
||||
let root_path = Path::new("tests/cargo-fmt/source").join(source_root);
|
||||
let get_path = |exp: &str| PathBuf::from(&root_path).join(exp).canonicalize().unwrap();
|
||||
let manifest_path = Path::new(&root_path).join(manifest_suffix);
|
||||
let targets = get_targets(&CargoFmtStrategy::All, Some(manifest_path.as_path()))
|
||||
.expect("Targets should have been loaded");
|
||||
|
||||
assert_eq!(targets.len(), exp_num_targets);
|
||||
|
||||
for target in exp_targets {
|
||||
assert!(targets.contains(&Target {
|
||||
path: get_path(target.path),
|
||||
edition: target.edition.to_owned(),
|
||||
kind: target.kind.to_owned(),
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
mod different_crate_and_dir_names {
|
||||
use super::*;
|
||||
|
||||
fn assert_correct_targets_loaded(manifest_suffix: &str) {
|
||||
let exp_targets = vec![
|
||||
ExpTarget {
|
||||
path: "dependency-dir-name/subdep-dir-name/src/lib.rs",
|
||||
edition: "2018",
|
||||
kind: "lib",
|
||||
},
|
||||
ExpTarget {
|
||||
path: "dependency-dir-name/src/lib.rs",
|
||||
edition: "2018",
|
||||
kind: "lib",
|
||||
},
|
||||
ExpTarget {
|
||||
path: "src/main.rs",
|
||||
edition: "2018",
|
||||
kind: "main",
|
||||
},
|
||||
];
|
||||
super::assert_correct_targets_loaded(
|
||||
manifest_suffix,
|
||||
"divergent-crate-dir-names",
|
||||
&exp_targets,
|
||||
3,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn correct_targets_from_root() {
|
||||
assert_correct_targets_loaded("Cargo.toml");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn correct_targets_from_sub_local_dep() {
|
||||
assert_correct_targets_loaded("dependency-dir-name/Cargo.toml");
|
||||
}
|
||||
}
|
||||
|
||||
mod workspaces {
|
||||
use super::*;
|
||||
|
||||
fn assert_correct_targets_loaded(manifest_suffix: &str) {
|
||||
let exp_targets = vec![
|
||||
ExpTarget {
|
||||
path: "ws/a/src/main.rs",
|
||||
edition: "2018",
|
||||
kind: "bin",
|
||||
},
|
||||
ExpTarget {
|
||||
path: "ws/b/src/main.rs",
|
||||
edition: "2018",
|
||||
kind: "bin",
|
||||
},
|
||||
ExpTarget {
|
||||
path: "ws/c/src/lib.rs",
|
||||
edition: "2018",
|
||||
kind: "lib",
|
||||
},
|
||||
ExpTarget {
|
||||
path: "ws/a/d/src/lib.rs",
|
||||
edition: "2018",
|
||||
kind: "lib",
|
||||
},
|
||||
ExpTarget {
|
||||
path: "e/src/main.rs",
|
||||
edition: "2018",
|
||||
kind: "main",
|
||||
},
|
||||
ExpTarget {
|
||||
path: "ws/a/d/f/src/lib.rs",
|
||||
edition: "2018",
|
||||
kind: "lib",
|
||||
},
|
||||
];
|
||||
super::assert_correct_targets_loaded(
|
||||
manifest_suffix,
|
||||
"workspaces/path-dep-above",
|
||||
&exp_targets,
|
||||
6,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn includes_outside_workspace_deps() {
|
||||
assert_correct_targets_loaded("ws/Cargo.toml");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn includes_workspace_from_dep_above() {
|
||||
assert_correct_targets_loaded("e/Cargo.toml");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn includes_all_packages_from_workspace_subdir() {
|
||||
assert_correct_targets_loaded("ws/a/d/f/Cargo.toml");
|
||||
}
|
||||
}
|
||||
}
|
@ -10,7 +10,8 @@ use crate::rewrite::RewriteContext;
|
||||
use crate::shape::{Indent, Shape};
|
||||
use crate::string::{rewrite_string, StringFormat};
|
||||
use crate::utils::{
|
||||
count_newlines, first_line_width, last_line_width, trim_left_preserve_layout, unicode_str_width,
|
||||
count_newlines, first_line_width, last_line_width, trim_left_preserve_layout,
|
||||
trimmed_last_line_width, unicode_str_width,
|
||||
};
|
||||
use crate::{ErrorKind, FormattingError};
|
||||
|
||||
@ -171,11 +172,12 @@ pub(crate) fn combine_strs_with_missing_comments(
|
||||
String::with_capacity(prev_str.len() + next_str.len() + shape.indent.width() + 128);
|
||||
result.push_str(prev_str);
|
||||
let mut allow_one_line = !prev_str.contains('\n') && !next_str.contains('\n');
|
||||
let first_sep = if prev_str.is_empty() || next_str.is_empty() {
|
||||
""
|
||||
} else {
|
||||
" "
|
||||
};
|
||||
let first_sep =
|
||||
if prev_str.is_empty() || next_str.is_empty() || trimmed_last_line_width(prev_str) == 0 {
|
||||
""
|
||||
} else {
|
||||
" "
|
||||
};
|
||||
let mut one_line_width =
|
||||
last_line_width(prev_str) + first_line_width(next_str) + first_sep.len();
|
||||
|
||||
@ -184,7 +186,7 @@ pub(crate) fn combine_strs_with_missing_comments(
|
||||
let missing_comment = rewrite_missing_comment(span, shape, context)?;
|
||||
|
||||
if missing_comment.is_empty() {
|
||||
if allow_extend && prev_str.len() + first_sep.len() + next_str.len() <= shape.width {
|
||||
if allow_extend && one_line_width <= shape.width {
|
||||
result.push_str(first_sep);
|
||||
} else if !prev_str.is_empty() {
|
||||
result.push_str(&indent.to_string_with_newline(config))
|
||||
@ -392,28 +394,26 @@ fn identify_comment(
|
||||
}
|
||||
}
|
||||
|
||||
/// Attributes for code blocks in rustdoc.
|
||||
/// See <https://doc.rust-lang.org/rustdoc/print.html#attributes>.
|
||||
/// Enum indicating if the code block contains rust based on attributes
|
||||
enum CodeBlockAttribute {
|
||||
Rust,
|
||||
Ignore,
|
||||
Text,
|
||||
ShouldPanic,
|
||||
NoRun,
|
||||
CompileFail,
|
||||
NotRust,
|
||||
}
|
||||
|
||||
impl CodeBlockAttribute {
|
||||
fn new(attribute: &str) -> CodeBlockAttribute {
|
||||
match attribute {
|
||||
"rust" | "" => CodeBlockAttribute::Rust,
|
||||
"ignore" => CodeBlockAttribute::Ignore,
|
||||
"text" => CodeBlockAttribute::Text,
|
||||
"should_panic" => CodeBlockAttribute::ShouldPanic,
|
||||
"no_run" => CodeBlockAttribute::NoRun,
|
||||
"compile_fail" => CodeBlockAttribute::CompileFail,
|
||||
_ => CodeBlockAttribute::Text,
|
||||
/// Parse comma separated attributes list. Return rust only if all
|
||||
/// attributes are valid rust attributes
|
||||
/// See https://doc.rust-lang.org/rustdoc/print.html#attributes
|
||||
fn new(attributes: &str) -> CodeBlockAttribute {
|
||||
for attribute in attributes.split(",") {
|
||||
match attribute.trim() {
|
||||
"" | "rust" | "should_panic" | "no_run" | "edition2015" | "edition2018"
|
||||
| "edition2021" => (),
|
||||
"ignore" | "compile_fail" | "text" => return CodeBlockAttribute::NotRust,
|
||||
_ => return CodeBlockAttribute::NotRust,
|
||||
}
|
||||
}
|
||||
CodeBlockAttribute::Rust
|
||||
}
|
||||
}
|
||||
|
||||
@ -647,25 +647,21 @@ impl<'a> CommentRewrite<'a> {
|
||||
} else if self.code_block_attr.is_some() {
|
||||
if line.starts_with("```") {
|
||||
let code_block = match self.code_block_attr.as_ref().unwrap() {
|
||||
CodeBlockAttribute::Ignore | CodeBlockAttribute::Text => {
|
||||
trim_custom_comment_prefix(&self.code_block_buffer)
|
||||
}
|
||||
_ if self.code_block_buffer.is_empty() => String::new(),
|
||||
_ => {
|
||||
CodeBlockAttribute::Rust
|
||||
if self.fmt.config.format_code_in_doc_comments()
|
||||
&& !self.code_block_buffer.is_empty() =>
|
||||
{
|
||||
let mut config = self.fmt.config.clone();
|
||||
config.set().wrap_comments(false);
|
||||
if config.format_code_in_doc_comments() {
|
||||
if let Some(s) =
|
||||
crate::format_code_block(&self.code_block_buffer, &config, false)
|
||||
{
|
||||
trim_custom_comment_prefix(&s.snippet)
|
||||
} else {
|
||||
trim_custom_comment_prefix(&self.code_block_buffer)
|
||||
}
|
||||
if let Some(s) =
|
||||
crate::format_code_block(&self.code_block_buffer, &config, false)
|
||||
{
|
||||
trim_custom_comment_prefix(&s.snippet)
|
||||
} else {
|
||||
trim_custom_comment_prefix(&self.code_block_buffer)
|
||||
}
|
||||
}
|
||||
_ => trim_custom_comment_prefix(&self.code_block_buffer),
|
||||
};
|
||||
if !code_block.is_empty() {
|
||||
self.result.push_str(&self.comment_line_separator);
|
||||
|
@ -69,6 +69,8 @@ create_config! {
|
||||
format_macro_matchers: bool, false, false,
|
||||
"Format the metavariable matching patterns in macros";
|
||||
format_macro_bodies: bool, true, false, "Format the bodies of macros";
|
||||
hex_literal_case: HexLiteralCase, HexLiteralCase::Preserve, false,
|
||||
"Format hexadecimal integer literals";
|
||||
|
||||
// Single line expressions and items
|
||||
empty_item_single_line: bool, true, false,
|
||||
@ -125,7 +127,7 @@ create_config! {
|
||||
"Add trailing semicolon after break, continue and return";
|
||||
trailing_comma: SeparatorTactic, SeparatorTactic::Vertical, false,
|
||||
"How to handle trailing commas for lists";
|
||||
match_block_trailing_comma: bool, false, false,
|
||||
match_block_trailing_comma: bool, false, true,
|
||||
"Put a trailing comma after a block based match arm (non-block arms are not affected)";
|
||||
blank_lines_upper_bound: usize, 1, false,
|
||||
"Maximum number of blank lines which can be put between items";
|
||||
@ -136,6 +138,7 @@ create_config! {
|
||||
inline_attribute_width: usize, 0, false,
|
||||
"Write an item and its attribute on the same line \
|
||||
if their combined width is below a threshold";
|
||||
format_generated_files: bool, false, false, "Format generated files";
|
||||
|
||||
// Options that can change the source code beyond whitespace/blocks (somewhat linty things)
|
||||
merge_derives: bool, true, true, "Merge multiple `#[derive(...)]` into a single one";
|
||||
@ -152,7 +155,7 @@ create_config! {
|
||||
"Require a specific version of rustfmt";
|
||||
unstable_features: bool, false, false,
|
||||
"Enables unstable features. Only available on nightly channel";
|
||||
disable_all_formatting: bool, false, false, "Don't reformat anything";
|
||||
disable_all_formatting: bool, false, true, "Don't reformat anything";
|
||||
skip_children: bool, false, false, "Don't reformat out of line modules";
|
||||
hide_parse_errors: bool, false, false, "Hide errors from the parser";
|
||||
error_on_line_overflow: bool, false, false, "Error if unable to get all lines within max_width";
|
||||
@ -569,6 +572,7 @@ license_template_path = ""
|
||||
format_strings = false
|
||||
format_macro_matchers = false
|
||||
format_macro_bodies = true
|
||||
hex_literal_case = "Preserve"
|
||||
empty_item_single_line = true
|
||||
struct_lit_single_line = true
|
||||
fn_single_line = false
|
||||
@ -604,6 +608,7 @@ blank_lines_lower_bound = 0
|
||||
edition = "2015"
|
||||
version = "One"
|
||||
inline_attribute_width = 0
|
||||
format_generated_files = false
|
||||
merge_derives = true
|
||||
use_try_shorthand = false
|
||||
use_field_init_shorthand = false
|
||||
|
@ -125,6 +125,19 @@ pub enum ImportGranularity {
|
||||
Module,
|
||||
/// Use one `use` statement per imported item.
|
||||
Item,
|
||||
/// Use one `use` statement including all items.
|
||||
One,
|
||||
}
|
||||
|
||||
/// Controls how rustfmt should handle case in hexadecimal literals.
|
||||
#[config_type]
|
||||
pub enum HexLiteralCase {
|
||||
/// Leave the literal as-is
|
||||
Preserve,
|
||||
/// Ensure all literals use uppercase lettering
|
||||
Upper,
|
||||
/// Ensure all literals use lowercase lettering
|
||||
Lower,
|
||||
}
|
||||
|
||||
#[config_type]
|
||||
|
46
src/expr.rs
46
src/expr.rs
@ -13,7 +13,7 @@ use crate::comment::{
|
||||
rewrite_missing_comment, CharClasses, FindUncommented,
|
||||
};
|
||||
use crate::config::lists::*;
|
||||
use crate::config::{Config, ControlBraceStyle, IndentStyle, Version};
|
||||
use crate::config::{Config, ControlBraceStyle, HexLiteralCase, IndentStyle, Version};
|
||||
use crate::lists::{
|
||||
definitive_tactic, itemize_list, shape_for_tactic, struct_lit_formatting, struct_lit_shape,
|
||||
struct_lit_tactic, write_list, ListFormatting, Separator,
|
||||
@ -822,7 +822,7 @@ impl<'a> ControlFlow<'a> {
|
||||
let pat_string = pat.rewrite(context, pat_shape)?;
|
||||
let comments_lo = context
|
||||
.snippet_provider
|
||||
.span_after(self.span, self.connector.trim());
|
||||
.span_after(self.span.with_lo(pat.span.hi()), self.connector.trim());
|
||||
let comments_span = mk_sp(comments_lo, expr.span.lo());
|
||||
return rewrite_assign_rhs_with_comments(
|
||||
context,
|
||||
@ -1168,6 +1168,7 @@ pub(crate) fn rewrite_literal(
|
||||
) -> Option<String> {
|
||||
match l.kind {
|
||||
ast::LitKind::Str(_, ast::StrStyle::Cooked) => rewrite_string_lit(context, l.span, shape),
|
||||
ast::LitKind::Int(..) => rewrite_int_lit(context, l, shape),
|
||||
_ => wrap_str(
|
||||
context.snippet(l.span).to_owned(),
|
||||
context.config.max_width(),
|
||||
@ -1202,6 +1203,36 @@ fn rewrite_string_lit(context: &RewriteContext<'_>, span: Span, shape: Shape) ->
|
||||
)
|
||||
}
|
||||
|
||||
fn rewrite_int_lit(context: &RewriteContext<'_>, lit: &ast::Lit, shape: Shape) -> Option<String> {
|
||||
let span = lit.span;
|
||||
let symbol = lit.token.symbol.as_str();
|
||||
|
||||
if symbol.starts_with("0x") {
|
||||
let hex_lit = match context.config.hex_literal_case() {
|
||||
HexLiteralCase::Preserve => None,
|
||||
HexLiteralCase::Upper => Some(symbol[2..].to_ascii_uppercase()),
|
||||
HexLiteralCase::Lower => Some(symbol[2..].to_ascii_lowercase()),
|
||||
};
|
||||
if let Some(hex_lit) = hex_lit {
|
||||
return wrap_str(
|
||||
format!(
|
||||
"0x{}{}",
|
||||
hex_lit,
|
||||
lit.token.suffix.map_or(String::new(), |s| s.to_string())
|
||||
),
|
||||
context.config.max_width(),
|
||||
shape,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
wrap_str(
|
||||
context.snippet(span).to_owned(),
|
||||
context.config.max_width(),
|
||||
shape,
|
||||
)
|
||||
}
|
||||
|
||||
fn choose_separator_tactic(context: &RewriteContext<'_>, span: Span) -> Option<SeparatorTactic> {
|
||||
if context.inside_macro() {
|
||||
if span_ends_with_comma(context, span) {
|
||||
@ -1497,12 +1528,12 @@ fn rewrite_struct_lit<'a>(
|
||||
let path_shape = shape.sub_width(2)?;
|
||||
let path_str = rewrite_path(context, PathContext::Expr, None, path, path_shape)?;
|
||||
|
||||
let has_base = match struct_rest {
|
||||
let has_base_or_rest = match struct_rest {
|
||||
ast::StructRest::None if fields.is_empty() => return Some(format!("{} {{}}", path_str)),
|
||||
ast::StructRest::Rest(_) if fields.is_empty() => {
|
||||
return Some(format!("{} {{ .. }}", path_str));
|
||||
}
|
||||
ast::StructRest::Base(_) => true,
|
||||
ast::StructRest::Rest(_) | ast::StructRest::Base(_) => true,
|
||||
_ => false,
|
||||
};
|
||||
|
||||
@ -1511,7 +1542,7 @@ fn rewrite_struct_lit<'a>(
|
||||
|
||||
let one_line_width = h_shape.map_or(0, |shape| shape.width);
|
||||
let body_lo = context.snippet_provider.span_after(span, "{");
|
||||
let fields_str = if struct_lit_can_be_aligned(fields, has_base)
|
||||
let fields_str = if struct_lit_can_be_aligned(fields, has_base_or_rest)
|
||||
&& context.config.struct_field_align_threshold() > 0
|
||||
{
|
||||
rewrite_with_alignment(
|
||||
@ -1583,10 +1614,7 @@ fn rewrite_struct_lit<'a>(
|
||||
nested_shape,
|
||||
tactic,
|
||||
context,
|
||||
force_no_trailing_comma
|
||||
|| has_base
|
||||
|| !context.use_block_indent()
|
||||
|| matches!(struct_rest, ast::StructRest::Rest(_)),
|
||||
force_no_trailing_comma || has_base_or_rest || !context.use_block_indent(),
|
||||
);
|
||||
|
||||
write_list(&item_vec, &fmt)?
|
||||
|
@ -10,6 +10,7 @@ use rustc_span::Span;
|
||||
use self::newline_style::apply_newline_style;
|
||||
use crate::comment::{CharClasses, FullCodeCharKind};
|
||||
use crate::config::{Config, FileName, Verbosity};
|
||||
use crate::formatting::generated::is_generated_file;
|
||||
use crate::issues::BadIssueSeeker;
|
||||
use crate::modules::Module;
|
||||
use crate::syntux::parser::{DirectoryOwnership, Parser, ParserError};
|
||||
@ -18,6 +19,7 @@ use crate::utils::count_newlines;
|
||||
use crate::visitor::FmtVisitor;
|
||||
use crate::{modules, source_file, ErrorKind, FormatReport, Input, Session};
|
||||
|
||||
mod generated;
|
||||
mod newline_style;
|
||||
|
||||
// A map of the files of a crate, with their new content
|
||||
@ -103,7 +105,12 @@ fn format_project<T: FormatHandler>(
|
||||
context.parse_session.set_silent_emitter();
|
||||
|
||||
for (path, module) in files {
|
||||
let should_ignore = !input_is_stdin && context.ignore_file(&path);
|
||||
let source_file = context.parse_session.span_to_file_contents(module.span);
|
||||
let src = source_file.src.as_ref().expect("SourceFile without src");
|
||||
|
||||
let should_ignore = (!input_is_stdin && context.ignore_file(&path))
|
||||
|| (!config.format_generated_files() && is_generated_file(src));
|
||||
|
||||
if (config.skip_children() && path != main_file) || should_ignore {
|
||||
continue;
|
||||
}
|
||||
|
7
src/formatting/generated.rs
Normal file
7
src/formatting/generated.rs
Normal file
@ -0,0 +1,7 @@
|
||||
/// Returns `true` if the given span is a part of generated files.
|
||||
pub(super) fn is_generated_file(original_snippet: &str) -> bool {
|
||||
original_snippet
|
||||
.lines()
|
||||
.take(5) // looking for marker only in the beginning of the file
|
||||
.any(|line| line.contains("@generated"))
|
||||
}
|
146
src/imports.rs
146
src/imports.rs
@ -138,6 +138,29 @@ impl UseSegment {
|
||||
}
|
||||
}
|
||||
|
||||
// Check if self == other with their aliases removed.
|
||||
fn equal_except_alias(&self, other: &Self) -> bool {
|
||||
match (self, other) {
|
||||
(UseSegment::Ident(ref s1, _), UseSegment::Ident(ref s2, _)) => s1 == s2,
|
||||
(UseSegment::Slf(_), UseSegment::Slf(_))
|
||||
| (UseSegment::Super(_), UseSegment::Super(_))
|
||||
| (UseSegment::Crate(_), UseSegment::Crate(_))
|
||||
| (UseSegment::Glob, UseSegment::Glob) => true,
|
||||
(UseSegment::List(ref list1), UseSegment::List(ref list2)) => list1 == list2,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
fn get_alias(&self) -> Option<&str> {
|
||||
match self {
|
||||
UseSegment::Ident(_, a)
|
||||
| UseSegment::Slf(a)
|
||||
| UseSegment::Super(a)
|
||||
| UseSegment::Crate(a) => a.as_deref(),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn from_path_segment(
|
||||
context: &RewriteContext<'_>,
|
||||
path_seg: &ast::PathSegment,
|
||||
@ -558,6 +581,7 @@ impl UseTree {
|
||||
SharedPrefix::Module => {
|
||||
self.path[..self.path.len() - 1] == other.path[..other.path.len() - 1]
|
||||
}
|
||||
SharedPrefix::One => true,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -598,7 +622,7 @@ impl UseTree {
|
||||
fn merge(&mut self, other: &UseTree, merge_by: SharedPrefix) {
|
||||
let mut prefix = 0;
|
||||
for (a, b) in self.path.iter().zip(other.path.iter()) {
|
||||
if *a == *b {
|
||||
if a.equal_except_alias(b) {
|
||||
prefix += 1;
|
||||
} else {
|
||||
break;
|
||||
@ -633,14 +657,20 @@ fn merge_rest(
|
||||
return Some(new_path);
|
||||
}
|
||||
} else if len == 1 {
|
||||
let rest = if a.len() == len { &b[1..] } else { &a[1..] };
|
||||
return Some(vec![
|
||||
b[0].clone(),
|
||||
UseSegment::List(vec![
|
||||
UseTree::from_path(vec![UseSegment::Slf(None)], DUMMY_SP),
|
||||
UseTree::from_path(rest.to_vec(), DUMMY_SP),
|
||||
]),
|
||||
]);
|
||||
let (common, rest) = if a.len() == len {
|
||||
(&a[0], &b[1..])
|
||||
} else {
|
||||
(&b[0], &a[1..])
|
||||
};
|
||||
let mut list = vec![UseTree::from_path(
|
||||
vec![UseSegment::Slf(common.get_alias().map(ToString::to_string))],
|
||||
DUMMY_SP,
|
||||
)];
|
||||
match rest {
|
||||
[UseSegment::List(rest_list)] => list.extend(rest_list.clone()),
|
||||
_ => list.push(UseTree::from_path(rest.to_vec(), DUMMY_SP)),
|
||||
}
|
||||
return Some(vec![b[0].clone(), UseSegment::List(list)]);
|
||||
} else {
|
||||
len -= 1;
|
||||
}
|
||||
@ -655,18 +685,54 @@ fn merge_rest(
|
||||
}
|
||||
|
||||
fn merge_use_trees_inner(trees: &mut Vec<UseTree>, use_tree: UseTree, merge_by: SharedPrefix) {
|
||||
let similar_trees = trees
|
||||
.iter_mut()
|
||||
.filter(|tree| tree.share_prefix(&use_tree, merge_by));
|
||||
struct SimilarTree<'a> {
|
||||
similarity: usize,
|
||||
path_len: usize,
|
||||
tree: &'a mut UseTree,
|
||||
}
|
||||
|
||||
let similar_trees = trees.iter_mut().filter_map(|tree| {
|
||||
if tree.share_prefix(&use_tree, merge_by) {
|
||||
// In the case of `SharedPrefix::One`, `similarity` is used for deciding with which
|
||||
// tree `use_tree` should be merge.
|
||||
// In other cases `similarity` won't be used, so set it to `0` as a dummy value.
|
||||
let similarity = if merge_by == SharedPrefix::One {
|
||||
tree.path
|
||||
.iter()
|
||||
.zip(&use_tree.path)
|
||||
.take_while(|(a, b)| a.equal_except_alias(b))
|
||||
.count()
|
||||
} else {
|
||||
0
|
||||
};
|
||||
|
||||
let path_len = tree.path.len();
|
||||
Some(SimilarTree {
|
||||
similarity,
|
||||
tree,
|
||||
path_len,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
});
|
||||
|
||||
if use_tree.path.len() == 1 && merge_by == SharedPrefix::Crate {
|
||||
if let Some(tree) = similar_trees.min_by_key(|tree| tree.path.len()) {
|
||||
if tree.path.len() == 1 {
|
||||
if let Some(tree) = similar_trees.min_by_key(|tree| tree.path_len) {
|
||||
if tree.path_len == 1 {
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else if let Some(tree) = similar_trees.max_by_key(|tree| tree.path.len()) {
|
||||
if tree.path.len() > 1 {
|
||||
tree.merge(&use_tree, merge_by);
|
||||
} else if merge_by == SharedPrefix::One {
|
||||
if let Some(sim_tree) = similar_trees.max_by_key(|tree| tree.similarity) {
|
||||
if sim_tree.similarity > 0 {
|
||||
sim_tree.tree.merge(&use_tree, merge_by);
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else if let Some(sim_tree) = similar_trees.max_by_key(|tree| tree.path_len) {
|
||||
if sim_tree.path_len > 1 {
|
||||
sim_tree.tree.merge(&use_tree, merge_by);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -880,6 +946,7 @@ impl Rewrite for UseTree {
|
||||
pub(crate) enum SharedPrefix {
|
||||
Crate,
|
||||
Module,
|
||||
One,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
@ -904,7 +971,7 @@ mod test {
|
||||
}
|
||||
|
||||
fn eat(&mut self, c: char) {
|
||||
assert!(self.input.next().unwrap() == c);
|
||||
assert_eq!(self.input.next().unwrap(), c);
|
||||
}
|
||||
|
||||
fn push_segment(
|
||||
@ -1094,6 +1161,49 @@ mod test {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_use_tree_merge_one() {
|
||||
test_merge!(One, ["a", "b"], ["{a, b}"]);
|
||||
|
||||
test_merge!(One, ["a::{aa, ab}", "b", "a"], ["{a::{self, aa, ab}, b}"]);
|
||||
|
||||
test_merge!(One, ["a as x", "b as y"], ["{a as x, b as y}"]);
|
||||
|
||||
test_merge!(
|
||||
One,
|
||||
["a::{aa as xa, ab}", "b", "a"],
|
||||
["{a::{self, aa as xa, ab}, b}"]
|
||||
);
|
||||
|
||||
test_merge!(
|
||||
One,
|
||||
["a", "a::{aa, ab::{aba, abb}}"],
|
||||
["a::{self, aa, ab::{aba, abb}}"]
|
||||
);
|
||||
|
||||
test_merge!(One, ["a", "b::{ba, *}"], ["{a, b::{ba, *}}"]);
|
||||
|
||||
test_merge!(One, ["a", "b", "a::aa"], ["{a::{self, aa}, b}"]);
|
||||
|
||||
test_merge!(
|
||||
One,
|
||||
["a::aa::aaa", "a::ac::aca", "a::aa::*"],
|
||||
["a::{aa::{aaa, *}, ac::aca}"]
|
||||
);
|
||||
|
||||
test_merge!(
|
||||
One,
|
||||
["a", "b::{ba, bb}", "a::{aa::*, ab::aba}"],
|
||||
["{a::{self, aa::*, ab::aba}, b::{ba, bb}}"]
|
||||
);
|
||||
|
||||
test_merge!(
|
||||
One,
|
||||
["b", "a::ac::{aca, acb}", "a::{aa::*, ab}"],
|
||||
["{a::{aa::*, ab, ac::{aca, acb}}, b}"]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_flatten_use_trees() {
|
||||
assert_eq!(
|
||||
|
146
src/items.rs
146
src/items.rs
@ -174,14 +174,14 @@ pub(crate) struct FnSig<'a> {
|
||||
constness: ast::Const,
|
||||
defaultness: ast::Defaultness,
|
||||
unsafety: ast::Unsafe,
|
||||
visibility: ast::Visibility,
|
||||
visibility: &'a ast::Visibility,
|
||||
}
|
||||
|
||||
impl<'a> FnSig<'a> {
|
||||
pub(crate) fn from_method_sig(
|
||||
method_sig: &'a ast::FnSig,
|
||||
generics: &'a ast::Generics,
|
||||
visibility: ast::Visibility,
|
||||
visibility: &'a ast::Visibility,
|
||||
) -> FnSig<'a> {
|
||||
FnSig {
|
||||
unsafety: method_sig.header.unsafety,
|
||||
@ -204,7 +204,7 @@ impl<'a> FnSig<'a> {
|
||||
match *fn_kind {
|
||||
visit::FnKind::Fn(fn_ctxt, _, fn_sig, vis, _) => match fn_ctxt {
|
||||
visit::FnCtxt::Assoc(..) => {
|
||||
let mut fn_sig = FnSig::from_method_sig(fn_sig, generics, vis.clone());
|
||||
let mut fn_sig = FnSig::from_method_sig(fn_sig, generics, vis);
|
||||
fn_sig.defaultness = defaultness;
|
||||
fn_sig
|
||||
}
|
||||
@ -216,7 +216,7 @@ impl<'a> FnSig<'a> {
|
||||
is_async: Cow::Borrowed(&fn_sig.header.asyncness),
|
||||
defaultness,
|
||||
unsafety: fn_sig.header.unsafety,
|
||||
visibility: vis.clone(),
|
||||
visibility: vis,
|
||||
},
|
||||
},
|
||||
_ => unreachable!(),
|
||||
@ -323,6 +323,7 @@ impl<'a> FmtVisitor<'a> {
|
||||
indent: Indent,
|
||||
ident: symbol::Ident,
|
||||
sig: &ast::FnSig,
|
||||
vis: &ast::Visibility,
|
||||
generics: &ast::Generics,
|
||||
span: Span,
|
||||
) -> Option<String> {
|
||||
@ -334,7 +335,7 @@ impl<'a> FmtVisitor<'a> {
|
||||
&context,
|
||||
indent,
|
||||
ident,
|
||||
&FnSig::from_method_sig(sig, generics, DEFAULT_VISIBILITY),
|
||||
&FnSig::from_method_sig(sig, generics, vis),
|
||||
span,
|
||||
FnBraceStyle::None,
|
||||
)?;
|
||||
@ -1474,12 +1475,17 @@ fn format_tuple_struct(
|
||||
format_empty_struct_or_tuple(context, inner_span, offset, &mut result, "(", ")");
|
||||
} else {
|
||||
let shape = Shape::indented(offset, context.config).sub_width(1)?;
|
||||
let lo = if let Some(generics) = struct_parts.generics {
|
||||
generics.span.hi()
|
||||
} else {
|
||||
struct_parts.ident.span.hi()
|
||||
};
|
||||
result = overflow::rewrite_with_parens(
|
||||
context,
|
||||
&result,
|
||||
fields.iter(),
|
||||
shape,
|
||||
span,
|
||||
mk_sp(lo, span.hi()),
|
||||
context.config.fn_call_width(),
|
||||
None,
|
||||
)?;
|
||||
@ -1503,7 +1509,7 @@ fn format_tuple_struct(
|
||||
Some(result)
|
||||
}
|
||||
|
||||
fn rewrite_type<R: Rewrite>(
|
||||
pub(crate) fn rewrite_type<R: Rewrite>(
|
||||
context: &RewriteContext<'_>,
|
||||
indent: Indent,
|
||||
ident: symbol::Ident,
|
||||
@ -1760,7 +1766,7 @@ impl<'a> StaticParts<'a> {
|
||||
};
|
||||
StaticParts {
|
||||
prefix: "const",
|
||||
vis: &DEFAULT_VISIBILITY,
|
||||
vis: &ti.vis,
|
||||
ident: ti.ident,
|
||||
ty,
|
||||
mutability: ast::Mutability::Not,
|
||||
@ -1847,29 +1853,6 @@ fn rewrite_static(
|
||||
Some(format!("{}{};", prefix, ty_str))
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn rewrite_type_alias(
|
||||
ident: symbol::Ident,
|
||||
ty_opt: Option<&ptr::P<ast::Ty>>,
|
||||
generics: &ast::Generics,
|
||||
generic_bounds_opt: Option<&ast::GenericBounds>,
|
||||
context: &RewriteContext<'_>,
|
||||
indent: Indent,
|
||||
vis: &ast::Visibility,
|
||||
span: Span,
|
||||
) -> Option<String> {
|
||||
rewrite_type(
|
||||
context,
|
||||
indent,
|
||||
ident,
|
||||
vis,
|
||||
generics,
|
||||
generic_bounds_opt,
|
||||
ty_opt,
|
||||
span,
|
||||
)
|
||||
}
|
||||
|
||||
struct OpaqueType<'a> {
|
||||
bounds: &'a ast::GenericBounds,
|
||||
}
|
||||
@ -1883,32 +1866,7 @@ impl<'a> Rewrite for OpaqueType<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn rewrite_opaque_impl_type(
|
||||
context: &RewriteContext<'_>,
|
||||
ident: symbol::Ident,
|
||||
generics: &ast::Generics,
|
||||
generic_bounds: &ast::GenericBounds,
|
||||
indent: Indent,
|
||||
) -> Option<String> {
|
||||
let ident_str = rewrite_ident(context, ident);
|
||||
// 5 = "type "
|
||||
let generics_shape = Shape::indented(indent, context.config).offset_left(5)?;
|
||||
let generics_str = rewrite_generics(context, ident_str, generics, generics_shape)?;
|
||||
let prefix = format!("type {} =", generics_str);
|
||||
let rhs = OpaqueType {
|
||||
bounds: generic_bounds,
|
||||
};
|
||||
|
||||
rewrite_assign_rhs(
|
||||
context,
|
||||
&prefix,
|
||||
&rhs,
|
||||
Shape::indented(indent, context.config).sub_width(1)?,
|
||||
)
|
||||
.map(|s| s + ";")
|
||||
}
|
||||
|
||||
pub(crate) fn rewrite_associated_impl_type(
|
||||
pub(crate) fn rewrite_impl_type(
|
||||
ident: symbol::Ident,
|
||||
vis: &ast::Visibility,
|
||||
defaultness: ast::Defaultness,
|
||||
@ -1918,7 +1876,25 @@ pub(crate) fn rewrite_associated_impl_type(
|
||||
indent: Indent,
|
||||
span: Span,
|
||||
) -> Option<String> {
|
||||
let result = rewrite_type_alias(ident, ty_opt, generics, None, context, indent, vis, span)?;
|
||||
// Opaque type
|
||||
let result = if let Some(rustc_ast::ast::Ty {
|
||||
kind: ast::TyKind::ImplTrait(_, ref bounds),
|
||||
..
|
||||
}) = ty_opt.map(|t| &**t)
|
||||
{
|
||||
rewrite_type(
|
||||
context,
|
||||
indent,
|
||||
ident,
|
||||
&DEFAULT_VISIBILITY,
|
||||
generics,
|
||||
None,
|
||||
Some(&OpaqueType { bounds }),
|
||||
span,
|
||||
)
|
||||
} else {
|
||||
rewrite_type(context, indent, ident, vis, generics, None, ty_opt, span)
|
||||
}?;
|
||||
|
||||
match defaultness {
|
||||
ast::Defaultness::Default(..) => Some(format!("default {}", result)),
|
||||
@ -1995,14 +1971,17 @@ impl Rewrite for ast::Param {
|
||||
let param_attrs_result = self
|
||||
.attrs
|
||||
.rewrite(context, Shape::legacy(shape.width, shape.indent))?;
|
||||
let (span, has_multiple_attr_lines) = if !self.attrs.is_empty() {
|
||||
// N.B. Doc comments aren't typically valid syntax, but could appear
|
||||
// in the presence of certain macros - https://github.com/rust-lang/rustfmt/issues/4936
|
||||
let (span, has_multiple_attr_lines, has_doc_comments) = if !self.attrs.is_empty() {
|
||||
let num_attrs = self.attrs.len();
|
||||
(
|
||||
mk_sp(self.attrs[num_attrs - 1].span.hi(), self.pat.span.lo()),
|
||||
param_attrs_result.contains('\n'),
|
||||
self.attrs.iter().any(|a| a.is_doc_comment()),
|
||||
)
|
||||
} else {
|
||||
(mk_sp(self.span.lo(), self.span.lo()), false)
|
||||
(mk_sp(self.span.lo(), self.span.lo()), false, false)
|
||||
};
|
||||
|
||||
if let Some(ref explicit_self) = self.to_self() {
|
||||
@ -2015,15 +1994,16 @@ impl Rewrite for ast::Param {
|
||||
has_multiple_attr_lines,
|
||||
)
|
||||
} else if is_named_param(self) {
|
||||
let param_name = &self
|
||||
.pat
|
||||
.rewrite(context, Shape::legacy(shape.width, shape.indent))?;
|
||||
let mut result = combine_strs_with_missing_comments(
|
||||
context,
|
||||
¶m_attrs_result,
|
||||
&self
|
||||
.pat
|
||||
.rewrite(context, Shape::legacy(shape.width, shape.indent))?,
|
||||
param_name,
|
||||
span,
|
||||
shape,
|
||||
!has_multiple_attr_lines,
|
||||
!has_multiple_attr_lines && !has_doc_comments,
|
||||
)?;
|
||||
|
||||
if !is_empty_infer(&*self.ty, self.pat.span) {
|
||||
@ -2034,10 +2014,30 @@ impl Rewrite for ast::Param {
|
||||
result.push_str(&after_comment);
|
||||
let overhead = last_line_width(&result);
|
||||
let max_width = shape.width.checked_sub(overhead)?;
|
||||
let ty_str = self
|
||||
if let Some(ty_str) = self
|
||||
.ty
|
||||
.rewrite(context, Shape::legacy(max_width, shape.indent))?;
|
||||
result.push_str(&ty_str);
|
||||
.rewrite(context, Shape::legacy(max_width, shape.indent))
|
||||
{
|
||||
result.push_str(&ty_str);
|
||||
} else {
|
||||
result = combine_strs_with_missing_comments(
|
||||
context,
|
||||
&(param_attrs_result + &shape.to_string_with_newline(context.config)),
|
||||
param_name,
|
||||
span,
|
||||
shape,
|
||||
!has_multiple_attr_lines,
|
||||
)?;
|
||||
result.push_str(&before_comment);
|
||||
result.push_str(colon_spaces(context.config));
|
||||
result.push_str(&after_comment);
|
||||
let overhead = last_line_width(&result);
|
||||
let max_width = shape.width.checked_sub(overhead)?;
|
||||
let ty_str = self
|
||||
.ty
|
||||
.rewrite(context, Shape::legacy(max_width, shape.indent))?;
|
||||
result.push_str(&ty_str);
|
||||
}
|
||||
}
|
||||
|
||||
Some(result)
|
||||
@ -3146,7 +3146,7 @@ impl Rewrite for ast::ForeignItem {
|
||||
context,
|
||||
shape.indent,
|
||||
self.ident,
|
||||
&FnSig::from_method_sig(&fn_sig, generics, self.vis.clone()),
|
||||
&FnSig::from_method_sig(&fn_sig, generics, &self.vis),
|
||||
span,
|
||||
FnBraceStyle::None,
|
||||
)
|
||||
@ -3170,14 +3170,14 @@ impl Rewrite for ast::ForeignItem {
|
||||
ast::ForeignItemKind::TyAlias(ref ty_alias_kind) => {
|
||||
let ast::TyAliasKind(_, ref generics, ref generic_bounds, ref type_default) =
|
||||
**ty_alias_kind;
|
||||
rewrite_type_alias(
|
||||
self.ident,
|
||||
type_default.as_ref(),
|
||||
generics,
|
||||
Some(generic_bounds),
|
||||
rewrite_type(
|
||||
&context,
|
||||
shape.indent,
|
||||
self.ident,
|
||||
&self.vis,
|
||||
generics,
|
||||
Some(generic_bounds),
|
||||
type_default.as_ref(),
|
||||
self.span,
|
||||
)
|
||||
}
|
||||
|
@ -367,9 +367,9 @@ where
|
||||
result.push_str(&comment);
|
||||
|
||||
if !inner_item.is_empty() {
|
||||
if tactic == DefinitiveListTactic::Vertical || tactic == DefinitiveListTactic::Mixed
|
||||
{
|
||||
// We cannot keep pre-comments on the same line if the comment if normalized.
|
||||
use DefinitiveListTactic::*;
|
||||
if matches!(tactic, Vertical | Mixed | SpecialMacro(_)) {
|
||||
// We cannot keep pre-comments on the same line if the comment is normalized.
|
||||
let keep_comment = if formatting.config.normalize_comments()
|
||||
|| item.pre_comment_style == ListItemCommentStyle::DifferentLine
|
||||
{
|
||||
@ -389,7 +389,7 @@ where
|
||||
line_len = item.item.as_ref().map_or(0, |s| unicode_str_width(&s));
|
||||
}
|
||||
} else {
|
||||
result.push(' ');
|
||||
result.push(' ')
|
||||
}
|
||||
}
|
||||
item_max_width = None;
|
||||
|
@ -409,6 +409,7 @@ fn rewrite_match_body(
|
||||
}
|
||||
result.push_str(&nested_indent_str);
|
||||
result.push_str(&body_str);
|
||||
result.push_str(&comma);
|
||||
return Some(result);
|
||||
}
|
||||
|
||||
|
@ -51,6 +51,14 @@ impl<'a> FmtVisitor<'a> {
|
||||
}
|
||||
|
||||
pub(crate) fn format_missing_with_indent(&mut self, end: BytePos) {
|
||||
self.format_missing_indent(end, true)
|
||||
}
|
||||
|
||||
pub(crate) fn format_missing_no_indent(&mut self, end: BytePos) {
|
||||
self.format_missing_indent(end, false)
|
||||
}
|
||||
|
||||
fn format_missing_indent(&mut self, end: BytePos, should_indent: bool) {
|
||||
let config = self.config;
|
||||
self.format_missing_inner(end, |this, last_snippet, snippet| {
|
||||
this.push_str(last_snippet.trim_end());
|
||||
@ -58,14 +66,10 @@ impl<'a> FmtVisitor<'a> {
|
||||
// No new lines in the snippet.
|
||||
this.push_str("\n");
|
||||
}
|
||||
let indent = this.block_indent.to_string(config);
|
||||
this.push_str(&indent);
|
||||
})
|
||||
}
|
||||
|
||||
pub(crate) fn format_missing_no_indent(&mut self, end: BytePos) {
|
||||
self.format_missing_inner(end, |this, last_snippet, _| {
|
||||
this.push_str(last_snippet.trim_end());
|
||||
if should_indent {
|
||||
let indent = this.block_indent.to_string(config);
|
||||
this.push_str(&indent);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -77,6 +77,7 @@ pub(crate) enum OverflowableItem<'a> {
|
||||
FieldDef(&'a ast::FieldDef),
|
||||
TuplePatField(&'a TuplePatField<'a>),
|
||||
Ty(&'a ast::Ty),
|
||||
Pat(&'a ast::Pat),
|
||||
}
|
||||
|
||||
impl<'a> Rewrite for OverflowableItem<'a> {
|
||||
@ -116,6 +117,7 @@ impl<'a> OverflowableItem<'a> {
|
||||
OverflowableItem::FieldDef(sf) => f(*sf),
|
||||
OverflowableItem::TuplePatField(pat) => f(*pat),
|
||||
OverflowableItem::Ty(ty) => f(*ty),
|
||||
OverflowableItem::Pat(pat) => f(*pat),
|
||||
}
|
||||
}
|
||||
|
||||
@ -232,7 +234,7 @@ macro_rules! impl_into_overflowable_item_for_rustfmt_types {
|
||||
}
|
||||
}
|
||||
|
||||
impl_into_overflowable_item_for_ast_node!(Expr, GenericParam, NestedMetaItem, FieldDef, Ty);
|
||||
impl_into_overflowable_item_for_ast_node!(Expr, GenericParam, NestedMetaItem, FieldDef, Ty, Pat);
|
||||
impl_into_overflowable_item_for_rustfmt_types!([MacroArg], [SegmentParam, TuplePatField]);
|
||||
|
||||
pub(crate) fn into_overflowable_list<'a, T>(
|
||||
|
@ -4,6 +4,7 @@ use rustc_span::{BytePos, Span};
|
||||
|
||||
use crate::comment::{combine_strs_with_missing_comments, FindUncommented};
|
||||
use crate::config::lists::*;
|
||||
use crate::config::Version;
|
||||
use crate::expr::{can_be_overflowed_expr, rewrite_unary_prefix, wrap_struct_field};
|
||||
use crate::lists::{
|
||||
definitive_tactic, itemize_list, shape_for_tactic, struct_lit_formatting, struct_lit_shape,
|
||||
@ -226,12 +227,13 @@ impl Rewrite for Pat {
|
||||
PatKind::Path(ref q_self, ref path) => {
|
||||
rewrite_path(context, PathContext::Expr, q_self.as_ref(), path, shape)
|
||||
}
|
||||
PatKind::TupleStruct(_, ref path, ref pat_vec) => {
|
||||
let path_str = rewrite_path(context, PathContext::Expr, None, path, shape)?;
|
||||
PatKind::TupleStruct(ref q_self, ref path, ref pat_vec) => {
|
||||
let path_str =
|
||||
rewrite_path(context, PathContext::Expr, q_self.as_ref(), path, shape)?;
|
||||
rewrite_tuple_pat(pat_vec, Some(path_str), self.span, context, shape)
|
||||
}
|
||||
PatKind::Lit(ref expr) => expr.rewrite(context, shape),
|
||||
PatKind::Slice(ref slice_pat) => {
|
||||
PatKind::Slice(ref slice_pat) if context.config.version() == Version::One => {
|
||||
let rw: Vec<String> = slice_pat
|
||||
.iter()
|
||||
.map(|p| {
|
||||
@ -244,8 +246,17 @@ impl Rewrite for Pat {
|
||||
.collect();
|
||||
Some(format!("[{}]", rw.join(", ")))
|
||||
}
|
||||
PatKind::Struct(_, ref path, ref fields, ellipsis) => {
|
||||
rewrite_struct_pat(path, fields, ellipsis, self.span, context, shape)
|
||||
PatKind::Slice(ref slice_pat) => overflow::rewrite_with_square_brackets(
|
||||
context,
|
||||
"",
|
||||
slice_pat.iter(),
|
||||
shape,
|
||||
self.span,
|
||||
None,
|
||||
None,
|
||||
),
|
||||
PatKind::Struct(ref qself, ref path, ref fields, ellipsis) => {
|
||||
rewrite_struct_pat(qself, path, fields, ellipsis, self.span, context, shape)
|
||||
}
|
||||
PatKind::MacCall(ref mac) => {
|
||||
rewrite_macro(mac, None, context, shape, MacroPosition::Pat)
|
||||
@ -258,6 +269,7 @@ impl Rewrite for Pat {
|
||||
}
|
||||
|
||||
fn rewrite_struct_pat(
|
||||
qself: &Option<ast::QSelf>,
|
||||
path: &ast::Path,
|
||||
fields: &[ast::PatField],
|
||||
ellipsis: bool,
|
||||
@ -267,7 +279,7 @@ fn rewrite_struct_pat(
|
||||
) -> Option<String> {
|
||||
// 2 = ` {`
|
||||
let path_shape = shape.sub_width(2)?;
|
||||
let path_str = rewrite_path(context, PathContext::Expr, None, path, path_shape)?;
|
||||
let path_str = rewrite_path(context, PathContext::Expr, qself.as_ref(), path, path_shape)?;
|
||||
|
||||
if fields.is_empty() && !ellipsis {
|
||||
return Some(format!("{} {{}}", path_str));
|
||||
|
@ -113,6 +113,7 @@ fn rewrite_reorderable_or_regroupable_items(
|
||||
merge_use_trees(normalized_items, SharedPrefix::Module)
|
||||
}
|
||||
ImportGranularity::Item => flatten_use_trees(normalized_items),
|
||||
ImportGranularity::One => merge_use_trees(normalized_items, SharedPrefix::One),
|
||||
ImportGranularity::Preserve => normalized_items,
|
||||
};
|
||||
|
||||
|
@ -104,7 +104,7 @@ impl Spanned for ast::Arm {
|
||||
impl Spanned for ast::Param {
|
||||
fn span(&self) -> Span {
|
||||
if crate::items::is_named_param(self) {
|
||||
mk_sp(self.pat.span.lo(), self.ty.span.hi())
|
||||
mk_sp(crate::items::span_lo_for_param(self), self.ty.span.hi())
|
||||
} else {
|
||||
self.ty.span
|
||||
}
|
||||
|
@ -175,6 +175,12 @@ impl ParseSess {
|
||||
self.parse_sess.source_map().span_to_filename(span).into()
|
||||
}
|
||||
|
||||
pub(crate) fn span_to_file_contents(&self, span: Span) -> Lrc<rustc_span::SourceFile> {
|
||||
self.parse_sess
|
||||
.source_map()
|
||||
.lookup_source_file(span.data().lo)
|
||||
}
|
||||
|
||||
pub(crate) fn span_to_first_line_string(&self, span: Span) -> String {
|
||||
let file_lines = self.parse_sess.source_map().span_to_lines(span).ok();
|
||||
|
||||
|
@ -469,11 +469,6 @@ fn stdin_works_with_modified_lines() {
|
||||
#[test]
|
||||
fn stdin_disable_all_formatting_test() {
|
||||
init_log();
|
||||
match option_env!("CFG_RELEASE_CHANNEL") {
|
||||
None | Some("nightly") => {}
|
||||
// These tests require nightly.
|
||||
_ => return,
|
||||
}
|
||||
let input = String::from("fn main() { println!(\"This should not be formatted.\"); }");
|
||||
let mut child = Command::new(rustfmt().to_str().unwrap())
|
||||
.stdin(Stdio::piped())
|
||||
@ -694,7 +689,7 @@ fn read_significant_comments(file_name: &Path) -> HashMap<String, String> {
|
||||
reader
|
||||
.lines()
|
||||
.map(|line| line.expect("failed getting line"))
|
||||
.take_while(|line| line_regex.is_match(line))
|
||||
.filter(|line| line_regex.is_match(line))
|
||||
.filter_map(|line| {
|
||||
regex.captures_iter(&line).next().map(|capture| {
|
||||
(
|
||||
|
137
src/types.rs
137
src/types.rs
@ -169,34 +169,41 @@ impl<'a> Rewrite for SegmentParam<'a> {
|
||||
SegmentParam::Const(const_) => const_.rewrite(context, shape),
|
||||
SegmentParam::LifeTime(lt) => lt.rewrite(context, shape),
|
||||
SegmentParam::Type(ty) => ty.rewrite(context, shape),
|
||||
SegmentParam::Binding(assoc_ty_constraint) => {
|
||||
let mut result = match assoc_ty_constraint.kind {
|
||||
ast::AssocTyConstraintKind::Bound { .. } => {
|
||||
format!("{}: ", rewrite_ident(context, assoc_ty_constraint.ident))
|
||||
}
|
||||
ast::AssocTyConstraintKind::Equality { .. } => {
|
||||
match context.config.type_punctuation_density() {
|
||||
TypeDensity::Wide => {
|
||||
format!("{} = ", rewrite_ident(context, assoc_ty_constraint.ident))
|
||||
}
|
||||
TypeDensity::Compressed => {
|
||||
format!("{}=", rewrite_ident(context, assoc_ty_constraint.ident))
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let budget = shape.width.checked_sub(result.len())?;
|
||||
let rewrite = assoc_ty_constraint
|
||||
.kind
|
||||
.rewrite(context, Shape::legacy(budget, shape.indent + result.len()))?;
|
||||
result.push_str(&rewrite);
|
||||
Some(result)
|
||||
}
|
||||
SegmentParam::Binding(atc) => atc.rewrite(context, shape),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Rewrite for ast::AssocTyConstraint {
|
||||
fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option<String> {
|
||||
use ast::AssocTyConstraintKind::{Bound, Equality};
|
||||
|
||||
let mut result = String::with_capacity(128);
|
||||
result.push_str(rewrite_ident(context, self.ident));
|
||||
|
||||
if let Some(ref gen_args) = self.gen_args {
|
||||
let budget = shape.width.checked_sub(result.len())?;
|
||||
let shape = Shape::legacy(budget, shape.indent + result.len());
|
||||
let gen_str = rewrite_generic_args(gen_args, context, shape, gen_args.span())?;
|
||||
result.push_str(&gen_str);
|
||||
}
|
||||
|
||||
let infix = match (&self.kind, context.config.type_punctuation_density()) {
|
||||
(Bound { .. }, _) => ": ",
|
||||
(Equality { .. }, TypeDensity::Wide) => " = ",
|
||||
(Equality { .. }, TypeDensity::Compressed) => "=",
|
||||
};
|
||||
result.push_str(infix);
|
||||
|
||||
let budget = shape.width.checked_sub(result.len())?;
|
||||
let shape = Shape::legacy(budget, shape.indent + result.len());
|
||||
let rewrite = self.kind.rewrite(context, shape)?;
|
||||
result.push_str(&rewrite);
|
||||
|
||||
Some(result)
|
||||
}
|
||||
}
|
||||
|
||||
impl Rewrite for ast::AssocTyConstraintKind {
|
||||
fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option<String> {
|
||||
match self {
|
||||
@ -235,21 +242,9 @@ fn rewrite_segment(
|
||||
};
|
||||
|
||||
if let Some(ref args) = segment.args {
|
||||
let generics_str = rewrite_generic_args(args, context, shape, mk_sp(*span_lo, span_hi))?;
|
||||
match **args {
|
||||
ast::GenericArgs::AngleBracketed(ref data) if !data.args.is_empty() => {
|
||||
let param_list = data
|
||||
.args
|
||||
.iter()
|
||||
.map(|x| match x {
|
||||
ast::AngleBracketedArg::Arg(generic_arg) => {
|
||||
SegmentParam::from_generic_arg(generic_arg)
|
||||
}
|
||||
ast::AngleBracketedArg::Constraint(constraint) => {
|
||||
SegmentParam::Binding(constraint)
|
||||
}
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
// HACK: squeeze out the span between the identifier and the parameters.
|
||||
// The hack is requried so that we don't remove the separator inside macro calls.
|
||||
// This does not work in the presence of comment, hoping that people are
|
||||
@ -265,33 +260,14 @@ fn rewrite_segment(
|
||||
};
|
||||
result.push_str(separator);
|
||||
|
||||
let generics_str = overflow::rewrite_with_angle_brackets(
|
||||
context,
|
||||
"",
|
||||
param_list.iter(),
|
||||
shape,
|
||||
mk_sp(*span_lo, span_hi),
|
||||
)?;
|
||||
|
||||
// Update position of last bracket.
|
||||
*span_lo = context
|
||||
.snippet_provider
|
||||
.span_after(mk_sp(*span_lo, span_hi), "<");
|
||||
|
||||
result.push_str(&generics_str)
|
||||
}
|
||||
ast::GenericArgs::Parenthesized(ref data) => {
|
||||
result.push_str(&format_function_type(
|
||||
data.inputs.iter().map(|x| &**x),
|
||||
&data.output,
|
||||
false,
|
||||
data.span,
|
||||
context,
|
||||
shape,
|
||||
)?);
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
result.push_str(&generics_str)
|
||||
}
|
||||
|
||||
Some(result)
|
||||
@ -484,6 +460,41 @@ impl Rewrite for ast::GenericArg {
|
||||
}
|
||||
}
|
||||
|
||||
fn rewrite_generic_args(
|
||||
gen_args: &ast::GenericArgs,
|
||||
context: &RewriteContext<'_>,
|
||||
shape: Shape,
|
||||
span: Span,
|
||||
) -> Option<String> {
|
||||
match gen_args {
|
||||
ast::GenericArgs::AngleBracketed(ref data) if !data.args.is_empty() => {
|
||||
let args = data
|
||||
.args
|
||||
.iter()
|
||||
.map(|x| match x {
|
||||
ast::AngleBracketedArg::Arg(generic_arg) => {
|
||||
SegmentParam::from_generic_arg(generic_arg)
|
||||
}
|
||||
ast::AngleBracketedArg::Constraint(constraint) => {
|
||||
SegmentParam::Binding(constraint)
|
||||
}
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
overflow::rewrite_with_angle_brackets(context, "", args.iter(), shape, span)
|
||||
}
|
||||
ast::GenericArgs::Parenthesized(ref data) => format_function_type(
|
||||
data.inputs.iter().map(|x| &**x),
|
||||
&data.output,
|
||||
false,
|
||||
data.span,
|
||||
context,
|
||||
shape,
|
||||
),
|
||||
_ => Some("".to_owned()),
|
||||
}
|
||||
}
|
||||
|
||||
fn rewrite_bounded_lifetime(
|
||||
lt: &ast::Lifetime,
|
||||
bounds: &[ast::GenericBound],
|
||||
@ -566,13 +577,23 @@ impl Rewrite for ast::GenericParam {
|
||||
if let ast::GenericParamKind::Const {
|
||||
ref ty,
|
||||
kw_span: _,
|
||||
default: _,
|
||||
default,
|
||||
} = &self.kind
|
||||
{
|
||||
result.push_str("const ");
|
||||
result.push_str(rewrite_ident(context, self.ident));
|
||||
result.push_str(": ");
|
||||
result.push_str(&ty.rewrite(context, shape)?);
|
||||
if let Some(default) = default {
|
||||
let eq_str = match context.config.type_punctuation_density() {
|
||||
TypeDensity::Compressed => "=",
|
||||
TypeDensity::Wide => " = ",
|
||||
};
|
||||
result.push_str(eq_str);
|
||||
let budget = shape.width.checked_sub(result.len())?;
|
||||
let rewrite = default.rewrite(context, Shape::legacy(budget, shape.indent))?;
|
||||
result.push_str(&rewrite);
|
||||
}
|
||||
} else {
|
||||
result.push_str(rewrite_ident(context, self.ident));
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ use std::rc::Rc;
|
||||
|
||||
use rustc_ast::{ast, token::DelimToken, visit, AstLike};
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use rustc_span::{symbol, BytePos, Pos, Span, DUMMY_SP};
|
||||
use rustc_span::{symbol, BytePos, Pos, Span};
|
||||
|
||||
use crate::attr::*;
|
||||
use crate::comment::{contains_comment, rewrite_comment, CodeCharKind, CommentCodeSlices};
|
||||
@ -11,9 +11,9 @@ use crate::config::Version;
|
||||
use crate::config::{BraceStyle, Config};
|
||||
use crate::coverage::transform_missing_snippet;
|
||||
use crate::items::{
|
||||
format_impl, format_trait, format_trait_alias, is_mod_decl, is_use_item,
|
||||
rewrite_associated_impl_type, rewrite_extern_crate, rewrite_opaque_impl_type,
|
||||
rewrite_opaque_type, rewrite_type_alias, FnBraceStyle, FnSig, StaticParts, StructParts,
|
||||
format_impl, format_trait, format_trait_alias, is_mod_decl, is_use_item, rewrite_extern_crate,
|
||||
rewrite_impl_type, rewrite_opaque_type, rewrite_type, FnBraceStyle, FnSig, StaticParts,
|
||||
StructParts,
|
||||
};
|
||||
use crate::macros::{macro_style, rewrite_macro, rewrite_macro_def, MacroPosition};
|
||||
use crate::modules::Module;
|
||||
@ -568,6 +568,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
|
||||
indent,
|
||||
item.ident,
|
||||
&fn_signature,
|
||||
&item.vis,
|
||||
generics,
|
||||
item.span,
|
||||
);
|
||||
@ -579,14 +580,14 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
|
||||
**alias_kind;
|
||||
match ty {
|
||||
Some(ty) => {
|
||||
let rewrite = rewrite_type_alias(
|
||||
item.ident,
|
||||
Some(&*ty),
|
||||
generics,
|
||||
Some(generic_bounds),
|
||||
let rewrite = rewrite_type(
|
||||
&self.get_context(),
|
||||
self.block_indent,
|
||||
item.ident,
|
||||
&item.vis,
|
||||
generics,
|
||||
Some(generic_bounds),
|
||||
Some(&*ty),
|
||||
item.span,
|
||||
);
|
||||
self.push_rewrite(item.span, rewrite);
|
||||
@ -641,14 +642,9 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
|
||||
let ast::FnKind(defaultness, ref sig, ref generics, ref block) = **fn_kind;
|
||||
if let Some(ref body) = block {
|
||||
let inner_attrs = inner_attributes(&ti.attrs);
|
||||
let vis = ast::Visibility {
|
||||
kind: ast::VisibilityKind::Inherited,
|
||||
span: DUMMY_SP,
|
||||
tokens: None,
|
||||
};
|
||||
let fn_ctxt = visit::FnCtxt::Assoc(visit::AssocCtxt::Trait);
|
||||
self.visit_fn(
|
||||
visit::FnKind::Fn(fn_ctxt, ti.ident, sig, &vis, Some(body)),
|
||||
visit::FnKind::Fn(fn_ctxt, ti.ident, sig, &ti.vis, Some(body)),
|
||||
generics,
|
||||
&sig.decl,
|
||||
ti.span,
|
||||
@ -658,21 +654,21 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
|
||||
} else {
|
||||
let indent = self.block_indent;
|
||||
let rewrite =
|
||||
self.rewrite_required_fn(indent, ti.ident, sig, generics, ti.span);
|
||||
self.rewrite_required_fn(indent, ti.ident, sig, &ti.vis, generics, ti.span);
|
||||
self.push_rewrite(ti.span, rewrite);
|
||||
}
|
||||
}
|
||||
ast::AssocItemKind::TyAlias(ref ty_alias_kind) => {
|
||||
let ast::TyAliasKind(_, ref generics, ref generic_bounds, ref type_default) =
|
||||
**ty_alias_kind;
|
||||
let rewrite = rewrite_type_alias(
|
||||
ti.ident,
|
||||
type_default.as_ref(),
|
||||
generics,
|
||||
Some(generic_bounds),
|
||||
let rewrite = rewrite_type(
|
||||
&self.get_context(),
|
||||
self.block_indent,
|
||||
ti.ident,
|
||||
&ti.vis,
|
||||
generics,
|
||||
Some(generic_bounds),
|
||||
type_default.as_ref(),
|
||||
ti.span,
|
||||
);
|
||||
self.push_rewrite(ti.span, rewrite);
|
||||
@ -708,15 +704,16 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
|
||||
} else {
|
||||
let indent = self.block_indent;
|
||||
let rewrite =
|
||||
self.rewrite_required_fn(indent, ii.ident, sig, generics, ii.span);
|
||||
self.rewrite_required_fn(indent, ii.ident, sig, &ii.vis, generics, ii.span);
|
||||
self.push_rewrite(ii.span, rewrite);
|
||||
}
|
||||
}
|
||||
ast::AssocItemKind::Const(..) => self.visit_static(&StaticParts::from_impl_item(ii)),
|
||||
ast::AssocItemKind::TyAlias(ref ty_alias_kind) => {
|
||||
let ast::TyAliasKind(defaultness, ref generics, _, ref ty) = **ty_alias_kind;
|
||||
let rewrite_associated = || {
|
||||
rewrite_associated_impl_type(
|
||||
self.push_rewrite(
|
||||
ii.span,
|
||||
rewrite_impl_type(
|
||||
ii.ident,
|
||||
&ii.vis,
|
||||
defaultness,
|
||||
@ -725,22 +722,8 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
|
||||
&self.get_context(),
|
||||
self.block_indent,
|
||||
ii.span,
|
||||
)
|
||||
};
|
||||
let rewrite = match ty {
|
||||
None => rewrite_associated(),
|
||||
Some(ty) => match ty.kind {
|
||||
ast::TyKind::ImplTrait(_, ref bounds) => rewrite_opaque_impl_type(
|
||||
&self.get_context(),
|
||||
ii.ident,
|
||||
generics,
|
||||
bounds,
|
||||
self.block_indent,
|
||||
),
|
||||
_ => rewrite_associated(),
|
||||
},
|
||||
};
|
||||
self.push_rewrite(ii.span, rewrite);
|
||||
),
|
||||
);
|
||||
}
|
||||
ast::AssocItemKind::MacCall(ref mac) => {
|
||||
self.visit_mac(mac, Some(ii.ident), MacroPosition::Item);
|
||||
|
13
tests/cargo-fmt/source/divergent-crate-dir-names/Cargo.toml
Normal file
13
tests/cargo-fmt/source/divergent-crate-dir-names/Cargo.toml
Normal file
@ -0,0 +1,13 @@
|
||||
[package]
|
||||
name = "cargo-fmt-test"
|
||||
version = "0.1.0"
|
||||
authors = ["calebcartwright"]
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
indexmap = "1.0.2"
|
||||
|
||||
[workspace]
|
||||
members = [
|
||||
"dependency-dir-name",
|
||||
]
|
@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "dependency-crate-name"
|
||||
version = "0.1.0"
|
||||
authors = ["calebcartwright"]
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
subdep-crate-name = { path = "subdep-dir-name" }
|
||||
indexmap = "1.0.2"
|
||||
rusty-hook = "0.8.4"
|
@ -0,0 +1,7 @@
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
#[test]
|
||||
fn it_works() {
|
||||
assert_eq!(2 + 2, 4);
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
[package]
|
||||
name = "subdep-crate-name"
|
||||
version = "0.1.0"
|
||||
authors = ["calebcartwright"]
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
@ -0,0 +1,7 @@
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
#[test]
|
||||
fn sub_test_that_works() {
|
||||
assert_eq!(3 + 3, 6);
|
||||
}
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "e"
|
||||
version = "0.1.0"
|
||||
edition = "2018"
|
||||
[dependencies]
|
||||
c = { path = "../ws/c" }
|
@ -0,0 +1 @@
|
||||
struct E{ }
|
@ -0,0 +1,5 @@
|
||||
[workspace]
|
||||
members = [
|
||||
"a",
|
||||
"b"
|
||||
]
|
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "a"
|
||||
version = "0.1.0"
|
||||
edition = "2018"
|
||||
[dependencies]
|
||||
d = { path = "./d" }
|
@ -0,0 +1,7 @@
|
||||
[package]
|
||||
name = "d"
|
||||
version = "0.1.0"
|
||||
edition = "2018"
|
||||
[dependencies]
|
||||
e = { path = "../../../e" }
|
||||
f = { path = "f" }
|
@ -0,0 +1,4 @@
|
||||
[package]
|
||||
name = "f"
|
||||
version = "0.1.0"
|
||||
edition = "2018"
|
@ -0,0 +1 @@
|
||||
struct F{ }
|
@ -0,0 +1 @@
|
||||
struct D{ }
|
@ -0,0 +1 @@
|
||||
struct D{ }
|
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "b"
|
||||
version = "0.1.0"
|
||||
edition = "2018"
|
||||
[dependencies]
|
||||
c = { path = "../c" }
|
@ -0,0 +1 @@
|
||||
struct B{ }
|
@ -0,0 +1,4 @@
|
||||
[package]
|
||||
name = "c"
|
||||
version = "0.1.0"
|
||||
edition = "2018"
|
@ -0,0 +1 @@
|
||||
struct C{ }
|
14
tests/source/binop-separator-back/bitwise.rs
Normal file
14
tests/source/binop-separator-back/bitwise.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// rustfmt-binop_separator: Back
|
||||
|
||||
fn main() {
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ^ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ & abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ | abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ << abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ >> abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
|
||||
}
|
23
tests/source/binop-separator-back/comp.rs
Normal file
23
tests/source/binop-separator-back/comp.rs
Normal file
@ -0,0 +1,23 @@
|
||||
// rustfmt-binop_separator: Back
|
||||
|
||||
fn main() {
|
||||
if abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ < abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {
|
||||
//
|
||||
}
|
||||
|
||||
if abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ <= abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {
|
||||
//
|
||||
}
|
||||
|
||||
if abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ > abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {
|
||||
//
|
||||
}
|
||||
|
||||
if abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ >= abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {
|
||||
//
|
||||
}
|
||||
|
||||
if abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ == abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {
|
||||
//
|
||||
}
|
||||
}
|
7
tests/source/binop-separator-back/logic.rs
Normal file
7
tests/source/binop-separator-back/logic.rs
Normal file
@ -0,0 +1,7 @@
|
||||
// rustfmt-binop_separator: Back
|
||||
|
||||
fn main() {
|
||||
if abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ && abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ || abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {
|
||||
//
|
||||
}
|
||||
}
|
7
tests/source/binop-separator-back/math.rs
Normal file
7
tests/source/binop-separator-back/math.rs
Normal file
@ -0,0 +1,7 @@
|
||||
// rustfmt-binop_separator: Back
|
||||
|
||||
fn main() {
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ * abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ - abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ * abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ * abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
}
|
9
tests/source/binop-separator-back/patterns.rs
Normal file
9
tests/source/binop-separator-back/patterns.rs
Normal file
@ -0,0 +1,9 @@
|
||||
// rustfmt-binop_separator: Back
|
||||
|
||||
fn main() {
|
||||
match val {
|
||||
ThisIsA::ReallyLongPatternNameToHelpOverflowTheNextValueOntoTheNextLine | ThisIsA::SecondValueSeparatedByAPipe | ThisIsA::ThirdValueSeparatedByAPipe => {
|
||||
//
|
||||
}
|
||||
}
|
||||
}
|
7
tests/source/binop-separator-back/range.rs
Normal file
7
tests/source/binop-separator-back/range.rs
Normal file
@ -0,0 +1,7 @@
|
||||
// rustfmt-binop_separator: Back
|
||||
|
||||
fn main() {
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ..abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ..=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
}
|
8
tests/source/configs/format_generated_files/false.rs
Normal file
8
tests/source/configs/format_generated_files/false.rs
Normal file
@ -0,0 +1,8 @@
|
||||
// @generated
|
||||
// rustfmt-format_generated_files: false
|
||||
|
||||
fn main()
|
||||
{
|
||||
println!("hello, world")
|
||||
;
|
||||
}
|
8
tests/source/configs/format_generated_files/true.rs
Normal file
8
tests/source/configs/format_generated_files/true.rs
Normal file
@ -0,0 +1,8 @@
|
||||
// @generated
|
||||
// rustfmt-format_generated_files: true
|
||||
|
||||
fn main()
|
||||
{
|
||||
println!("hello, world")
|
||||
;
|
||||
}
|
5
tests/source/hex_literal_lower.rs
Normal file
5
tests/source/hex_literal_lower.rs
Normal file
@ -0,0 +1,5 @@
|
||||
// rustfmt-hex_literal_case: Lower
|
||||
fn main() {
|
||||
let h1 = 0xCAFE_5EA7;
|
||||
let h2 = 0xCAFE_F00Du32;
|
||||
}
|
5
tests/source/hex_literal_upper.rs
Normal file
5
tests/source/hex_literal_upper.rs
Normal file
@ -0,0 +1,5 @@
|
||||
// rustfmt-hex_literal_case: Upper
|
||||
fn main() {
|
||||
let h1 = 0xCaFE_5ea7;
|
||||
let h2 = 0xCAFE_F00Du32;
|
||||
}
|
@ -13,6 +13,14 @@ pub impl Foo for Bar {
|
||||
// Comment 3
|
||||
}
|
||||
|
||||
#[inherent]
|
||||
impl Visible for Bar {
|
||||
pub const C: i32;
|
||||
pub type T;
|
||||
pub fn f();
|
||||
pub fn g() {}
|
||||
}
|
||||
|
||||
pub unsafe impl<'a, 'b, X, Y: Foo<Bar>> !Foo<'a, X> for Bar<'b, Y> where X: Foo<'a, Z> {
|
||||
fn foo() { "hi" }
|
||||
}
|
||||
|
60
tests/source/imports_granularity_one.rs
Normal file
60
tests/source/imports_granularity_one.rs
Normal file
@ -0,0 +1,60 @@
|
||||
// rustfmt-imports_granularity: One
|
||||
|
||||
use b;
|
||||
use a::ac::{aca, acb};
|
||||
use a::{aa::*, ab};
|
||||
|
||||
use a as x;
|
||||
use b::ba;
|
||||
use a::{aa, ab};
|
||||
|
||||
use a::aa::aaa;
|
||||
use a::ab::aba as x;
|
||||
use a::aa::*;
|
||||
|
||||
use a::aa;
|
||||
use a::ad::ada;
|
||||
#[cfg(test)]
|
||||
use a::{ab, ac::aca};
|
||||
use b;
|
||||
#[cfg(test)]
|
||||
use b::{
|
||||
ba, bb,
|
||||
bc::bca::{bcaa, bcab},
|
||||
};
|
||||
|
||||
pub use a::aa;
|
||||
pub use a::ae;
|
||||
use a::{ab, ac, ad};
|
||||
use b::ba;
|
||||
pub use b::{bb, bc::bca};
|
||||
|
||||
use a::aa::aaa;
|
||||
use a::ac::{aca, acb};
|
||||
use a::{aa::*, ab};
|
||||
use b::{
|
||||
ba,
|
||||
bb::{self, bba},
|
||||
};
|
||||
|
||||
use crate::a;
|
||||
use crate::b::ba;
|
||||
use c::ca;
|
||||
|
||||
use super::a;
|
||||
use c::ca;
|
||||
use super::b::ba;
|
||||
|
||||
use crate::a;
|
||||
use super::b;
|
||||
use c::{self, ca};
|
||||
|
||||
use a::{
|
||||
// some comment
|
||||
aa::{aaa, aab},
|
||||
ab,
|
||||
// another comment
|
||||
ac::aca,
|
||||
};
|
||||
use b as x;
|
||||
use a::ad::ada;
|
74
tests/source/issue-3158.rs
Normal file
74
tests/source/issue-3158.rs
Normal file
@ -0,0 +1,74 @@
|
||||
// rustfmt-format_code_in_doc_comments: true
|
||||
|
||||
/// Should format
|
||||
/// ```rust
|
||||
/// assert!( false );
|
||||
/// ```
|
||||
///
|
||||
/// Should format
|
||||
/// ```rust,should_panic
|
||||
/// assert!( false );
|
||||
/// ```
|
||||
///
|
||||
/// Should format
|
||||
/// ```rust,should_panic,edition2018
|
||||
/// assert!( false );
|
||||
/// ```
|
||||
///
|
||||
/// Should format
|
||||
/// ```rust , should_panic , edition2018
|
||||
/// assert!( false );
|
||||
/// ```
|
||||
///
|
||||
/// Should not format
|
||||
/// ```ignore
|
||||
/// assert!( false );
|
||||
/// ```
|
||||
///
|
||||
/// Should not format (not all are rust)
|
||||
/// ```rust,ignore
|
||||
/// assert!( false );
|
||||
/// ```
|
||||
///
|
||||
/// Should not format (rust compile_fail)
|
||||
/// ```compile_fail
|
||||
/// assert!( false );
|
||||
/// ```
|
||||
///
|
||||
/// Should not format (rust compile_fail)
|
||||
/// ```rust,compile_fail
|
||||
/// assert!( false );
|
||||
/// ```
|
||||
///
|
||||
/// Various unspecified ones that should format
|
||||
/// ```
|
||||
/// assert!( false );
|
||||
/// ```
|
||||
///
|
||||
/// ```,
|
||||
/// assert!( false );
|
||||
/// ```
|
||||
///
|
||||
/// ```,,,,,
|
||||
/// assert!( false );
|
||||
/// ```
|
||||
///
|
||||
/// ```,,, rust ,,
|
||||
/// assert!( false );
|
||||
/// ```
|
||||
///
|
||||
/// Should not format
|
||||
/// ```,,, rust , ignore,
|
||||
/// assert!( false );
|
||||
/// ```
|
||||
///
|
||||
/// Few empty ones
|
||||
/// ```
|
||||
/// ```
|
||||
///
|
||||
/// ```rust
|
||||
/// ```
|
||||
///
|
||||
/// ```ignore
|
||||
/// ```
|
||||
fn foo() {}
|
4
tests/source/issue-4530.rs
Normal file
4
tests/source/issue-4530.rs
Normal file
@ -0,0 +1,4 @@
|
||||
// rustfmt-version: Two
|
||||
fn main() {
|
||||
let [aaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, cccccccccccccccccccccccccc, ddddddddddddddddddddddddd] = panic!();
|
||||
}
|
4
tests/source/issue-4615/minimum_example.rs
Normal file
4
tests/source/issue-4615/minimum_example.rs
Normal file
@ -0,0 +1,4 @@
|
||||
info!(//debug
|
||||
"{}: sending function_code={:04x} data={:04x} crc=0x{:04X} data={:02X?}",
|
||||
self.name, function_code, data, crc, output_cmd
|
||||
);
|
10
tests/source/issue-4816/lib.rs
Normal file
10
tests/source/issue-4816/lib.rs
Normal file
@ -0,0 +1,10 @@
|
||||
#![feature(const_generics_defaults)]
|
||||
struct Foo<const N: usize = 1, const N2: usize = 2>;
|
||||
struct Bar<const N: usize, const N2: usize = { N +
|
||||
1 }>;
|
||||
struct Lots<const N1BlahFooUwU: usize = { 10 + 28 + 1872 / 10 * 3 },const N2SecondParamOhmyyy: usize = { N1BlahFooUwU / 2 + 10 * 2 },>;
|
||||
struct NamesRHard<const N: usize = { 1 + 1 + 1 + 1 + 1 + 1 }>;
|
||||
struct FooBar<
|
||||
const LessThan100ButClose: usize = {1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1}
|
||||
>;
|
||||
struct FooBarrrrrrrr<const N: usize = {13478234326456456444323871+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+1+1+1 + 1},>;
|
35
tests/source/issue-4926/deeply_nested_struct.rs
Normal file
35
tests/source/issue-4926/deeply_nested_struct.rs
Normal file
@ -0,0 +1,35 @@
|
||||
|
||||
// rustfmt-struct_field_align_threshold: 30
|
||||
|
||||
struct X {
|
||||
a: i32,
|
||||
b: i32,
|
||||
c: i32,
|
||||
}
|
||||
|
||||
fn test(x: X) {
|
||||
let d = {
|
||||
let e = {
|
||||
let f = {
|
||||
let g = {
|
||||
let h = {
|
||||
let i = {
|
||||
let j = {
|
||||
matches!(
|
||||
x,
|
||||
X { a: 1_000, b: 1_000, .. }
|
||||
)
|
||||
};
|
||||
j
|
||||
};
|
||||
i
|
||||
};
|
||||
h
|
||||
};
|
||||
g
|
||||
};
|
||||
f
|
||||
};
|
||||
e
|
||||
};
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
// rustfmt-struct_field_align_threshold: 30
|
||||
|
||||
struct X {
|
||||
really_really_long_field_a: i32,
|
||||
really_really_really_long_field_b: i32,
|
||||
really_really_really_really_long_field_c: i32,
|
||||
really_really_really_really_really_long_field_d: i32,
|
||||
really_really_really_really_really_really_long_field_e: i32,
|
||||
f: i32,
|
||||
}
|
||||
|
||||
fn test(x: X) {
|
||||
let d = {
|
||||
let e = {
|
||||
let f = {
|
||||
let g = {
|
||||
let h = {
|
||||
let i = {
|
||||
let j = {
|
||||
matches!(
|
||||
x,
|
||||
X {
|
||||
really_really_long_field_a: 10,
|
||||
really_really_really_long_field_b: 10,
|
||||
really_really_really_really_long_field_c: 10,
|
||||
really_really_really_really_really_long_field_d: 10,
|
||||
really_really_really_really_really_really_long_field_e: 10, ..
|
||||
}
|
||||
)
|
||||
};
|
||||
j
|
||||
};
|
||||
i
|
||||
};
|
||||
h
|
||||
};
|
||||
g
|
||||
};
|
||||
f
|
||||
};
|
||||
e
|
||||
};
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
// rustfmt-struct_field_align_threshold: 30
|
||||
|
||||
struct X {
|
||||
a: i32,
|
||||
b: i32,
|
||||
c: i32,
|
||||
d: i32,
|
||||
e: i32,
|
||||
f: i32,
|
||||
g: i32,
|
||||
h: i32,
|
||||
i: i32,
|
||||
j: i32,
|
||||
k: i32,
|
||||
}
|
||||
|
||||
fn test(x: X) {
|
||||
let d = {
|
||||
let e = {
|
||||
let f = {
|
||||
let g = {
|
||||
let h = {
|
||||
let i = {
|
||||
let j = {
|
||||
matches!(
|
||||
x,
|
||||
X {
|
||||
a: 1_000, b: 1_000, c: 1_000, d: 1_000, e: 1_000, f: 1_000, g: 1_000, h: 1_000, i: 1_000, j: 1_000, ..
|
||||
}
|
||||
)
|
||||
};
|
||||
j
|
||||
};
|
||||
i
|
||||
};
|
||||
h
|
||||
};
|
||||
g
|
||||
};
|
||||
f
|
||||
};
|
||||
e
|
||||
};
|
||||
}
|
35
tests/source/issue-4926/enum_struct_field.rs
Normal file
35
tests/source/issue-4926/enum_struct_field.rs
Normal file
@ -0,0 +1,35 @@
|
||||
// rustfmt-struct_field_align_threshold: 30
|
||||
// rustfmt-enum_discrim_align_threshold: 30
|
||||
// rustfmt-imports_layout: HorizontalVertical
|
||||
|
||||
#[derive(Default)]
|
||||
struct InnerStructA { bbbbbbbbb: i32, cccccccc: i32 }
|
||||
|
||||
enum SomeEnumNamedD {
|
||||
E(InnerStructA),
|
||||
F {
|
||||
ggggggggggggggggggggggggg: bool,
|
||||
h: bool,
|
||||
}
|
||||
}
|
||||
|
||||
impl SomeEnumNamedD {
|
||||
fn f_variant() -> Self {
|
||||
Self::F { ggggggggggggggggggggggggg: true, h: true }
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk = SomeEnumNamedD::f_variant();
|
||||
let something_we_care_about = matches!(
|
||||
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk,
|
||||
SomeEnumNamedD::F {
|
||||
ggggggggggggggggggggggggg: true,
|
||||
..
|
||||
}
|
||||
);
|
||||
|
||||
if something_we_care_about {
|
||||
println!("Yup it happened");
|
||||
}
|
||||
}
|
10
tests/source/issue-4926/minimum_example.rs
Normal file
10
tests/source/issue-4926/minimum_example.rs
Normal file
@ -0,0 +1,10 @@
|
||||
// rustfmt-struct_field_align_threshold: 30
|
||||
|
||||
struct X { a: i32, b: i32 }
|
||||
|
||||
fn test(x: X) {
|
||||
let y = matches!(x, X {
|
||||
a: 1,
|
||||
..
|
||||
});
|
||||
}
|
21
tests/source/issue-4926/struct_with_long_field_names.rs
Normal file
21
tests/source/issue-4926/struct_with_long_field_names.rs
Normal file
@ -0,0 +1,21 @@
|
||||
// rustfmt-struct_field_align_threshold: 30
|
||||
|
||||
struct X {
|
||||
really_really_long_field_a: i32,
|
||||
really_really_really_long_field_b: i32,
|
||||
really_really_really_really_long_field_c: i32,
|
||||
really_really_really_really_really_long_field_d: i32,
|
||||
really_really_really_really_really_really_long_field_e: i32,
|
||||
f: i32,
|
||||
}
|
||||
|
||||
fn test(x: X) {
|
||||
let y = matches!(x, X {
|
||||
really_really_long_field_a: 10,
|
||||
really_really_really_long_field_b: 10,
|
||||
really_really_really_really_long_field_c: 10,
|
||||
really_really_really_really_really_long_field_d: 10,
|
||||
really_really_really_really_really_really_long_field_e: 10,
|
||||
..
|
||||
});
|
||||
}
|
21
tests/source/issue-4926/struct_with_many_fields.rs
Normal file
21
tests/source/issue-4926/struct_with_many_fields.rs
Normal file
@ -0,0 +1,21 @@
|
||||
// rustfmt-struct_field_align_threshold: 30
|
||||
|
||||
struct X {
|
||||
a: i32,
|
||||
b: i32,
|
||||
c: i32,
|
||||
d: i32,
|
||||
e: i32,
|
||||
f: i32,
|
||||
g: i32,
|
||||
h: i32,
|
||||
i: i32,
|
||||
j: i32,
|
||||
k: i32,
|
||||
}
|
||||
|
||||
fn test(x: X) {
|
||||
let y = matches!(x, X {
|
||||
a: 1_000, b: 1_000, c: 1_000, d: 1_000, e: 1_000, f: 1_000, g: 1_000, h: 1_000, i: 1_000, j: 1_000, ..
|
||||
});
|
||||
}
|
2
tests/source/issue-4984/minimum_example.rs
Normal file
2
tests/source/issue-4984/minimum_example.rs
Normal file
@ -0,0 +1,2 @@
|
||||
#[derive(/*Debug, */Clone)]
|
||||
struct Foo;
|
20
tests/source/issue-4984/multi_line_derive.rs
Normal file
20
tests/source/issue-4984/multi_line_derive.rs
Normal file
@ -0,0 +1,20 @@
|
||||
#[derive(
|
||||
/* ---------- Some really important comment that just had to go inside the derive --------- */
|
||||
Debug, Clone, Eq, PartialEq,
|
||||
)]
|
||||
struct Foo {
|
||||
a: i32,
|
||||
b: T,
|
||||
}
|
||||
|
||||
#[derive(
|
||||
/*
|
||||
Some really important comment that just had to go inside the derive.
|
||||
Also had to be put over multiple lines
|
||||
*/
|
||||
Debug, Clone, Eq, PartialEq,
|
||||
)]
|
||||
struct Bar {
|
||||
a: i32,
|
||||
b: T,
|
||||
}
|
8
tests/source/issue-4984/multiple_comments_within.rs
Normal file
8
tests/source/issue-4984/multiple_comments_within.rs
Normal file
@ -0,0 +1,8 @@
|
||||
#[derive(
|
||||
/* ---------- Some really important comment that just had to go inside the derive --------- */
|
||||
Debug, Clone,/* Another comment */Eq, PartialEq,
|
||||
)]
|
||||
struct Foo {
|
||||
a: i32,
|
||||
b: T,
|
||||
}
|
12
tests/source/issue-5011.rs
Normal file
12
tests/source/issue-5011.rs
Normal file
@ -0,0 +1,12 @@
|
||||
pub(crate) struct ASlash(
|
||||
// hello
|
||||
i32
|
||||
);
|
||||
|
||||
pub(crate) struct AStar(
|
||||
/* hello */
|
||||
i32
|
||||
);
|
||||
|
||||
pub(crate) struct BStar(/* hello */ i32);
|
||||
|
4
tests/source/issue_4032.rs
Normal file
4
tests/source/issue_4032.rs
Normal file
@ -0,0 +1,4 @@
|
||||
fn a1(#[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] a: u8) {}
|
||||
fn b1(#[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] bb: u8) {}
|
||||
fn a2(#[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] a: u8) {}
|
||||
fn b2(#[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] bb: u8) {}
|
13
tests/source/issue_4257.rs
Normal file
13
tests/source/issue_4257.rs
Normal file
@ -0,0 +1,13 @@
|
||||
#![feature(generic_associated_types)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
trait Trait<T> {
|
||||
type Type<'a> where T: 'a;
|
||||
fn foo(x: &T) -> Self::Type<'_>;
|
||||
}
|
||||
impl<T> Trait<T> for () {
|
||||
type Type<'a> where T: 'a = &'a T;
|
||||
fn foo(x: &T) -> Self::Type<'_> {
|
||||
x
|
||||
}
|
||||
}
|
3
tests/source/issue_4322.rs
Normal file
3
tests/source/issue_4322.rs
Normal file
@ -0,0 +1,3 @@
|
||||
trait Bar {
|
||||
type X<'a> where Self: 'a;
|
||||
}
|
15
tests/source/issue_4579.rs
Normal file
15
tests/source/issue_4579.rs
Normal file
@ -0,0 +1,15 @@
|
||||
// rustfmt-hard_tabs: true
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! main {
|
||||
() => {
|
||||
#[spirv(fragment)]
|
||||
pub fn main_fs(
|
||||
mut out_color: ::spirv_std::storage_class::Output<Vec4>,
|
||||
#[spirv(descriptor_set = 1)]iChannelResolution: ::spirv_std::storage_class::UniformConstant<
|
||||
[::spirv_std::glam::Vec3A; 4],
|
||||
>,
|
||||
) {
|
||||
}
|
||||
};
|
||||
}
|
6
tests/source/issue_4911.rs
Normal file
6
tests/source/issue_4911.rs
Normal file
@ -0,0 +1,6 @@
|
||||
#![feature(generic_associated_types)]
|
||||
#![feature(min_type_alias_impl_trait)]
|
||||
|
||||
impl SomeTrait for SomeType {
|
||||
type SomeGAT<'a> where Self: 'a = impl SomeOtherTrait;
|
||||
}
|
9
tests/source/issue_4943.rs
Normal file
9
tests/source/issue_4943.rs
Normal file
@ -0,0 +1,9 @@
|
||||
#![feature(generic_associated_types)]
|
||||
|
||||
impl SomeStruct {
|
||||
fn process<T>(v: T) -> <Self as GAT>::R<T>
|
||||
where Self: GAT<R<T> = T>
|
||||
{
|
||||
SomeStruct::do_something(v)
|
||||
}
|
||||
}
|
5
tests/source/issue_4954.rs
Normal file
5
tests/source/issue_4954.rs
Normal file
@ -0,0 +1,5 @@
|
||||
trait Foo {
|
||||
type Arg<'a>;
|
||||
}
|
||||
|
||||
struct Bar<T>(T) where for<'a> T: Foo<Arg<'a> = ()>;
|
5
tests/source/issue_4963.rs
Normal file
5
tests/source/issue_4963.rs
Normal file
@ -0,0 +1,5 @@
|
||||
mod test {
|
||||
extern "C" {fn test();}
|
||||
}
|
||||
|
||||
extern "C" {fn test();}
|
@ -8,6 +8,14 @@ fn foo() {
|
||||
"line1";
|
||||
"line2"
|
||||
}
|
||||
ThisIsA::Guard if true => {
|
||||
"line1";
|
||||
"line2"
|
||||
}
|
||||
ThisIsA::ReallyLongPattern(ThatWillForce::TheGuard, ToWrapOnto::TheFollowingLine) if true => {
|
||||
"line1";
|
||||
"line2"
|
||||
}
|
||||
b => (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,
|
||||
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb),
|
||||
}
|
||||
|
@ -174,3 +174,10 @@ Send
|
||||
+ DDDDDDDD
|
||||
+ DDDDDDDDD
|
||||
+ EEEEEEE;
|
||||
|
||||
trait Visible {
|
||||
pub const C: i32;
|
||||
pub type T;
|
||||
pub fn f();
|
||||
pub fn g() {}
|
||||
}
|
||||
|
18
tests/target/binop-separator-back/bitwise.rs
Normal file
18
tests/target/binop-separator-back/bitwise.rs
Normal file
@ -0,0 +1,18 @@
|
||||
// rustfmt-binop_separator: Back
|
||||
|
||||
fn main() {
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ^
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ &
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ |
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ <<
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ >>
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
}
|
33
tests/target/binop-separator-back/comp.rs
Normal file
33
tests/target/binop-separator-back/comp.rs
Normal file
@ -0,0 +1,33 @@
|
||||
// rustfmt-binop_separator: Back
|
||||
|
||||
fn main() {
|
||||
if abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ <
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
if abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ <=
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
if abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ >
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
if abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ >=
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
if abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ==
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
10
tests/target/binop-separator-back/logic.rs
Normal file
10
tests/target/binop-separator-back/logic.rs
Normal file
@ -0,0 +1,10 @@
|
||||
// rustfmt-binop_separator: Back
|
||||
|
||||
fn main() {
|
||||
if abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ &&
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ||
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
23
tests/target/binop-separator-back/math.rs
Normal file
23
tests/target/binop-separator-back/math.rs
Normal file
@ -0,0 +1,23 @@
|
||||
// rustfmt-binop_separator: Back
|
||||
|
||||
fn main() {
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ *
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ -
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ /
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ *
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ *
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ /
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ /
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ +
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
}
|
11
tests/target/binop-separator-back/patterns.rs
Normal file
11
tests/target/binop-separator-back/patterns.rs
Normal file
@ -0,0 +1,11 @@
|
||||
// rustfmt-binop_separator: Back
|
||||
|
||||
fn main() {
|
||||
match val {
|
||||
ThisIsA::ReallyLongPatternNameToHelpOverflowTheNextValueOntoTheNextLine |
|
||||
ThisIsA::SecondValueSeparatedByAPipe |
|
||||
ThisIsA::ThirdValueSeparatedByAPipe => {
|
||||
//
|
||||
}
|
||||
}
|
||||
}
|
9
tests/target/binop-separator-back/range.rs
Normal file
9
tests/target/binop-separator-back/range.rs
Normal file
@ -0,0 +1,9 @@
|
||||
// rustfmt-binop_separator: Back
|
||||
|
||||
fn main() {
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ..
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
|
||||
let value = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ..=
|
||||
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;
|
||||
}
|
8
tests/target/configs/format_generated_files/false.rs
Normal file
8
tests/target/configs/format_generated_files/false.rs
Normal file
@ -0,0 +1,8 @@
|
||||
// @generated
|
||||
// rustfmt-format_generated_files: false
|
||||
|
||||
fn main()
|
||||
{
|
||||
println!("hello, world")
|
||||
;
|
||||
}
|
6
tests/target/configs/format_generated_files/true.rs
Normal file
6
tests/target/configs/format_generated_files/true.rs
Normal file
@ -0,0 +1,6 @@
|
||||
// @generated
|
||||
// rustfmt-format_generated_files: true
|
||||
|
||||
fn main() {
|
||||
println!("hello, world");
|
||||
}
|
5
tests/target/hex_literal_lower.rs
Normal file
5
tests/target/hex_literal_lower.rs
Normal file
@ -0,0 +1,5 @@
|
||||
// rustfmt-hex_literal_case: Lower
|
||||
fn main() {
|
||||
let h1 = 0xcafe_5ea7;
|
||||
let h2 = 0xcafe_f00du32;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user