summary refs log tree commit diff
path: root/pkgs/development/tools
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/tools')
-rw-r--r--pkgs/development/tools/analysis/frama-c/default.nix3
-rw-r--r--pkgs/development/tools/bacon/default.nix6
-rw-r--r--pkgs/development/tools/electron/default.nix48
-rw-r--r--pkgs/development/tools/flip-link/default.nix6
-rw-r--r--pkgs/development/tools/go-mockery/default.nix4
-rw-r--r--pkgs/development/tools/ijq/default.nix22
-rw-r--r--pkgs/development/tools/misc/clojure-lsp/default.nix5
-rw-r--r--pkgs/development/tools/misc/clojure-lsp/disable-check-toolchain.patch12
-rw-r--r--pkgs/development/tools/misc/hydra/common.nix4
-rw-r--r--pkgs/development/tools/rust/cargo-embed/default.nix6
-rw-r--r--pkgs/development/tools/rust/probe-run/default.nix6
-rw-r--r--pkgs/development/tools/rust/rust-analyzer/default.nix14
-rw-r--r--pkgs/development/tools/rust/rust-analyzer/no-rust-1-53-features.patch673
-rwxr-xr-xpkgs/development/tools/rust/rust-analyzer/update.sh3
-rw-r--r--pkgs/development/tools/zprint/default.nix1
15 files changed, 760 insertions, 53 deletions
diff --git a/pkgs/development/tools/analysis/frama-c/default.nix b/pkgs/development/tools/analysis/frama-c/default.nix
index a10d015e9ff..1079974ae62 100644
--- a/pkgs/development/tools/analysis/frama-c/default.nix
+++ b/pkgs/development/tools/analysis/frama-c/default.nix
@@ -15,6 +15,7 @@ let
     mlgmpidl
     num
     ocamlgraph
+    stdlib-shims
     why3
     yojson
     zarith
@@ -37,7 +38,7 @@ stdenv.mkDerivation rec {
   nativeBuildInputs = [ autoconf wrapGAppsHook ];
 
   buildInputs = with ocamlPackages; [
-    ncurses ocaml findlib ltl2ba ocamlgraph yojson menhirLib camlzip
+    ncurses ocaml findlib ltl2ba ocamlgraph ocamlgraph_gtk yojson menhirLib camlzip
     lablgtk coq graphviz zarith apron why3 mlgmpidl doxygen
     gdk-pixbuf
   ];
diff --git a/pkgs/development/tools/bacon/default.nix b/pkgs/development/tools/bacon/default.nix
index 1cf066e6b49..52f0d29ed60 100644
--- a/pkgs/development/tools/bacon/default.nix
+++ b/pkgs/development/tools/bacon/default.nix
@@ -2,16 +2,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "bacon";
-  version = "1.1.5";
+  version = "1.1.6";
 
   src = fetchFromGitHub {
     owner = "Canop";
     repo = pname;
     rev = "v${version}";
-    sha256 = "0wyx216q9q7y60bnnw4cbpv9zlbnjm2hwq0llkjw60fp3qalj9am";
+    sha256 = "sha256-0/fQhBHkoI/0PhuUDLGfyjytgEEJWSr1P67Rh0vGDnA=";
   };
 
-  cargoSha256 = "1pii5ajl3xgylrm20pkwbd1lk7gv0pshl1cxjfna0l63q56v7f21";
+  cargoSha256 = "sha256-O1jJXnvPLxJmcnf3qpdcpdrogQ7FtjHF8uUxQRWLDyg=";
 
   buildInputs = lib.optional stdenv.isDarwin CoreServices;
 
diff --git a/pkgs/development/tools/electron/default.nix b/pkgs/development/tools/electron/default.nix
index 8377e7c4431..a04905705d4 100644
--- a/pkgs/development/tools/electron/default.nix
+++ b/pkgs/development/tools/electron/default.nix
@@ -95,33 +95,33 @@ rec {
     headers = "01x6a0r2jawjpl09ixgzap3g0z6znj34hsnnhzanavkbds0ri4k6";
   };
 
-  electron_11 = mkElectron "11.4.8" {
-    x86_64-linux = "742cfa025fa64cfa02c4eb8584e9f2f15321b795688a5c1a6597b1e1da1e98e7";
-    x86_64-darwin = "b251b02f70a9a0e63866836c0638200cca05392cdec1b5271ebbe0c016276364";
-    i686-linux = "a7813cfa785e8e9a440db4cfb0d98dcd5ba52041fb018856d9c544a43ae55357";
-    armv7l-linux = "a72e346a569f582fc40e9ebbfd6f6faf5c32dd6e83fdcd5335c46e332dbe5ee6";
-    aarch64-linux = "acd4e32851cc0fdfe1a62df90a6c8b02139e510b7c3212bd4ac57f767e85dfe4";
-    aarch64-darwin = "ee28b1d525ae5be60253430200692f3fe6b4d588921aedd246bfc851014127ea";
-    headers = "0l8pc4grabj641wf1q37bc19w0y9913v4c9s8pbniz7py1a6rpmn";
+  electron_11 = mkElectron "11.4.9" {
+    x86_64-linux = "c18ed2e16e60ca1eddd01ab2e4fff2bbfd9f197ab17b7577155f05687297d7be";
+    x86_64-darwin = "ec34759ae768e55449c23244283c8af3dc5d5ab533d64cea0231be0a0878ebdd";
+    i686-linux = "ef9125268e03f2f1d13c2b2505ba2529af88a8397cad640bd35116caae7ab296";
+    armv7l-linux = "b43c00f4a0b4cf8affa09cedff93066d23d57a6148af383a8fc9f6d25b63d449";
+    aarch64-linux = "3df038538056fc4a918afe07138052b1f53648c411add47c3a18abe8a30e6f71";
+    aarch64-darwin = "acf880cfaea9ca382831df165fa7ef7e0b442c663d5a586cdfe0baa1aea4e17c";
+    headers = "1wfhc22g680pvv85rq8d8lw4vphpr700fmzs3nwxixxnzhp1sb79";
   };
 
-  electron_12 = mkElectron "12.0.11" {
-    x86_64-linux = "e3bac4b81f0d99447f8ff7edf88f2e9941699d30cf1f41a41af7a93b199e805b";
-    x86_64-darwin = "eeee59eb751e0d95538a40c74aa1563ee4485903eb028c462872004cc8dfdabb";
-    i686-linux = "97fe1b7f7414a9cf1416d4a2d61139cc71f50765f48df02b6ccb4c1af62f0d97";
-    armv7l-linux = "c43b28d5d15b303a7643e7d2320f03577e27d90a13f4fa1dc3e14f81630ab62e";
-    aarch64-linux = "b5f17959b8cb55f0557f4a0a37cd99c1c6d1d48fad839402383d9087175b4f44";
-    aarch64-darwin = "e5f88751bfb1344ea2f1345b56e95093ebfa850761b53752fbcf8c6d8de0f824";
-    headers = "11801qplb7s7zs0yjmk4436yp3xg2szn7hzag75v3g026k2ay1xz";
+  electron_12 = mkElectron "12.0.12" {
+    x86_64-linux = "98e7cc5dd3f161c37cbbd9aef90d55c51531a4bad8221a9d1f92e78014758054";
+    x86_64-darwin = "3a39933c1c83406e4ddbce2af193e9a6b7b77f418c4f1d5e7b8f9edc348acd15";
+    i686-linux = "2a06936fa13929342ebb7521d2e3e8b4a7a08ac1d757c0521a047b4cf0a979fc";
+    armv7l-linux = "c0a2c13d99a1152aa6252fd8237207a6f395b70d0890eba5b7209a03beb9a6ec";
+    aarch64-linux = "a92e2eaebab75b93eda0bc523ba9262a32db95c7546c095fee93d39a304521a0";
+    aarch64-darwin = "810a1f36574a2db8d7d4022a042a65cceec3443644487868c5609b16b5dfe29f";
+    headers = "1qis2k8yc7g1klvhiysjrgl5gclx4idxdz60kh8ldrji5a0lgha1";
   };
 
-  electron_13 = mkElectron "13.1.2" {
-    x86_64-linux = "1391bae19ff6446fb56f00ba5597bb92a509b6e808534087c153b9fcebddbeef";
-    x86_64-darwin = "b8c5eca90864ce4a91e1fdb8a932598fad31922407b502eeb868a508fd26347f";
-    i686-linux = "40d6c373b5e77b80285715fb66acb6562ea1d685f6644d463fb427f846f09fdc";
-    armv7l-linux = "ce31a8d455663f6e85ed75fa9ac1007b55d6fd0b9445d9e51e2a103706e49e94";
-    aarch64-linux = "06965ade2aaf4dce78b5d5b075fc09c225d7d83817297338fc26eb4d33ebb289";
-    aarch64-darwin = "dde2b3fd2ac52097481ff5bfd54c358432f7f2402b0b20ae32681ae6e5a4d451";
-    headers = "1qrw1cpj63757c582zzz0gchaq0w0xq1mm5702q34xyv06mh5h93";
+  electron_13 = mkElectron "13.1.3" {
+    x86_64-linux = "33646b1bace221edd636f172b5d3ae391fe519dd6a49aaeef4e50916d636fcfb";
+    x86_64-darwin = "246356862f4e97bdba31d9b0f2dadc45b1d7c689d0762bc27b89251cafcdd14c";
+    i686-linux = "1237ab5043b22f00236d52e12b771778f740fd0d5c06d0f5aee4219afb9b5b38";
+    armv7l-linux = "7106ef6720162d9f38927583968dd9b45f4c678d4bdbe549604aa3b6a40f7f50";
+    aarch64-linux = "3213bb087e6f3a9091c2fe2de13a597a9d122735a996872ba51e17c138148cae";
+    aarch64-darwin = "35bb2b36e73df228c295c5e820ac7f4206b3ea9e546b61e32a4b080fd1f08234";
+    headers = "020xka91w4i5p24i56zlk2i6xsynwwvryh3fim336mmkjryqhqxp";
   };
 }
diff --git a/pkgs/development/tools/flip-link/default.nix b/pkgs/development/tools/flip-link/default.nix
index 697e4fb3536..6e752379a73 100644
--- a/pkgs/development/tools/flip-link/default.nix
+++ b/pkgs/development/tools/flip-link/default.nix
@@ -2,16 +2,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "flip-link";
-  version = "0.1.3";
+  version = "0.1.4";
 
   src = fetchFromGitHub {
     owner = "knurling-rs";
     repo = pname;
     rev = "v${version}";
-    sha256 = "0x6l5aps0aryf3iqiyk969zrq77bm95jvm6f0f5vqqqizxjd3yfl";
+    sha256 = "sha256-LE0cWS6sOb9/VvGloezNnePHGldnpfNTdCFUv3F/nwE=";
   };
 
-  cargoSha256 = "13rgpbwaz2b928rg15lbaszzjymph54pwingxpszp5paihx4iayr";
+  cargoSha256 = "sha256-8WBMF5stMB4JXvYwa5yHVFV+3utDuMFJNTZ4fZFDftw=";
 
   buildInputs = lib.optional stdenv.isDarwin libiconv;
 
diff --git a/pkgs/development/tools/go-mockery/default.nix b/pkgs/development/tools/go-mockery/default.nix
index 347bfeb116a..598ee15a5f3 100644
--- a/pkgs/development/tools/go-mockery/default.nix
+++ b/pkgs/development/tools/go-mockery/default.nix
@@ -2,13 +2,13 @@
 
 buildGoModule rec {
   pname = "go-mockery";
-  version = "2.8.0";
+  version = "2.9.0";
 
   src = fetchFromGitHub {
     owner = "vektra";
     repo = "mockery";
     rev = "v${version}";
-    sha256 = "sha256-sOZig47KKKGJmV9QNCa+TwYCxemeVl6xssfExSaaFjY=";
+    sha256 = "sha256-lR4EhFddP+ae1xpRW82w53yNoBG4RpMHk8w4XFGcli8=";
   };
 
   vendorSha256 = "sha256-//V3ia3YP1hPgC1ipScURZ5uXU4A2keoG6dGuwaPBcA=";
diff --git a/pkgs/development/tools/ijq/default.nix b/pkgs/development/tools/ijq/default.nix
index f3c0b6c7b1b..4165f9bd41c 100644
--- a/pkgs/development/tools/ijq/default.nix
+++ b/pkgs/development/tools/ijq/default.nix
@@ -1,18 +1,26 @@
-{ buildGoModule, fetchgit, lib, jq, makeWrapper }:
+{ buildGoModule, fetchFromSourcehut, lib, jq, installShellFiles, makeWrapper, scdoc }:
 
 buildGoModule rec {
   pname = "ijq";
-  version = "0.3.4";
+  version = "0.3.5";
 
-  src = fetchgit {
-    url = "https://git.sr.ht/~gpanders/ijq";
+  src = fetchFromSourcehut {
+    owner = "~gpanders";
+    repo = pname;
     rev = "v${version}";
-    sha256 = "ZKxEK6SPxEC0S5yXSzITPn0HhpJa4Bcf9X8/N+ZZAeA=";
+    sha256 = "sha256-0xLmjidPxjSkYmLI4lWieT2rswZsWBY/IUXFOrUFAMo=";
   };
 
-  vendorSha256 = "04KlXE2I8ZVDbyo9tBnFskLB6fo5W5/lPzSpo8KGqUU=";
+  vendorSha256 = "sha256-7UuQXnQdlUMC0ZIgHydQ5bZMB5XrE7dhx5+1NI+zFkM=";
 
-  nativeBuildInputs = [ makeWrapper ];
+  nativeBuildInputs = [ installShellFiles makeWrapper scdoc ];
+
+  ldflags = [ "-s" "-w" "-X main.Version=${version}" ];
+
+  postBuild = ''
+    scdoc < ijq.1.scd > ijq.1
+    installManPage ijq.1
+  '';
 
   postInstall = ''
     wrapProgram "$out/bin/ijq" \
diff --git a/pkgs/development/tools/misc/clojure-lsp/default.nix b/pkgs/development/tools/misc/clojure-lsp/default.nix
index 3f51136c65c..8783d217c1f 100644
--- a/pkgs/development/tools/misc/clojure-lsp/default.nix
+++ b/pkgs/development/tools/misc/clojure-lsp/default.nix
@@ -18,6 +18,9 @@ stdenv.mkDerivation rec {
 
   GRAALVM_HOME = graalvm11-ce;
   CLOJURE_LSP_JAR = jar;
+  CLOJURE_LSP_XMX = "-J-Xmx4g";
+
+  patches = lib.optionals stdenv.isDarwin [ ./disable-check-toolchain.patch ];
 
   buildInputs = [ graalvm11-ce ];
 
@@ -52,7 +55,7 @@ stdenv.mkDerivation rec {
     description = "Language Server Protocol (LSP) for Clojure";
     homepage = "https://github.com/clojure-lsp/clojure-lsp";
     license = licenses.mit;
-    maintainers = [ maintainers.ericdallo ];
+    maintainers = with maintainers; [ ericdallo babariviere ];
     platforms = graalvm11-ce.meta.platforms;
   };
 }
diff --git a/pkgs/development/tools/misc/clojure-lsp/disable-check-toolchain.patch b/pkgs/development/tools/misc/clojure-lsp/disable-check-toolchain.patch
new file mode 100644
index 00000000000..402189627c2
--- /dev/null
+++ b/pkgs/development/tools/misc/clojure-lsp/disable-check-toolchain.patch
@@ -0,0 +1,12 @@
+diff --git a/graalvm/native-unix-compile.sh b/graalvm/native-unix-compile.sh
+index ec0e49f..e19a120 100755
+--- a/graalvm/native-unix-compile.sh
++++ b/graalvm/native-unix-compile.sh
+@@ -17,6 +17,7 @@ CLOJURE_LSP_XMX=${CLOJURE_LSP_XMX:-"-J-Xmx4g"}
+ 
+ args=("-jar" "$CLOJURE_LSP_JAR"
+       "-H:+ReportExceptionStackTraces"
++      "-H:-CheckToolchain"
+       "--verbose"
+       "--no-fallback"
+       "--native-image-info"
diff --git a/pkgs/development/tools/misc/hydra/common.nix b/pkgs/development/tools/misc/hydra/common.nix
index 9ad8295c9b9..5b1973c2b9e 100644
--- a/pkgs/development/tools/misc/hydra/common.nix
+++ b/pkgs/development/tools/misc/hydra/common.nix
@@ -1,5 +1,5 @@
 { stdenv, nix, perlPackages, buildEnv
-, makeWrapper, autoconf, automake, libtool, unzip, pkg-config, sqlite, libpqxx
+, makeWrapper, autoconf, automake, libtool, unzip, pkg-config, sqlite, libpqxx_6
 , top-git, mercurial, darcs, subversion, breezy, openssl, bzip2, libxslt
 , perl, postgresql, nukeReferences, git, boehmgc, nlohmann_json
 , docbook_xsl, openssh, gnused, coreutils, findutils, gzip, xz, gnutar
@@ -82,7 +82,7 @@ in stdenv.mkDerivation rec {
   inherit stdenv src version patches;
 
   buildInputs =
-    [ makeWrapper autoconf automake libtool unzip nukeReferences sqlite libpqxx
+    [ makeWrapper autoconf automake libtool unzip nukeReferences sqlite libpqxx_6
       top-git mercurial /*darcs*/ subversion breezy openssl bzip2 libxslt
       perlDeps perl nix
       postgresql # for running the tests
diff --git a/pkgs/development/tools/rust/cargo-embed/default.nix b/pkgs/development/tools/rust/cargo-embed/default.nix
index 4fb994b3ee2..72c67c55e4d 100644
--- a/pkgs/development/tools/rust/cargo-embed/default.nix
+++ b/pkgs/development/tools/rust/cargo-embed/default.nix
@@ -4,16 +4,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "cargo-embed";
-  version = "0.10.1";
+  version = "0.11.0";
 
   src = fetchFromGitHub {
     owner = "probe-rs";
     repo = pname;
     rev = "v${version}";
-    sha256 = "1z8n883cb4jca3phi9x2kwl01xclyr00l8jxgiyd28l2jik78i5k";
+    sha256 = "151zdnv4i0dgkk4w3j2a1sdklcxw07bgqjs7sv6lvkylrx8dfrxa";
   };
 
-  cargoSha256 = "1ir9qngxmja6cm42m40jqbga9mlfjllm23ca26wyigjv3025pi6i";
+  cargoSha256 = "00p2rwqrax99kwadc8bfq8pbcijals2nzpx43wb03kwxl4955wn9";
 
   nativeBuildInputs = [ pkg-config rustfmt ];
   buildInputs = [ libusb1 libftdi1 ];
diff --git a/pkgs/development/tools/rust/probe-run/default.nix b/pkgs/development/tools/rust/probe-run/default.nix
index 336cbef9bae..dcbff79a3c8 100644
--- a/pkgs/development/tools/rust/probe-run/default.nix
+++ b/pkgs/development/tools/rust/probe-run/default.nix
@@ -3,16 +3,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "probe-run";
-  version = "0.2.3";
+  version = "0.2.4";
 
   src = fetchFromGitHub {
     owner = "knurling-rs";
     repo = pname;
     rev = "v${version}";
-    sha256 = "0jvyqynhg2fva29bzj4wrg3f22xpvl1hdf9kqws2c3wdiz9lc8l4";
+    sha256 = "069f4vai1cw69xw3q7xyd81k3rklyb0bs77jfsrwq97vy7b78i92";
   };
 
-  cargoSha256 = "1jijpm4k3py09k9w9a2zj1795r02wsa53r4sxa4ws96d4gkv4x5b";
+  cargoSha256 = "0j5bl1sh3hcx38qckrjlfggsfsczzw2vbb3ks5x59dqakqh5fb7v";
 
   nativeBuildInputs = [ pkg-config ];
   buildInputs = [ libusb1 ]
diff --git a/pkgs/development/tools/rust/rust-analyzer/default.nix b/pkgs/development/tools/rust/rust-analyzer/default.nix
index 8eca1fda2e5..07b00deb9c3 100644
--- a/pkgs/development/tools/rust/rust-analyzer/default.nix
+++ b/pkgs/development/tools/rust/rust-analyzer/default.nix
@@ -1,21 +1,27 @@
 { lib, stdenv, fetchFromGitHub, rustPlatform, CoreServices, cmake
 , libiconv
 , useMimalloc ? false
-, doCheck ? true
+# FIXME: Test doesn't pass under rustc 1.52.1 due to different escaping of `'` in string.
+, doCheck ? false
 }:
 
 rustPlatform.buildRustPackage rec {
   pname = "rust-analyzer-unwrapped";
-  version = "2021-06-07";
-  cargoSha256 = "sha256-TyoCu2Q4Tr2EIWxQcjSxASni4dkeEVsfrF5UN7IVxSs=";
+  version = "2021-06-21";
+  cargoSha256 = "sha256-OpfcxBeNwXSD830Sz3o07kgIdXTbZNNVGpaPeCIGGV8=";
 
   src = fetchFromGitHub {
     owner = "rust-analyzer";
     repo = "rust-analyzer";
     rev = version;
-    sha256 = "sha256-f8jdBL42+bU8KKchkW4fF6+kDBjgpoOZyP5yOYsebBk=";
+    sha256 = "sha256-nL5lSvxpOS+fw4iH/Gnl/DI86T9tUtguOy+wLGRkoeY=";
   };
 
+  patches = [
+    # We have rustc 1.52.1 in nixpkgs.
+    ./no-rust-1-53-features.patch
+  ];
+
   buildAndTestSubdir = "crates/rust-analyzer";
 
   cargoBuildFlags = lib.optional useMimalloc "--features=mimalloc";
diff --git a/pkgs/development/tools/rust/rust-analyzer/no-rust-1-53-features.patch b/pkgs/development/tools/rust/rust-analyzer/no-rust-1-53-features.patch
new file mode 100644
index 00000000000..9fa54e8a903
--- /dev/null
+++ b/pkgs/development/tools/rust/rust-analyzer/no-rust-1-53-features.patch
@@ -0,0 +1,673 @@
+diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs
+index 43162797e..613266e07 100644
+--- a/crates/hir/src/semantics.rs
++++ b/crates/hir/src/semantics.rs
+@@ -51,14 +51,12 @@ impl PathResolution {
+             PathResolution::Def(ModuleDef::BuiltinType(builtin)) => {
+                 Some(TypeNs::BuiltinType((*builtin).into()))
+             }
+-            PathResolution::Def(
+-                ModuleDef::Const(_)
+-                | ModuleDef::Variant(_)
+-                | ModuleDef::Function(_)
+-                | ModuleDef::Module(_)
+-                | ModuleDef::Static(_)
+-                | ModuleDef::Trait(_),
+-            ) => None,
++            PathResolution::Def(ModuleDef::Const(_))
++            | PathResolution::Def(ModuleDef::Variant(_))
++            | PathResolution::Def(ModuleDef::Function(_))
++            | PathResolution::Def(ModuleDef::Module(_))
++            | PathResolution::Def(ModuleDef::Static(_))
++            | PathResolution::Def(ModuleDef::Trait(_)) => None,
+             PathResolution::Def(ModuleDef::TypeAlias(alias)) => {
+                 Some(TypeNs::TypeAliasId((*alias).into()))
+             }
+@@ -67,7 +65,8 @@ impl PathResolution {
+             }
+             PathResolution::TypeParam(param) => Some(TypeNs::GenericParam((*param).into())),
+             PathResolution::SelfType(impl_def) => Some(TypeNs::SelfType((*impl_def).into())),
+-            PathResolution::AssocItem(AssocItem::Const(_) | AssocItem::Function(_)) => None,
++            PathResolution::AssocItem(AssocItem::Const(_))
++            | PathResolution::AssocItem(AssocItem::Function(_)) => None,
+             PathResolution::AssocItem(AssocItem::TypeAlias(alias)) => {
+                 Some(TypeNs::TypeAliasId((*alias).into()))
+             }
+diff --git a/crates/hir_def/src/item_tree/pretty.rs b/crates/hir_def/src/item_tree/pretty.rs
+index e63bc8232..b1e1b70d0 100644
+--- a/crates/hir_def/src/item_tree/pretty.rs
++++ b/crates/hir_def/src/item_tree/pretty.rs
+@@ -63,7 +63,7 @@ impl<'a> Printer<'a> {
+     fn blank(&mut self) {
+         let mut iter = self.buf.chars().rev().fuse();
+         match (iter.next(), iter.next()) {
+-            (Some('\n'), Some('\n') | None) | (None, None) => {}
++            (Some('\n'), Some('\n')) | (Some('\n'), None) | (None, None) => {}
+             (Some('\n'), Some(_)) => {
+                 self.buf.push('\n');
+             }
+@@ -77,7 +77,7 @@ impl<'a> Printer<'a> {
+ 
+     fn whitespace(&mut self) {
+         match self.buf.chars().next_back() {
+-            None | Some('\n' | ' ') => {}
++            None | Some('\n') | Some(' ') => {}
+             _ => self.buf.push(' '),
+         }
+     }
+diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs
+index 927a7b6e8..fc2c50fb8 100644
+--- a/crates/hir_def/src/nameres/collector.rs
++++ b/crates/hir_def/src/nameres/collector.rs
+@@ -1260,7 +1260,7 @@ impl DefCollector<'_> {
+         for directive in &self.unresolved_imports {
+             if let ImportSource::Import { id: import, use_tree } = &directive.import.source {
+                 match (directive.import.path.segments().first(), &directive.import.path.kind) {
+-                    (Some(krate), PathKind::Plain | PathKind::Abs) => {
++                    (Some(krate), PathKind::Plain) | (Some(krate), PathKind::Abs) => {
+                         if diagnosed_extern_crates.contains(krate) {
+                             continue;
+                         }
+diff --git a/crates/hir_def/src/resolver.rs b/crates/hir_def/src/resolver.rs
+index 49c573087..5edd93a2a 100644
+--- a/crates/hir_def/src/resolver.rs
++++ b/crates/hir_def/src/resolver.rs
+@@ -605,7 +605,8 @@ fn to_value_ns(per_ns: PerNs) -> Option<ValueNs> {
+         ModuleDefId::ConstId(it) => ValueNs::ConstId(it),
+         ModuleDefId::StaticId(it) => ValueNs::StaticId(it),
+ 
+-        ModuleDefId::AdtId(AdtId::EnumId(_) | AdtId::UnionId(_))
++        ModuleDefId::AdtId(AdtId::EnumId(_))
++        | ModuleDefId::AdtId(AdtId::UnionId(_))
+         | ModuleDefId::TraitId(_)
+         | ModuleDefId::TypeAliasId(_)
+         | ModuleDefId::BuiltinType(_)
+diff --git a/crates/hir_def/src/visibility.rs b/crates/hir_def/src/visibility.rs
+index aeb1e7726..83500f54e 100644
+--- a/crates/hir_def/src/visibility.rs
++++ b/crates/hir_def/src/visibility.rs
+@@ -172,8 +172,9 @@ impl Visibility {
+     /// visible in unrelated modules).
+     pub(crate) fn max(self, other: Visibility, def_map: &DefMap) -> Option<Visibility> {
+         match (self, other) {
+-            (Visibility::Module(_) | Visibility::Public, Visibility::Public)
+-            | (Visibility::Public, Visibility::Module(_)) => Some(Visibility::Public),
++            (Visibility::Module(_), Visibility::Public)
++            | (Visibility::Public, Visibility::Module(_))
++            | (Visibility::Public, Visibility::Public) => Some(Visibility::Public),
+             (Visibility::Module(mod_a), Visibility::Module(mod_b)) => {
+                 if mod_a.krate != mod_b.krate {
+                     return None;
+diff --git a/crates/hir_expand/src/hygiene.rs b/crates/hir_expand/src/hygiene.rs
+index 848522411..05c6c3fb1 100644
+--- a/crates/hir_expand/src/hygiene.rs
++++ b/crates/hir_expand/src/hygiene.rs
+@@ -146,11 +146,10 @@ impl HygieneInfo {
+                 (&self.macro_arg.1, InFile::new(loc.kind.file_id(), arg_start))
+             }
+             mbe::Origin::Def => match (&*self.macro_def, self.def_start) {
+-                (
+-                    TokenExpander::MacroDef { def_site_token_map, .. }
+-                    | TokenExpander::MacroRules { def_site_token_map, .. },
+-                    Some(tt),
+-                ) => (def_site_token_map, tt),
++                (TokenExpander::MacroDef { def_site_token_map, .. }, Some(tt))
++                | (TokenExpander::MacroRules { def_site_token_map, .. }, Some(tt)) => {
++                    (def_site_token_map, tt)
++                }
+                 _ => panic!("`Origin::Def` used with non-`macro_rules!` macro"),
+             },
+         };
+diff --git a/crates/hir_expand/src/lib.rs b/crates/hir_expand/src/lib.rs
+index c31426d7c..33107aa24 100644
+--- a/crates/hir_expand/src/lib.rs
++++ b/crates/hir_expand/src/lib.rs
+@@ -368,11 +368,10 @@ impl ExpansionInfo {
+         let (token_map, tt) = match origin {
+             mbe::Origin::Call => (&self.macro_arg.1, self.arg.clone()),
+             mbe::Origin::Def => match (&*self.macro_def, self.def.as_ref()) {
+-                (
+-                    db::TokenExpander::MacroRules { def_site_token_map, .. }
+-                    | db::TokenExpander::MacroDef { def_site_token_map, .. },
+-                    Some(tt),
+-                ) => (def_site_token_map, tt.as_ref().map(|tt| tt.syntax().clone())),
++                (db::TokenExpander::MacroRules { def_site_token_map, .. }, Some(tt))
++                | (db::TokenExpander::MacroDef { def_site_token_map, .. }, Some(tt)) => {
++                    (def_site_token_map, tt.as_ref().map(|tt| tt.syntax().clone()))
++                }
+                 _ => panic!("`Origin::Def` used with non-`macro_rules!` macro"),
+             },
+         };
+diff --git a/crates/hir_ty/src/consteval.rs b/crates/hir_ty/src/consteval.rs
+index ab1afce08..6f0bf8f8c 100644
+--- a/crates/hir_ty/src/consteval.rs
++++ b/crates/hir_ty/src/consteval.rs
+@@ -38,7 +38,8 @@ impl ConstExt for Const {
+ // FIXME: support more than just evaluating literals
+ pub fn eval_usize(expr: &Expr) -> Option<u64> {
+     match expr {
+-        Expr::Literal(Literal::Uint(v, None | Some(BuiltinUint::Usize))) => (*v).try_into().ok(),
++        Expr::Literal(Literal::Uint(v, None))
++        | Expr::Literal(Literal::Uint(v, Some(BuiltinUint::Usize))) => (*v).try_into().ok(),
+         _ => None,
+     }
+ }
+diff --git a/crates/hir_ty/src/diagnostics/match_check/deconstruct_pat.rs b/crates/hir_ty/src/diagnostics/match_check/deconstruct_pat.rs
+index e3d640a79..471cd4921 100644
+--- a/crates/hir_ty/src/diagnostics/match_check/deconstruct_pat.rs
++++ b/crates/hir_ty/src/diagnostics/match_check/deconstruct_pat.rs
+@@ -84,7 +84,10 @@ impl IntRange {
+     #[inline]
+     fn is_integral(ty: &Ty) -> bool {
+         match ty.kind(&Interner) {
+-            TyKind::Scalar(Scalar::Char | Scalar::Int(_) | Scalar::Uint(_) | Scalar::Bool) => true,
++            TyKind::Scalar(Scalar::Char)
++            | TyKind::Scalar(Scalar::Int(_))
++            | TyKind::Scalar(Scalar::Uint(_))
++            | TyKind::Scalar(Scalar::Bool) => true,
+             _ => false,
+         }
+     }
+@@ -378,7 +381,7 @@ impl Constructor {
+             // Wildcards cover anything
+             (_, Wildcard) => true,
+             // The missing ctors are not covered by anything in the matrix except wildcards.
+-            (Missing | Wildcard, _) => false,
++            (Missing, _) | (Wildcard, _) => false,
+ 
+             (Single, Single) => true,
+             (Variant(self_id), Variant(other_id)) => self_id == other_id,
+@@ -520,7 +523,7 @@ impl SplitWildcard {
+                 }
+             }
+             TyKind::Scalar(Scalar::Char) => unhandled(),
+-            TyKind::Scalar(Scalar::Int(..) | Scalar::Uint(..)) => unhandled(),
++            TyKind::Scalar(Scalar::Int(..)) | TyKind::Scalar(Scalar::Uint(..)) => unhandled(),
+             TyKind::Never if !cx.feature_exhaustive_patterns() && !pcx.is_top_level => {
+                 smallvec![NonExhaustive]
+             }
+diff --git a/crates/hir_ty/src/infer/coerce.rs b/crates/hir_ty/src/infer/coerce.rs
+index 7be914451..4b7f31521 100644
+--- a/crates/hir_ty/src/infer/coerce.rs
++++ b/crates/hir_ty/src/infer/coerce.rs
+@@ -47,7 +47,10 @@ impl<'a> InferenceContext<'a> {
+         // pointers to have a chance at getting a match. See
+         // https://github.com/rust-lang/rust/blob/7b805396bf46dce972692a6846ce2ad8481c5f85/src/librustc_typeck/check/coercion.rs#L877-L916
+         let sig = match (ty1.kind(&Interner), ty2.kind(&Interner)) {
+-            (TyKind::FnDef(..) | TyKind::Closure(..), TyKind::FnDef(..) | TyKind::Closure(..)) => {
++            (TyKind::FnDef(..), TyKind::FnDef(..))
++            | (TyKind::Closure(..), TyKind::FnDef(..))
++            | (TyKind::FnDef(..), TyKind::Closure(..))
++            | (TyKind::Closure(..), TyKind::Closure(..)) => {
+                 // FIXME: we're ignoring safety here. To be more correct, if we have one FnDef and one Closure,
+                 // we should be coercing the closure to a fn pointer of the safety of the FnDef
+                 cov_mark::hit!(coerce_fn_reification);
+@@ -445,7 +448,8 @@ fn safe_to_unsafe_fn_ty(fn_ty: FnPointer) -> FnPointer {
+ 
+ fn coerce_mutabilities(from: Mutability, to: Mutability) -> Result<(), TypeError> {
+     match (from, to) {
+-        (Mutability::Mut, Mutability::Mut | Mutability::Not)
++        (Mutability::Mut, Mutability::Mut)
++        | (Mutability::Mut, Mutability::Not)
+         | (Mutability::Not, Mutability::Not) => Ok(()),
+         (Mutability::Not, Mutability::Mut) => Err(TypeError),
+     }
+diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs
+index c3a5b979f..346e94128 100644
+--- a/crates/hir_ty/src/infer/expr.rs
++++ b/crates/hir_ty/src/infer/expr.rs
+@@ -593,11 +593,11 @@ impl<'a> InferenceContext<'a> {
+                     UnaryOp::Neg => {
+                         match inner_ty.kind(&Interner) {
+                             // Fast path for builtins
+-                            TyKind::Scalar(Scalar::Int(_) | Scalar::Uint(_) | Scalar::Float(_))
+-                            | TyKind::InferenceVar(
+-                                _,
+-                                TyVariableKind::Integer | TyVariableKind::Float,
+-                            ) => inner_ty,
++                            TyKind::Scalar(Scalar::Int(_))
++                            | TyKind::Scalar(Scalar::Uint(_))
++                            | TyKind::Scalar(Scalar::Float(_))
++                            | TyKind::InferenceVar(_, TyVariableKind::Integer)
++                            | TyKind::InferenceVar(_, TyVariableKind::Float) => inner_ty,
+                             // Otherwise we resolve via the std::ops::Neg trait
+                             _ => self
+                                 .resolve_associated_type(inner_ty, self.resolve_ops_neg_output()),
+@@ -606,7 +606,9 @@ impl<'a> InferenceContext<'a> {
+                     UnaryOp::Not => {
+                         match inner_ty.kind(&Interner) {
+                             // Fast path for builtins
+-                            TyKind::Scalar(Scalar::Bool | Scalar::Int(_) | Scalar::Uint(_))
++                            TyKind::Scalar(Scalar::Bool)
++                            | TyKind::Scalar(Scalar::Int(_))
++                            | TyKind::Scalar(Scalar::Uint(_))
+                             | TyKind::InferenceVar(_, TyVariableKind::Integer) => inner_ty,
+                             // Otherwise we resolve via the std::ops::Not trait
+                             _ => self
+@@ -733,7 +735,7 @@ impl<'a> InferenceContext<'a> {
+             Expr::Array(array) => {
+                 let elem_ty =
+                     match expected.to_option(&mut self.table).as_ref().map(|t| t.kind(&Interner)) {
+-                        Some(TyKind::Array(st, _) | TyKind::Slice(st)) => st.clone(),
++                        Some(TyKind::Array(st, _)) | Some(TyKind::Slice(st)) => st.clone(),
+                         _ => self.table.new_type_var(),
+                     };
+ 
+diff --git a/crates/hir_ty/src/infer/pat.rs b/crates/hir_ty/src/infer/pat.rs
+index c79ed91ea..80ecd4ea9 100644
+--- a/crates/hir_ty/src/infer/pat.rs
++++ b/crates/hir_ty/src/infer/pat.rs
+@@ -297,11 +297,10 @@ fn is_non_ref_pat(body: &hir_def::body::Body, pat: PatId) -> bool {
+             Expr::Literal(Literal::String(..)) => false,
+             _ => true,
+         },
+-        Pat::Bind {
+-            mode: BindingAnnotation::Mutable | BindingAnnotation::Unannotated,
+-            subpat: Some(subpat),
+-            ..
+-        } => is_non_ref_pat(body, *subpat),
++        Pat::Bind { mode: BindingAnnotation::Mutable, subpat: Some(subpat), .. }
++        | Pat::Bind { mode: BindingAnnotation::Unannotated, subpat: Some(subpat), .. } => {
++            is_non_ref_pat(body, *subpat)
++        }
+         Pat::Wild | Pat::Bind { .. } | Pat::Ref { .. } | Pat::Box { .. } | Pat::Missing => false,
+     }
+ }
+diff --git a/crates/hir_ty/src/op.rs b/crates/hir_ty/src/op.rs
+index 5ef6342d5..0222de2bc 100644
+--- a/crates/hir_ty/src/op.rs
++++ b/crates/hir_ty/src/op.rs
+@@ -8,15 +8,17 @@ pub(super) fn binary_op_return_ty(op: BinaryOp, lhs_ty: Ty, rhs_ty: Ty) -> Ty {
+     match op {
+         BinaryOp::LogicOp(_) | BinaryOp::CmpOp(_) => TyKind::Scalar(Scalar::Bool).intern(&Interner),
+         BinaryOp::Assignment { .. } => TyBuilder::unit(),
+-        BinaryOp::ArithOp(ArithOp::Shl | ArithOp::Shr) => {
++        BinaryOp::ArithOp(ArithOp::Shl) | BinaryOp::ArithOp(ArithOp::Shr) => {
+             // all integer combinations are valid here
+             if matches!(
+                 lhs_ty.kind(&Interner),
+-                TyKind::Scalar(Scalar::Int(_) | Scalar::Uint(_))
++                TyKind::Scalar(Scalar::Int(_))
++                    | TyKind::Scalar(Scalar::Uint(_))
+                     | TyKind::InferenceVar(_, TyVariableKind::Integer)
+             ) && matches!(
+                 rhs_ty.kind(&Interner),
+-                TyKind::Scalar(Scalar::Int(_) | Scalar::Uint(_))
++                TyKind::Scalar(Scalar::Int(_))
++                    | TyKind::Scalar(Scalar::Uint(_))
+                     | TyKind::InferenceVar(_, TyVariableKind::Integer)
+             ) {
+                 lhs_ty
+@@ -30,15 +32,15 @@ pub(super) fn binary_op_return_ty(op: BinaryOp, lhs_ty: Ty, rhs_ty: Ty) -> Ty {
+             | (TyKind::Scalar(Scalar::Uint(_)), TyKind::Scalar(Scalar::Uint(_)))
+             | (TyKind::Scalar(Scalar::Float(_)), TyKind::Scalar(Scalar::Float(_))) => rhs_ty,
+             // ({int}, int) | ({int}, uint)
+-            (
+-                TyKind::InferenceVar(_, TyVariableKind::Integer),
+-                TyKind::Scalar(Scalar::Int(_) | Scalar::Uint(_)),
+-            ) => rhs_ty,
++            (TyKind::InferenceVar(_, TyVariableKind::Integer), TyKind::Scalar(Scalar::Int(_)))
++            | (TyKind::InferenceVar(_, TyVariableKind::Integer), TyKind::Scalar(Scalar::Uint(_))) => {
++                rhs_ty
++            }
+             // (int, {int}) | (uint, {int})
+-            (
+-                TyKind::Scalar(Scalar::Int(_) | Scalar::Uint(_)),
+-                TyKind::InferenceVar(_, TyVariableKind::Integer),
+-            ) => lhs_ty,
++            (TyKind::Scalar(Scalar::Int(_)), TyKind::InferenceVar(_, TyVariableKind::Integer))
++            | (TyKind::Scalar(Scalar::Uint(_)), TyKind::InferenceVar(_, TyVariableKind::Integer)) => {
++                lhs_ty
++            }
+             // ({float} | float)
+             (TyKind::InferenceVar(_, TyVariableKind::Float), TyKind::Scalar(Scalar::Float(_))) => {
+                 rhs_ty
+@@ -67,15 +69,21 @@ pub(super) fn binary_op_rhs_expectation(op: BinaryOp, lhs_ty: Ty) -> Ty {
+         BinaryOp::Assignment { op: None } => lhs_ty,
+         BinaryOp::CmpOp(CmpOp::Eq { .. }) => match lhs_ty.kind(&Interner) {
+             TyKind::Scalar(_) | TyKind::Str => lhs_ty,
+-            TyKind::InferenceVar(_, TyVariableKind::Integer | TyVariableKind::Float) => lhs_ty,
++            TyKind::InferenceVar(_, TyVariableKind::Integer)
++            | TyKind::InferenceVar(_, TyVariableKind::Float) => lhs_ty,
+             _ => TyKind::Error.intern(&Interner),
+         },
+-        BinaryOp::ArithOp(ArithOp::Shl | ArithOp::Shr) => TyKind::Error.intern(&Interner),
++        BinaryOp::ArithOp(ArithOp::Shl) | BinaryOp::ArithOp(ArithOp::Shr) => {
++            TyKind::Error.intern(&Interner)
++        }
+         BinaryOp::CmpOp(CmpOp::Ord { .. })
+         | BinaryOp::Assignment { op: Some(_) }
+         | BinaryOp::ArithOp(_) => match lhs_ty.kind(&Interner) {
+-            TyKind::Scalar(Scalar::Int(_) | Scalar::Uint(_) | Scalar::Float(_)) => lhs_ty,
+-            TyKind::InferenceVar(_, TyVariableKind::Integer | TyVariableKind::Float) => lhs_ty,
++            TyKind::Scalar(Scalar::Int(_))
++            | TyKind::Scalar(Scalar::Uint(_))
++            | TyKind::Scalar(Scalar::Float(_)) => lhs_ty,
++            TyKind::InferenceVar(_, TyVariableKind::Integer)
++            | TyKind::InferenceVar(_, TyVariableKind::Float) => lhs_ty,
+             _ => TyKind::Error.intern(&Interner),
+         },
+     }
+diff --git a/crates/ide/src/join_lines.rs b/crates/ide/src/join_lines.rs
+index ffa8bd182..93d3760bf 100644
+--- a/crates/ide/src/join_lines.rs
++++ b/crates/ide/src/join_lines.rs
+@@ -197,7 +197,7 @@ fn join_single_use_tree(edit: &mut TextEditBuilder, token: &SyntaxToken) -> Opti
+ }
+ 
+ fn is_trailing_comma(left: SyntaxKind, right: SyntaxKind) -> bool {
+-    matches!((left, right), (T![,], T![')'] | T![']']))
++    matches!((left, right), (T![,], T![')']) | (T![,], T![']']))
+ }
+ 
+ fn compute_ws(left: SyntaxKind, right: SyntaxKind) -> &'static str {
+diff --git a/crates/ide/src/references.rs b/crates/ide/src/references.rs
+index 5808562a7..945c9b9e1 100644
+--- a/crates/ide/src/references.rs
++++ b/crates/ide/src/references.rs
+@@ -79,7 +79,8 @@ pub(crate) fn find_all_refs(
+                 });
+                 usages.references.retain(|_, it| !it.is_empty());
+             }
+-            Definition::ModuleDef(hir::ModuleDef::Adt(_) | hir::ModuleDef::Variant(_)) => {
++            Definition::ModuleDef(hir::ModuleDef::Adt(_))
++            | Definition::ModuleDef(hir::ModuleDef::Variant(_)) => {
+                 refs.for_each(|it| {
+                     it.retain(|reference| {
+                         reference.name.as_name_ref().map_or(false, is_lit_name_ref)
+diff --git a/crates/ide/src/syntax_highlighting.rs b/crates/ide/src/syntax_highlighting.rs
+index d44a1b45f..e186b82b7 100644
+--- a/crates/ide/src/syntax_highlighting.rs
++++ b/crates/ide/src/syntax_highlighting.rs
+@@ -294,7 +294,7 @@ fn traverse(
+                 Some(parent) => {
+                     // We only care Name and Name_ref
+                     match (token.kind(), parent.kind()) {
+-                        (IDENT, NAME | NAME_REF) => parent.into(),
++                        (IDENT, NAME) | (IDENT, NAME_REF) => parent.into(),
+                         _ => token.into(),
+                     }
+                 }
+@@ -310,7 +310,7 @@ fn traverse(
+                 Some(parent) => {
+                     // We only care Name and Name_ref
+                     match (token.kind(), parent.kind()) {
+-                        (IDENT, NAME | NAME_REF) => parent.into(),
++                        (IDENT, NAME) | (IDENT, NAME_REF) => parent.into(),
+                         _ => token.into(),
+                     }
+                 }
+diff --git a/crates/ide_assists/src/handlers/extract_function.rs b/crates/ide_assists/src/handlers/extract_function.rs
+index ac7f0959b..9b78cf4b1 100644
+--- a/crates/ide_assists/src/handlers/extract_function.rs
++++ b/crates/ide_assists/src/handlers/extract_function.rs
+@@ -1384,7 +1384,7 @@ fn fix_param_usages(ctx: &AssistContext, params: &[Param], syntax: &SyntaxNode)
+     for (param, usages) in usages_for_param {
+         for usage in usages {
+             match usage.syntax().ancestors().skip(1).find_map(ast::Expr::cast) {
+-                Some(ast::Expr::MethodCallExpr(_) | ast::Expr::FieldExpr(_)) => {
++                Some(ast::Expr::MethodCallExpr(_)) | Some(ast::Expr::FieldExpr(_)) => {
+                     // do nothing
+                 }
+                 Some(ast::Expr::RefExpr(node))
+diff --git a/crates/ide_assists/src/tests.rs b/crates/ide_assists/src/tests.rs
+index 841537c77..d9d9124b6 100644
+--- a/crates/ide_assists/src/tests.rs
++++ b/crates/ide_assists/src/tests.rs
+@@ -181,10 +181,9 @@ fn check(handler: Handler, before: &str, expected: ExpectedResult, assist_label:
+             "unresolved assist should not contain source changes"
+         ),
+         (Some(_), ExpectedResult::NotApplicable) => panic!("assist should not be applicable!"),
+-        (
+-            None,
+-            ExpectedResult::After(_) | ExpectedResult::Target(_) | ExpectedResult::Unresolved,
+-        ) => {
++        (None, ExpectedResult::After(_))
++        | (None, ExpectedResult::Target(_))
++        | (None, ExpectedResult::Unresolved) => {
+             panic!("code action is not applicable")
+         }
+         (None, ExpectedResult::NotApplicable) => (),
+diff --git a/crates/ide_completion/src/completions/qualified_path.rs b/crates/ide_completion/src/completions/qualified_path.rs
+index f5dbd203b..88f4d940d 100644
+--- a/crates/ide_completion/src/completions/qualified_path.rs
++++ b/crates/ide_completion/src/completions/qualified_path.rs
+@@ -65,11 +65,9 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon
+                     // Don't suggest attribute macros and derives.
+                     hir::ScopeDef::MacroDef(mac) => mac.is_fn_like(),
+                     // no values in type places
+-                    hir::ScopeDef::ModuleDef(
+-                        hir::ModuleDef::Function(_)
+-                        | hir::ModuleDef::Variant(_)
+-                        | hir::ModuleDef::Static(_),
+-                    )
++                    hir::ScopeDef::ModuleDef(hir::ModuleDef::Function(_))
++                    | hir::ScopeDef::ModuleDef(hir::ModuleDef::Variant(_))
++                    | hir::ScopeDef::ModuleDef(hir::ModuleDef::Static(_))
+                     | hir::ScopeDef::Local(_) => !ctx.expects_type(),
+                     // unless its a constant in a generic arg list position
+                     hir::ScopeDef::ModuleDef(hir::ModuleDef::Const(_)) => {
+@@ -83,13 +81,9 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon
+                 }
+             }
+         }
+-        hir::PathResolution::Def(
+-            def
+-            @
+-            (hir::ModuleDef::Adt(_)
+-            | hir::ModuleDef::TypeAlias(_)
+-            | hir::ModuleDef::BuiltinType(_)),
+-        ) => {
++        hir::PathResolution::Def(def @ hir::ModuleDef::Adt(_))
++        | hir::PathResolution::Def(def @ hir::ModuleDef::TypeAlias(_))
++        | hir::PathResolution::Def(def @ hir::ModuleDef::BuiltinType(_)) => {
+             if let hir::ModuleDef::Adt(hir::Adt::Enum(e)) = def {
+                 add_enum_variants(acc, ctx, e);
+             }
+diff --git a/crates/ide_completion/src/completions/unqualified_path.rs b/crates/ide_completion/src/completions/unqualified_path.rs
+index 81c4fb305..8ea5a2d5b 100644
+--- a/crates/ide_completion/src/completions/unqualified_path.rs
++++ b/crates/ide_completion/src/completions/unqualified_path.rs
+@@ -74,11 +74,9 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC
+             // Don't suggest attribute macros and derives.
+             ScopeDef::MacroDef(mac) => mac.is_fn_like(),
+             // no values in type places
+-            ScopeDef::ModuleDef(
+-                hir::ModuleDef::Function(_)
+-                | hir::ModuleDef::Variant(_)
+-                | hir::ModuleDef::Static(_),
+-            )
++            ScopeDef::ModuleDef(hir::ModuleDef::Function(_))
++            | ScopeDef::ModuleDef(hir::ModuleDef::Variant(_))
++            | ScopeDef::ModuleDef(hir::ModuleDef::Static(_))
+             | ScopeDef::Local(_) => !ctx.expects_type(),
+             // unless its a constant in a generic arg list position
+             ScopeDef::ModuleDef(hir::ModuleDef::Const(_))
+diff --git a/crates/ide_completion/src/context.rs b/crates/ide_completion/src/context.rs
+index 7b76600df..09eb953fd 100644
+--- a/crates/ide_completion/src/context.rs
++++ b/crates/ide_completion/src/context.rs
+@@ -242,23 +242,24 @@ impl<'a> CompletionContext<'a> {
+     }
+ 
+     pub(crate) fn expects_assoc_item(&self) -> bool {
+-        matches!(self.completion_location, Some(ImmediateLocation::Trait | ImmediateLocation::Impl))
++        matches!(
++            self.completion_location,
++            Some(ImmediateLocation::Trait) | Some(ImmediateLocation::Impl)
++        )
+     }
+ 
+     pub(crate) fn has_dot_receiver(&self) -> bool {
+         matches!(
+             &self.completion_location,
+-            Some(ImmediateLocation::FieldAccess { receiver, .. } | ImmediateLocation::MethodCall { receiver,.. })
++            Some(ImmediateLocation::FieldAccess { receiver, .. }) | Some(ImmediateLocation::MethodCall { receiver,.. })
+                 if receiver.is_some()
+         )
+     }
+ 
+     pub(crate) fn dot_receiver(&self) -> Option<&ast::Expr> {
+         match &self.completion_location {
+-            Some(
+-                ImmediateLocation::MethodCall { receiver, .. }
+-                | ImmediateLocation::FieldAccess { receiver, .. },
+-            ) => receiver.as_ref(),
++            Some(ImmediateLocation::MethodCall { receiver, .. })
++            | Some(ImmediateLocation::FieldAccess { receiver, .. }) => receiver.as_ref(),
+             _ => None,
+         }
+     }
+@@ -282,7 +283,7 @@ impl<'a> CompletionContext<'a> {
+     pub(crate) fn expects_ident_pat_or_ref_expr(&self) -> bool {
+         matches!(
+             self.completion_location,
+-            Some(ImmediateLocation::IdentPat | ImmediateLocation::RefExpr)
++            Some(ImmediateLocation::IdentPat) | Some(ImmediateLocation::RefExpr)
+         )
+     }
+ 
+@@ -293,14 +294,14 @@ impl<'a> CompletionContext<'a> {
+     pub(crate) fn in_use_tree(&self) -> bool {
+         matches!(
+             self.completion_location,
+-            Some(ImmediateLocation::Use | ImmediateLocation::UseTree)
++            Some(ImmediateLocation::Use) | Some(ImmediateLocation::UseTree)
+         )
+     }
+ 
+     pub(crate) fn has_impl_or_trait_prev_sibling(&self) -> bool {
+         matches!(
+             self.prev_sibling,
+-            Some(ImmediatePrevSibling::ImplDefType | ImmediatePrevSibling::TraitDefName)
++            Some(ImmediatePrevSibling::ImplDefType) | Some(ImmediatePrevSibling::TraitDefName)
+         )
+     }
+ 
+@@ -321,16 +322,14 @@ impl<'a> CompletionContext<'a> {
+             || self.previous_token_is(T![unsafe])
+             || matches!(
+                 self.prev_sibling,
+-                Some(ImmediatePrevSibling::Attribute | ImmediatePrevSibling::Visibility)
++                Some(ImmediatePrevSibling::Attribute) | Some(ImmediatePrevSibling::Visibility)
+             )
+             || matches!(
+                 self.completion_location,
+-                Some(
+-                    ImmediateLocation::Attribute(_)
+-                        | ImmediateLocation::ModDeclaration(_)
+-                        | ImmediateLocation::RecordPat(_)
+-                        | ImmediateLocation::RecordExpr(_)
+-                )
++                Some(ImmediateLocation::Attribute(_))
++                    | Some(ImmediateLocation::ModDeclaration(_))
++                    | Some(ImmediateLocation::RecordPat(_))
++                    | Some(ImmediateLocation::RecordExpr(_))
+             )
+     }
+ 
+@@ -704,8 +703,8 @@ fn path_or_use_tree_qualifier(path: &ast::Path) -> Option<(ast::Path, bool)> {
+ 
+ fn has_ref(token: &SyntaxToken) -> bool {
+     let mut token = token.clone();
+-    for skip in [WHITESPACE, IDENT, T![mut]] {
+-        if token.kind() == skip {
++    for skip in &[WHITESPACE, IDENT, T![mut]] {
++        if token.kind() == *skip {
+             token = match token.prev_token() {
+                 Some(it) => it,
+                 None => return false,
+diff --git a/crates/ide_completion/src/render/builder_ext.rs b/crates/ide_completion/src/render/builder_ext.rs
+index 33d3a5ee1..749dfc665 100644
+--- a/crates/ide_completion/src/render/builder_ext.rs
++++ b/crates/ide_completion/src/render/builder_ext.rs
+@@ -32,7 +32,7 @@ impl Builder {
+             cov_mark::hit!(no_parens_in_use_item);
+             return false;
+         }
+-        if matches!(ctx.path_call_kind(), Some(CallKind::Expr | CallKind::Pat))
++        if matches!(ctx.path_call_kind(), Some(CallKind::Expr) | Some(CallKind::Pat))
+             | matches!(
+                 ctx.completion_location,
+                 Some(ImmediateLocation::MethodCall { has_parens: true, .. })
+diff --git a/crates/mbe/src/expander/matcher.rs b/crates/mbe/src/expander/matcher.rs
+index b4f2fe9a4..c2a9a38c9 100644
+--- a/crates/mbe/src/expander/matcher.rs
++++ b/crates/mbe/src/expander/matcher.rs
+@@ -804,17 +804,33 @@ impl<'a> TtIter<'a> {
+         };
+ 
+         match (punct.char, second, third) {
+-            ('.', '.', Some('.' | '=')) | ('<', '<', Some('=')) | ('>', '>', Some('=')) => {
++            ('.', '.', Some('.'))
++            | ('.', '.', Some('='))
++            | ('<', '<', Some('='))
++            | ('>', '>', Some('=')) => {
+                 let tt2 = self.next().unwrap().clone();
+                 let tt3 = self.next().unwrap().clone();
+                 Ok(tt::Subtree { delimiter: None, token_trees: vec![tt, tt2, tt3] }.into())
+             }
+-            ('-' | '!' | '*' | '/' | '&' | '%' | '^' | '+' | '<' | '=' | '>' | '|', '=', _)
+-            | ('-' | '=' | '>', '>', _)
++            ('-', '=', _)
++            | ('-', '>', _)
+             | (':', ':', _)
++            | ('!', '=', _)
+             | ('.', '.', _)
++            | ('*', '=', _)
++            | ('/', '=', _)
+             | ('&', '&', _)
++            | ('&', '=', _)
++            | ('%', '=', _)
++            | ('^', '=', _)
++            | ('+', '=', _)
+             | ('<', '<', _)
++            | ('<', '=', _)
++            | ('=', '=', _)
++            | ('=', '>', _)
++            | ('>', '=', _)
++            | ('>', '>', _)
++            | ('|', '=', _)
+             | ('|', '|', _) => {
+                 let tt2 = self.next().unwrap().clone();
+                 Ok(tt::Subtree { delimiter: None, token_trees: vec![tt, tt2] }.into())
+diff --git a/crates/parser/src/grammar/params.rs b/crates/parser/src/grammar/params.rs
+index 5a78675fb..e0c1d3b3a 100644
+--- a/crates/parser/src/grammar/params.rs
++++ b/crates/parser/src/grammar/params.rs
+@@ -184,7 +184,8 @@ fn opt_self_param(p: &mut Parser, m: Marker) -> Result<(), Marker> {
+         if !matches!(
+             (p.current(), la1, la2, la3),
+             (T![&], T![self], _, _)
+-                | (T![&], T![mut] | LIFETIME_IDENT, T![self], _)
++                | (T![&], LIFETIME_IDENT, T![self], _)
++                | (T![&], T![mut], T![self], _)
+                 | (T![&], LIFETIME_IDENT, T![mut], T![self])
+         ) {
+             return Err(m);
+diff --git a/crates/vfs/src/vfs_path.rs b/crates/vfs/src/vfs_path.rs
+index ef2d7657a..2b3d7fd84 100644
+--- a/crates/vfs/src/vfs_path.rs
++++ b/crates/vfs/src/vfs_path.rs
+@@ -389,7 +389,7 @@ impl VirtualPath {
+ 
+             match (file_stem, extension) {
+                 (None, None) => None,
+-                (None | Some(""), Some(_)) => Some((file_name, None)),
++                (None, Some(_)) | (Some(""), Some(_)) => Some((file_name, None)),
+                 (Some(file_stem), extension) => Some((file_stem, extension)),
+             }
+         }
+diff --git a/xtask/src/install.rs b/xtask/src/install.rs
+index 64ab12b42..7e2dccdfe 100644
+--- a/xtask/src/install.rs
++++ b/xtask/src/install.rs
+@@ -8,7 +8,7 @@ use xshell::{cmd, pushd};
+ use crate::flags;
+ 
+ // Latest stable, feel free to send a PR if this lags behind.
+-const REQUIRED_RUST_VERSION: u32 = 53;
++const REQUIRED_RUST_VERSION: u32 = 52;
+ 
+ impl flags::Install {
+     pub(crate) fn run(self) -> Result<()> {
diff --git a/pkgs/development/tools/rust/rust-analyzer/update.sh b/pkgs/development/tools/rust/rust-analyzer/update.sh
index a67b6c927a8..3010b9bf385 100755
--- a/pkgs/development/tools/rust/rust-analyzer/update.sh
+++ b/pkgs/development/tools/rust/rust-analyzer/update.sh
@@ -51,6 +51,9 @@ build_deps="../../../../misc/vscode-extensions/rust-analyzer/build-deps"
 jq '{ name, version, dependencies: (.dependencies + .devDependencies) }' "$node_src/package.json" \
     >"$build_deps/package.json.new"
 
+# FIXME: vsce@1.93.0 breaks the build.
+sed 's/"vsce": ".*"/"vsce": "=1.88.0"/' --in-place "$build_deps/package.json.new"
+
 if cmp --quiet "$build_deps"/package.json{.new,}; then
     echo "package.json not changed, skip updating nodePackages"
     rm "$build_deps"/package.json.new
diff --git a/pkgs/development/tools/zprint/default.nix b/pkgs/development/tools/zprint/default.nix
index 70201280620..266ac83b80d 100644
--- a/pkgs/development/tools/zprint/default.nix
+++ b/pkgs/development/tools/zprint/default.nix
@@ -24,6 +24,7 @@ stdenv.mkDerivation rec {
     -H:Name=${pname} \
     -H:EnableURLProtocols=https,http \
     -H:+ReportExceptionStackTraces \
+    ${lib.optionalString stdenv.isDarwin ''-H:-CheckToolchain''} \
     --report-unsupported-elements-at-runtime \
     --initialize-at-build-time \
     --no-fallback