Repository: qryxip/cargo-equip (language: rust)

Issue:
Memory allocation of 140015098745856 bytes failed
I have followed the basic setup. This is my Cargo.toml file: 
```
[package]
name = "love-story"
version = "0.0.0"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
proconio = { version = "0.4.3", features = ["derive"] }
```
I'm on Ubuntu.

The full error message: 
```
memory allocation of 140015098745856 bytes failed
error: could not bundle the code

- `proconio 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)` as `crate::__cargo_equip::crates::proconio`
- `proconio-derive 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)` as `crate::__cargo_equip::crates::__proconio_derive_0_2_1`


Caused by:
  rust-analyzer error

Caused by:
  server exited
```


Discussion / hints:
```toml
[dependencies]
proconio = { version = "0.4.3" }
```

It seems that memory allocation errors are less likely to occur when derive features are not used, but I have no idea of the exact cause at this time.
Same issue on Windows. Removing "features = ["derive"]" could solve this problem, but fastout will be unavailable.

Fix patch:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 33e6923..e6e1b42 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -12,6 +12,9 @@ on:
       - 'v[0-9]+.[0-9]+.[0-9]+**'
   pull_request:
 
+env:
+  CARGO_EQUIP_TEST_NIGHTLY_TOOLCHAIN: nightly-2023-08-04
+
 jobs:
   rustfmt:
     name: Rustfmt
@@ -32,8 +35,6 @@ jobs:
   grcov:
     name: grcov
     runs-on: ubuntu-20.04
-    env:
-      CARGO_EQUIP_TEST_NIGHTLY_TOOLCHAIN: nightly-2022-03-25
     if: ${{ github.repository_owner == 'qryxip' && github.ref == 'refs/heads/master' }}
 
     steps:
@@ -102,9 +103,6 @@ jobs:
     name: ${{ matrix.channel }}-${{ matrix.target-triple }}
     runs-on: ${{ matrix.os }}
 
-    env:
-      CARGO_EQUIP_TEST_NIGHTLY_TOOLCHAIN: nightly-2022-03-25
-
     steps:
       - name: Disable `core.autocrlf`
         run: git config --global core.autocrlf false
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9e1e13b..3238dde 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,41 @@
 # Changelog
 
+## [Unreleased]
+
+### Added
+
+- Added `--toolchain-for-proc-macro-srv`.
+
+    ```console
+            --toolchain-for-proc-macro-srv <TOOLCHAIN>    Toolchain for expanding procedural macros
+    ```
+
+### Changed
+
+- Updated the embedded Rust Analyzer to `2023-07-31` (`0.0.166`).
+
+    For Rust <1.64, `--toolchain-for-proc-macro-srv` is required for macro expansion.
+
+    ```console
+    ❯ cargo +1.42.0 equip 2>&1 | tail -n 2
+      Rust ≧1.64.0 is required for expanding procedural macros. Specify one with `--toolchain-for-proc-macro-srv`
+    ```
+
+    This update should fix the issue where macro expansion segfaults.
+
+- `--toolchain` was renamed to `--toolchain-for-udeps`.
+
+    ```console
+    ❯ cargo equip --toolchain nightly
+    warning: `--toolchain` was renamed to `--toolchain-for-udeps`
+    ```
+
+### Fixed
+
+- Updated [prettytable](https://docs.rs/crate/prettytable). ([#193](https://github.com/qryxip/cargo-equip/pull/193) by [@ichyo](https://github.com/ichyo))
+
+    Now cargo-equip built with recent Rust works.
+
 ## [0.19.0] - 2022-03-26Z
 
 ### Added
diff --git a/Cargo.lock b/Cargo.lock
index c5cda95..17795a7 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,9 +4,9 @@ version = 3
 
 [[package]]
 name = "always-assert"
-version = "0.1.2"
+version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbf688625d06217d5b1bb0ea9d9c44a1635fd0ee3534466388d18203174f4d11"
+checksum = "4436e0292ab1bb631b42973c61205e704475fe8126af845c8d923c0996328127"
 dependencies = [
  "log",
 ]
@@ -20,18 +20,25 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "anstyle"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd"
+
 [[package]]
 name = "anyhow"
-version = "1.0.56"
+version = "1.0.72"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4361135be9122e0870de935d7c439aef945b9f9ddd4199a553b5270b49c82a27"
+checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854"
 
 [[package]]
 name = "assert_cmd"
-version = "2.0.4"
+version = "2.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93ae1ddd39efd67689deb1979d80bad3bf7f2b09c6e6117c8d1f2443b5e2f83e"
+checksum = "88903cb14723e4d4003335bb7f8a14f27691649105346a0f0957466c096adfe6"
 dependencies = [
+ "anstyle",
  "bstr",
  "doc-comment",
  "predicates",
@@ -63,13 +70,18 @@ version = "1.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
+[[package]]
+name = "bitflags"
+version = "2.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42"
+
 [[package]]
 name = "bstr"
-version = "0.2.17"
+version = "1.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
+checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05"
 dependencies = [
- "lazy_static",
  "memchr",
  "regex-automata",
  "serde",
@@ -77,15 +89,15 @@ dependencies = [
 
 [[package]]
 name = "bytes"
-version = "1.1.0"
+version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8"
+checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
 
 [[package]]
 name = "camino"
-version = "1.0.7"
+version = "1.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f3132262930b0522068049f5870a856ab8affc80c70d08b6ecb785771a6fc23"
+checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c"
 dependencies = [
  "serde",
 ]
@@ -119,17 +131,16 @@ dependencies = [
  "quote",
  "ra_ap_paths",
  "ra_ap_proc_macro_api",
- "ra_ap_proc_macro_srv",
  "ra_ap_tt",
  "rand",
  "rustminify",
  "semver",
  "serde",
  "serde_json",
- "smol_str",
  "spdx",
  "structopt",
- "syn",
+ "syn 1.0.109",
+ "tap",
  "tempfile",
  "termcolor",
  "toml_edit",
@@ -138,9 +149,9 @@ dependencies = [
 
 [[package]]
 name = "cargo-platform"
-version = "0.1.2"
+version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27"
+checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479"
 dependencies = [
  "serde",
 ]
@@ -182,9 +193,12 @@ dependencies = [
 
 [[package]]
 name = "cc"
-version = "1.0.73"
+version = "1.0.81"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
+checksum = "6c6b2562119bf28c3439f7f02db99faf0aa1a8cdfe5772a2ee155d32227239f0"
+dependencies = [
+ "libc",
+]
 
 [[package]]
 name = "cfg-expr"
@@ -218,7 +232,7 @@ checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
 dependencies = [
  "ansi_term",
  "atty",
- "bitflags",
+ "bitflags 1.3.2",
  "strsim",
  "textwrap",
  "unicode-width",
@@ -227,9 +241,9 @@ dependencies = [
 
 [[package]]
 name = "combine"
-version = "4.6.3"
+version = "4.6.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50b727aacc797f9fc28e355d21f34709ac4fc9adecfe470ad07b8f4464f53062"
+checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4"
 dependencies = [
  "bytes",
  "memchr",
@@ -255,15 +269,14 @@ dependencies = [
 
 [[package]]
 name = "console"
-version = "0.15.0"
+version = "0.15.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31"
+checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8"
 dependencies = [
  "encode_unicode 0.3.6",
+ "lazy_static",
  "libc",
- "once_cell",
- "terminal_size",
- "winapi",
+ "windows-sys 0.45.0",
 ]
 
 [[package]]
@@ -284,9 +297,9 @@ dependencies = [
 
 [[package]]
 name = "core-foundation-sys"
-version = "0.8.3"
+version = "0.8.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
+checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
 
 [[package]]
 name = "countme"
@@ -300,10 +313,23 @@ dependencies = [
 ]
 
 [[package]]
-name = "cov-mark"
-version = "2.0.0-pre.1"
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d48d8f76bd9331f19fe2aaf3821a9f9fb32c3963e1e3d6ce82a8c09cef7444a"
+checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+dependencies = [
+ "cfg-if",
+]
 
 [[package]]
 name = "crypto-hash"
@@ -319,13 +345,12 @@ dependencies = [
 
 [[package]]
 name = "csv"
-version = "1.1.6"
+version = "1.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1"
+checksum = "626ae34994d3d8d668f4269922248239db4ae42d538b14c398b74a52208e8086"
 dependencies = [
- "bstr",
  "csv-core",
- "itoa 0.4.8",
+ "itoa",
  "ryu",
  "serde",
 ]
@@ -339,25 +364,17 @@ dependencies = [
  "memchr",
 ]
 
-[[package]]
-name = "ctor"
-version = "0.1.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c"
-dependencies = [
- "quote",
- "syn",
-]
-
 [[package]]
 name = "dashmap"
-version = "5.2.0"
+version = "5.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c8858831f7781322e539ea39e72449c46b059638250c14344fec8d0aa6e539c"
+checksum = "6943ae99c34386c84a470c499d3414f66502a41340aa895406e0d2e4a207b91d"
 dependencies = [
  "cfg-if",
- "num_cpus",
- "parking_lot",
+ "hashbrown 0.14.0",
+ "lock_api",
+ "once_cell",
+ "parking_lot_core",
 ]
 
 [[package]]
@@ -370,14 +387,14 @@ dependencies = [
  "proc-macro2",
  "quote",
  "rustc_version",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
 name = "diff"
-version = "0.1.12"
+version = "0.1.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499"
+checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
 
 [[package]]
 name = "difflib"
@@ -412,17 +429,11 @@ version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
 
-[[package]]
-name = "drop_bomb"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9bda8e21c04aca2ae33ffc2fd8c23134f3cac46db123ba97bd9d3f3b8a4a85e1"
-
 [[package]]
 name = "either"
-version = "1.6.1"
+version = "1.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
+checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
 
 [[package]]
 name = "encode_unicode"
@@ -438,9 +449,9 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0"
 
 [[package]]
 name = "errno"
-version = "0.3.1"
+version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
+checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f"
 dependencies = [
  "errno-dragonfly",
  "libc",
@@ -459,30 +470,27 @@ dependencies = [
 
 [[package]]
 name = "fastrand"
-version = "1.7.0"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf"
-dependencies = [
- "instant",
-]
+checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764"
 
 [[package]]
 name = "filetime"
-version = "0.2.15"
+version = "0.2.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98"
+checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153"
 dependencies = [
  "cfg-if",
  "libc",
- "redox_syscall",
- "winapi",
+ "redox_syscall 0.2.16",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "fixedbitset"
-version = "0.4.1"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e"
+checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
 
 [[package]]
 name = "foreign-types"
@@ -501,9 +509,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
 
 [[package]]
 name = "getrandom"
-version = "0.2.5"
+version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77"
+checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
 dependencies = [
  "cfg-if",
  "libc",
@@ -512,15 +520,15 @@ dependencies = [
 
 [[package]]
 name = "hashbrown"
-version = "0.11.2"
+version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
 
 [[package]]
 name = "hashbrown"
-version = "0.12.0"
+version = "0.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758"
+checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
 
 [[package]]
 name = "heck"
@@ -542,9 +550,9 @@ dependencies = [
 
 [[package]]
 name = "hermit-abi"
-version = "0.3.1"
+version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b"
 
 [[package]]
 name = "hex"
@@ -566,99 +574,74 @@ checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed"
 
 [[package]]
 name = "indexmap"
-version = "1.8.0"
+version = "1.9.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
 dependencies = [
  "autocfg",
- "hashbrown 0.11.2",
+ "hashbrown 0.12.3",
 ]
 
 [[package]]
 name = "indoc"
-version = "1.0.4"
+version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7906a9fababaeacb774f72410e497a1d18de916322e33797bb2cd29baa23c9e"
-dependencies = [
- "unindent",
-]
+checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306"
 
 [[package]]
 name = "insta"
-version = "1.13.0"
+version = "1.31.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30a7e1911532a662f6b08b68f884080850f2fd9544963c3ab23a5af42bda1eac"
+checksum = "a0770b0a3d4c70567f0d58331f3088b0e4c4f56c9b8d764efe654b4a5d46de3a"
 dependencies = [
  "console",
- "once_cell",
- "serde",
- "serde_json",
- "serde_yaml",
+ "lazy_static",
+ "linked-hash-map",
  "similar",
-]
-
-[[package]]
-name = "instant"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "io-lifetimes"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
-dependencies = [
- "hermit-abi 0.3.1",
- "libc",
- "windows-sys 0.48.0",
+ "yaml-rust",
 ]
 
 [[package]]
 name = "is-terminal"
-version = "0.4.7"
+version = "0.4.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f"
+checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
 dependencies = [
- "hermit-abi 0.3.1",
- "io-lifetimes",
+ "hermit-abi 0.3.2",
  "rustix",
  "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "itertools"
-version = "0.10.3"
+version = "0.10.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
 dependencies = [
  "either",
 ]
 
 [[package]]
 name = "itoa"
-version = "0.4.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
-
-[[package]]
-name = "itoa"
-version = "1.0.1"
+version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
+checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
 
 [[package]]
 name = "jobserver"
-version = "0.1.24"
+version = "0.1.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa"
+checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2"
 dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "jod-thread"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b23360e99b8717f20aaa4598f5a6541efbe30630039fbc7706cf954a87947ae"
+
 [[package]]
 name = "krates"
 version = "0.8.1"
@@ -680,6 +663,12 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "la-arena"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3752f229dcc5a481d60f385fa479ff46818033d881d2d801aa27dffcfb5e8306"
+
 [[package]]
 name = "lazy_static"
 version = "1.4.0"
@@ -688,49 +677,37 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 
 [[package]]
 name = "libc"
-version = "0.2.146"
+version = "0.2.147"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b"
-
-[[package]]
-name = "libloading"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd"
-dependencies = [
- "cfg-if",
- "winapi",
-]
+checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
 
 [[package]]
 name = "linked-hash-map"
-version = "0.5.4"
+version = "0.5.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
+checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.3.8"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
+checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503"
 
 [[package]]
 name = "lock_api"
-version = "0.4.6"
+version = "0.4.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b"
+checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
 dependencies = [
+ "autocfg",
  "scopeguard",
 ]
 
 [[package]]
 name = "log"
-version = "0.4.16"
+version = "0.4.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8"
-dependencies = [
- "cfg-if",
-]
+checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
 
 [[package]]
 name = "maplit"
@@ -746,28 +723,19 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
 
 [[package]]
 name = "memchr"
-version = "2.4.1"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
 
 [[package]]
 name = "memmap2"
-version = "0.5.3"
+version = "0.5.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "057a3db23999c867821a7a59feb06a578fcb03685e983dff90daf9e7d24ac08f"
+checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327"
 dependencies = [
  "libc",
 ]
 
-[[package]]
-name = "memoffset"
-version = "0.6.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
-dependencies = [
- "autocfg",
-]
-
 [[package]]
 name = "miow"
 version = "0.3.7"
@@ -779,95 +747,77 @@ dependencies = [
 
 [[package]]
 name = "miow"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7377f7792b3afb6a3cba68daa54ca23c032137010460d667fda53a8d66be00e"
-dependencies = [
- "windows-sys 0.28.0",
-]
-
-[[package]]
-name = "num_cpus"
-version = "1.13.1"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
+checksum = "52ffbca2f655e33c08be35d87278e5b18b89550a37dbd598c20db92f6a471123"
 dependencies = [
- "hermit-abi 0.1.19",
- "libc",
+ "windows-sys 0.42.0",
 ]
 
 [[package]]
 name = "object"
-version = "0.28.3"
+version = "0.31.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456"
+checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
 name = "once_cell"
-version = "1.10.0"
+version = "1.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
 
 [[package]]
 name = "openssl"
-version = "0.10.38"
+version = "0.10.55"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95"
+checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "cfg-if",
  "foreign-types",
  "libc",
  "once_cell",
+ "openssl-macros",
  "openssl-sys",
 ]
 
 [[package]]
-name = "openssl-sys"
-version = "0.9.72"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb"
-dependencies = [
- "autocfg",
- "cc",
- "libc",
- "pkg-config",
- "vcpkg",
-]
-
-[[package]]
-name = "output_vt100"
-version = "0.1.3"
+name = "openssl-macros"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66"
+checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
 dependencies = [
- "winapi",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.28",
 ]
 
 [[package]]
-name = "parking_lot"
-version = "0.12.0"
+name = "openssl-sys"
+version = "0.9.90"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58"
+checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6"
 dependencies = [
- "lock_api",
- "parking_lot_core",
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
 ]
 
 [[package]]
 name = "parking_lot_core"
-version = "0.9.1"
+version = "0.9.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954"
+checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
 dependencies = [
  "cfg-if",
  "libc",
- "redox_syscall",
+ "redox_syscall 0.3.5",
  "smallvec",
- "windows-sys 0.32.0",
+ "windows-targets 0.48.1",
 ]
 
 [[package]]
@@ -891,9 +841,9 @@ dependencies = [
 
 [[package]]
 name = "petgraph"
-version = "0.6.0"
+version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f"
+checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4"
 dependencies = [
  "fixedbitset",
  "indexmap",
@@ -901,28 +851,29 @@ dependencies = [
 
 [[package]]
 name = "pin-project-lite"
-version = "0.2.8"
+version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c"
+checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57"
 
 [[package]]
 name = "pkg-config"
-version = "0.3.24"
+version = "0.3.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe"
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
 
 [[package]]
 name = "ppv-lite86"
-version = "0.2.16"
+version = "0.2.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
 
 [[package]]
 name = "predicates"
-version = "2.1.1"
+version = "3.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c"
+checksum = "09963355b9f467184c04017ced4a2ba2d75cbcb4e7462690d388233253d4b1a9"
 dependencies = [
+ "anstyle",
  "difflib",
  "itertools",
  "predicates-core",
@@ -930,15 +881,15 @@ dependencies = [
 
 [[package]]
 name = "predicates-core"
-version = "1.0.3"
+version = "1.0.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da1c2388b1513e1b605fcec39a95e0a9e8ef088f71443ef37099fa9ae6673fcb"
+checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174"
 
 [[package]]
 name = "predicates-tree"
-version = "1.0.5"
+version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032"
+checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf"
 dependencies = [
  "predicates-core",
  "termtree",
@@ -946,14 +897,12 @@ dependencies = [
 
 [[package]]
 name = "pretty_assertions"
-version = "1.2.0"
+version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c038cb5319b9c704bf9c227c261d275bfec0ad438118a2787ce47944fb228b"
+checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66"
 dependencies = [
- "ansi_term",
- "ctor",
  "diff",
- "output_vt100",
+ "yansi",
 ]
 
 [[package]]
@@ -979,7 +928,7 @@ dependencies = [
  "proc-macro-error-attr",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "version_check",
 ]
 
@@ -996,72 +945,33 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.36"
+version = "1.0.66"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029"
+checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
 dependencies = [
- "unicode-xid",
+ "unicode-ident",
 ]
 
 [[package]]
 name = "quote"
-version = "1.0.17"
+version = "1.0.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "632d02bff7f874a36f33ea8bb416cd484b90cc66c1194b1a1110d067a7013f58"
+checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965"
 dependencies = [
  "proc-macro2",
 ]
 
-[[package]]
-name = "ra_ap_la-arena"
-version = "0.0.101"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21c3f4e5c46b857f34a8aee25d4af2aad566a0dbcbb5a98ca52a98a0acbc5810"
-
-[[package]]
-name = "ra_ap_limit"
-version = "0.0.101"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cba1fcb5d6c139453b6fe3a87c84f717199dd56fadc3ea9733ddacdff19c057a"
-
-[[package]]
-name = "ra_ap_mbe"
-version = "0.0.101"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d48a68cb9efa0006191edc1348c8d927fc3512adc9815abac54128ed88649ba"
-dependencies = [
- "cov-mark",
- "ra_ap_parser",
- "ra_ap_stdx",
- "ra_ap_syntax",
- "ra_ap_tt",
- "rustc-hash",
- "smallvec",
- "tracing",
-]
-
-[[package]]
-name = "ra_ap_parser"
-version = "0.0.101"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "316660572c84524ad7fd0249a46a09c7f914b1d045599dca7aa334a162f2dc28"
-dependencies = [
- "drop_bomb",
- "ra_ap_limit",
- "rustc-ap-rustc_lexer",
-]
-
 [[package]]
 name = "ra_ap_paths"
-version = "0.0.101"
+version = "0.0.166"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b7fac9cfaa364b61dcef319aec940e2923e0c92b51d8a367beff32363398be9"
+checksum = "47853bc3cbcc022b1e2d8a03b385728a6b4bf2d76379674ae2fbc558456aa824"
 
 [[package]]
 name = "ra_ap_proc_macro_api"
-version = "0.0.101"
+version = "0.0.166"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ef863eb566f943b0d371b35d8f0c99069dd06640f051b82757495002a51a289"
+checksum = "56310b6f0292a217719714b1e04e930073cf4a8b74a78f92908225581d1451cf"
 dependencies = [
  "memmap2",
  "object",
@@ -1073,85 +983,43 @@ dependencies = [
  "serde_json",
  "snap",
  "tracing",
-]
-
-[[package]]
-name = "ra_ap_proc_macro_srv"
-version = "0.0.101"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb1da12089c6f31e47ea7ad2aaa2f402d208858b981152f72e9a1e4c882d06da"
-dependencies = [
- "libloading",
- "memmap2",
- "object",
- "ra_ap_mbe",
- "ra_ap_paths",
- "ra_ap_proc_macro_api",
- "ra_ap_tt",
+ "triomphe",
 ]
 
 [[package]]
 name = "ra_ap_profile"
-version = "0.0.101"
+version = "0.0.166"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b22ca6c944c41dd71418787ef7495912b9030687eca8966b0baf98ba4c5bf909"
+checksum = "171b058e1e245c5a9fb0d9cca67fb477b993e0d6ffe507076eb7dba052435666"
 dependencies = [
  "cfg-if",
  "countme",
+ "la-arena",
  "libc",
  "once_cell",
  "perf-event",
- "ra_ap_la-arena",
  "winapi",
 ]
 
 [[package]]
 name = "ra_ap_stdx"
-version = "0.0.101"
+version = "0.0.166"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdbacb76788cce7f166536b794c4d2708c074ac8e204775a9cdf08bf08a62407"
+checksum = "b84673a6890eee1ef44baa2a8ee5ee3b7e53ca45f9b4f6f8beb4c2dfe18e00a2"
 dependencies = [
  "always-assert",
+ "crossbeam-channel",
+ "jod-thread",
  "libc",
- "miow 0.4.0",
+ "miow 0.5.0",
  "winapi",
 ]
 
-[[package]]
-name = "ra_ap_syntax"
-version = "0.0.101"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2798466eb83fe96d1458b5c58dbcad05e1ce2547e171af6acc70f97f62a70b71"
-dependencies = [
- "cov-mark",
- "indexmap",
- "itertools",
- "once_cell",
- "ra_ap_parser",
- "ra_ap_profile",
- "ra_ap_stdx",
- "ra_ap_text_edit",
- "rowan",
- "rustc-ap-rustc_lexer",
- "rustc-hash",
- "smol_str",
-]
-
-[[package]]
-name = "ra_ap_text_edit"
-version = "0.0.101"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "489ace8df1433cd8dade69ed524d11ba7849762abc6abfaa0118dacadb951eab"
-dependencies = [
- "itertools",
- "text-size",
-]
-
 [[package]]
 name = "ra_ap_tt"
-version = "0.0.101"
+version = "0.0.166"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a704a0589e9ecd1bd001e5be249bf7673308c9f33c00db26f2fdf644e36d556"
+checksum = "c570c3aca3afb046736abf1672dc9eab31e75de0ff43ac41bd46af7982240dc7"
 dependencies = [
  "ra_ap_stdx",
  "smol_str",
@@ -1180,69 +1048,47 @@ dependencies = [
 
 [[package]]
 name = "rand_core"
-version = "0.6.3"
+version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
 dependencies = [
  "getrandom",
 ]
 
 [[package]]
 name = "redox_syscall"
-version = "0.2.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ae183fc1b06c149f0c1793e1eb447c8b04bfe46d48e9e48bfb8d2d7ed64ecf0"
-dependencies = [
- "bitflags",
-]
-
-[[package]]
-name = "redox_users"
-version = "0.4.2"
+version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7776223e2696f1aa4c6b0170e83212f47296a00424305117d013dfe86fb0fe55"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
 dependencies = [
- "getrandom",
- "redox_syscall",
- "thiserror",
+ "bitflags 1.3.2",
 ]
 
 [[package]]
-name = "regex-automata"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
-
-[[package]]
-name = "remove_dir_all"
-version = "0.5.3"
+name = "redox_syscall"
+version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
 dependencies = [
- "winapi",
+ "bitflags 1.3.2",
 ]
 
 [[package]]
-name = "rowan"
-version = "0.15.4"
+name = "redox_users"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4c1112d7b23c800be3a0dae244886b71d96b1461b57b31b56e4c679acbe614f"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
 dependencies = [
- "countme",
- "hashbrown 0.12.0",
- "memoffset",
- "rustc-hash",
- "text-size",
+ "getrandom",
+ "redox_syscall 0.2.16",
+ "thiserror",
 ]
 
 [[package]]
-name = "rustc-ap-rustc_lexer"
-version = "725.0.0"
+name = "regex-automata"
+version = "0.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f950742ef8a203aa7661aad3ab880438ddeb7f95d4b837c30d65db1a2c5df68e"
-dependencies = [
- "unicode-xid",
-]
+checksum = "b7b6d6190b7594385f61bd3911cd1be99dfddcfc365a4160cc2ab5bff4aed294"
 
 [[package]]
 name = "rustc-hash"
@@ -1261,13 +1107,12 @@ dependencies = [
 
 [[package]]
 name = "rustix"
-version = "0.37.20"
+version = "0.38.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0"
+checksum = "1ee020b1716f0a80e2ace9b03441a749e402e86712f15f16fe8a8f75afac732f"
 dependencies = [
- "bitflags",
+ "bitflags 2.3.3",
  "errno",
- "io-lifetimes",
  "libc",
  "linux-raw-sys",
  "windows-sys 0.48.0",
@@ -1281,20 +1126,20 @@ checksum = "8ebf2755dbb7825d6215fa58eb885419385d62d29a5bba66eda6dce2655043d9"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
 name = "rustversion"
-version = "1.0.12"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06"
+checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
 
 [[package]]
 name = "ryu"
-version = "1.0.9"
+version = "1.0.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f"
+checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
 
 [[package]]
 name = "same-file"
@@ -1307,60 +1152,48 @@ dependencies = [
 
 [[package]]
 name = "scopeguard"
-version = "1.1.0"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
 
 [[package]]
 name = "semver"
-version = "1.0.6"
+version = "1.0.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d"
+checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "serde"
-version = "1.0.136"
+version = "1.0.181"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789"
+checksum = "6d3e73c93c3240c0bda063c239298e633114c69a888c3e37ca8bb33f343e9890"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.136"
+version = "1.0.181"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9"
+checksum = "be02f6cb0cd3a5ec20bbcfbcbd749f57daddb1a0882dc2e46a6c236c90b977ed"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.28",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.79"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95"
-dependencies = [
- "itoa 1.0.1",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "serde_yaml"
-version = "0.8.23"
+version = "1.0.104"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0"
+checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c"
 dependencies = [
- "indexmap",
+ "itoa",
  "ryu",
  "serde",
- "yaml-rust",
 ]
 
 [[package]]
@@ -1371,30 +1204,30 @@ checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f"
 
 [[package]]
 name = "similar"
-version = "2.1.0"
+version = "2.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e24979f63a11545f5f2c60141afe249d4f19f84581ea2138065e400941d83d3"
+checksum = "420acb44afdae038210c99e69aae24109f32f15500aa708e81d46c9f29d55fcf"
 
 [[package]]
 name = "smallvec"
-version = "1.8.0"
+version = "1.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83"
+checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
 
 [[package]]
 name = "smol_str"
-version = "0.1.21"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61d15c83e300cce35b7c8cd39ff567c1ef42dde6d4a1a38dbdbf9a59902261bd"
+checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "snap"
-version = "1.0.5"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45456094d1983e2ee2a18fdfebce3189fa451699d0502cb8e3b49dba5ba41451"
+checksum = "5e9f0ab6ef7eb7353d9119c170a436d1bf248eea575ac42d19d12f4e34130831"
 
 [[package]]
 name = "spdx"
@@ -1432,32 +1265,48 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
 name = "syn"
-version = "1.0.89"
+version = "1.0.109"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
 dependencies = [
  "proc-macro2",
  "quote",
- "unicode-xid",
+ "unicode-ident",
 ]
 
+[[package]]
+name = "syn"
+version = "2.0.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "tap"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
+
 [[package]]
 name = "tempfile"
-version = "3.3.0"
+version = "3.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4"
+checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998"
 dependencies = [
  "cfg-if",
  "fastrand",
- "libc",
- "redox_syscall",
- "remove_dir_all",
- "winapi",
+ "redox_syscall 0.3.5",
+ "rustix",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -1473,34 +1322,18 @@ dependencies = [
 
 [[package]]
 name = "termcolor"
-version = "1.1.3"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
+checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
 dependencies = [
  "winapi-util",
 ]
 
-[[package]]
-name = "terminal_size"
-version = "0.1.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df"
-dependencies = [
- "libc",
- "winapi",
-]
-
 [[package]]
 name = "termtree"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b"
-
-[[package]]
-name = "text-size"
-version = "1.1.0"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "288cb548dbe72b652243ea797201f3d481a0609a967980fcc5b2315ea811560a"
+checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76"
 
 [[package]]
 name = "textwrap"
@@ -1513,22 +1346,22 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "1.0.30"
+version = "1.0.44"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417"
+checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.30"
+version = "1.0.44"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b"
+checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.28",
 ]
 
 [[package]]
@@ -1545,9 +1378,9 @@ dependencies = [
 
 [[package]]
 name = "tracing"
-version = "0.1.32"
+version = "0.1.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
 dependencies = [
  "cfg-if",
  "pin-project-lite",
@@ -1557,47 +1390,47 @@ dependencies = [
 
 [[package]]
 name = "tracing-attributes"
-version = "0.1.20"
+version = "0.1.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b"
+checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.28",
 ]
 
 [[package]]
 name = "tracing-core"
-version = "0.1.23"
+version = "0.1.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa31669fa42c09c34d94d8165dd2012e8ff3c66aca50f3bb226b68f216f2706c"
+checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
 dependencies = [
- "lazy_static",
+ "once_cell",
 ]
 
 [[package]]
-name = "unicode-segmentation"
-version = "1.9.0"
+name = "triomphe"
+version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99"
+checksum = "0eee8098afad3fb0c54a9007aab6804558410503ad676d4633f9c2559a00ac0f"
 
 [[package]]
-name = "unicode-width"
-version = "0.1.9"
+name = "unicode-ident"
+version = "1.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
+checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
 
 [[package]]
-name = "unicode-xid"
-version = "0.2.2"
+name = "unicode-segmentation"
+version = "1.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
+checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
 
 [[package]]
-name = "unindent"
-version = "0.1.8"
+name = "unicode-width"
+version = "0.1.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "514672a55d7380da379785a4d70ca8386c8883ff7eaae877be4d2081cebe73d8"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
 
 [[package]]
 name = "vcpkg"
@@ -1628,30 +1461,29 @@ dependencies = [
 
 [[package]]
 name = "walkdir"
-version = "2.3.2"
+version = "2.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
 dependencies = [
  "same-file",
- "winapi",
  "winapi-util",
 ]
 
 [[package]]
 name = "wasi"
-version = "0.10.2+wasi-snapshot-preview1"
+version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
 [[package]]
 name = "which"
-version = "4.2.5"
+version = "4.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae"
+checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
 dependencies = [
  "either",
- "lazy_static",
  "libc",
+ "once_cell",
 ]
 
 [[package]]
@@ -1687,28 +1519,26 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
 [[package]]
 name = "windows-sys"
-version = "0.28.0"
+version = "0.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82ca39602d5cbfa692c4b67e3bcbb2751477355141c1ed434c94da4186836ff6"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
 dependencies = [
- "windows_aarch64_msvc 0.28.0",
- "windows_i686_gnu 0.28.0",
- "windows_i686_msvc 0.28.0",
- "windows_x86_64_gnu 0.28.0",
- "windows_x86_64_msvc 0.28.0",
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
 ]
 
 [[package]]
 name = "windows-sys"
-version = "0.32.0"
+version = "0.45.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
 dependencies = [
- "windows_aarch64_msvc 0.32.0",
- "windows_i686_gnu 0.32.0",
- "windows_i686_msvc 0.32.0",
- "windows_x86_64_gnu 0.32.0",
- "windows_x86_64_msvc 0.32.0",
+ "windows-targets 0.42.2",
 ]
 
 [[package]]
@@ -1717,41 +1547,56 @@ version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
 dependencies = [
- "windows-targets",
+ "windows-targets 0.48.1",
 ]
 
 [[package]]
 name = "windows-targets"
-version = "0.48.0"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
 dependencies = [
- "windows_aarch64_gnullvm",
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.0",
  "windows_aarch64_msvc 0.48.0",
  "windows_i686_gnu 0.48.0",
  "windows_i686_msvc 0.48.0",
  "windows_x86_64_gnu 0.48.0",
- "windows_x86_64_gnullvm",
+ "windows_x86_64_gnullvm 0.48.0",
  "windows_x86_64_msvc 0.48.0",
 ]
 
 [[package]]
 name = "windows_aarch64_gnullvm"
-version = "0.48.0"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
 
 [[package]]
-name = "windows_aarch64_msvc"
-version = "0.28.0"
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52695a41e536859d5308cc613b4a022261a274390b25bd29dfff4bf08505f3c2"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
 
 [[package]]
 name = "windows_aarch64_msvc"
-version = "0.32.0"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
 
 [[package]]
 name = "windows_aarch64_msvc"
@@ -1761,15 +1606,9 @@ checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
 
 [[package]]
 name = "windows_i686_gnu"
-version = "0.28.0"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f54725ac23affef038fecb177de6c9bf065787c2f432f79e3c373da92f3e1d8a"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.32.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
 
 [[package]]
 name = "windows_i686_gnu"
@@ -1779,15 +1618,9 @@ checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
 
 [[package]]
 name = "windows_i686_msvc"
-version = "0.28.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51d5158a43cc43623c0729d1ad6647e62fa384a3d135fd15108d37c683461f64"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.32.0"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
 
 [[package]]
 name = "windows_i686_msvc"
@@ -1797,15 +1630,9 @@ checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
 
 [[package]]
 name = "windows_x86_64_gnu"
-version = "0.28.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc31f409f565611535130cfe7ee8e6655d3fa99c1c61013981e491921b5ce954"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.32.0"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
 
 [[package]]
 name = "windows_x86_64_gnu"
@@ -1815,21 +1642,21 @@ checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
-version = "0.48.0"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
 
 [[package]]
-name = "windows_x86_64_msvc"
-version = "0.28.0"
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f2b8c7cbd3bfdddd9ab98769f9746a7fad1bca236554cd032b78d768bc0e89f"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
 
 [[package]]
 name = "windows_x86_64_msvc"
-version = "0.32.0"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
 
 [[package]]
 name = "windows_x86_64_msvc"
@@ -1845,3 +1672,9 @@ checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
 dependencies = [
  "linked-hash-map",
 ]
+
+[[package]]
+name = "yansi"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
diff --git a/Cargo.toml b/Cargo.toml
index 989eeb6..e99b28f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -9,45 +9,44 @@ keywords = ["competitive", "cli", "windows"]
 categories = ["command-line-utilities", "development-tools::cargo-plugins"]
 
 [dependencies]
-anyhow = "1.0.56"
+anyhow = "1.0.72"
 atty = "0.2.14"
-camino = { version = "1.0.7", features = ["serde1"] }
+camino = { version = "1.1.6", features = ["serde1"] }
 cargo-util = "0.1.2"
 cargo_metadata = "0.14.2"
-cfg-expr = "0.9.0"
+cfg-expr = "0.9.1"
 derive_more = "0.99.17"
 dirs-next = "2.0.0"
-fixedbitset = "0.4.1"
+fixedbitset = "0.4.2"
 if_chain = "1.0.2"
-indoc = "1.0.4"
-itertools = "0.10.3"
+indoc = "1.0.9"
+itertools = "0.10.5"
 krates = "0.8.1"
 maplit = "1.0.2"
-once_cell = "1.10.0"
-petgraph = "0.6.0"
+petgraph = "0.6.3"
 prettytable-rs = "0.10.0"
-proc-macro2 = { version = "1.0.36", features = ["span-locations"] }
-quote = "1.0.17"
-ra_ap_paths = "=0.0.101"
-ra_ap_proc_macro_api = "=0.0.101"
-ra_ap_proc_macro_srv = "=0.0.101"
-ra_ap_tt = "=0.0.101"
+proc-macro2 = { version = "1.0.66", features = ["span-locations"] }
+quote = "1.0.32"
+ra_ap_paths = "=0.0.166"
+ra_ap_proc_macro_api = "=0.0.166"
+ra_ap_tt = "=0.0.166"
 rand = "0.8.5"
 rustminify = "0.1.0"
-semver = { version = "1.0.6", features = ["serde"] }
-serde = { version = "1.0.136", features = ["derive"] }
-serde_json = "1.0.79"
-smol_str = { version = "0.1.21", features = ["serde"] }
-spdx = "0.6.0"
+semver = { version = "1.0.18", features = ["serde"] }
+serde = { version = "1.0.181", features = ["derive"] }
+serde_json = "1.0.104"
+spdx = "0.6.2"
 structopt = "0.3.26"
-syn = { version = "1.0.89", features = ["extra-traits", "full", "parsing", "visit"] }
-tempfile = "3.3.0"
-termcolor = "1.1.3"
+syn = { version = "1.0.109", features = ["extra-traits", "full", "parsing", "visit"] }
+tap = "1.0.1"
+tempfile = "3.7.0"
+termcolor = "1.2.0"
 toml_edit = "0.5.0"
-which = "4.2.5"
+which = "4.4.0"
 
 [dev-dependencies]
-assert_cmd = "2.0.4"
-insta = "1.13.0"
+assert_cmd = "2.0.12"
+insta = "1.31.0"
 md5 = "0.7.0"
-pretty_assertions = "1.2.0"
+once_cell = "1.18.0"
+pretty_assertions = "1.4.0"
diff --git a/src/lib.rs b/src/lib.rs
index cc62837..89ce55e 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -29,13 +29,12 @@ use petgraph::{
 };
 use prettytable::{cell, format::FormatBuilder, row, Table};
 use quote::quote;
-use ra_ap_paths::{AbsPath, AbsPathBuf};
-use ra_ap_proc_macro_srv as proc_macro_srv;
 use std::{
     cmp,
     collections::{BTreeMap, BTreeSet, HashMap, HashSet},
     fmt::Debug,
     path::{Path, PathBuf},
+    rc::Rc,
     str::FromStr,
 };
 use structopt::{clap::AppSettings, StructOpt};
@@ -69,8 +68,6 @@ pub enum Opt {
         )
     )]
     Equip(OptEquip),
-    #[structopt(setting(AppSettings::Hidden))]
-    RustAnalyzerProcMacro {},
 }
 
 #[derive(StructOpt, Debug)]
@@ -153,9 +150,17 @@ pub struct OptEquip {
     )]
     mine: Vec<User>,
 
+    /// [Deprecated] Alias for `--toolchain-for-udeps`
+    #[structopt(long, value_name("TOOLCHAIN"), conflicts_with("toolchain_for_udeps"))]
+    toolchain: Option<String>,
+
     /// `nightly` toolchain for `cargo-udeps`
     #[structopt(long, value_name("TOOLCHAIN"), default_value("nightly"))]
-    toolchain: String,
+    toolchain_for_udeps: String,
+
+    /// Toolchain for expanding procedural macros
+    #[structopt(long, value_name("TOOLCHAIN"))]
+    toolchain_for_proc_macro_srv: Option<String>,
 
     /// Expand the libraries to the module
     #[structopt(long, value_name("MODULE_PATH"), default_value("crate::__cargo_equip"))]
@@ -352,7 +357,6 @@ impl FromStr for Minify {
 
 pub struct Context<'a> {
     pub cwd: PathBuf,
-    pub cargo_equip_exe: AbsPathBuf,
     pub cache_dir: PathBuf,
     pub shell: &'a mut Shell,
 }
@@ -411,11 +415,7 @@ static CODINGAME_CRATES: &[&str] = &[
 ];
 
 pub fn run(opt: Opt, ctx: Context<'_>) -> anyhow::Result<()> {
-    let opt = match opt {
-        Opt::Equip(opt) => opt,
-        Opt::RustAnalyzerProcMacro {} => return proc_macro_srv::cli::run().map_err(Into::into),
-    };
-    let OptEquip {
+    let Opt::Equip(OptEquip {
         src,
         lib,
         bin,
@@ -425,7 +425,9 @@ pub fn run(opt: Opt, ctx: Context<'_>) -> anyhow::Result<()> {
         exclude_atcoder_crates,
         exclude_codingame_crates,
         mine,
-        toolchain,
+        toolchain: deprecated_toolchain_opt,
+        toolchain_for_udeps,
+        toolchain_for_proc_macro_srv,
         mod_path: CrateSinglePath(cargo_equip_mod_name),
         remove,
         minify,
@@ -437,7 +439,7 @@ pub fn run(opt: Opt, ctx: Context<'_>) -> anyhow::Result<()> {
         resolve_cfgs: deprecated_resolve_cfgs_flag,
         rustfmt: deprecated_rustfmt_flag,
         check: deprecated_check_flag,
-    } = opt;
+    }) = opt;
 
     let minify = match (minify, deprecated_oneline_opt) {
         (Minify::None, oneline) => oneline,
@@ -455,13 +457,19 @@ pub fn run(opt: Opt, ctx: Context<'_>) -> anyhow::Result<()> {
         exclude
     };
 
+    let toolchain_for_udeps = deprecated_toolchain_opt
+        .as_ref()
+        .unwrap_or(&toolchain_for_udeps);
+
     let Context {
         cwd,
-        cargo_equip_exe,
         cache_dir,
         shell,
     } = ctx;
 
+    if deprecated_toolchain_opt.is_some() {
+        shell.warn("`--toolchain` was renamed to `--toolchain-for-udeps`")?;
+    }
     if deprecated_resolve_cfgs_flag {
         shell.warn("`--resolve-cfgs` is deprecated. `#[cfg(..)]`s are resolved by default")?;
     }
@@ -496,7 +504,7 @@ pub fn run(opt: Opt, ctx: Context<'_>) -> anyhow::Result<()> {
         let unused_deps = &if root.is_lib() {
             hashset!()
         } else {
-            match cargo_udeps::cargo_udeps(root_package, root, &toolchain, shell) {
+            match cargo_udeps::cargo_udeps(root_package, root, toolchain_for_udeps, shell) {
                 Ok(unused_deps) => unused_deps,
                 Err(warning) => {
                     shell.warn(warning)?;
@@ -556,7 +564,7 @@ pub fn run(opt: Opt, ctx: Context<'_>) -> anyhow::Result<()> {
         &remove,
         minify,
         !no_rustfmt,
-        &cargo_equip_exe,
+        toolchain_for_proc_macro_srv.as_deref(),
         &cache_dir,
         shell,
     )
@@ -593,45 +601,60 @@ fn bundle(
     remove: &[Remove],
     minify: Minify,
     rustfmt: bool,
-    cargo_equip_exe: &AbsPath,
+    toolchain_for_proc_macro_srv: Option<&str>,
     cache_dir: &Path,
     shell: &mut Shell,
 ) -> anyhow::Result<String> {
     let cargo_check_message_format_json = |toolchain: &str, shell: &mut Shell| -> _ {
         let (package, krate) = root_crate.split();
         workspace::cargo_check_message_format_json(toolchain, metadata, package, krate, shell)
+            .map(Rc::new)
     };
 
-    let cargo_messages_for_out_dirs = &libs_to_bundle
-        .keys()
-        .any(|p| metadata[p].has_custom_build())
-        .then(|| {
-            let toolchain = &toolchain::active_toolchain(root_crate.package().manifest_dir())?;
-            cargo_check_message_format_json(toolchain, shell)
-        })
-        .unwrap_or_else(|| Ok(vec![]))?;
+    let active_toolchain = &*toolchain::active_toolchain(root_crate.package().manifest_dir())?;
+    let toolchain_for_proc_macro_srv = toolchain_for_proc_macro_srv.unwrap_or(active_toolchain);
 
+    let has_custom_build = libs_to_bundle
+        .keys()
+        .any(|p| metadata[p].has_custom_build());
     let has_proc_macro = libs_to_bundle.keys().any(|p| metadata[p].has_proc_macro());
 
-    let cargo_messages_for_proc_macro_dll_paths = &has_proc_macro
-        .then(|| {
-            let toolchain = toolchain::find_toolchain_compatible_with_ra(
+    let (cargo_messages_for_out_dirs, cargo_messages_for_proc_macro_dll_paths) =
+        if has_custom_build && has_proc_macro && active_toolchain == toolchain_for_proc_macro_srv {
+            let cargo_messages = cargo_check_message_format_json(active_toolchain, shell)?;
+            (cargo_messages.clone(), Some(cargo_messages))
+        } else {
+            let cargo_messages_for_out_dirs = has_custom_build
+                .then(|| cargo_check_message_format_json(active_toolchain, shell))
+                .unwrap_or_else(|| Ok(Default::default()))?;
+
+            let cargo_messages_for_proc_macro_dll_paths = has_proc_macro
+                .then(|| cargo_check_message_format_json(toolchain_for_proc_macro_srv, shell))
+                .transpose()?;
+
+            (
+                cargo_messages_for_out_dirs,
+                cargo_messages_for_proc_macro_dll_paths,
+            )
+        };
+
+    let out_dirs = workspace::list_out_dirs(metadata, &cargo_messages_for_out_dirs);
+
+    let macro_expander = cargo_messages_for_proc_macro_dll_paths
+        .as_ref()
+        .map(|cargo_messages_for_proc_macro_dll_paths| {
+            let proc_macro_srv_exe = &toolchain::find_rust_analyzer_proc_macro_srv(
                 root_crate.package().manifest_dir(),
-                shell,
+                toolchain_for_proc_macro_srv,
             )?;
-            let msgs = cargo_check_message_format_json(&toolchain, shell)?;
-            Ok::<_, anyhow::Error>(msgs)
-        })
-        .unwrap_or_else(|| Ok(vec![]))?;
 
-    let out_dirs = workspace::list_out_dirs(metadata, cargo_messages_for_out_dirs);
-    let proc_macro_crate_dylibs =
-        &ra_proc_macro::list_proc_macro_dylibs(cargo_messages_for_proc_macro_dll_paths, |p| {
-            libs_to_bundle.contains_key(p)
-        });
+            let proc_macro_crate_dylibs = &ra_proc_macro::list_proc_macro_dylibs(
+                cargo_messages_for_proc_macro_dll_paths,
+                |p| libs_to_bundle.contains_key(p),
+            );
 
-    let macro_expander = has_proc_macro
-        .then(|| ProcMacroExpander::spawn(cargo_equip_exe, proc_macro_crate_dylibs))
+            ProcMacroExpander::spawn(proc_macro_srv_exe, proc_macro_crate_dylibs)
+        })
         .transpose()?;
 
     let proc_macro_names = macro_expander
diff --git a/src/main.rs b/src/main.rs
index 4164a67..197f4e2 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,10 +1,9 @@
 #![forbid(unsafe_code)]
 #![warn(rust_2018_idioms)]
 
-use anyhow::{anyhow, Context as _};
+use anyhow::Context as _;
 use cargo_equip::{shell::Shell, Context, Opt};
-use ra_ap_paths::AbsPathBuf;
-use std::{convert::TryFrom as _, env};
+use std::env;
 use structopt::{clap, StructOpt};
 
 fn main() {
@@ -15,13 +14,6 @@ fn main() {
 
         let ctx = Context {
             cwd: env::current_dir().with_context(|| "could not get the current direcotry")?,
-            cargo_equip_exe: env::current_exe()
-                .map_err(anyhow::Error::from)
-                .and_then(|p| {
-                    AbsPathBuf::try_from(p)
-                        .map_err(|p| anyhow!("`{}` is not an absolute path", p.display()))
-                })
-                .with_context(|| "could not get the current executable")?,
             cache_dir: dirs_next::cache_dir()
                 .with_context(|| "could not find the cache directory")?
                 .join("cargo-equip"),
diff --git a/src/ra_proc_macro.rs b/src/ra_proc_macro.rs
index 8c7d8e0..87f4c4f 100644
--- a/src/ra_proc_macro.rs
+++ b/src/ra_proc_macro.rs
@@ -1,4 +1,4 @@
-use anyhow::{anyhow, bail, Context as _};
+use anyhow::{anyhow, Context as _};
 use cargo_metadata as cm;
 use itertools::chain;
 use maplit::btreemap;
@@ -7,8 +7,11 @@ use ra_ap_proc_macro_api::{
     msg::PanicMessage, MacroDylib, ProcMacro, ProcMacroKind, ProcMacroServer,
 };
 use ra_ap_tt::{self as tt, DelimiterKind, Leaf, TokenId};
+use semver::Version;
 use std::collections::{BTreeMap, BTreeSet};
 
+pub(crate) const MSRV: Version = Version::new(1, 64, 0);
+
 pub(crate) fn list_proc_macro_dylibs<P: FnMut(&cm::PackageId) -> bool>(
     cargo_messages: &[cm::Message],
     mut filter: P,
@@ -43,25 +46,21 @@ pub struct ProcMacroExpander<'msg> {
 
 impl<'msg> ProcMacroExpander<'msg> {
     pub(crate) fn spawn(
-        cargo_equip_exe: &AbsPath,
+        proc_macro_srv_exe: &AbsPath,
         dylib_paths: &BTreeMap<&'msg cm::PackageId, &'msg AbsPath>,
     ) -> anyhow::Result<Self> {
-        let server =
-            ProcMacroServer::spawn(cargo_equip_exe.to_path_buf(), ["rust-analyzer-proc-macro"])?;
+        let server = ProcMacroServer::spawn(proc_macro_srv_exe.to_path_buf())?;
 
         let mut custom_derive = btreemap!();
         let mut func_like = btreemap!();
         let mut attr = btreemap!();
 
         for (&package_id, dylib_path) in dylib_paths {
-            let result = MacroDylib::new(dylib_path.to_path_buf())
-                .map_err(anyhow::Error::from)
-                .and_then(|d| server.load_dylib(d).map_err(|e| anyhow!("{}", e)))
+            let proc_macros = server
+                .load_dylib(MacroDylib::new(dylib_path.to_path_buf()))
+                .map_err(|e| anyhow!("{}", e))
                 .with_context(|| "rust-analyzer error")?;
-            let proc_macros = match result {
-                Ok(proc_macros) => proc_macros,
-                Err(err) => bail!("{}", err),
-            };
+
             for proc_macro in proc_macros {
                 match proc_macro.kind() {
                     ProcMacroKind::CustomDerive => &mut custom_derive,
@@ -146,7 +145,7 @@ impl<'msg> ProcMacroExpander<'msg> {
     }
 }
 
-fn from_proc_macro2_group(group: &proc_macro2::Group) -> tt::Subtree {
+fn from_proc_macro2_group(group: &proc_macro2::Group) -> tt::Subtree<TokenId> {
     return tt::Subtree {
         delimiter: from_proc_macro2_delimiter(group.delimiter()),
         token_trees: group
@@ -156,23 +155,20 @@ fn from_proc_macro2_group(group: &proc_macro2::Group) -> tt::Subtree {
             .collect(),
     };
 
-    fn from_proc_macro2_delimiter(delimiter: proc_macro2::Delimiter) -> Option<tt::Delimiter> {
-        return match delimiter {
-            proc_macro2::Delimiter::Parenthesis => Some(from(DelimiterKind::Parenthesis)),
-            proc_macro2::Delimiter::Brace => Some(from(DelimiterKind::Brace)),
-            proc_macro2::Delimiter::Bracket => Some(from(DelimiterKind::Bracket)),
-            proc_macro2::Delimiter::None => None,
-        };
-
-        fn from(kind: DelimiterKind) -> tt::Delimiter {
-            tt::Delimiter {
-                id: TokenId::unspecified(),
-                kind,
-            }
+    fn from_proc_macro2_delimiter(delimiter: proc_macro2::Delimiter) -> tt::Delimiter<TokenId> {
+        tt::Delimiter {
+            open: TokenId::unspecified(),
+            close: TokenId::unspecified(),
+            kind: match delimiter {
+                proc_macro2::Delimiter::Parenthesis => DelimiterKind::Parenthesis,
+                proc_macro2::Delimiter::Brace => DelimiterKind::Brace,
+                proc_macro2::Delimiter::Bracket => DelimiterKind::Bracket,
+                proc_macro2::Delimiter::None => DelimiterKind::Invisible,
+            },
         }
     }
 
-    fn from_proc_macro2_token_tree(tt: &proc_macro2::TokenTree) -> tt::TokenTree {
+    fn from_proc_macro2_token_tree(tt: &proc_macro2::TokenTree) -> tt::TokenTree<TokenId> {
         match tt {
             proc_macro2::TokenTree::Group(g) => from_proc_macro2_group(g).into(),
             proc_macro2::TokenTree::Ident(i) => Leaf::from(from_proc_macro2_ident(i)).into(),
@@ -181,18 +177,18 @@ fn from_proc_macro2_group(group: &proc_macro2::Group) -> tt::Subtree {
         }
     }
 
-    fn from_proc_macro2_ident(ident: &proc_macro2::Ident) -> tt::Ident {
+    fn from_proc_macro2_ident(ident: &proc_macro2::Ident) -> tt::Ident<TokenId> {
         tt::Ident {
             text: ident.to_string().into(),
-            id: TokenId::unspecified(),
+            span: TokenId::unspecified(),
         }
     }
 
-    fn from_proc_macro2_punct(punct: &proc_macro2::Punct) -> tt::Punct {
+    fn from_proc_macro2_punct(punct: &proc_macro2::Punct) -> tt::Punct<TokenId> {
         tt::Punct {
             char: punct.as_char(),
             spacing: from_proc_macro2_spacing(punct.spacing()),
-            id: TokenId::unspecified(),
+            span: TokenId::unspecified(),
         }
     }
 
@@ -203,30 +199,30 @@ fn from_proc_macro2_group(group: &proc_macro2::Group) -> tt::Subtree {
         }
     }
 
-    fn from_proc_macro2_literal(lit: &proc_macro2::Literal) -> tt::Literal {
+    fn from_proc_macro2_literal(lit: &proc_macro2::Literal) -> tt::Literal<TokenId> {
         tt::Literal {
             text: lit.to_string().into(),
-            id: TokenId::unspecified(),
+            span: TokenId::unspecified(),
         }
     }
 }
 
-fn from_ra_subtree(subtree: &tt::Subtree) -> proc_macro2::Group {
+fn from_ra_subtree(subtree: &tt::Subtree<impl Copy>) -> proc_macro2::Group {
     return proc_macro2::Group::new(
         from_ra_delimiter(subtree.delimiter),
         subtree.token_trees.iter().map(from_ra_token_tree).collect(),
     );
 
-    fn from_ra_delimiter(delimiter: Option<tt::Delimiter>) -> proc_macro2::Delimiter {
-        match delimiter.map(|tt::Delimiter { kind, .. }| kind) {
-            Some(DelimiterKind::Parenthesis) => proc_macro2::Delimiter::Parenthesis,
-            Some(DelimiterKind::Brace) => proc_macro2::Delimiter::Brace,
-            Some(DelimiterKind::Bracket) => proc_macro2::Delimiter::Bracket,
-            None => proc_macro2::Delimiter::None,
+    fn from_ra_delimiter(delimiter: tt::Delimiter<impl Copy>) -> proc_macro2::Delimiter {
+        match delimiter.kind {
+            DelimiterKind::Parenthesis => proc_macro2::Delimiter::Parenthesis,
+            DelimiterKind::Brace => proc_macro2::Delimiter::Brace,
+            DelimiterKind::Bracket => proc_macro2::Delimiter::Bracket,
+            DelimiterKind::Invisible => proc_macro2::Delimiter::None,
         }
     }
 
-    fn from_ra_token_tree(tt: &tt::TokenTree) -> proc_macro2::TokenTree {
+    fn from_ra_token_tree(tt: &tt::TokenTree<impl Copy>) -> proc_macro2::TokenTree {
         match tt {
             tt::TokenTree::Subtree(s) => proc_macro2::TokenTree::Group(from_ra_subtree(s)),
             tt::TokenTree::Leaf(Leaf::Ident(i)) => from_ra_ident(i).into(),
@@ -235,11 +231,11 @@ fn from_ra_subtree(subtree: &tt::Subtree) -> proc_macro2::Group {
         }
     }
 
-    fn from_ra_ident(ident: &tt::Ident) -> proc_macro2::Ident {
+    fn from_ra_ident(ident: &tt::Ident<impl Copy>) -> proc_macro2::Ident {
         proc_macro2::Ident::new(&ident.text, proc_macro2::Span::call_site())
     }
 
-    fn from_ra_punct(punct: tt::Punct) -> proc_macro2::Punct {
+    fn from_ra_punct(punct: tt::Punct<impl Copy>) -> proc_macro2::Punct {
         proc_macro2::Punct::new(punct.char, from_ra_spacing(punct.spacing))
     }
 
@@ -250,7 +246,7 @@ fn from_ra_subtree(subtree: &tt::Subtree) -> proc_macro2::Group {
         }
     }
 
-    fn from_ra_literal(lit: &tt::Literal) -> proc_macro2::Literal {
+    fn from_ra_literal(lit: &tt::Literal<impl Copy>) -> proc_macro2::Literal {
         syn::parse_str(&lit.text)
             .unwrap_or_else(|e| panic!("could not parse {:?} as a literal: {}", &lit.text, e))
     }
diff --git a/src/toolchain.rs b/src/toolchain.rs
index d4a312b..b3f5d7b 100644
--- a/src/toolchain.rs
+++ b/src/toolchain.rs
@@ -1,14 +1,14 @@
-use crate::{process::ProcessBuilderExt as _, shell::Shell};
-use anyhow::{anyhow, Context as _};
+use crate::process::ProcessBuilderExt as _;
+use anyhow::{anyhow, ensure};
 use camino::Utf8Path;
 use cargo_util::ProcessBuilder;
-use once_cell::sync::Lazy;
-use semver::{Version, VersionReq};
+use ra_ap_paths::AbsPathBuf;
+use semver::Version;
 use std::{
-    collections::BTreeMap,
     env,
     path::{Path, PathBuf},
 };
+use tap::Pipe as _;
 
 pub(crate) fn rustup_exe(cwd: impl AsRef<Path>) -> anyhow::Result<PathBuf> {
     which::which_in("rustup", env::var_os("PATH"), cwd).map_err(|_| anyhow!("`rustup` not found"))
@@ -22,85 +22,49 @@ pub(crate) fn active_toolchain(manifest_dir: &Utf8Path) -> anyhow::Result<String
     Ok(output.split_whitespace().next().unwrap().to_owned())
 }
 
-pub(crate) fn find_toolchain_compatible_with_ra(
+pub(crate) fn find_rust_analyzer_proc_macro_srv(
     manifest_dir: &Utf8Path,
-    shell: &mut Shell,
-) -> anyhow::Result<String> {
-    let rustup_exe = &rustup_exe(manifest_dir)?;
-
-    let cargo_version = |toolchain| -> _ {
-        ProcessBuilder::new(rustup_exe)
-            .args(&["run", toolchain, "cargo", "-V"])
-            .cwd(manifest_dir)
-            .read_stdout::<String>()
-            .and_then(|o| extract_version(&o))
-    };
-
-    let active_toolchain = active_toolchain(manifest_dir)?;
-    let active_version = cargo_version(&active_toolchain)?;
-    if GEQ_1_48_0.matches(&active_version) {
-        return Ok(active_toolchain);
-    }
+    toolchain: &str,
+) -> anyhow::Result<AbsPathBuf> {
+    use crate::ra_proc_macro::MSRV;
 
-    let status = &mut |toolchain: &str| -> _ {
-        shell.status(
-            "Using",
-            format!("`{}` for compiling `proc-macro` crates", toolchain),
-        )
-    };
+    let rustup_exe = &rustup_exe(manifest_dir)?;
 
-    let output = ProcessBuilder::new(rustup_exe)
-        .args(&["toolchain", "list"])
+    let version = ProcessBuilder::new(rustup_exe)
+        .args(&["run", toolchain, "rustc", "-V"])
         .cwd(manifest_dir)
-        .read_stdout::<String>()?;
-    let toolchains = output
-        .lines()
-        .map(|s| s.split_whitespace().next().unwrap())
-        .collect::<Vec<_>>();
+        .read_stdout::<String>()?
+        .pipe(|output| {
+            output
+                .split_ascii_whitespace()
+                .nth(1)
+                .and_then(|output| output.parse::<Version>().ok())
+                .ok_or_else(|| anyhow!("Could not parse {output:?}"))
+        })?;
 
-    let compatible_toolchains = &mut output
-        .lines()
-        .map(|s| s.split_whitespace().next().unwrap())
-        .flat_map(|toolchain| {
-            let version = toolchain.split('-').next().unwrap().parse().ok()?;
-            GEQ_1_48_0.matches(&version).then_some((version, toolchain))
-        })
-        .collect::<BTreeMap<Version, _>>();
+    ensure!(
+        version >= MSRV,
+        "Rust ≧{MSRV} is required for expanding procedural macros. Specify one with \
+         `--toolchain-for-proc-macro-srv`",
+    );
 
-    if let Some((_, toolchain)) = compatible_toolchains
-        .iter()
-        .next()
-        .filter(|(v, _)| v.to_string() == "1.48.0")
-    {
-        status(toolchain)?;
-        return Ok((*toolchain).to_owned());
-    }
+    let rust_analyzer_proc_macro_srv = ProcessBuilder::new(rustup_exe)
+        .args(&["run", toolchain, "rustc", "--print", "sysroot"])
+        .cwd(manifest_dir)
+        .read_stdout::<String>()?
+        .pipe_deref(str::trim_end)
+        .pipe(Path::new)
+        .join("libexec")
+        .join("rust-analyzer-proc-macro-srv")
+        .with_extension(env::consts::EXE_EXTENSION)
+        .pipe(AbsPathBuf::assert);
 
-    for toolchain in toolchains {
-        if ["stable-", "beta-", "nightly-"]
-            .iter()
-            .any(|p| toolchain.starts_with(p))
-        {
-            let version = cargo_version(toolchain)?;
-            if GEQ_1_48_0.matches(&version) {
-                compatible_toolchains.insert(version, toolchain);
-            }
-        }
+    if !Path::new(rust_analyzer_proc_macro_srv.as_os_str()).try_exists()? {
+        anyhow::bail!(
+            "{} does not exist. Run `rustup component add rust-analyzer --toolchain {toolchain}`",
+            Path::new(rust_analyzer_proc_macro_srv.as_os_str()).display(),
+        );
     }
 
-    let (_, compatible_toolchain) = compatible_toolchains
-        .iter()
-        .next()
-        .with_context(|| format!("no toolchain found that satisfies {}", *GEQ_1_48_0))?;
-    status(compatible_toolchain)?;
-    return Ok((*compatible_toolchain).to_owned());
-
-    static GEQ_1_48_0: Lazy<VersionReq> = Lazy::new(|| ">=1.48.0".parse().unwrap());
-
-    fn extract_version(output: &str) -> anyhow::Result<Version> {
-        output
-            .split_whitespace()
-            .find_map(|s| s.parse::<Version>().ok())
-            .with_context(|| format!("could not parse {:?}", output))
-    }
+    Ok(rust_analyzer_proc_macro_srv)
 }


Test patch:
diff --git a/tests/md5-snapshots.rs b/tests/md5-snapshots.rs
index d7cde8b..8df5dca 100644
--- a/tests/md5-snapshots.rs
+++ b/tests/md5-snapshots.rs
@@ -1,7 +1,6 @@
 use cargo_equip::shell::Shell;
 use insta::assert_snapshot;
 use once_cell::sync::Lazy;
-use ra_ap_paths::AbsPathBuf;
 use std::{
     cell::RefCell,
     env,
@@ -83,7 +82,6 @@ fn snapshot_test(name: &str, _: MutexGuard<'_, ()>) -> anyhow::Result<String> {
             cwd: Path::new(env!("CARGO_MANIFEST_DIR"))
                 .join("tests")
                 .join("solutions"),
-            cargo_equip_exe: AbsPathBuf::assert(env!("CARGO_BIN_EXE_cargo-equip").into()),
             cache_dir: Path::new(env!("CARGO_MANIFEST_DIR"))
                 .join("tests")
                 .join("cache"),
diff --git a/tests/snapshots/help_snapshot__long.snap b/tests/snapshots/help_snapshot__long.snap
index d49e089..58387b7 100644
--- a/tests/snapshots/help_snapshot__long.snap
+++ b/tests/snapshots/help_snapshot__long.snap
@@ -1,7 +1,7 @@
 ---
 source: tests/help-snapshot.rs
+assertion_line: 7
 expression: "run(\"--help\")?"
-
 ---
 cargo-equip <version>
 Ryo Yamashita <qryxip@gmail.com>
@@ -18,27 +18,27 @@ USAGE:
     cargo equip [OPTIONS] --src <PATH>
 
 OPTIONS:
-        --src <PATH>                       
+        --src <PATH>                                  
             Bundle the lib/bin/example target and its dependencies.
             
             This option is intended to be used from editors such as VSCode. Use `--lib`, `--bin` or `--example` for
             normal usage.
-        --lib                              
+        --lib                                         
             Bundle the library and its dependencies
 
-        --bin <NAME>                       
+        --bin <NAME>                                  
             Bundle the binary and its dependencies
 
-        --example <NAME>                   
+        --example <NAME>                              
             Bundle the binary example and its dependencies
 
-        --manifest-path <PATH>             
+        --manifest-path <PATH>                        
             Path to Cargo.toml
 
-        --exclude <SPEC>...                
+        --exclude <SPEC>...                           
             Exclude library crates from bundling
 
-        --exclude-atcoder-crates           
+        --exclude-atcoder-crates                      
             Alias for:
             --exclude https://github.com/rust-lang/crates.io-index#alga:0.9.3
                       https://github.com/rust-lang/crates.io-index#ascii:1.0.0
@@ -82,7 +82,7 @@ OPTIONS:
                       https://github.com/rust-lang/crates.io-index#text_io:0.1.8
                       https://github.com/rust-lang/crates.io-index#whiteread:0.5.0
              
-        --exclude-codingame-crates         
+        --exclude-codingame-crates                    
             Alias for:
             --exclude https://github.com/rust-lang/crates.io-index#chrono:0.4.19
                       https://github.com/rust-lang/crates.io-index#itertools:0.10.0
@@ -91,20 +91,26 @@ OPTIONS:
                       https://github.com/rust-lang/crates.io-index#regex:1.4.5
                       https://github.com/rust-lang/crates.io-index#time:0.2.26
              
-        --mine <DOMAIN_AND_USERNAME>...    
+        --mine <DOMAIN_AND_USERNAME>...               
             Do not include license and copyright notices for the users.
             
             Supported formats:
             * github.com/{username}
             * gitlab.com/{username}
              
-        --toolchain <TOOLCHAIN>            
+        --toolchain <TOOLCHAIN>                       
+            [Deprecated] Alias for `--toolchain-for-udeps`
+
+        --toolchain-for-udeps <TOOLCHAIN>             
             `nightly` toolchain for `cargo-udeps` [default: nightly]
 
-        --mod-path <MODULE_PATH>           
+        --toolchain-for-proc-macro-srv <TOOLCHAIN>    
+            Toolchain for expanding procedural macros
+
+        --mod-path <MODULE_PATH>                      
             Expand the libraries to the module [default: crate::__cargo_equip]
 
-        --remove <REMOVE>...               
+        --remove <REMOVE>...                          
             Removes
             * doc comments (`//! ..`, `/// ..`, `/** .. */`, `#[doc = ".."]`) with `--remove docs`.
             * comments (`// ..`, `/* .. */`) with `--remove comments`.
@@ -128,41 +134,41 @@ OPTIONS:
             }
             ```
              
-        --minify <MINIFY>                  
+        --minify <MINIFY>
             Minifies
             - each expaned library with `--minify lib`.
             - the whole code with `--minify all`.
             
             Not that the minification function is incomplete. Unnecessary spaces may be inserted.
              
-        --no-resolve-cfgs                  
+        --no-resolve-cfgs                             
             Do not resolve `cfg(..)`s
 
-        --no-rustfmt                       
+        --no-rustfmt                                  
             Do not format the output before emitting
 
-        --no-check                         
+        --no-check                                    
             Do not check the output before emitting
 
-    -o, --output <PATH>                    
+    -o, --output <PATH>                               
             Write to the file instead of STDOUT
 
-        --oneline <MINIFY>                 
+        --oneline <MINIFY>
             [Deprecated] Alias for `--minify` [default: none]  [possible values: none, libs, all]
 
-        --resolve-cfgs                     
+        --resolve-cfgs                                
             [Deprecated] No-op
 
-        --rustfmt                          
+        --rustfmt                                     
             [Deprecated] No-op
 
-        --check                            
+        --check                                       
             [Deprecated] No-op
 
-    -h, --help                             
+    -h, --help                                        
             Prints help information
 
-    -V, --version                          
+    -V, --version                                     
             Prints version information
 
 
diff --git a/tests/snapshots/help_snapshot__short.snap b/tests/snapshots/help_snapshot__short.snap
index d67daea..45cbfb1 100644
--- a/tests/snapshots/help_snapshot__short.snap
+++ b/tests/snapshots/help_snapshot__short.snap
@@ -1,7 +1,7 @@
 ---
 source: tests/help-snapshot.rs
+assertion_line: 6
 expression: "run(\"-h\")?"
-
 ---
 cargo-equip <version>
 Ryo Yamashita <qryxip@gmail.com>
@@ -18,29 +18,33 @@ USAGE:
     cargo equip [OPTIONS] --src <PATH>
 
 OPTIONS:
-        --src <PATH>                       Bundle the lib/bin/example target and its dependencies
-        --lib                              Bundle the library and its dependencies
-        --bin <NAME>                       Bundle the binary and its dependencies
-        --example <NAME>                   Bundle the binary example and its dependencies
-        --manifest-path <PATH>             Path to Cargo.toml
-        --exclude <SPEC>...                Exclude library crates from bundling
-        --exclude-atcoder-crates           Alias for `--exclude {crates available on AtCoder}`
-        --exclude-codingame-crates         Alias for `--exclude {crates available on CodinGame}`
-        --mine <DOMAIN_AND_USERNAME>...    Do not include license and copyright notices for the users
-        --toolchain <TOOLCHAIN>            `nightly` toolchain for `cargo-udeps` [default: nightly]
-        --mod-path <MODULE_PATH>           Expand the libraries to the module [default: crate::__cargo_equip]
-        --remove <REMOVE>...               Remove some part [possible values: docs, comments]
-        --minify <MINIFY>                  Minify part of the output before emitting [default: none]  [possible values:
-                                           none, libs, all]
-        --no-resolve-cfgs                  Do not resolve `cfg(..)`s
-        --no-rustfmt                       Do not format the output before emitting
-        --no-check                         Do not check the output before emitting
-    -o, --output <PATH>                    Write to the file instead of STDOUT
-        --oneline <MINIFY>                 [Deprecated] Alias for `--minify` [default: none]  [possible values: none,
-                                           libs, all]
-        --resolve-cfgs                     [Deprecated] No-op
-        --rustfmt                          [Deprecated] No-op
-        --check                            [Deprecated] No-op
-    -h, --help                             Prints help information
-    -V, --version                          Prints version information
+        --src <PATH>                                  Bundle the lib/bin/example target and its dependencies
+        --lib                                         Bundle the library and its dependencies
+        --bin <NAME>                                  Bundle the binary and its dependencies
+        --example <NAME>                              Bundle the binary example and its dependencies
+        --manifest-path <PATH>                        Path to Cargo.toml
+        --exclude <SPEC>...                           Exclude library crates from bundling
+        --exclude-atcoder-crates                      Alias for `--exclude {crates available on AtCoder}`
+        --exclude-codingame-crates                    Alias for `--exclude {crates available on CodinGame}`
+        --mine <DOMAIN_AND_USERNAME>...               Do not include license and copyright notices for the users
+        --toolchain <TOOLCHAIN>                       [Deprecated] Alias for `--toolchain-for-udeps`
+        --toolchain-for-udeps <TOOLCHAIN>             `nightly` toolchain for `cargo-udeps` [default: nightly]
+        --toolchain-for-proc-macro-srv <TOOLCHAIN>    Toolchain for expanding procedural macros
+        --mod-path <MODULE_PATH>                      Expand the libraries to the module [default: crate::__cargo_equip]
+        --remove <REMOVE>...                          Remove some part [possible values: docs, comments]
+        --minify <MINIFY>
+            Minify part of the output before emitting [default: none]  [possible values: none, libs, all]
+
+        --no-resolve-cfgs                             Do not resolve `cfg(..)`s
+        --no-rustfmt                                  Do not format the output before emitting
+        --no-check                                    Do not check the output before emitting
+    -o, --output <PATH>                               Write to the file instead of STDOUT
+        --oneline <MINIFY>
+            [Deprecated] Alias for `--minify` [default: none]  [possible values: none, libs, all]
+
+        --resolve-cfgs                                [Deprecated] No-op
+        --rustfmt                                     [Deprecated] No-op
+        --check                                       [Deprecated] No-op
+    -h, --help                                        Prints help information
+    -V, --version                                     Prints version information
 
diff --git a/tests/snapshots/md5_snapshots__proconio_with_macro_use.snap b/tests/snapshots/md5_snapshots__proconio_with_macro_use.snap
index 664e22c..47bf49a 100644
--- a/tests/snapshots/md5_snapshots__proconio_with_macro_use.snap
+++ b/tests/snapshots/md5_snapshots__proconio_with_macro_use.snap
@@ -1,6 +1,5 @@
 ---
 source: tests/md5-snapshots.rs
 expression: output
-
 ---
-ba7f077d7cfb8f422c153fac025ad4a0
+3a15e5702a34bf6af2389b30239e9700
diff --git a/tests/snapshots/md5_snapshots__proconio_with_use.snap b/tests/snapshots/md5_snapshots__proconio_with_use.snap
index 180024f..7b4e373 100644
--- a/tests/snapshots/md5_snapshots__proconio_with_use.snap
+++ b/tests/snapshots/md5_snapshots__proconio_with_use.snap
@@ -1,6 +1,5 @@
 ---
 source: tests/md5-snapshots.rs
 expression: output
-
 ---
-d7ecfeca8e79566e0c2db5f9c7215245
+d98226c4ca4d09f9fe0917da90333b5a