From 91bbf0efc443499e223c77ccdeb1258dd968a4dc Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Fri, 2 Aug 2024 18:13:17 -0400 Subject: [PATCH] assistant: Normalize line endings for prompts loaded from the prompt library (#15708) This PR makes it so we normalize the line endings for prompts to LFs (`\n`) when we load a prompt from the library. In some cases, prompts could end up with CRLF (`\r\n`) line endings. When these prompts were used with the `/prompt` slash command and summarily run, the prompt text would be converted into a rope, causing the line endings to be normalized to LFs. However, this would happen _after_ the ranges for the `SlashCommandOutputSection`s were computed based on the text that still contained the CRLFs. This would then cause these ranges to be invalid for the text with the normalized endings, resulting in a panic when converting them to anchors. Fixes https://github.com/zed-industries/zed/issues/15652. Release Notes: - N/A Co-authored-by: Max --- crates/assistant/Cargo.toml | 1 + crates/assistant/src/prompt_library.rs | 7 +++++-- .../assistant_slash_command/src/assistant_slash_command.rs | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/crates/assistant/Cargo.toml b/crates/assistant/Cargo.toml index e5f769ede0..605867820f 100644 --- a/crates/assistant/Cargo.toml +++ b/crates/assistant/Cargo.toml @@ -71,6 +71,7 @@ strsim.workspace = true telemetry_events.workspace = true terminal.workspace = true terminal_view.workspace = true +text.workspace = true theme.workspace = true toml.workspace = true ui.workspace = true diff --git a/crates/assistant/src/prompt_library.rs b/crates/assistant/src/prompt_library.rs index 769db54225..965a8e3af6 100644 --- a/crates/assistant/src/prompt_library.rs +++ b/crates/assistant/src/prompt_library.rs @@ -36,6 +36,7 @@ use std::{ sync::{atomic::AtomicBool, Arc}, time::Duration, }; +use text::LineEnding; use theme::ThemeSettings; use ui::{ div, prelude::*, IconButtonShape, ListItem, ListItemSpacing, ParentElement, Render, @@ -1302,10 +1303,12 @@ impl PromptStore { let bodies = self.bodies; self.executor.spawn(async move { let txn = env.read_txn()?; - Ok(bodies + let mut prompt = bodies .get(&txn, &id)? .ok_or_else(|| anyhow!("prompt not found"))? - .into()) + .into(); + LineEnding::normalize(&mut prompt); + Ok(prompt) }) } diff --git a/crates/assistant_slash_command/src/assistant_slash_command.rs b/crates/assistant_slash_command/src/assistant_slash_command.rs index b33c2ce50b..72836dd4b6 100644 --- a/crates/assistant_slash_command/src/assistant_slash_command.rs +++ b/crates/assistant_slash_command/src/assistant_slash_command.rs @@ -60,7 +60,7 @@ pub type RenderFoldPlaceholder = Arc< + Fn(ElementId, Arc, &mut WindowContext) -> AnyElement, >; -#[derive(Default)] +#[derive(Debug, Default)] pub struct SlashCommandOutput { pub text: String, pub sections: Vec>,