Bump Rust to 1.90 (#38436)

Piotr Osiewicz , Nia Espera , and Julia Ryan created

Release Notes:

- N/A

---------

Co-authored-by: Nia Espera <nia@zed.dev>
Co-authored-by: Julia Ryan <juliaryan3.14@gmail.com>

Change summary

Cargo.lock                                              |  1 
Dockerfile-collab                                       |  2 
crates/collab/src/db/queries/channels.rs                |  5 -
crates/command_palette/src/persistence.rs               |  5 +
crates/context_server/src/listener.rs                   | 10 ---
crates/extension_host/src/wasm_host/wit/since_v0_0_6.rs |  1 
crates/extension_host/src/wasm_host/wit/since_v0_2_0.rs |  1 
crates/extension_host/src/wasm_host/wit/since_v0_3_0.rs |  1 
crates/extension_host/src/wasm_host/wit/since_v0_4_0.rs |  1 
crates/extension_host/src/wasm_host/wit/since_v0_5_0.rs |  1 
crates/extension_host/src/wasm_host/wit/since_v0_6_0.rs |  1 
crates/git_ui/src/git_panel_settings.rs                 |  8 --
crates/gpui/examples/data_table.rs                      |  2 
crates/gpui/src/text_system/line_layout.rs              |  6 +-
crates/project_panel/src/project_panel.rs               |  6 +-
crates/task/src/vscode_debug_format.rs                  |  7 --
crates/theme/Cargo.toml                                 |  1 
crates/theme/src/schema.rs                              | 26 ---------
crates/theme_importer/src/main.rs                       | 31 -----------
crates/vim/src/object.rs                                |  4 
flake.lock                                              | 18 +++---
rust-toolchain.toml                                     |  2 
script/generate-licenses                                |  2 
script/generate-licenses-csv                            |  2 
script/generate-licenses.ps1                            |  2 
25 files changed, 33 insertions(+), 113 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -17195,7 +17195,6 @@ dependencies = [
  "fs",
  "futures 0.3.31",
  "gpui",
- "indexmap 2.9.0",
  "log",
  "palette",
  "parking_lot",

Dockerfile-collab 🔗

@@ -1,6 +1,6 @@
 # syntax = docker/dockerfile:1.2
 
-FROM rust:1.89-bookworm as builder
+FROM rust:1.90-bookworm as builder
 WORKDIR app
 COPY . .
 

crates/collab/src/db/queries/channels.rs 🔗

@@ -1129,8 +1129,3 @@ async fn max_order(parent_path: &str, tx: &TransactionHandle) -> Result<i32> {
 enum QueryIds {
     Id,
 }
-
-#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)]
-enum QueryUserIds {
-    UserId,
-}

crates/command_palette/src/persistence.rs 🔗

@@ -10,6 +10,7 @@ use db::{
 use serde::{Deserialize, Serialize};
 use time::OffsetDateTime;
 
+#[cfg(test)]
 #[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 pub(crate) struct SerializedCommandInvocation {
     pub(crate) command_name: String,
@@ -39,6 +40,7 @@ impl Column for SerializedCommandUsage {
     }
 }
 
+#[cfg(test)]
 impl Column for SerializedCommandInvocation {
     fn column(statement: &mut Statement, start_index: i32) -> Result<(Self, i32)> {
         let (command_name, next_index): (String, i32) = Column::column(statement, start_index)?;
@@ -84,8 +86,9 @@ impl CommandPaletteDB {
             .await
     }
 
+    #[cfg(test)]
     query! {
-        pub fn get_last_invoked(command: &str) -> Result<Option<SerializedCommandInvocation>> {
+        pub(crate) fn get_last_invoked(command: &str) -> Result<Option<SerializedCommandInvocation>> {
             SELECT
             command_name,
             user_query,

crates/context_server/src/listener.rs 🔗

@@ -438,13 +438,3 @@ struct RawRequest {
     #[serde(skip_serializing_if = "Option::is_none")]
     params: Option<Box<serde_json::value::RawValue>>,
 }
-
-#[derive(Serialize, Deserialize)]
-struct RawResponse {
-    jsonrpc: &'static str,
-    id: RequestId,
-    #[serde(skip_serializing_if = "Option::is_none")]
-    error: Option<crate::client::Error>,
-    #[serde(skip_serializing_if = "Option::is_none")]
-    result: Option<Box<serde_json::value::RawValue>>,
-}

crates/git_ui/src/git_panel_settings.rs 🔗

@@ -9,14 +9,6 @@ use ui::{
 };
 use workspace::dock::DockPosition;
 
-#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
-pub struct ScrollbarSettingsContent {
-    /// When to show the scrollbar in the git panel.
-    ///
-    /// Default: inherits editor scrollbar settings
-    pub show: Option<Option<ShowScrollbar>>,
-}
-
 #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
 pub struct ScrollbarSettings {
     pub show: Option<ShowScrollbar>,

crates/gpui/examples/data_table.rs 🔗

@@ -238,7 +238,7 @@ impl RenderOnce for TableRow {
             .flex_row()
             .border_b_1()
             .border_color(rgb(0xE0E0E0))
-            .bg(if self.ix % 2 == 0 {
+            .bg(if self.ix.is_multiple_of(2) {
                 rgb(0xFFFFFF)
             } else {
                 rgb(0xFAFAFA)

crates/gpui/src/text_system/line_layout.rs 🔗

@@ -634,15 +634,15 @@ struct CacheKeyRef<'a> {
     force_width: Option<Pixels>,
 }
 
-impl PartialEq for (dyn AsCacheKeyRef + '_) {
+impl PartialEq for dyn AsCacheKeyRef + '_ {
     fn eq(&self, other: &dyn AsCacheKeyRef) -> bool {
         self.as_cache_key_ref() == other.as_cache_key_ref()
     }
 }
 
-impl Eq for (dyn AsCacheKeyRef + '_) {}
+impl Eq for dyn AsCacheKeyRef + '_ {}
 
-impl Hash for (dyn AsCacheKeyRef + '_) {
+impl Hash for dyn AsCacheKeyRef + '_ {
     fn hash<H: Hasher>(&self, state: &mut H) {
         self.as_cache_key_ref().hash(state)
     }

crates/project_panel/src/project_panel.rs 🔗

@@ -3579,7 +3579,7 @@ impl ProjectPanel {
             let entry_range = range.start.saturating_sub(ix)..end_ix - ix;
             let entries = visible
                 .index
-                .get_or_init(|| visible.entries.iter().map(|e| (e.path.clone())).collect());
+                .get_or_init(|| visible.entries.iter().map(|e| e.path.clone()).collect());
             let base_index = ix + entry_range.start;
             for (i, entry) in visible.entries[entry_range].iter().enumerate() {
                 let global_index = base_index + i;
@@ -3623,7 +3623,7 @@ impl ProjectPanel {
                 let entry_range = range.start.saturating_sub(ix)..end_ix - ix;
                 let entries = visible
                     .index
-                    .get_or_init(|| visible.entries.iter().map(|e| (e.path.clone())).collect());
+                    .get_or_init(|| visible.entries.iter().map(|e| e.path.clone()).collect());
                 for entry in visible.entries[entry_range].iter() {
                     let status = git_status_setting
                         .then_some(entry.git_summary)
@@ -4968,7 +4968,7 @@ impl ProjectPanel {
                 visible_worktree
                     .entries
                     .iter()
-                    .map(|e| (e.path.clone()))
+                    .map(|e| e.path.clone())
                     .collect()
             });
 

crates/task/src/vscode_debug_format.rs 🔗

@@ -6,13 +6,6 @@ use crate::{
     DebugScenario, DebugTaskFile, EnvVariableReplacer, TcpArgumentsTemplate, VariableName,
 };
 
-#[derive(Clone, Debug, Deserialize, PartialEq)]
-#[serde(rename_all = "camelCase")]
-enum Request {
-    Launch,
-    Attach,
-}
-
 // TODO support preLaunchTask linkage with other tasks
 #[derive(Clone, Debug, Deserialize, PartialEq)]
 #[serde(rename_all = "camelCase")]

crates/theme/Cargo.toml 🔗

@@ -23,7 +23,6 @@ derive_more.workspace = true
 fs.workspace = true
 futures.workspace = true
 gpui.workspace = true
-indexmap.workspace = true
 log.workspace = true
 palette = { workspace = true, default-features = false, features = ["std"] }
 parking_lot.workspace = true

crates/theme/src/schema.rs 🔗

@@ -1,11 +1,9 @@
 #![allow(missing_docs)]
 
 use gpui::{FontStyle, FontWeight, HighlightStyle, Hsla};
-use indexmap::IndexMap;
 use palette::FromColor;
 use schemars::JsonSchema;
 use serde::{Deserialize, Serialize};
-use settings::{AccentContent, PlayerColorContent};
 pub use settings::{FontWeightContent, WindowBackgroundContent};
 
 use crate::{StatusColorsRefinement, ThemeColorsRefinement};
@@ -49,30 +47,6 @@ pub struct ThemeContent {
     pub style: settings::ThemeStyleContent,
 }
 
-/// The content of a serialized theme.
-#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, PartialEq)]
-#[serde(default)]
-pub struct ThemeStyleContent {
-    #[serde(default, rename = "background.appearance")]
-    pub window_background_appearance: Option<settings::WindowBackgroundContent>,
-
-    #[serde(default)]
-    pub accents: Vec<AccentContent>,
-
-    #[serde(flatten, default)]
-    pub colors: settings::ThemeColorsContent,
-
-    #[serde(flatten, default)]
-    pub status: settings::StatusColorsContent,
-
-    #[serde(default)]
-    pub players: Vec<PlayerColorContent>,
-
-    /// The styles for syntax nodes.
-    #[serde(default)]
-    pub syntax: IndexMap<String, settings::HighlightStyleContent>,
-}
-
 /// Returns the syntax style overrides in the [`ThemeContent`].
 pub fn syntax_overrides(this: &settings::ThemeStyleContent) -> Vec<(String, HighlightStyle)> {
     this.syntax

crates/theme_importer/src/main.rs 🔗

@@ -19,37 +19,6 @@ use crate::vscode::VsCodeThemeConverter;
 
 const ZED_THEME_SCHEMA_URL: &str = "https://zed.dev/schema/themes/v0.2.0.json";
 
-#[derive(Debug, Deserialize)]
-struct FamilyMetadata {
-    #[expect(
-        unused,
-        reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove"
-    )]
-    pub name: String,
-    #[expect(
-        unused,
-        reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove"
-    )]
-    pub author: String,
-    #[expect(
-        unused,
-        reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove"
-    )]
-    pub themes: Vec<ThemeMetadata>,
-
-    /// Overrides for specific syntax tokens.
-    ///
-    /// Use this to ensure certain Zed syntax tokens are matched
-    /// to an exact set of scopes when it is not otherwise possible
-    /// to rely on the default mappings in the theme importer.
-    #[serde(default)]
-    #[expect(
-        unused,
-        reason = "This field was found to be unused with serde library bump; it's left as is due to insufficient context on PO's side, but it *may* be fine to remove"
-    )]
-    pub syntax: IndexMap<String, Vec<String>>,
-}
-
 #[derive(Debug, Clone, Copy, Deserialize)]
 #[serde(rename_all = "snake_case")]
 pub enum ThemeAppearanceJson {

crates/vim/src/object.rs 🔗

@@ -1039,7 +1039,7 @@ fn text_object(
         .text_object_ranges(offset..offset, TreeSitterOptions::default())
         .filter_map(|(r, m)| if m == target { Some(r) } else { None })
         .collect();
-    matches.sort_by_key(|r| (r.end - r.start));
+    matches.sort_by_key(|r| r.end - r.start);
     if let Some(buffer_range) = matches.first() {
         let range = excerpt.map_range_from_buffer(buffer_range.clone());
         return Some(range.start.to_display_point(map)..range.end.to_display_point(map));
@@ -1050,7 +1050,7 @@ fn text_object(
         .text_object_ranges(offset..offset, TreeSitterOptions::default())
         .filter_map(|(r, m)| if m == around { Some(r) } else { None })
         .collect();
-    matches.sort_by_key(|r| (r.end - r.start));
+    matches.sort_by_key(|r| r.end - r.start);
     let around_range = matches.first()?;
 
     let mut matches: Vec<Range<usize>> = buffer

flake.lock 🔗

@@ -2,11 +2,11 @@
   "nodes": {
     "crane": {
       "locked": {
-        "lastModified": 1755993354,
-        "narHash": "sha256-FCRRAzSaL/+umLIm3RU3O/+fJ2ssaPHseI2SSFL8yZU=",
+        "lastModified": 1758215636,
+        "narHash": "sha256-8nkzkPbdxze8CxWhKWlcLbJEU1vfLM/nVqRlTy17V54=",
         "owner": "ipetkov",
         "repo": "crane",
-        "rev": "25bd41b24426c7734278c2ff02e53258851db914",
+        "rev": "a669fe77a8b0cd6f11419d89ea45a16691ca5121",
         "type": "github"
       },
       "original": {
@@ -33,10 +33,10 @@
     "nixpkgs": {
       "locked": {
         "lastModified": 315532800,
-        "narHash": "sha256-E8CyvVDZuIsF7puIw+OLkrFmhj3qUV+iwPcNbBhdcxM=",
-        "rev": "a918bb3594dd243c2f8534b3be01b3cb4ed35fd1",
+        "narHash": "sha256-YPoFUJMpbuPvIS4FJBn2Sv/iWsui9S26gu2ufFWEY0g=",
+        "rev": "a1f79a1770d05af18111fbbe2a3ab2c42c0f6cd0",
         "type": "tarball",
-        "url": "https://releases.nixos.org/nixpkgs/nixpkgs-25.11pre854010.a918bb3594dd/nixexprs.tar.xz"
+        "url": "https://releases.nixos.org/nixpkgs/nixpkgs-25.11pre864673.a1f79a1770d0/nixexprs.tar.xz"
       },
       "original": {
         "type": "tarball",
@@ -58,11 +58,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1756607787,
-        "narHash": "sha256-ciwAdgtlAN1PCaidWK6RuWsTBL8DVuyDCGM+X3ein5Q=",
+        "lastModified": 1758508617,
+        "narHash": "sha256-kx2uELmVnAbiekj/YFfWR26OXqXedImkhe2ocnbumTA=",
         "owner": "oxalica",
         "repo": "rust-overlay",
-        "rev": "f46d294b87ebb9f7124f1ce13aa2a5f5acc0f3eb",
+        "rev": "d2bac276ac7e669a1f09c48614538a37e3eb6d0f",
         "type": "github"
       },
       "original": {

rust-toolchain.toml 🔗

@@ -1,5 +1,5 @@
 [toolchain]
-channel = "1.89"
+channel = "1.90"
 profile = "minimal"
 components = [ "rustfmt", "clippy" ]
 targets = [

script/generate-licenses 🔗

@@ -2,7 +2,7 @@
 
 set -euo pipefail
 
-CARGO_ABOUT_VERSION="0.7"
+CARGO_ABOUT_VERSION="0.8"
 OUTPUT_FILE="${1:-$(pwd)/assets/licenses.md}"
 TEMPLATE_FILE="script/licenses/template.md.hbs"
 

script/generate-licenses-csv 🔗

@@ -2,7 +2,7 @@
 
 set -euo pipefail
 
-CARGO_ABOUT_VERSION="0.6"
+CARGO_ABOUT_VERSION="0.8"
 OUTPUT_FILE="${1:-$(pwd)/assets/licenses.csv}"
 TEMPLATE_FILE="script/licenses/template.csv.hbs"
 

script/generate-licenses.ps1 🔗

@@ -1,4 +1,4 @@
-$CARGO_ABOUT_VERSION="0.7"
+$CARGO_ABOUT_VERSION="0.8"
 $outputFile=$args[0] ? $args[0] : "$(Get-Location)/assets/licenses.md"
 $templateFile="script/licenses/template.md.hbs"