diff --git a/crates/editor2/Cargo.toml b/crates/editor2/Cargo.toml index 3f94d5cdc0..f0002787f3 100644 --- a/crates/editor2/Cargo.toml +++ b/crates/editor2/Cargo.toml @@ -35,7 +35,7 @@ git = { path = "../git" } gpui = { package = "gpui2", path = "../gpui2" } language = { package = "language2", path = "../language2" } lsp = { package = "lsp2", path = "../lsp2" } -multi_buffer = { path = "../multi_buffer" } +multi_buffer = { package = "multi_buffer2", path = "../multi_buffer2" } project = { package = "project2", path = "../project2" } rpc = { package = "rpc2", path = "../rpc2" } rich_text = { path = "../rich_text" } @@ -80,7 +80,7 @@ util = { path = "../util", features = ["test-support"] } project = { package = "project2", path = "../project2", features = ["test-support"] } settings = { package = "settings2", path = "../settings2", features = ["test-support"] } workspace = { package = "workspace2", path = "../workspace2", features = ["test-support"] } -multi_buffer = { path = "../multi_buffer", features = ["test-support"] } +multi_buffer = { package = "multi_buffer2", path = "../multi_buffer2", features = ["test-support"] } ctor.workspace = true env_logger.workspace = true diff --git a/crates/editor2/src/blink_manager.rs b/crates/editor2/src/blink_manager.rs index 7d242b6684..d25e30f649 100644 --- a/crates/editor2/src/blink_manager.rs +++ b/crates/editor2/src/blink_manager.rs @@ -1,5 +1,6 @@ use crate::EditorSettings; -use gpui::{Entity, ModelContext}; +use gpui::ModelContext; +use settings::Settings; use settings::SettingsStore; use smol::Timer; use std::time::Duration; @@ -16,7 +17,7 @@ pub struct BlinkManager { impl BlinkManager { pub fn new(blink_interval: Duration, cx: &mut ModelContext) -> Self { // Make sure we blink the cursors if the setting is re-enabled - cx.observe_global::(move |this, cx| { + cx.observe_global::(move |this, cx| { this.blink_cursors(this.blink_epoch, cx) }) .detach(); @@ -41,14 +42,9 @@ impl BlinkManager { let epoch = self.next_blink_epoch(); let interval = self.blink_interval; - cx.spawn(|this, mut cx| { - let this = this.downgrade(); - async move { - Timer::after(interval).await; - if let Some(this) = this.upgrade(&cx) { - this.update(&mut cx, |this, cx| this.resume_cursor_blinking(epoch, cx)) - } - } + cx.spawn(|this, mut cx| async move { + Timer::after(interval).await; + this.update(&mut cx, |this, cx| this.resume_cursor_blinking(epoch, cx)) }) .detach(); } @@ -68,13 +64,10 @@ impl BlinkManager { let epoch = self.next_blink_epoch(); let interval = self.blink_interval; - cx.spawn(|this, mut cx| { - let this = this.downgrade(); - async move { - Timer::after(interval).await; - if let Some(this) = this.upgrade(&cx) { - this.update(&mut cx, |this, cx| this.blink_cursors(epoch, cx)); - } + cx.spawn(|this, mut cx| async move { + Timer::after(interval).await; + if let Some(this) = this.upgrade() { + this.update(&mut cx, |this, cx| this.blink_cursors(epoch, cx)); } }) .detach(); diff --git a/crates/editor2/src/display_map.rs b/crates/editor2/src/display_map.rs index 5848a12531..ab137df74f 100644 --- a/crates/editor2/src/display_map.rs +++ b/crates/editor2/src/display_map.rs @@ -497,62 +497,63 @@ impl DisplaySnapshot { ) } - pub fn highlighted_chunks<'a>( - &'a self, - display_rows: Range, - language_aware: bool, - style: &'a EditorStyle, - ) -> impl Iterator> { - self.chunks( - display_rows, - language_aware, - Some(style.theme.hint), - Some(style.theme.suggestion), - ) - .map(|chunk| { - let mut highlight_style = chunk - .syntax_highlight_id - .and_then(|id| id.style(&style.syntax)); + // pub fn highlighted_chunks<'a>( + // &'a self, + // display_rows: Range, + // language_aware: bool, + // style: &'a EditorStyle, + // ) -> impl Iterator> { + // self.chunks( + // display_rows, + // language_aware, + // Some(style.theme.hint), + // Some(style.theme.suggestion), + // ) + // .map(|chunk| { + // let mut highlight_style = chunk + // .syntax_highlight_id + // .and_then(|id| id.style(&style.syntax)); - if let Some(chunk_highlight) = chunk.highlight_style { - if let Some(highlight_style) = highlight_style.as_mut() { - highlight_style.highlight(chunk_highlight); - } else { - highlight_style = Some(chunk_highlight); - } - } + // if let Some(chunk_highlight) = chunk.highlight_style { + // if let Some(highlight_style) = highlight_style.as_mut() { + // highlight_style.highlight(chunk_highlight); + // } else { + // highlight_style = Some(chunk_highlight); + // } + // } - let mut diagnostic_highlight = HighlightStyle::default(); + // let mut diagnostic_highlight = HighlightStyle::default(); - if chunk.is_unnecessary { - diagnostic_highlight.fade_out = Some(style.unnecessary_code_fade); - } + // if chunk.is_unnecessary { + // diagnostic_highlight.fade_out = Some(style.unnecessary_code_fade); + // } - if let Some(severity) = chunk.diagnostic_severity { - // Omit underlines for HINT/INFO diagnostics on 'unnecessary' code. - if severity <= DiagnosticSeverity::WARNING || !chunk.is_unnecessary { - let diagnostic_style = super::diagnostic_style(severity, true, style); - diagnostic_highlight.underline = Some(UnderlineStyle { - color: Some(diagnostic_style.message.text.color), - thickness: 1.0.into(), - wavy: true, - }); - } - } + // if let Some(severity) = chunk.diagnostic_severity { + // // Omit underlines for HINT/INFO diagnostics on 'unnecessary' code. + // if severity <= DiagnosticSeverity::WARNING || !chunk.is_unnecessary { + // todo!() + // // let diagnostic_style = super::diagnostic_style(severity, true, style); + // // diagnostic_highlight.underline = Some(UnderlineStyle { + // // color: Some(diagnostic_style.message.text.color), + // // thickness: 1.0.into(), + // // wavy: true, + // // }); + // } + // } - if let Some(highlight_style) = highlight_style.as_mut() { - highlight_style.highlight(diagnostic_highlight); - } else { - highlight_style = Some(diagnostic_highlight); - } + // if let Some(highlight_style) = highlight_style.as_mut() { + // highlight_style.highlight(diagnostic_highlight); + // } else { + // highlight_style = Some(diagnostic_highlight); + // } - HighlightedChunk { - chunk: chunk.text, - style: highlight_style, - is_tab: chunk.is_tab, - } - }) - } + // HighlightedChunk { + // chunk: chunk.text, + // style: highlight_style, + // is_tab: chunk.is_tab, + // } + // }) + // } pub fn lay_out_line_for_row( &self, @@ -606,7 +607,7 @@ impl DisplaySnapshot { // }); } - text_layout_cache.layout_text(&line, editor_style.text.font_size, &styles) + text_layout_cache.layout_text(&line, editor_style.text.font_size, &styles, None) } pub fn x_for_point( diff --git a/crates/editor2/src/display_map/block_map.rs b/crates/editor2/src/display_map/block_map.rs index e6830a9039..aa5ff0e3d2 100644 --- a/crates/editor2/src/display_map/block_map.rs +++ b/crates/editor2/src/display_map/block_map.rs @@ -932,15 +932,15 @@ impl BlockDisposition { } } -impl<'a, 'b, 'c> Deref for BlockContext<'a, 'b, 'c> { - type Target = ViewContext<'a, 'b, Editor>; +impl<'a> Deref for BlockContext<'a, '_> { + type Target = ViewContext<'a, Editor>; fn deref(&self) -> &Self::Target { self.view_context } } -impl DerefMut for BlockContext<'_, '_, '_> { +impl DerefMut for BlockContext<'_, '_> { fn deref_mut(&mut self) -> &mut Self::Target { self.view_context } diff --git a/crates/editor2/src/display_map/wrap_map.rs b/crates/editor2/src/display_map/wrap_map.rs index c2f181efcd..d6f321f616 100644 --- a/crates/editor2/src/display_map/wrap_map.rs +++ b/crates/editor2/src/display_map/wrap_map.rs @@ -4,7 +4,7 @@ use super::{ Highlights, }; use crate::MultiBufferSnapshot; -use gpui::{AppContext, FontId, Model, ModelContext, Pixels, Task}; +use gpui::{AppContext, FontId, LineWrapper, Model, ModelContext, Pixels, Task}; use language::{Chunk, Point}; use lazy_static::lazy_static; use smol::future::yield_now; @@ -20,7 +20,7 @@ pub struct WrapMap { pending_edits: VecDeque<(TabSnapshot, Vec)>, interpolated_edits: Patch, edits_since_sync: Patch, - wrap_width: Option, + wrap_width: Option, background_task: Option>, font: (FontId, Pixels), } @@ -130,7 +130,11 @@ impl WrapMap { } } - pub fn set_wrap_width(&mut self, wrap_width: Option, cx: &mut ModelContext) -> bool { + pub fn set_wrap_width( + &mut self, + wrap_width: Option, + cx: &mut ModelContext, + ) -> bool { if wrap_width == self.wrap_width { return false; } @@ -379,7 +383,7 @@ impl WrapSnapshot { &mut self, new_tab_snapshot: TabSnapshot, tab_edits: &[TabEdit], - wrap_width: f32, + wrap_width: Pixels, line_wrapper: &mut LineWrapper, ) -> Patch { #[derive(Debug)] diff --git a/crates/editor2/src/editor.rs b/crates/editor2/src/editor.rs index a7378aa705..0ae03661e8 100644 --- a/crates/editor2/src/editor.rs +++ b/crates/editor2/src/editor.rs @@ -19,7 +19,6 @@ pub mod selections_collection; mod editor_tests; #[cfg(any(test, feature = "test-support"))] pub mod test; - use ::git::diff::DiffHunk; use aho_corasick::AhoCorasick; use anyhow::{anyhow, Context, Result}; @@ -38,8 +37,9 @@ pub use element::{ use futures::FutureExt; use fuzzy::{StringMatch, StringMatchCandidate}; use gpui::{ - serde_json, AnyElement, AppContext, AsyncAppContext, ClipboardItem, Element, Entity, Hsla, - Model, Quad, Subscription, Task, Text, View, ViewContext, WeakView, WindowContext, + serde_json, AnyElement, AppContext, AsyncAppContext, ClipboardItem, Element, Entity, + EventEmitter, FontWeight, HighlightStyle, Hsla, Model, Pixels, Quad, Render, Subscription, + Task, Text, View, ViewContext, WeakView, WindowContext, }; use highlight_matching_bracket::refresh_matching_bracket_highlights; use hover_popover::{hide_hover, HoverState}; @@ -74,30 +74,17 @@ use rpc::proto::{self, PeerId}; use scroll::{ autoscroll::Autoscroll, OngoingScroll, ScrollAnchor, ScrollManager, ScrollbarAutoHide, }; -use selections_collection::{resolve_multiple, MutableSelectionsCollection, SelectionsCollection}; +use selections_collection::SelectionsCollection; use serde::{Deserialize, Serialize}; -use settings::SettingsStore; -use smallvec::SmallVec; -use snippet::Snippet; +use settings::Settings; use std::{ - any::TypeId, - borrow::Cow, - cmp::{self, Ordering, Reverse}, - mem, - num::NonZeroU32, - ops::{ControlFlow, Deref, DerefMut, Range, RangeInclusive}, - path::Path, + ops::{Deref, DerefMut, Range}, sync::Arc, - time::{Duration, Instant}, + time::Duration, }; pub use sum_tree::Bias; -use sum_tree::TreeMap; -use text::Rope; -use theme::{DiagnosticStyle, Theme, ThemeSettings}; -use util::{post_inc, RangeExt, ResultExt, TryFutureExt}; -use workspace::{ItemNavHistory, SplitDirection, ViewId, Workspace}; - -use crate::git::diff_hunk_to_display; +use util::TryFutureExt; +use workspace::{ItemNavHistory, ViewId, Workspace}; const CURSOR_BLINK_INTERVAL: Duration = Duration::from_millis(500); const MAX_LINE_LEN: usize = 1024; @@ -109,70 +96,70 @@ pub const DOCUMENT_HIGHLIGHTS_DEBOUNCE_TIMEOUT: Duration = Duration::from_millis pub const FORMAT_TIMEOUT: Duration = Duration::from_secs(2); -pub fn render_parsed_markdown( - parsed: &language::ParsedMarkdown, - editor_style: &EditorStyle, - workspace: Option>, - cx: &mut ViewContext, -) -> Text { - enum RenderedMarkdown {} +// pub fn render_parsed_markdown( +// parsed: &language::ParsedMarkdown, +// editor_style: &EditorStyle, +// workspace: Option>, +// cx: &mut ViewContext, +// ) -> Text { +// enum RenderedMarkdown {} - let parsed = parsed.clone(); - let view_id = cx.view_id(); - let code_span_background_color = editor_style.document_highlight_read_background; +// let parsed = parsed.clone(); +// let view_id = cx.view_id(); +// let code_span_background_color = editor_style.document_highlight_read_background; - let mut region_id = 0; +// let mut region_id = 0; - todo!() - // Text::new(parsed.text, editor_style.text.clone()) - // .with_highlights( - // parsed - // .highlights - // .iter() - // .filter_map(|(range, highlight)| { - // let highlight = highlight.to_highlight_style(&editor_style.syntax)?; - // Some((range.clone(), highlight)) - // }) - // .collect::>(), - // ) - // .with_custom_runs(parsed.region_ranges, move |ix, bounds, cx| { - // region_id += 1; - // let region = parsed.regions[ix].clone(); +// todo!() +// // Text::new(parsed.text, editor_style.text.clone()) +// // .with_highlights( +// // parsed +// // .highlights +// // .iter() +// // .filter_map(|(range, highlight)| { +// // let highlight = highlight.to_highlight_style(&editor_style.syntax)?; +// // Some((range.clone(), highlight)) +// // }) +// // .collect::>(), +// // ) +// // .with_custom_runs(parsed.region_ranges, move |ix, bounds, cx| { +// // region_id += 1; +// // let region = parsed.regions[ix].clone(); - // if let Some(link) = region.link { - // cx.scene().push_cursor_region(CursorRegion { - // bounds, - // style: CursorStyle::PointingHand, - // }); - // cx.scene().push_mouse_region( - // MouseRegion::new::<(RenderedMarkdown, Tag)>(view_id, region_id, bounds) - // .on_down::(MouseButton::Left, move |_, _, cx| match &link { - // markdown::Link::Web { url } => cx.platform().open_url(url), - // markdown::Link::Path { path } => { - // if let Some(workspace) = &workspace { - // _ = workspace.update(cx, |workspace, cx| { - // workspace.open_abs_path(path.clone(), false, cx).detach(); - // }); - // } - // } - // }), - // ); - // } +// // if let Some(link) = region.link { +// // cx.scene().push_cursor_region(CursorRegion { +// // bounds, +// // style: CursorStyle::PointingHand, +// // }); +// // cx.scene().push_mouse_region( +// // MouseRegion::new::<(RenderedMarkdown, Tag)>(view_id, region_id, bounds) +// // .on_down::(MouseButton::Left, move |_, _, cx| match &link { +// // markdown::Link::Web { url } => cx.platform().open_url(url), +// // markdown::Link::Path { path } => { +// // if let Some(workspace) = &workspace { +// // _ = workspace.update(cx, |workspace, cx| { +// // workspace.open_abs_path(path.clone(), false, cx).detach(); +// // }); +// // } +// // } +// // }), +// // ); +// // } - // if region.code { - // cx.draw_quad(Quad { - // bounds, - // background: Some(code_span_background_color), - // corner_radii: (2.0).into(), - // order: todo!(), - // content_mask: todo!(), - // border_color: todo!(), - // border_widths: todo!(), - // }); - // } - // }) - // .with_soft_wrap(true) -} +// // if region.code { +// // cx.draw_quad(Quad { +// // bounds, +// // background: Some(code_span_background_color), +// // corner_radii: (2.0).into(), +// // order: todo!(), +// // content_mask: todo!(), +// // border_color: todo!(), +// // border_widths: todo!(), +// // }); +// // } +// // }) +// // .with_soft_wrap(true) +// } #[derive(Clone, Deserialize, PartialEq, Default)] pub struct SelectNext { @@ -270,138 +257,138 @@ impl InlayId { } } -actions!( - editor, - [ - Cancel, - Backspace, - Delete, - Newline, - NewlineAbove, - NewlineBelow, - GoToDiagnostic, - GoToPrevDiagnostic, - GoToHunk, - GoToPrevHunk, - Indent, - Outdent, - DeleteLine, - DeleteToPreviousWordStart, - DeleteToPreviousSubwordStart, - DeleteToNextWordEnd, - DeleteToNextSubwordEnd, - DeleteToBeginningOfLine, - DeleteToEndOfLine, - CutToEndOfLine, - DuplicateLine, - MoveLineUp, - MoveLineDown, - JoinLines, - SortLinesCaseSensitive, - SortLinesCaseInsensitive, - ReverseLines, - ShuffleLines, - ConvertToUpperCase, - ConvertToLowerCase, - ConvertToTitleCase, - ConvertToSnakeCase, - ConvertToKebabCase, - ConvertToUpperCamelCase, - ConvertToLowerCamelCase, - Transpose, - Cut, - Copy, - Paste, - Undo, - Redo, - MoveUp, - PageUp, - MoveDown, - PageDown, - MoveLeft, - MoveRight, - MoveToPreviousWordStart, - MoveToPreviousSubwordStart, - MoveToNextWordEnd, - MoveToNextSubwordEnd, - MoveToBeginningOfLine, - MoveToEndOfLine, - MoveToStartOfParagraph, - MoveToEndOfParagraph, - MoveToBeginning, - MoveToEnd, - SelectUp, - SelectDown, - SelectLeft, - SelectRight, - SelectToPreviousWordStart, - SelectToPreviousSubwordStart, - SelectToNextWordEnd, - SelectToNextSubwordEnd, - SelectToStartOfParagraph, - SelectToEndOfParagraph, - SelectToBeginning, - SelectToEnd, - SelectAll, - SelectLine, - SplitSelectionIntoLines, - AddSelectionAbove, - AddSelectionBelow, - Tab, - TabPrev, - ShowCharacterPalette, - SelectLargerSyntaxNode, - SelectSmallerSyntaxNode, - GoToDefinition, - GoToDefinitionSplit, - GoToTypeDefinition, - GoToTypeDefinitionSplit, - MoveToEnclosingBracket, - UndoSelection, - RedoSelection, - FindAllReferences, - Rename, - ConfirmRename, - Fold, - UnfoldLines, - FoldSelectedRanges, - ShowCompletions, - OpenExcerpts, - RestartLanguageServer, - Hover, - Format, - ToggleSoftWrap, - ToggleInlayHints, - RevealInFinder, - CopyPath, - CopyRelativePath, - CopyHighlightJson, - ContextMenuFirst, - ContextMenuPrev, - ContextMenuNext, - ContextMenuLast, - ] -); +// actions!( +// editor, +// [ +// Cancel, +// Backspace, +// Delete, +// Newline, +// NewlineAbove, +// NewlineBelow, +// GoToDiagnostic, +// GoToPrevDiagnostic, +// GoToHunk, +// GoToPrevHunk, +// Indent, +// Outdent, +// DeleteLine, +// DeleteToPreviousWordStart, +// DeleteToPreviousSubwordStart, +// DeleteToNextWordEnd, +// DeleteToNextSubwordEnd, +// DeleteToBeginningOfLine, +// DeleteToEndOfLine, +// CutToEndOfLine, +// DuplicateLine, +// MoveLineUp, +// MoveLineDown, +// JoinLines, +// SortLinesCaseSensitive, +// SortLinesCaseInsensitive, +// ReverseLines, +// ShuffleLines, +// ConvertToUpperCase, +// ConvertToLowerCase, +// ConvertToTitleCase, +// ConvertToSnakeCase, +// ConvertToKebabCase, +// ConvertToUpperCamelCase, +// ConvertToLowerCamelCase, +// Transpose, +// Cut, +// Copy, +// Paste, +// Undo, +// Redo, +// MoveUp, +// PageUp, +// MoveDown, +// PageDown, +// MoveLeft, +// MoveRight, +// MoveToPreviousWordStart, +// MoveToPreviousSubwordStart, +// MoveToNextWordEnd, +// MoveToNextSubwordEnd, +// MoveToBeginningOfLine, +// MoveToEndOfLine, +// MoveToStartOfParagraph, +// MoveToEndOfParagraph, +// MoveToBeginning, +// MoveToEnd, +// SelectUp, +// SelectDown, +// SelectLeft, +// SelectRight, +// SelectToPreviousWordStart, +// SelectToPreviousSubwordStart, +// SelectToNextWordEnd, +// SelectToNextSubwordEnd, +// SelectToStartOfParagraph, +// SelectToEndOfParagraph, +// SelectToBeginning, +// SelectToEnd, +// SelectAll, +// SelectLine, +// SplitSelectionIntoLines, +// AddSelectionAbove, +// AddSelectionBelow, +// Tab, +// TabPrev, +// ShowCharacterPalette, +// SelectLargerSyntaxNode, +// SelectSmallerSyntaxNode, +// GoToDefinition, +// GoToDefinitionSplit, +// GoToTypeDefinition, +// GoToTypeDefinitionSplit, +// MoveToEnclosingBracket, +// UndoSelection, +// RedoSelection, +// FindAllReferences, +// Rename, +// ConfirmRename, +// Fold, +// UnfoldLines, +// FoldSelectedRanges, +// ShowCompletions, +// OpenExcerpts, +// RestartLanguageServer, +// Hover, +// Format, +// ToggleSoftWrap, +// ToggleInlayHints, +// RevealInFinder, +// CopyPath, +// CopyRelativePath, +// CopyHighlightJson, +// ContextMenuFirst, +// ContextMenuPrev, +// ContextMenuNext, +// ContextMenuLast, +// ] +// ); -impl_actions!( - editor, - [ - SelectNext, - SelectPrevious, - SelectAllMatches, - SelectToBeginningOfLine, - SelectToEndOfLine, - ToggleCodeActions, - MovePageUp, - MovePageDown, - ConfirmCompletion, - ConfirmCodeAction, - ToggleComments, - FoldAt, - UnfoldAt, - GutterHover - ] -); +// impl_actions!( +// editor, +// [ +// SelectNext, +// SelectPrevious, +// SelectAllMatches, +// SelectToBeginningOfLine, +// SelectToEndOfLine, +// ToggleCodeActions, +// MovePageUp, +// MovePageDown, +// ConfirmCompletion, +// ConfirmCodeAction, +// ToggleComments, +// FoldAt, +// UnfoldAt, +// GutterHover +// ] +// ); enum DocumentHighlightRead {} enum DocumentHighlightWrite {} @@ -414,7 +401,7 @@ pub enum Direction { } pub fn init_settings(cx: &mut AppContext) { - settings::register::(cx); + EditorSettings::register(cx); } pub fn init(cx: &mut AppContext) { @@ -574,7 +561,7 @@ pub enum SelectPhase { Update { position: DisplayPoint, goal_column: u32, - scroll_position: Point, + scroll_position: gpui::Point, }, End, } @@ -603,20 +590,20 @@ pub enum SoftWrap { #[derive(Clone)] pub struct EditorStyle { - pub text: TextStyle, + // pub text: TextStyle, pub line_height_scalar: f32, - pub placeholder_text: Option, - pub theme: theme::Editor, + // pub placeholder_text: Option, + // pub theme: theme::Editor, pub theme_id: usize, } type CompletionId = usize; -type GetFieldEditorTheme = dyn Fn(&theme::Theme) -> theme::FieldEditor; -type OverrideTextStyle = dyn Fn(&EditorStyle) -> Option; +// type GetFieldEditorTheme = dyn Fn(&theme::Theme) -> theme::FieldEditor; +// type OverrideTextStyle = dyn Fn(&EditorStyle) -> Option; -type BackgroundHighlight = (fn(&Theme) -> Hsla, Vec>); -type InlayBackgroundHighlight = (fn(&Theme) -> Hsla, Vec); +// type BackgroundHighlight = (fn(&Theme) -> Hsla, Vec>); +// type InlayBackgroundHighlight = (fn(&Theme) -> Hsla, Vec); pub struct Editor { handle: WeakView, @@ -635,8 +622,8 @@ pub struct Editor { ime_transaction: Option, active_diagnostics: Option, soft_wrap_mode_override: Option, - get_field_editor_theme: Option>, - override_text_style: Option>, + // get_field_editor_theme: Option>, + // override_text_style: Option>, project: Option>, collaboration_hub: Option>, focused: bool, @@ -647,8 +634,8 @@ pub struct Editor { show_wrap_guides: Option, placeholder_text: Option>, highlighted_rows: Option>, - background_highlights: BTreeMap, - inlay_background_highlights: TreeMap, InlayBackgroundHighlight>, + // background_highlights: BTreeMap, + // inlay_background_highlights: TreeMap, InlayBackgroundHighlight>, nav_history: Option, context_menu: RwLock>, mouse_context_menu: View, @@ -663,7 +650,7 @@ pub struct Editor { collapse_matches: bool, autoindent_mode: Option, workspace: Option<(WeakView, i64)>, - keymap_context_layers: BTreeMap, + // keymap_context_layers: BTreeMap, input_enabled: bool, read_only: bool, leader_peer_id: Option, @@ -675,7 +662,7 @@ pub struct Editor { // inlay_hint_cache: InlayHintCache, next_inlay_id: usize, _subscriptions: Vec, - pixel_position_of_newest_cursor: Option>, + pixel_position_of_newest_cursor: Option>, } pub struct EditorSnapshot { @@ -937,688 +924,688 @@ struct CompletionsMenu { match_candidates: Arc<[StringMatchCandidate]>, matches: Arc<[StringMatch]>, selected_item: usize, - list: UniformListState, + // list: UniformListState, } -impl CompletionsMenu { - fn select_first(&mut self, project: Option<&Model>, cx: &mut ViewContext) { - self.selected_item = 0; - self.list.scroll_to(ScrollTarget::Show(self.selected_item)); - self.attempt_resolve_selected_completion_documentation(project, cx); - cx.notify(); - } +// impl CompletionsMenu { +// fn select_first(&mut self, project: Option<&Model>, cx: &mut ViewContext) { +// self.selected_item = 0; +// self.list.scroll_to(ScrollTarget::Show(self.selected_item)); +// self.attempt_resolve_selected_completion_documentation(project, cx); +// cx.notify(); +// } - fn select_prev(&mut self, project: Option<&Model>, cx: &mut ViewContext) { - if self.selected_item > 0 { - self.selected_item -= 1; - } else { - self.selected_item = self.matches.len() - 1; - } - self.list.scroll_to(ScrollTarget::Show(self.selected_item)); - self.attempt_resolve_selected_completion_documentation(project, cx); - cx.notify(); - } +// fn select_prev(&mut self, project: Option<&Model>, cx: &mut ViewContext) { +// if self.selected_item > 0 { +// self.selected_item -= 1; +// } else { +// self.selected_item = self.matches.len() - 1; +// } +// self.list.scroll_to(ScrollTarget::Show(self.selected_item)); +// self.attempt_resolve_selected_completion_documentation(project, cx); +// cx.notify(); +// } - fn select_next(&mut self, project: Option<&Model>, cx: &mut ViewContext) { - if self.selected_item + 1 < self.matches.len() { - self.selected_item += 1; - } else { - self.selected_item = 0; - } - self.list.scroll_to(ScrollTarget::Show(self.selected_item)); - self.attempt_resolve_selected_completion_documentation(project, cx); - cx.notify(); - } +// fn select_next(&mut self, project: Option<&Model>, cx: &mut ViewContext) { +// if self.selected_item + 1 < self.matches.len() { +// self.selected_item += 1; +// } else { +// self.selected_item = 0; +// } +// self.list.scroll_to(ScrollTarget::Show(self.selected_item)); +// self.attempt_resolve_selected_completion_documentation(project, cx); +// cx.notify(); +// } - fn select_last(&mut self, project: Option<&Model>, cx: &mut ViewContext) { - self.selected_item = self.matches.len() - 1; - self.list.scroll_to(ScrollTarget::Show(self.selected_item)); - self.attempt_resolve_selected_completion_documentation(project, cx); - cx.notify(); - } +// fn select_last(&mut self, project: Option<&Model>, cx: &mut ViewContext) { +// self.selected_item = self.matches.len() - 1; +// self.list.scroll_to(ScrollTarget::Show(self.selected_item)); +// self.attempt_resolve_selected_completion_documentation(project, cx); +// cx.notify(); +// } - fn pre_resolve_completion_documentation( - &self, - project: Option>, - cx: &mut ViewContext, - ) { - let settings = settings::get::(cx); - if !settings.show_completion_documentation { - return; - } +// fn pre_resolve_completion_documentation( +// &self, +// project: Option>, +// cx: &mut ViewContext, +// ) { +// let settings = settings::get::(cx); +// if !settings.show_completion_documentation { +// return; +// } - let Some(project) = project else { - return; - }; - let client = project.read(cx).client(); - let language_registry = project.read(cx).languages().clone(); +// let Some(project) = project else { +// return; +// }; +// let client = project.read(cx).client(); +// let language_registry = project.read(cx).languages().clone(); - let is_remote = project.read(cx).is_remote(); - let project_id = project.read(cx).remote_id(); +// let is_remote = project.read(cx).is_remote(); +// let project_id = project.read(cx).remote_id(); - let completions = self.completions.clone(); - let completion_indices: Vec<_> = self.matches.iter().map(|m| m.candidate_id).collect(); +// let completions = self.completions.clone(); +// let completion_indices: Vec<_> = self.matches.iter().map(|m| m.candidate_id).collect(); - cx.spawn(move |this, mut cx| async move { - if is_remote { - let Some(project_id) = project_id else { - log::error!("Remote project without remote_id"); - return; - }; +// cx.spawn(move |this, mut cx| async move { +// if is_remote { +// let Some(project_id) = project_id else { +// log::error!("Remote project without remote_id"); +// return; +// }; - for completion_index in completion_indices { - let completions_guard = completions.read(); - let completion = &completions_guard[completion_index]; - if completion.documentation.is_some() { - continue; - } +// for completion_index in completion_indices { +// let completions_guard = completions.read(); +// let completion = &completions_guard[completion_index]; +// if completion.documentation.is_some() { +// continue; +// } - let server_id = completion.server_id; - let completion = completion.lsp_completion.clone(); - drop(completions_guard); +// let server_id = completion.server_id; +// let completion = completion.lsp_completion.clone(); +// drop(completions_guard); - Self::resolve_completion_documentation_remote( - project_id, - server_id, - completions.clone(), - completion_index, - completion, - client.clone(), - language_registry.clone(), - ) - .await; +// Self::resolve_completion_documentation_remote( +// project_id, +// server_id, +// completions.clone(), +// completion_index, +// completion, +// client.clone(), +// language_registry.clone(), +// ) +// .await; - _ = this.update(&mut cx, |_, cx| cx.notify()); - } - } else { - for completion_index in completion_indices { - let completions_guard = completions.read(); - let completion = &completions_guard[completion_index]; - if completion.documentation.is_some() { - continue; - } +// _ = this.update(&mut cx, |_, cx| cx.notify()); +// } +// } else { +// for completion_index in completion_indices { +// let completions_guard = completions.read(); +// let completion = &completions_guard[completion_index]; +// if completion.documentation.is_some() { +// continue; +// } - let server_id = completion.server_id; - let completion = completion.lsp_completion.clone(); - drop(completions_guard); +// let server_id = completion.server_id; +// let completion = completion.lsp_completion.clone(); +// drop(completions_guard); - let server = project.read_with(&mut cx, |project, _| { - project.language_server_for_id(server_id) - }); - let Some(server) = server else { - return; - }; +// let server = project.read_with(&mut cx, |project, _| { +// project.language_server_for_id(server_id) +// }); +// let Some(server) = server else { +// return; +// }; - Self::resolve_completion_documentation_local( - server, - completions.clone(), - completion_index, - completion, - language_registry.clone(), - ) - .await; +// Self::resolve_completion_documentation_local( +// server, +// completions.clone(), +// completion_index, +// completion, +// language_registry.clone(), +// ) +// .await; - _ = this.update(&mut cx, |_, cx| cx.notify()); - } - } - }) - .detach(); - } +// _ = this.update(&mut cx, |_, cx| cx.notify()); +// } +// } +// }) +// .detach(); +// } - fn attempt_resolve_selected_completion_documentation( - &mut self, - project: Option<&Model>, - cx: &mut ViewContext, - ) { - let settings = settings::get::(cx); - if !settings.show_completion_documentation { - return; - } +// fn attempt_resolve_selected_completion_documentation( +// &mut self, +// project: Option<&Model>, +// cx: &mut ViewContext, +// ) { +// let settings = settings::get::(cx); +// if !settings.show_completion_documentation { +// return; +// } - let completion_index = self.matches[self.selected_item].candidate_id; - let Some(project) = project else { - return; - }; - let language_registry = project.read(cx).languages().clone(); +// let completion_index = self.matches[self.selected_item].candidate_id; +// let Some(project) = project else { +// return; +// }; +// let language_registry = project.read(cx).languages().clone(); - let completions = self.completions.clone(); - let completions_guard = completions.read(); - let completion = &completions_guard[completion_index]; - if completion.documentation.is_some() { - return; - } +// let completions = self.completions.clone(); +// let completions_guard = completions.read(); +// let completion = &completions_guard[completion_index]; +// if completion.documentation.is_some() { +// return; +// } - let server_id = completion.server_id; - let completion = completion.lsp_completion.clone(); - drop(completions_guard); +// let server_id = completion.server_id; +// let completion = completion.lsp_completion.clone(); +// drop(completions_guard); - if project.read(cx).is_remote() { - let Some(project_id) = project.read(cx).remote_id() else { - log::error!("Remote project without remote_id"); - return; - }; +// if project.read(cx).is_remote() { +// let Some(project_id) = project.read(cx).remote_id() else { +// log::error!("Remote project without remote_id"); +// return; +// }; - let client = project.read(cx).client(); +// let client = project.read(cx).client(); - cx.spawn(move |this, mut cx| async move { - Self::resolve_completion_documentation_remote( - project_id, - server_id, - completions.clone(), - completion_index, - completion, - client, - language_registry.clone(), - ) - .await; +// cx.spawn(move |this, mut cx| async move { +// Self::resolve_completion_documentation_remote( +// project_id, +// server_id, +// completions.clone(), +// completion_index, +// completion, +// client, +// language_registry.clone(), +// ) +// .await; - _ = this.update(&mut cx, |_, cx| cx.notify()); - }) - .detach(); - } else { - let Some(server) = project.read(cx).language_server_for_id(server_id) else { - return; - }; +// _ = this.update(&mut cx, |_, cx| cx.notify()); +// }) +// .detach(); +// } else { +// let Some(server) = project.read(cx).language_server_for_id(server_id) else { +// return; +// }; - cx.spawn(move |this, mut cx| async move { - Self::resolve_completion_documentation_local( - server, - completions, - completion_index, - completion, - language_registry, - ) - .await; +// cx.spawn(move |this, mut cx| async move { +// Self::resolve_completion_documentation_local( +// server, +// completions, +// completion_index, +// completion, +// language_registry, +// ) +// .await; - _ = this.update(&mut cx, |_, cx| cx.notify()); - }) - .detach(); - } - } +// _ = this.update(&mut cx, |_, cx| cx.notify()); +// }) +// .detach(); +// } +// } - async fn resolve_completion_documentation_remote( - project_id: u64, - server_id: LanguageServerId, - completions: Arc>>, - completion_index: usize, - completion: lsp::CompletionItem, - client: Arc, - language_registry: Arc, - ) { - let request = proto::ResolveCompletionDocumentation { - project_id, - language_server_id: server_id.0 as u64, - lsp_completion: serde_json::to_string(&completion).unwrap().into_bytes(), - }; +// async fn resolve_completion_documentation_remote( +// project_id: u64, +// server_id: LanguageServerId, +// completions: Arc>>, +// completion_index: usize, +// completion: lsp::CompletionItem, +// client: Arc, +// language_registry: Arc, +// ) { +// let request = proto::ResolveCompletionDocumentation { +// project_id, +// language_server_id: server_id.0 as u64, +// lsp_completion: serde_json::to_string(&completion).unwrap().into_bytes(), +// }; - let Some(response) = client - .request(request) - .await - .context("completion documentation resolve proto request") - .log_err() - else { - return; - }; +// let Some(response) = client +// .request(request) +// .await +// .context("completion documentation resolve proto request") +// .log_err() +// else { +// return; +// }; - if response.text.is_empty() { - let mut completions = completions.write(); - let completion = &mut completions[completion_index]; - completion.documentation = Some(Documentation::Undocumented); - } +// if response.text.is_empty() { +// let mut completions = completions.write(); +// let completion = &mut completions[completion_index]; +// completion.documentation = Some(Documentation::Undocumented); +// } - let documentation = if response.is_markdown { - Documentation::MultiLineMarkdown( - markdown::parse_markdown(&response.text, &language_registry, None).await, - ) - } else if response.text.lines().count() <= 1 { - Documentation::SingleLine(response.text) - } else { - Documentation::MultiLinePlainText(response.text) - }; +// let documentation = if response.is_markdown { +// Documentation::MultiLineMarkdown( +// markdown::parse_markdown(&response.text, &language_registry, None).await, +// ) +// } else if response.text.lines().count() <= 1 { +// Documentation::SingleLine(response.text) +// } else { +// Documentation::MultiLinePlainText(response.text) +// }; - let mut completions = completions.write(); - let completion = &mut completions[completion_index]; - completion.documentation = Some(documentation); - } +// let mut completions = completions.write(); +// let completion = &mut completions[completion_index]; +// completion.documentation = Some(documentation); +// } - async fn resolve_completion_documentation_local( - server: Arc, - completions: Arc>>, - completion_index: usize, - completion: lsp::CompletionItem, - language_registry: Arc, - ) { - let can_resolve = server - .capabilities() - .completion_provider - .as_ref() - .and_then(|options| options.resolve_provider) - .unwrap_or(false); - if !can_resolve { - return; - } +// async fn resolve_completion_documentation_local( +// server: Arc, +// completions: Arc>>, +// completion_index: usize, +// completion: lsp::CompletionItem, +// language_registry: Arc, +// ) { +// let can_resolve = server +// .capabilities() +// .completion_provider +// .as_ref() +// .and_then(|options| options.resolve_provider) +// .unwrap_or(false); +// if !can_resolve { +// return; +// } - let request = server.request::(completion); - let Some(completion_item) = request.await.log_err() else { - return; - }; +// let request = server.request::(completion); +// let Some(completion_item) = request.await.log_err() else { +// return; +// }; - if let Some(lsp_documentation) = completion_item.documentation { - let documentation = language::prepare_completion_documentation( - &lsp_documentation, - &language_registry, - None, // TODO: Try to reasonably work out which language the completion is for - ) - .await; +// if let Some(lsp_documentation) = completion_item.documentation { +// let documentation = language::prepare_completion_documentation( +// &lsp_documentation, +// &language_registry, +// None, // TODO: Try to reasonably work out which language the completion is for +// ) +// .await; - let mut completions = completions.write(); - let completion = &mut completions[completion_index]; - completion.documentation = Some(documentation); - } else { - let mut completions = completions.write(); - let completion = &mut completions[completion_index]; - completion.documentation = Some(Documentation::Undocumented); - } - } +// let mut completions = completions.write(); +// let completion = &mut completions[completion_index]; +// completion.documentation = Some(documentation); +// } else { +// let mut completions = completions.write(); +// let completion = &mut completions[completion_index]; +// completion.documentation = Some(Documentation::Undocumented); +// } +// } - fn visible(&self) -> bool { - !self.matches.is_empty() - } +// fn visible(&self) -> bool { +// !self.matches.is_empty() +// } - fn render( - &self, - style: EditorStyle, - workspace: Option>, - cx: &mut ViewContext, - ) -> AnyElement { - enum CompletionTag {} +// fn render( +// &self, +// style: EditorStyle, +// workspace: Option>, +// cx: &mut ViewContext, +// ) -> AnyElement { +// enum CompletionTag {} - let settings = settings::get::(cx); - let show_completion_documentation = settings.show_completion_documentation; +// let settings = settings::get::(cx); +// let show_completion_documentation = settings.show_completion_documentation; - let widest_completion_ix = self - .matches - .iter() - .enumerate() - .max_by_key(|(_, mat)| { - let completions = self.completions.read(); - let completion = &completions[mat.candidate_id]; - let documentation = &completion.documentation; +// let widest_completion_ix = self +// .matches +// .iter() +// .enumerate() +// .max_by_key(|(_, mat)| { +// let completions = self.completions.read(); +// let completion = &completions[mat.candidate_id]; +// let documentation = &completion.documentation; - let mut len = completion.label.text.chars().count(); - if let Some(Documentation::SingleLine(text)) = documentation { - if show_completion_documentation { - len += text.chars().count(); - } - } +// let mut len = completion.label.text.chars().count(); +// if let Some(Documentation::SingleLine(text)) = documentation { +// if show_completion_documentation { +// len += text.chars().count(); +// } +// } - len - }) - .map(|(ix, _)| ix); +// len +// }) +// .map(|(ix, _)| ix); - let completions = self.completions.clone(); - let matches = self.matches.clone(); - let selected_item = self.selected_item; +// let completions = self.completions.clone(); +// let matches = self.matches.clone(); +// let selected_item = self.selected_item; - let list = UniformList::new(self.list.clone(), matches.len(), cx, { - let style = style.clone(); - move |_, range, items, cx| { - let start_ix = range.start; - let completions_guard = completions.read(); +// let list = UniformList::new(self.list.clone(), matches.len(), cx, { +// let style = style.clone(); +// move |_, range, items, cx| { +// let start_ix = range.start; +// let completions_guard = completions.read(); - for (ix, mat) in matches[range].iter().enumerate() { - let item_ix = start_ix + ix; - let candidate_id = mat.candidate_id; - let completion = &completions_guard[candidate_id]; +// for (ix, mat) in matches[range].iter().enumerate() { +// let item_ix = start_ix + ix; +// let candidate_id = mat.candidate_id; +// let completion = &completions_guard[candidate_id]; - let documentation = if show_completion_documentation { - &completion.documentation - } else { - &None - }; +// let documentation = if show_completion_documentation { +// &completion.documentation +// } else { +// &None +// }; - items.push( - MouseEventHandler::new::( - mat.candidate_id, - cx, - |state, _| { - let item_style = if item_ix == selected_item { - style.autocomplete.selected_item - } else if state.hovered() { - style.autocomplete.hovered_item - } else { - style.autocomplete.item - }; +// items.push( +// MouseEventHandler::new::( +// mat.candidate_id, +// cx, +// |state, _| { +// let item_style = if item_ix == selected_item { +// style.autocomplete.selected_item +// } else if state.hovered() { +// style.autocomplete.hovered_item +// } else { +// style.autocomplete.item +// }; - let completion_label = - Text::new(completion.label.text.clone(), style.text.clone()) - .with_soft_wrap(false) - .with_highlights( - combine_syntax_and_fuzzy_match_highlights( - &completion.label.text, - style.text.color.into(), - styled_runs_for_code_label( - &completion.label, - &style.syntax, - ), - &mat.positions, - ), - ); +// let completion_label = +// Text::new(completion.label.text.clone(), style.text.clone()) +// .with_soft_wrap(false) +// .with_highlights( +// combine_syntax_and_fuzzy_match_highlights( +// &completion.label.text, +// style.text.color.into(), +// styled_runs_for_code_label( +// &completion.label, +// &style.syntax, +// ), +// &mat.positions, +// ), +// ); - if let Some(Documentation::SingleLine(text)) = documentation { - Flex::row() - .with_child(completion_label) - .with_children((|| { - let text_style = TextStyle { - color: style.autocomplete.inline_docs_color, - font_size: style.text.font_size - * style.autocomplete.inline_docs_size_percent, - ..style.text.clone() - }; +// if let Some(Documentation::SingleLine(text)) = documentation { +// Flex::row() +// .with_child(completion_label) +// .with_children((|| { +// let text_style = TextStyle { +// color: style.autocomplete.inline_docs_color, +// font_size: style.text.font_size +// * style.autocomplete.inline_docs_size_percent, +// ..style.text.clone() +// }; - let label = Text::new(text.clone(), text_style) - .aligned() - .constrained() - .dynamically(move |constraint, _, _| { - gpui::SizeConstraint { - min: constraint.min, - max: vec2f( - constraint.max.x(), - constraint.min.y(), - ), - } - }); +// let label = Text::new(text.clone(), text_style) +// .aligned() +// .constrained() +// .dynamically(move |constraint, _, _| { +// gpui::SizeConstraint { +// min: constraint.min, +// max: vec2f( +// constraint.max.x(), +// constraint.min.y(), +// ), +// } +// }); - if Some(item_ix) == widest_completion_ix { - Some( - label - .contained() - .with_style( - style - .autocomplete - .inline_docs_container, - ) - .into_any(), - ) - } else { - Some(label.flex_float().into_any()) - } - })()) - .into_any() - } else { - completion_label.into_any() - } - .contained() - .with_style(item_style) - .constrained() - .dynamically( - move |constraint, _, _| { - if Some(item_ix) == widest_completion_ix { - constraint - } else { - gpui::SizeConstraint { - min: constraint.min, - max: constraint.min, - } - } - }, - ) - }, - ) - .with_cursor_style(CursorStyle::PointingHand) - .on_down(MouseButton::Left, move |_, this, cx| { - this.confirm_completion( - &ConfirmCompletion { - item_ix: Some(item_ix), - }, - cx, - ) - .map(|task| task.detach()); - }) - .constrained() - .with_min_width(style.autocomplete.completion_min_width) - .with_max_width(style.autocomplete.completion_max_width) - .into_any(), - ); - } - } - }) - .with_width_from_item(widest_completion_ix); +// if Some(item_ix) == widest_completion_ix { +// Some( +// label +// .contained() +// .with_style( +// style +// .autocomplete +// .inline_docs_container, +// ) +// .into_any(), +// ) +// } else { +// Some(label.flex_float().into_any()) +// } +// })()) +// .into_any() +// } else { +// completion_label.into_any() +// } +// .contained() +// .with_style(item_style) +// .constrained() +// .dynamically( +// move |constraint, _, _| { +// if Some(item_ix) == widest_completion_ix { +// constraint +// } else { +// gpui::SizeConstraint { +// min: constraint.min, +// max: constraint.min, +// } +// } +// }, +// ) +// }, +// ) +// .with_cursor_style(CursorStyle::PointingHand) +// .on_down(MouseButton::Left, move |_, this, cx| { +// this.confirm_completion( +// &ConfirmCompletion { +// item_ix: Some(item_ix), +// }, +// cx, +// ) +// .map(|task| task.detach()); +// }) +// .constrained() +// .with_min_width(style.autocomplete.completion_min_width) +// .with_max_width(style.autocomplete.completion_max_width) +// .into_any(), +// ); +// } +// } +// }) +// .with_width_from_item(widest_completion_ix); - enum MultiLineDocumentation {} +// enum MultiLineDocumentation {} - Flex::row() - .with_child(list.flex(1., false)) - .with_children({ - let mat = &self.matches[selected_item]; - let completions = self.completions.read(); - let completion = &completions[mat.candidate_id]; - let documentation = &completion.documentation; +// Flex::row() +// .with_child(list.flex(1., false)) +// .with_children({ +// let mat = &self.matches[selected_item]; +// let completions = self.completions.read(); +// let completion = &completions[mat.candidate_id]; +// let documentation = &completion.documentation; - match documentation { - Some(Documentation::MultiLinePlainText(text)) => Some( - Flex::column() - .scrollable::(0, None, cx) - .with_child( - Text::new(text.clone(), style.text.clone()).with_soft_wrap(true), - ) - .contained() - .with_style(style.autocomplete.alongside_docs_container) - .constrained() - .with_max_width(style.autocomplete.alongside_docs_max_width) - .flex(1., false), - ), +// match documentation { +// Some(Documentation::MultiLinePlainText(text)) => Some( +// Flex::column() +// .scrollable::(0, None, cx) +// .with_child( +// Text::new(text.clone(), style.text.clone()).with_soft_wrap(true), +// ) +// .contained() +// .with_style(style.autocomplete.alongside_docs_container) +// .constrained() +// .with_max_width(style.autocomplete.alongside_docs_max_width) +// .flex(1., false), +// ), - Some(Documentation::MultiLineMarkdown(parsed)) => Some( - Flex::column() - .scrollable::(0, None, cx) - .with_child(render_parsed_markdown::( - parsed, &style, workspace, cx, - )) - .contained() - .with_style(style.autocomplete.alongside_docs_container) - .constrained() - .with_max_width(style.autocomplete.alongside_docs_max_width) - .flex(1., false), - ), +// Some(Documentation::MultiLineMarkdown(parsed)) => Some( +// Flex::column() +// .scrollable::(0, None, cx) +// .with_child(render_parsed_markdown::( +// parsed, &style, workspace, cx, +// )) +// .contained() +// .with_style(style.autocomplete.alongside_docs_container) +// .constrained() +// .with_max_width(style.autocomplete.alongside_docs_max_width) +// .flex(1., false), +// ), - _ => None, - } - }) - .contained() - .with_style(style.autocomplete.container) - .into_any() - } +// _ => None, +// } +// }) +// .contained() +// .with_style(style.autocomplete.container) +// .into_any() +// } - pub async fn filter(&mut self, query: Option<&str>, executor: Arc) { - let mut matches = if let Some(query) = query { - fuzzy::match_strings( - &self.match_candidates, - query, - query.chars().any(|c| c.is_uppercase()), - 100, - &Default::default(), - executor, - ) - .await - } else { - self.match_candidates - .iter() - .enumerate() - .map(|(candidate_id, candidate)| StringMatch { - candidate_id, - score: Default::default(), - positions: Default::default(), - string: candidate.string.clone(), - }) - .collect() - }; +// pub async fn filter(&mut self, query: Option<&str>, executor: Arc) { +// let mut matches = if let Some(query) = query { +// fuzzy::match_strings( +// &self.match_candidates, +// query, +// query.chars().any(|c| c.is_uppercase()), +// 100, +// &Default::default(), +// executor, +// ) +// .await +// } else { +// self.match_candidates +// .iter() +// .enumerate() +// .map(|(candidate_id, candidate)| StringMatch { +// candidate_id, +// score: Default::default(), +// positions: Default::default(), +// string: candidate.string.clone(), +// }) +// .collect() +// }; - // Remove all candidates where the query's start does not match the start of any word in the candidate - if let Some(query) = query { - if let Some(query_start) = query.chars().next() { - matches.retain(|string_match| { - split_words(&string_match.string).any(|word| { - // Check that the first codepoint of the word as lowercase matches the first - // codepoint of the query as lowercase - word.chars() - .flat_map(|codepoint| codepoint.to_lowercase()) - .zip(query_start.to_lowercase()) - .all(|(word_cp, query_cp)| word_cp == query_cp) - }) - }); - } - } +// // Remove all candidates where the query's start does not match the start of any word in the candidate +// if let Some(query) = query { +// if let Some(query_start) = query.chars().next() { +// matches.retain(|string_match| { +// split_words(&string_match.string).any(|word| { +// // Check that the first codepoint of the word as lowercase matches the first +// // codepoint of the query as lowercase +// word.chars() +// .flat_map(|codepoint| codepoint.to_lowercase()) +// .zip(query_start.to_lowercase()) +// .all(|(word_cp, query_cp)| word_cp == query_cp) +// }) +// }); +// } +// } - let completions = self.completions.read(); - matches.sort_unstable_by_key(|mat| { - let completion = &completions[mat.candidate_id]; - ( - completion.lsp_completion.sort_text.as_ref(), - Reverse(OrderedFloat(mat.score)), - completion.sort_key(), - ) - }); - drop(completions); +// let completions = self.completions.read(); +// matches.sort_unstable_by_key(|mat| { +// let completion = &completions[mat.candidate_id]; +// ( +// completion.lsp_completion.sort_text.as_ref(), +// Reverse(OrderedFloat(mat.score)), +// completion.sort_key(), +// ) +// }); +// drop(completions); - for mat in &mut matches { - let completions = self.completions.read(); - let filter_start = completions[mat.candidate_id].label.filter_range.start; - for position in &mut mat.positions { - *position += filter_start; - } - } +// for mat in &mut matches { +// let completions = self.completions.read(); +// let filter_start = completions[mat.candidate_id].label.filter_range.start; +// for position in &mut mat.positions { +// *position += filter_start; +// } +// } - self.matches = matches.into(); - self.selected_item = 0; - } -} +// self.matches = matches.into(); +// self.selected_item = 0; +// } +// } #[derive(Clone)] struct CodeActionsMenu { actions: Arc<[CodeAction]>, buffer: Model, selected_item: usize, - list: UniformListState, + // list: UniformListState, deployed_from_indicator: bool, } -impl CodeActionsMenu { - fn select_first(&mut self, cx: &mut ViewContext) { - self.selected_item = 0; - self.list.scroll_to(ScrollTarget::Show(self.selected_item)); - cx.notify() - } +// impl CodeActionsMenu { +// fn select_first(&mut self, cx: &mut ViewContext) { +// self.selected_item = 0; +// self.list.scroll_to(ScrollTarget::Show(self.selected_item)); +// cx.notify() +// } - fn select_prev(&mut self, cx: &mut ViewContext) { - if self.selected_item > 0 { - self.selected_item -= 1; - } else { - self.selected_item = self.actions.len() - 1; - } - self.list.scroll_to(ScrollTarget::Show(self.selected_item)); - cx.notify(); - } +// fn select_prev(&mut self, cx: &mut ViewContext) { +// if self.selected_item > 0 { +// self.selected_item -= 1; +// } else { +// self.selected_item = self.actions.len() - 1; +// } +// self.list.scroll_to(ScrollTarget::Show(self.selected_item)); +// cx.notify(); +// } - fn select_next(&mut self, cx: &mut ViewContext) { - if self.selected_item + 1 < self.actions.len() { - self.selected_item += 1; - } else { - self.selected_item = 0; - } - self.list.scroll_to(ScrollTarget::Show(self.selected_item)); - cx.notify(); - } +// fn select_next(&mut self, cx: &mut ViewContext) { +// if self.selected_item + 1 < self.actions.len() { +// self.selected_item += 1; +// } else { +// self.selected_item = 0; +// } +// self.list.scroll_to(ScrollTarget::Show(self.selected_item)); +// cx.notify(); +// } - fn select_last(&mut self, cx: &mut ViewContext) { - self.selected_item = self.actions.len() - 1; - self.list.scroll_to(ScrollTarget::Show(self.selected_item)); - cx.notify() - } +// fn select_last(&mut self, cx: &mut ViewContext) { +// self.selected_item = self.actions.len() - 1; +// self.list.scroll_to(ScrollTarget::Show(self.selected_item)); +// cx.notify() +// } - fn visible(&self) -> bool { - !self.actions.is_empty() - } +// fn visible(&self) -> bool { +// !self.actions.is_empty() +// } - fn render( - &self, - mut cursor_position: DisplayPoint, - style: EditorStyle, - cx: &mut ViewContext, - ) -> (DisplayPoint, AnyElement) { - enum ActionTag {} +// fn render( +// &self, +// mut cursor_position: DisplayPoint, +// style: EditorStyle, +// cx: &mut ViewContext, +// ) -> (DisplayPoint, AnyElement) { +// enum ActionTag {} - let container_style = style.autocomplete.container; - let actions = self.actions.clone(); - let selected_item = self.selected_item; - let element = UniformList::new( - self.list.clone(), - actions.len(), - cx, - move |_, range, items, cx| { - let start_ix = range.start; - for (ix, action) in actions[range].iter().enumerate() { - let item_ix = start_ix + ix; - items.push( - MouseEventHandler::new::(item_ix, cx, |state, _| { - let item_style = if item_ix == selected_item { - style.autocomplete.selected_item - } else if state.hovered() { - style.autocomplete.hovered_item - } else { - style.autocomplete.item - }; +// let container_style = style.autocomplete.container; +// let actions = self.actions.clone(); +// let selected_item = self.selected_item; +// let element = UniformList::new( +// self.list.clone(), +// actions.len(), +// cx, +// move |_, range, items, cx| { +// let start_ix = range.start; +// for (ix, action) in actions[range].iter().enumerate() { +// let item_ix = start_ix + ix; +// items.push( +// MouseEventHandler::new::(item_ix, cx, |state, _| { +// let item_style = if item_ix == selected_item { +// style.autocomplete.selected_item +// } else if state.hovered() { +// style.autocomplete.hovered_item +// } else { +// style.autocomplete.item +// }; - Text::new(action.lsp_action.title.clone(), style.text.clone()) - .with_soft_wrap(false) - .contained() - .with_style(item_style) - }) - .with_cursor_style(CursorStyle::PointingHand) - .on_down(MouseButton::Left, move |_, this, cx| { - let workspace = this - .workspace - .as_ref() - .and_then(|(workspace, _)| workspace.upgrade(cx)); - cx.window_context().defer(move |cx| { - if let Some(workspace) = workspace { - workspace.update(cx, |workspace, cx| { - if let Some(task) = Editor::confirm_code_action( - workspace, - &ConfirmCodeAction { - item_ix: Some(item_ix), - }, - cx, - ) { - task.detach_and_log_err(cx); - } - }); - } - }); - }) - .into_any(), - ); - } - }, - ) - .with_width_from_item( - self.actions - .iter() - .enumerate() - .max_by_key(|(_, action)| action.lsp_action.title.chars().count()) - .map(|(ix, _)| ix), - ) - .contained() - .with_style(container_style) - .into_any(); +// Text::new(action.lsp_action.title.clone(), style.text.clone()) +// .with_soft_wrap(false) +// .contained() +// .with_style(item_style) +// }) +// .with_cursor_style(CursorStyle::PointingHand) +// .on_down(MouseButton::Left, move |_, this, cx| { +// let workspace = this +// .workspace +// .as_ref() +// .and_then(|(workspace, _)| workspace.upgrade(cx)); +// cx.window_context().defer(move |cx| { +// if let Some(workspace) = workspace { +// workspace.update(cx, |workspace, cx| { +// if let Some(task) = Editor::confirm_code_action( +// workspace, +// &ConfirmCodeAction { +// item_ix: Some(item_ix), +// }, +// cx, +// ) { +// task.detach_and_log_err(cx); +// } +// }); +// } +// }); +// }) +// .into_any(), +// ); +// } +// }, +// ) +// .with_width_from_item( +// self.actions +// .iter() +// .enumerate() +// .max_by_key(|(_, action)| action.lsp_action.title.chars().count()) +// .map(|(ix, _)| ix), +// ) +// .contained() +// .with_style(container_style) +// .into_any(); - if self.deployed_from_indicator { - *cursor_position.column_mut() = 0; - } +// if self.deployed_from_indicator { +// *cursor_position.column_mut() = 0; +// } - (cursor_position, element) - } -} +// (cursor_position, element) +// } +// } pub struct CopilotState { excerpt_id: Option, @@ -2040,9 +2027,9 @@ impl InlayHintRefreshReason { // self.leader_peer_id // } -// pub fn buffer(&self) -> &Model { -// &self.buffer -// } +pub fn buffer(&self) -> &Model { + &self.buffer +} // fn workspace(&self, cx: &AppContext) -> Option> { // self.workspace.as_ref()?.0.upgrade(cx) @@ -9224,7 +9211,7 @@ impl EditorSnapshot { self.placeholder_text.as_ref() } - pub fn scroll_position(&self) -> Point { + pub fn scroll_position(&self) -> gpui::Point { self.scroll_anchor.scroll_position(&self.display_snapshot) } } @@ -9277,425 +9264,438 @@ pub struct EditorFocused(pub View); pub struct EditorBlurred(pub View); pub struct EditorReleased(pub WeakView); -impl Entity for Editor { +// impl Entity for Editor { +// type Event = Event; + +// fn release(&mut self, cx: &mut AppContext) { +// cx.emit_global(EditorReleased(self.handle.clone())); +// } +// } +// +impl EventEmitter for Editor { type Event = Event; +} - fn release(&mut self, cx: &mut AppContext) { - cx.emit_global(EditorReleased(self.handle.clone())); +impl Render for Editor { + type Element = EditorElement; + + fn render(&mut self, cx: &mut ViewContext) -> Self::Element { + todo!() } } -impl View for Editor { - fn render(&mut self, cx: &mut ViewContext) -> AnyElement { - let style = self.style(cx); - let font_changed = self.display_map.update(cx, |map, cx| { - map.set_fold_ellipses_color(style.folds.ellipses.text_color); - map.set_font(style.text.font_id, style.text.font_size, cx) - }); +// impl View for Editor { +// fn render(&mut self, cx: &mut ViewContext) -> AnyElement { +// let style = self.style(cx); +// let font_changed = self.display_map.update(cx, |map, cx| { +// map.set_fold_ellipses_color(style.folds.ellipses.text_color); +// map.set_font(style.text.font_id, style.text.font_size, cx) +// }); - if font_changed { - cx.defer(move |editor, cx: &mut ViewContext| { - hide_hover(editor, cx); - hide_link_definition(editor, cx); - }); - } +// if font_changed { +// cx.defer(move |editor, cx: &mut ViewContext| { +// hide_hover(editor, cx); +// hide_link_definition(editor, cx); +// }); +// } - Stack::new() - .with_child(EditorElement::new(style.clone())) - .with_child(ChildView::new(&self.mouse_context_menu, cx)) - .into_any() - } +// Stack::new() +// .with_child(EditorElement::new(style.clone())) +// .with_child(ChildView::new(&self.mouse_context_menu, cx)) +// .into_any() +// } - fn ui_name() -> &'static str { - "Editor" - } +// fn ui_name() -> &'static str { +// "Editor" +// } - fn focus_in(&mut self, focused: AnyView, cx: &mut ViewContext) { - if cx.is_self_focused() { - let focused_event = EditorFocused(cx.handle()); - cx.emit(Event::Focused); - cx.emit_global(focused_event); - } - if let Some(rename) = self.pending_rename.as_ref() { - cx.focus(&rename.editor); - } else if cx.is_self_focused() || !focused.is::() { - if !self.focused { - self.blink_manager.update(cx, BlinkManager::enable); - } - self.focused = true; - self.buffer.update(cx, |buffer, cx| { - buffer.finalize_last_transaction(cx); - if self.leader_peer_id.is_none() { - buffer.set_active_selections( - &self.selections.disjoint_anchors(), - self.selections.line_mode, - self.cursor_shape, - cx, - ); - } - }); - } - } +// fn focus_in(&mut self, focused: AnyView, cx: &mut ViewContext) { +// if cx.is_self_focused() { +// let focused_event = EditorFocused(cx.handle()); +// cx.emit(Event::Focused); +// cx.emit_global(focused_event); +// } +// if let Some(rename) = self.pending_rename.as_ref() { +// cx.focus(&rename.editor); +// } else if cx.is_self_focused() || !focused.is::() { +// if !self.focused { +// self.blink_manager.update(cx, BlinkManager::enable); +// } +// self.focused = true; +// self.buffer.update(cx, |buffer, cx| { +// buffer.finalize_last_transaction(cx); +// if self.leader_peer_id.is_none() { +// buffer.set_active_selections( +// &self.selections.disjoint_anchors(), +// self.selections.line_mode, +// self.cursor_shape, +// cx, +// ); +// } +// }); +// } +// } - fn focus_out(&mut self, _: AnyView, cx: &mut ViewContext) { - let blurred_event = EditorBlurred(cx.handle()); - cx.emit_global(blurred_event); - self.focused = false; - self.blink_manager.update(cx, BlinkManager::disable); - self.buffer - .update(cx, |buffer, cx| buffer.remove_active_selections(cx)); - self.hide_context_menu(cx); - hide_hover(self, cx); - cx.emit(Event::Blurred); - cx.notify(); - } +// fn focus_out(&mut self, _: AnyView, cx: &mut ViewContext) { +// let blurred_event = EditorBlurred(cx.handle()); +// cx.emit_global(blurred_event); +// self.focused = false; +// self.blink_manager.update(cx, BlinkManager::disable); +// self.buffer +// .update(cx, |buffer, cx| buffer.remove_active_selections(cx)); +// self.hide_context_menu(cx); +// hide_hover(self, cx); +// cx.emit(Event::Blurred); +// cx.notify(); +// } - fn modifiers_changed( - &mut self, - event: &gpui::platform::ModifiersChangedEvent, - cx: &mut ViewContext, - ) -> bool { - let pending_selection = self.has_pending_selection(); +// fn modifiers_changed( +// &mut self, +// event: &gpui::platform::ModifiersChangedEvent, +// cx: &mut ViewContext, +// ) -> bool { +// let pending_selection = self.has_pending_selection(); - if let Some(point) = &self.link_go_to_definition_state.last_trigger_point { - if event.cmd && !pending_selection { - let point = point.clone(); - let snapshot = self.snapshot(cx); - let kind = point.definition_kind(event.shift); +// if let Some(point) = &self.link_go_to_definition_state.last_trigger_point { +// if event.cmd && !pending_selection { +// let point = point.clone(); +// let snapshot = self.snapshot(cx); +// let kind = point.definition_kind(event.shift); - show_link_definition(kind, self, point, snapshot, cx); - return false; - } - } +// show_link_definition(kind, self, point, snapshot, cx); +// return false; +// } +// } - { - if self.link_go_to_definition_state.symbol_range.is_some() - || !self.link_go_to_definition_state.definitions.is_empty() - { - self.link_go_to_definition_state.symbol_range.take(); - self.link_go_to_definition_state.definitions.clear(); - cx.notify(); - } +// { +// if self.link_go_to_definition_state.symbol_range.is_some() +// || !self.link_go_to_definition_state.definitions.is_empty() +// { +// self.link_go_to_definition_state.symbol_range.take(); +// self.link_go_to_definition_state.definitions.clear(); +// cx.notify(); +// } - self.link_go_to_definition_state.task = None; +// self.link_go_to_definition_state.task = None; - self.clear_highlights::(cx); - } +// self.clear_highlights::(cx); +// } - false - } +// false +// } - fn update_keymap_context(&self, keymap: &mut KeymapContext, cx: &AppContext) { - Self::reset_to_default_keymap_context(keymap); - let mode = match self.mode { - EditorMode::SingleLine => "single_line", - EditorMode::AutoHeight { .. } => "auto_height", - EditorMode::Full => "full", - }; - keymap.add_key("mode", mode); - if self.pending_rename.is_some() { - keymap.add_identifier("renaming"); - } - if self.context_menu_visible() { - match self.context_menu.read().as_ref() { - Some(ContextMenu::Completions(_)) => { - keymap.add_identifier("menu"); - keymap.add_identifier("showing_completions") - } - Some(ContextMenu::CodeActions(_)) => { - keymap.add_identifier("menu"); - keymap.add_identifier("showing_code_actions") - } - None => {} - } - } +// fn update_keymap_context(&self, keymap: &mut KeymapContext, cx: &AppContext) { +// Self::reset_to_default_keymap_context(keymap); +// let mode = match self.mode { +// EditorMode::SingleLine => "single_line", +// EditorMode::AutoHeight { .. } => "auto_height", +// EditorMode::Full => "full", +// }; +// keymap.add_key("mode", mode); +// if self.pending_rename.is_some() { +// keymap.add_identifier("renaming"); +// } +// if self.context_menu_visible() { +// match self.context_menu.read().as_ref() { +// Some(ContextMenu::Completions(_)) => { +// keymap.add_identifier("menu"); +// keymap.add_identifier("showing_completions") +// } +// Some(ContextMenu::CodeActions(_)) => { +// keymap.add_identifier("menu"); +// keymap.add_identifier("showing_code_actions") +// } +// None => {} +// } +// } - for layer in self.keymap_context_layers.values() { - keymap.extend(layer); - } +// for layer in self.keymap_context_layers.values() { +// keymap.extend(layer); +// } - if let Some(extension) = self - .buffer - .read(cx) - .as_singleton() - .and_then(|buffer| buffer.read(cx).file()?.path().extension()?.to_str()) - { - keymap.add_key("extension", extension.to_string()); - } - } +// if let Some(extension) = self +// .buffer +// .read(cx) +// .as_singleton() +// .and_then(|buffer| buffer.read(cx).file()?.path().extension()?.to_str()) +// { +// keymap.add_key("extension", extension.to_string()); +// } +// } - fn text_for_range(&self, range_utf16: Range, cx: &AppContext) -> Option { - Some( - self.buffer - .read(cx) - .read(cx) - .text_for_range(OffsetUtf16(range_utf16.start)..OffsetUtf16(range_utf16.end)) - .collect(), - ) - } +// fn text_for_range(&self, range_utf16: Range, cx: &AppContext) -> Option { +// Some( +// self.buffer +// .read(cx) +// .read(cx) +// .text_for_range(OffsetUtf16(range_utf16.start)..OffsetUtf16(range_utf16.end)) +// .collect(), +// ) +// } - fn selected_text_range(&self, cx: &AppContext) -> Option> { - // Prevent the IME menu from appearing when holding down an alphabetic key - // while input is disabled. - if !self.input_enabled { - return None; - } +// fn selected_text_range(&self, cx: &AppContext) -> Option> { +// // Prevent the IME menu from appearing when holding down an alphabetic key +// // while input is disabled. +// if !self.input_enabled { +// return None; +// } - let range = self.selections.newest::(cx).range(); - Some(range.start.0..range.end.0) - } +// let range = self.selections.newest::(cx).range(); +// Some(range.start.0..range.end.0) +// } - fn marked_text_range(&self, cx: &AppContext) -> Option> { - let snapshot = self.buffer.read(cx).read(cx); - let range = self.text_highlights::(cx)?.1.get(0)?; - Some(range.start.to_offset_utf16(&snapshot).0..range.end.to_offset_utf16(&snapshot).0) - } +// fn marked_text_range(&self, cx: &AppContext) -> Option> { +// let snapshot = self.buffer.read(cx).read(cx); +// let range = self.text_highlights::(cx)?.1.get(0)?; +// Some(range.start.to_offset_utf16(&snapshot).0..range.end.to_offset_utf16(&snapshot).0) +// } - fn unmark_text(&mut self, cx: &mut ViewContext) { - self.clear_highlights::(cx); - self.ime_transaction.take(); - } +// fn unmark_text(&mut self, cx: &mut ViewContext) { +// self.clear_highlights::(cx); +// self.ime_transaction.take(); +// } - fn replace_text_in_range( - &mut self, - range_utf16: Option>, - text: &str, - cx: &mut ViewContext, - ) { - if !self.input_enabled { - cx.emit(Event::InputIgnored { text: text.into() }); - return; - } +// fn replace_text_in_range( +// &mut self, +// range_utf16: Option>, +// text: &str, +// cx: &mut ViewContext, +// ) { +// if !self.input_enabled { +// cx.emit(Event::InputIgnored { text: text.into() }); +// return; +// } - self.transact(cx, |this, cx| { - let new_selected_ranges = if let Some(range_utf16) = range_utf16 { - let range_utf16 = OffsetUtf16(range_utf16.start)..OffsetUtf16(range_utf16.end); - Some(this.selection_replacement_ranges(range_utf16, cx)) - } else { - this.marked_text_ranges(cx) - }; +// self.transact(cx, |this, cx| { +// let new_selected_ranges = if let Some(range_utf16) = range_utf16 { +// let range_utf16 = OffsetUtf16(range_utf16.start)..OffsetUtf16(range_utf16.end); +// Some(this.selection_replacement_ranges(range_utf16, cx)) +// } else { +// this.marked_text_ranges(cx) +// }; - let range_to_replace = new_selected_ranges.as_ref().and_then(|ranges_to_replace| { - let newest_selection_id = this.selections.newest_anchor().id; - this.selections - .all::(cx) - .iter() - .zip(ranges_to_replace.iter()) - .find_map(|(selection, range)| { - if selection.id == newest_selection_id { - Some( - (range.start.0 as isize - selection.head().0 as isize) - ..(range.end.0 as isize - selection.head().0 as isize), - ) - } else { - None - } - }) - }); +// let range_to_replace = new_selected_ranges.as_ref().and_then(|ranges_to_replace| { +// let newest_selection_id = this.selections.newest_anchor().id; +// this.selections +// .all::(cx) +// .iter() +// .zip(ranges_to_replace.iter()) +// .find_map(|(selection, range)| { +// if selection.id == newest_selection_id { +// Some( +// (range.start.0 as isize - selection.head().0 as isize) +// ..(range.end.0 as isize - selection.head().0 as isize), +// ) +// } else { +// None +// } +// }) +// }); - cx.emit(Event::InputHandled { - utf16_range_to_replace: range_to_replace, - text: text.into(), - }); +// cx.emit(Event::InputHandled { +// utf16_range_to_replace: range_to_replace, +// text: text.into(), +// }); - if let Some(new_selected_ranges) = new_selected_ranges { - this.change_selections(None, cx, |selections| { - selections.select_ranges(new_selected_ranges) - }); - } +// if let Some(new_selected_ranges) = new_selected_ranges { +// this.change_selections(None, cx, |selections| { +// selections.select_ranges(new_selected_ranges) +// }); +// } - this.handle_input(text, cx); - }); +// this.handle_input(text, cx); +// }); - if let Some(transaction) = self.ime_transaction { - self.buffer.update(cx, |buffer, cx| { - buffer.group_until_transaction(transaction, cx); - }); - } +// if let Some(transaction) = self.ime_transaction { +// self.buffer.update(cx, |buffer, cx| { +// buffer.group_until_transaction(transaction, cx); +// }); +// } - self.unmark_text(cx); - } +// self.unmark_text(cx); +// } - fn replace_and_mark_text_in_range( - &mut self, - range_utf16: Option>, - text: &str, - new_selected_range_utf16: Option>, - cx: &mut ViewContext, - ) { - if !self.input_enabled { - cx.emit(Event::InputIgnored { text: text.into() }); - return; - } +// fn replace_and_mark_text_in_range( +// &mut self, +// range_utf16: Option>, +// text: &str, +// new_selected_range_utf16: Option>, +// cx: &mut ViewContext, +// ) { +// if !self.input_enabled { +// cx.emit(Event::InputIgnored { text: text.into() }); +// return; +// } - let transaction = self.transact(cx, |this, cx| { - let ranges_to_replace = if let Some(mut marked_ranges) = this.marked_text_ranges(cx) { - let snapshot = this.buffer.read(cx).read(cx); - if let Some(relative_range_utf16) = range_utf16.as_ref() { - for marked_range in &mut marked_ranges { - marked_range.end.0 = marked_range.start.0 + relative_range_utf16.end; - marked_range.start.0 += relative_range_utf16.start; - marked_range.start = - snapshot.clip_offset_utf16(marked_range.start, Bias::Left); - marked_range.end = - snapshot.clip_offset_utf16(marked_range.end, Bias::Right); - } - } - Some(marked_ranges) - } else if let Some(range_utf16) = range_utf16 { - let range_utf16 = OffsetUtf16(range_utf16.start)..OffsetUtf16(range_utf16.end); - Some(this.selection_replacement_ranges(range_utf16, cx)) - } else { - None - }; +// let transaction = self.transact(cx, |this, cx| { +// let ranges_to_replace = if let Some(mut marked_ranges) = this.marked_text_ranges(cx) { +// let snapshot = this.buffer.read(cx).read(cx); +// if let Some(relative_range_utf16) = range_utf16.as_ref() { +// for marked_range in &mut marked_ranges { +// marked_range.end.0 = marked_range.start.0 + relative_range_utf16.end; +// marked_range.start.0 += relative_range_utf16.start; +// marked_range.start = +// snapshot.clip_offset_utf16(marked_range.start, Bias::Left); +// marked_range.end = +// snapshot.clip_offset_utf16(marked_range.end, Bias::Right); +// } +// } +// Some(marked_ranges) +// } else if let Some(range_utf16) = range_utf16 { +// let range_utf16 = OffsetUtf16(range_utf16.start)..OffsetUtf16(range_utf16.end); +// Some(this.selection_replacement_ranges(range_utf16, cx)) +// } else { +// None +// }; - let range_to_replace = ranges_to_replace.as_ref().and_then(|ranges_to_replace| { - let newest_selection_id = this.selections.newest_anchor().id; - this.selections - .all::(cx) - .iter() - .zip(ranges_to_replace.iter()) - .find_map(|(selection, range)| { - if selection.id == newest_selection_id { - Some( - (range.start.0 as isize - selection.head().0 as isize) - ..(range.end.0 as isize - selection.head().0 as isize), - ) - } else { - None - } - }) - }); +// let range_to_replace = ranges_to_replace.as_ref().and_then(|ranges_to_replace| { +// let newest_selection_id = this.selections.newest_anchor().id; +// this.selections +// .all::(cx) +// .iter() +// .zip(ranges_to_replace.iter()) +// .find_map(|(selection, range)| { +// if selection.id == newest_selection_id { +// Some( +// (range.start.0 as isize - selection.head().0 as isize) +// ..(range.end.0 as isize - selection.head().0 as isize), +// ) +// } else { +// None +// } +// }) +// }); - cx.emit(Event::InputHandled { - utf16_range_to_replace: range_to_replace, - text: text.into(), - }); +// cx.emit(Event::InputHandled { +// utf16_range_to_replace: range_to_replace, +// text: text.into(), +// }); - if let Some(ranges) = ranges_to_replace { - this.change_selections(None, cx, |s| s.select_ranges(ranges)); - } +// if let Some(ranges) = ranges_to_replace { +// this.change_selections(None, cx, |s| s.select_ranges(ranges)); +// } - let marked_ranges = { - let snapshot = this.buffer.read(cx).read(cx); - this.selections - .disjoint_anchors() - .iter() - .map(|selection| { - selection.start.bias_left(&*snapshot)..selection.end.bias_right(&*snapshot) - }) - .collect::>() - }; +// let marked_ranges = { +// let snapshot = this.buffer.read(cx).read(cx); +// this.selections +// .disjoint_anchors() +// .iter() +// .map(|selection| { +// selection.start.bias_left(&*snapshot)..selection.end.bias_right(&*snapshot) +// }) +// .collect::>() +// }; - if text.is_empty() { - this.unmark_text(cx); - } else { - this.highlight_text::( - marked_ranges.clone(), - this.style(cx).composition_mark, - cx, - ); - } +// if text.is_empty() { +// this.unmark_text(cx); +// } else { +// this.highlight_text::( +// marked_ranges.clone(), +// this.style(cx).composition_mark, +// cx, +// ); +// } - this.handle_input(text, cx); +// this.handle_input(text, cx); - if let Some(new_selected_range) = new_selected_range_utf16 { - let snapshot = this.buffer.read(cx).read(cx); - let new_selected_ranges = marked_ranges - .into_iter() - .map(|marked_range| { - let insertion_start = marked_range.start.to_offset_utf16(&snapshot).0; - let new_start = OffsetUtf16(new_selected_range.start + insertion_start); - let new_end = OffsetUtf16(new_selected_range.end + insertion_start); - snapshot.clip_offset_utf16(new_start, Bias::Left) - ..snapshot.clip_offset_utf16(new_end, Bias::Right) - }) - .collect::>(); +// if let Some(new_selected_range) = new_selected_range_utf16 { +// let snapshot = this.buffer.read(cx).read(cx); +// let new_selected_ranges = marked_ranges +// .into_iter() +// .map(|marked_range| { +// let insertion_start = marked_range.start.to_offset_utf16(&snapshot).0; +// let new_start = OffsetUtf16(new_selected_range.start + insertion_start); +// let new_end = OffsetUtf16(new_selected_range.end + insertion_start); +// snapshot.clip_offset_utf16(new_start, Bias::Left) +// ..snapshot.clip_offset_utf16(new_end, Bias::Right) +// }) +// .collect::>(); - drop(snapshot); - this.change_selections(None, cx, |selections| { - selections.select_ranges(new_selected_ranges) - }); - } - }); +// drop(snapshot); +// this.change_selections(None, cx, |selections| { +// selections.select_ranges(new_selected_ranges) +// }); +// } +// }); - self.ime_transaction = self.ime_transaction.or(transaction); - if let Some(transaction) = self.ime_transaction { - self.buffer.update(cx, |buffer, cx| { - buffer.group_until_transaction(transaction, cx); - }); - } +// self.ime_transaction = self.ime_transaction.or(transaction); +// if let Some(transaction) = self.ime_transaction { +// self.buffer.update(cx, |buffer, cx| { +// buffer.group_until_transaction(transaction, cx); +// }); +// } - if self.text_highlights::(cx).is_none() { - self.ime_transaction.take(); - } - } -} +// if self.text_highlights::(cx).is_none() { +// self.ime_transaction.take(); +// } +// } +// } -fn build_style( - settings: &ThemeSettings, - get_field_editor_theme: Option<&GetFieldEditorTheme>, - override_text_style: Option<&OverrideTextStyle>, - cx: &mut AppContext, -) -> EditorStyle { - let font_cache = cx.font_cache(); - let line_height_scalar = settings.line_height(); - let theme_id = settings.theme.meta.id; - let mut theme = settings.theme.editor.clone(); - let mut style = if let Some(get_field_editor_theme) = get_field_editor_theme { - let field_editor_theme = get_field_editor_theme(&settings.theme); - theme.text_color = field_editor_theme.text.color; - theme.selection = field_editor_theme.selection; - theme.background = field_editor_theme - .container - .background_color - .unwrap_or_default(); - EditorStyle { - text: field_editor_theme.text, - placeholder_text: field_editor_theme.placeholder_text, - line_height_scalar, - theme, - theme_id, - } - } else { - let font_family_id = settings.buffer_font_family; - let font_family_name = cx.font_cache().family_name(font_family_id).unwrap(); - let font_properties = Default::default(); - let font_id = font_cache - .select_font(font_family_id, &font_properties) - .unwrap(); - let font_size = settings.buffer_font_size(cx); - EditorStyle { - text: TextStyle { - color: settings.theme.editor.text_color, - font_family_name, - font_family_id, - font_id, - font_size, - font_properties, - underline: Default::default(), - soft_wrap: false, - }, - placeholder_text: None, - line_height_scalar, - theme, - theme_id, - } - }; +// fn build_style( +// settings: &ThemeSettings, +// get_field_editor_theme: Option<&GetFieldEditorTheme>, +// override_text_style: Option<&OverrideTextStyle>, +// cx: &mut AppContext, +// ) -> EditorStyle { +// let font_cache = cx.font_cache(); +// let line_height_scalar = settings.line_height(); +// let theme_id = settings.theme.meta.id; +// let mut theme = settings.theme.editor.clone(); +// let mut style = if let Some(get_field_editor_theme) = get_field_editor_theme { +// let field_editor_theme = get_field_editor_theme(&settings.theme); +// theme.text_color = field_editor_theme.text.color; +// theme.selection = field_editor_theme.selection; +// theme.background = field_editor_theme +// .container +// .background_color +// .unwrap_or_default(); +// EditorStyle { +// text: field_editor_theme.text, +// placeholder_text: field_editor_theme.placeholder_text, +// line_height_scalar, +// theme, +// theme_id, +// } +// } else { +// todo!(); +// // let font_family_id = settings.buffer_font_family; +// // let font_family_name = cx.font_cache().family_name(font_family_id).unwrap(); +// // let font_properties = Default::default(); +// // let font_id = font_cache +// // .select_font(font_family_id, &font_properties) +// // .unwrap(); +// // let font_size = settings.buffer_font_size(cx); +// // EditorStyle { +// // text: TextStyle { +// // color: settings.theme.editor.text_color, +// // font_family_name, +// // font_family_id, +// // font_id, +// // font_size, +// // font_properties, +// // underline: Default::default(), +// // soft_wrap: false, +// // }, +// // placeholder_text: None, +// // line_height_scalar, +// // theme, +// // theme_id, +// // } +// }; - if let Some(highlight_style) = override_text_style.and_then(|build_style| build_style(&style)) { - if let Some(highlighted) = style - .text - .clone() - .highlight(highlight_style, font_cache) - .log_err() - { - style.text = highlighted; - } - } +// if let Some(highlight_style) = override_text_style.and_then(|build_style| build_style(&style)) { +// if let Some(highlighted) = style +// .text +// .clone() +// .highlight(highlight_style, font_cache) +// .log_err() +// { +// style.text = highlighted; +// } +// } - style -} +// style +// } trait SelectionExt { fn offset_range(&self, buffer: &MultiBufferSnapshot) -> Range; @@ -9813,68 +9813,68 @@ impl InvalidationRegion for SnippetState { } } -impl Deref for EditorStyle { - type Target = theme::Editor; +// impl Deref for EditorStyle { +// type Target = theme::Editor; - fn deref(&self) -> &Self::Target { - &self.theme - } -} +// fn deref(&self) -> &Self::Target { +// &self.theme +// } +// } -pub fn diagnostic_block_renderer(diagnostic: Diagnostic, is_valid: bool) -> RenderBlock { - let mut highlighted_lines = Vec::new(); +// pub fn diagnostic_block_renderer(diagnostic: Diagnostic, is_valid: bool) -> RenderBlock { +// let mut highlighted_lines = Vec::new(); - for (index, line) in diagnostic.message.lines().enumerate() { - let line = match &diagnostic.source { - Some(source) if index == 0 => { - let source_highlight = Vec::from_iter(0..source.len()); - highlight_diagnostic_message(source_highlight, &format!("{source}: {line}")) - } +// for (index, line) in diagnostic.message.lines().enumerate() { +// let line = match &diagnostic.source { +// Some(source) if index == 0 => { +// let source_highlight = Vec::from_iter(0..source.len()); +// highlight_diagnostic_message(source_highlight, &format!("{source}: {line}")) +// } - _ => highlight_diagnostic_message(Vec::new(), line), - }; - highlighted_lines.push(line); - } - let message = diagnostic.message; - Arc::new(move |cx: &mut BlockContext| { - let message = message.clone(); - let settings = settings::get::(cx); - let tooltip_style = settings.theme.tooltip.clone(); - let theme = &settings.theme.editor; - let style = diagnostic_style(diagnostic.severity, is_valid, theme); - let font_size = (style.text_scale_factor * settings.buffer_font_size(cx)).round(); - let anchor_x = cx.anchor_x; - enum BlockContextToolip {} - MouseEventHandler::new::(cx.block_id, cx, |_, _| { - Flex::column() - .with_children(highlighted_lines.iter().map(|(line, highlights)| { - Label::new( - line.clone(), - style.message.clone().with_font_size(font_size), - ) - .with_highlights(highlights.clone()) - .contained() - .with_margin_left(anchor_x) - })) - .aligned() - .left() - .into_any() - }) - .with_cursor_style(CursorStyle::PointingHand) - .on_click(MouseButton::Left, move |_, _, cx| { - cx.write_to_clipboard(ClipboardItem::new(message.clone())); - }) - // We really need to rethink this ID system... - .with_tooltip::( - cx.block_id, - "Copy diagnostic message", - None, - tooltip_style, - cx, - ) - .into_any() - }) -} +// _ => highlight_diagnostic_message(Vec::new(), line), +// }; +// highlighted_lines.push(line); +// } +// let message = diagnostic.message; +// Arc::new(move |cx: &mut BlockContext| { +// let message = message.clone(); +// let settings = ThemeSettings::get_global(cx); +// let tooltip_style = settings.theme.tooltip.clone(); +// let theme = &settings.theme.editor; +// let style = diagnostic_style(diagnostic.severity, is_valid, theme); +// let font_size = (style.text_scale_factor * settings.buffer_font_size(cx)).round(); +// let anchor_x = cx.anchor_x; +// enum BlockContextToolip {} +// MouseEventHandler::new::(cx.block_id, cx, |_, _| { +// Flex::column() +// .with_children(highlighted_lines.iter().map(|(line, highlights)| { +// Label::new( +// line.clone(), +// style.message.clone().with_font_size(font_size), +// ) +// .with_highlights(highlights.clone()) +// .contained() +// .with_margin_left(anchor_x) +// })) +// .aligned() +// .left() +// .into_any() +// }) +// .with_cursor_style(CursorStyle::PointingHand) +// .on_click(MouseButton::Left, move |_, _, cx| { +// cx.write_to_clipboard(ClipboardItem::new(message.clone())); +// }) +// // We really need to rethink this ID system... +// .with_tooltip::( +// cx.block_id, +// "Copy diagnostic message", +// None, +// tooltip_style, +// cx, +// ) +// .into_any() +// }) +// } pub fn highlight_diagnostic_message( initial_highlights: Vec, @@ -9901,139 +9901,139 @@ pub fn highlight_diagnostic_message( (message_without_backticks, highlights) } -pub fn diagnostic_style( - severity: DiagnosticSeverity, - valid: bool, - theme: &theme::Editor, -) -> DiagnosticStyle { - match (severity, valid) { - (DiagnosticSeverity::ERROR, true) => theme.error_diagnostic.clone(), - (DiagnosticSeverity::ERROR, false) => theme.invalid_error_diagnostic.clone(), - (DiagnosticSeverity::WARNING, true) => theme.warning_diagnostic.clone(), - (DiagnosticSeverity::WARNING, false) => theme.invalid_warning_diagnostic.clone(), - (DiagnosticSeverity::INFORMATION, true) => theme.information_diagnostic.clone(), - (DiagnosticSeverity::INFORMATION, false) => theme.invalid_information_diagnostic.clone(), - (DiagnosticSeverity::HINT, true) => theme.hint_diagnostic.clone(), - (DiagnosticSeverity::HINT, false) => theme.invalid_hint_diagnostic.clone(), - _ => theme.invalid_hint_diagnostic.clone(), - } -} +// pub fn diagnostic_style( +// severity: DiagnosticSeverity, +// valid: bool, +// theme: &theme::Editor, +// ) -> DiagnosticStyle { +// match (severity, valid) { +// (DiagnosticSeverity::ERROR, true) => theme.error_diagnostic.clone(), +// (DiagnosticSeverity::ERROR, false) => theme.invalid_error_diagnostic.clone(), +// (DiagnosticSeverity::WARNING, true) => theme.warning_diagnostic.clone(), +// (DiagnosticSeverity::WARNING, false) => theme.invalid_warning_diagnostic.clone(), +// (DiagnosticSeverity::INFORMATION, true) => theme.information_diagnostic.clone(), +// (DiagnosticSeverity::INFORMATION, false) => theme.invalid_information_diagnostic.clone(), +// (DiagnosticSeverity::HINT, true) => theme.hint_diagnostic.clone(), +// (DiagnosticSeverity::HINT, false) => theme.invalid_hint_diagnostic.clone(), +// _ => theme.invalid_hint_diagnostic.clone(), +// } +// } -pub fn combine_syntax_and_fuzzy_match_highlights( - text: &str, - default_style: HighlightStyle, - syntax_ranges: impl Iterator, HighlightStyle)>, - match_indices: &[usize], -) -> Vec<(Range, HighlightStyle)> { - let mut result = Vec::new(); - let mut match_indices = match_indices.iter().copied().peekable(); +// pub fn combine_syntax_and_fuzzy_match_highlights( +// text: &str, +// default_style: HighlightStyle, +// syntax_ranges: impl Iterator, HighlightStyle)>, +// match_indices: &[usize], +// ) -> Vec<(Range, HighlightStyle)> { +// let mut result = Vec::new(); +// let mut match_indices = match_indices.iter().copied().peekable(); - for (range, mut syntax_highlight) in syntax_ranges.chain([(usize::MAX..0, Default::default())]) - { - syntax_highlight.weight = None; +// for (range, mut syntax_highlight) in syntax_ranges.chain([(usize::MAX..0, Default::default())]) +// { +// syntax_highlight.weight = None; - // Add highlights for any fuzzy match characters before the next - // syntax highlight range. - while let Some(&match_index) = match_indices.peek() { - if match_index >= range.start { - break; - } - match_indices.next(); - let end_index = char_ix_after(match_index, text); - let mut match_style = default_style; - match_style.weight = Some(fonts::Weight::BOLD); - result.push((match_index..end_index, match_style)); - } +// // Add highlights for any fuzzy match characters before the next +// // syntax highlight range. +// while let Some(&match_index) = match_indices.peek() { +// if match_index >= range.start { +// break; +// } +// match_indices.next(); +// let end_index = char_ix_after(match_index, text); +// let mut match_style = default_style; +// match_style.weight = Some(FontWeight::BOLD); +// result.push((match_index..end_index, match_style)); +// } - if range.start == usize::MAX { - break; - } +// if range.start == usize::MAX { +// break; +// } - // Add highlights for any fuzzy match characters within the - // syntax highlight range. - let mut offset = range.start; - while let Some(&match_index) = match_indices.peek() { - if match_index >= range.end { - break; - } +// // Add highlights for any fuzzy match characters within the +// // syntax highlight range. +// let mut offset = range.start; +// while let Some(&match_index) = match_indices.peek() { +// if match_index >= range.end { +// break; +// } - match_indices.next(); - if match_index > offset { - result.push((offset..match_index, syntax_highlight)); - } +// match_indices.next(); +// if match_index > offset { +// result.push((offset..match_index, syntax_highlight)); +// } - let mut end_index = char_ix_after(match_index, text); - while let Some(&next_match_index) = match_indices.peek() { - if next_match_index == end_index && next_match_index < range.end { - end_index = char_ix_after(next_match_index, text); - match_indices.next(); - } else { - break; - } - } +// let mut end_index = char_ix_after(match_index, text); +// while let Some(&next_match_index) = match_indices.peek() { +// if next_match_index == end_index && next_match_index < range.end { +// end_index = char_ix_after(next_match_index, text); +// match_indices.next(); +// } else { +// break; +// } +// } - let mut match_style = syntax_highlight; - match_style.weight = Some(fonts::Weight::BOLD); - result.push((match_index..end_index, match_style)); - offset = end_index; - } +// let mut match_style = syntax_highlight; +// match_style.weight = Some(FontWeight::BOLD); +// result.push((match_index..end_index, match_style)); +// offset = end_index; +// } - if offset < range.end { - result.push((offset..range.end, syntax_highlight)); - } - } +// if offset < range.end { +// result.push((offset..range.end, syntax_highlight)); +// } +// } - fn char_ix_after(ix: usize, text: &str) -> usize { - ix + text[ix..].chars().next().unwrap().len_utf8() - } +// fn char_ix_after(ix: usize, text: &str) -> usize { +// ix + text[ix..].chars().next().unwrap().len_utf8() +// } - result -} +// result +// } -pub fn styled_runs_for_code_label<'a>( - label: &'a CodeLabel, - syntax_theme: &'a theme::SyntaxTheme, -) -> impl 'a + Iterator, HighlightStyle)> { - let fade_out = HighlightStyle { - fade_out: Some(0.35), - ..Default::default() - }; +// pub fn styled_runs_for_code_label<'a>( +// label: &'a CodeLabel, +// syntax_theme: &'a theme::SyntaxTheme, +// ) -> impl 'a + Iterator, HighlightStyle)> { +// let fade_out = HighlightStyle { +// fade_out: Some(0.35), +// ..Default::default() +// }; - let mut prev_end = label.filter_range.end; - label - .runs - .iter() - .enumerate() - .flat_map(move |(ix, (range, highlight_id))| { - let style = if let Some(style) = highlight_id.style(syntax_theme) { - style - } else { - return Default::default(); - }; - let mut muted_style = style; - muted_style.highlight(fade_out); +// let mut prev_end = label.filter_range.end; +// label +// .runs +// .iter() +// .enumerate() +// .flat_map(move |(ix, (range, highlight_id))| { +// let style = if let Some(style) = highlight_id.style(syntax_theme) { +// style +// } else { +// return Default::default(); +// }; +// let mut muted_style = style; +// muted_style.highlight(fade_out); - let mut runs = SmallVec::<[(Range, HighlightStyle); 3]>::new(); - if range.start >= label.filter_range.end { - if range.start > prev_end { - runs.push((prev_end..range.start, fade_out)); - } - runs.push((range.clone(), muted_style)); - } else if range.end <= label.filter_range.end { - runs.push((range.clone(), style)); - } else { - runs.push((range.start..label.filter_range.end, style)); - runs.push((label.filter_range.end..range.end, muted_style)); - } - prev_end = cmp::max(prev_end, range.end); +// let mut runs = SmallVec::<[(Range, HighlightStyle); 3]>::new(); +// if range.start >= label.filter_range.end { +// if range.start > prev_end { +// runs.push((prev_end..range.start, fade_out)); +// } +// runs.push((range.clone(), muted_style)); +// } else if range.end <= label.filter_range.end { +// runs.push((range.clone(), style)); +// } else { +// runs.push((range.start..label.filter_range.end, style)); +// runs.push((label.filter_range.end..range.end, muted_style)); +// } +// prev_end = cmp::max(prev_end, range.end); - if ix + 1 == label.runs.len() && label.text.len() > prev_end { - runs.push((prev_end..label.text.len(), fade_out)); - } +// if ix + 1 == label.runs.len() && label.text.len() > prev_end { +// runs.push((prev_end..label.text.len(), fade_out)); +// } - runs - }) -} +// runs +// }) +// } pub fn split_words<'a>(text: &'a str) -> impl std::iter::Iterator + 'a { let mut index = 0; diff --git a/crates/editor2/src/editor_settings.rs b/crates/editor2/src/editor_settings.rs index 349d1c62fa..45c797598f 100644 --- a/crates/editor2/src/editor_settings.rs +++ b/crates/editor2/src/editor_settings.rs @@ -1,6 +1,6 @@ -use gpui::Settings; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use settings::Settings; #[derive(Deserialize)] pub struct EditorSettings { @@ -55,7 +55,7 @@ impl Settings for EditorSettings { fn load( default_value: &Self::FileContent, user_values: &[&Self::FileContent], - _: &gpui::AppContext, + _: &mut gpui::AppContext, ) -> anyhow::Result { Self::load_via_json_merge(default_value, user_values) } diff --git a/crates/editor2/src/element.rs b/crates/editor2/src/element.rs index 3583085fcc..dc0b9f6751 100644 --- a/crates/editor2/src/element.rs +++ b/crates/editor2/src/element.rs @@ -3,9 +3,11 @@ use super::{ }; use crate::{ display_map::{BlockStyle, DisplaySnapshot}, - mouse_context_menu, EditorSettings, EditorStyle, GutterHover, UnfoldAt, + EditorStyle, +}; +use gpui::{ + px, relative, AnyElement, Bounds, Element, Hsla, Line, Pixels, Size, Style, TextRun, TextSystem, }; -use gpui::{AnyElement, Bounds, Element, Hsla, Line, Pixels, Size, Style, TextRun, TextSystem}; use language::{CursorShape, Selection}; use std::{ops::Range, sync::Arc}; use sum_tree::Bias; @@ -1997,7 +1999,10 @@ impl Element for EditorElement { element_state: &mut Self::ElementState, cx: &mut gpui::ViewContext, ) -> gpui::LayoutId { - cx.request_layout(Style::default().size_full(), None) + let mut style = Style::default(); + style.size.width = relative(1.).into(); + style.size.height = relative(1.).into(); + cx.request_layout(&style, None) } fn paint( @@ -2011,13 +2016,8 @@ impl Element for EditorElement { let layout_text = cx.text_system().layout_text( "hello world", - text_style.font_size, - &[TextRun { - len: "hello world".len(), - font: text_style.font, - color: text_style.color, - underline: text_style.underline, - }], + text_style.font_size * cx.rem_size(), + &[text_style.to_run("hello world".len())], None, ); } @@ -2697,19 +2697,19 @@ impl PositionMap { position: gpui::Point, ) -> PointForPosition { let scroll_position = self.snapshot.scroll_position(); - let position = position - text_bounds.origin(); - let y = position.y().max(0.0).min(self.size.y()); - let x = position.x() + (scroll_position.x() * self.em_width); - let row = (y / self.line_height + scroll_position.y()) as u32; + let position = position - text_bounds.origin; + let y = position.y.max(px(0.)).min(self.size.width); + let x = position.x + (scroll_position.x * self.em_width); + let row = (y / self.line_height + scroll_position.y).into(); let (column, x_overshoot_after_line_end) = if let Some(line) = self .line_layouts - .get(row as usize - scroll_position.y() as usize) + .get(row as usize - scroll_position.y.into()) .map(|line_with_spaces| &line_with_spaces.line) { if let Some(ix) = line.index_for_x(x) { (ix as u32, 0.0) } else { - (line.len() as u32, 0f32.max(x - line.width())) + (line.len() as u32, px(0.).max(x - line.width())) } } else { (0, x) diff --git a/crates/editor2/src/hover_popover.rs b/crates/editor2/src/hover_popover.rs index 784b912c8c..b17c5df28f 100644 --- a/crates/editor2/src/hover_popover.rs +++ b/crates/editor2/src/hover_popover.rs @@ -466,35 +466,35 @@ pub struct InfoPopover { parsed_content: ParsedMarkdown, } -impl InfoPopover { - pub fn render( - &mut self, - style: &EditorStyle, - workspace: Option>, - cx: &mut ViewContext, - ) -> AnyElement { - MouseEventHandler::new::(0, cx, |_, cx| { - Flex::column() - .scrollable::(0, None, cx) - .with_child(crate::render_parsed_markdown::( - &self.parsed_content, - style, - workspace, - cx, - )) - .contained() - .with_style(style.hover_popover.container) - }) - .on_move(|_, _, _| {}) // Consume move events so they don't reach regions underneath. - .with_cursor_style(CursorStyle::Arrow) - .with_padding(Padding { - bottom: HOVER_POPOVER_GAP, - top: HOVER_POPOVER_GAP, - ..Default::default() - }) - .into_any() - } -} +// impl InfoPopover { +// pub fn render( +// &mut self, +// style: &EditorStyle, +// workspace: Option>, +// cx: &mut ViewContext, +// ) -> AnyElement { +// MouseEventHandler::new::(0, cx, |_, cx| { +// Flex::column() +// .scrollable::(0, None, cx) +// .with_child(crate::render_parsed_markdown::( +// &self.parsed_content, +// style, +// workspace, +// cx, +// )) +// .contained() +// .with_style(style.hover_popover.container) +// }) +// .on_move(|_, _, _| {}) // Consume move events so they don't reach regions underneath. +// .with_cursor_style(CursorStyle::Arrow) +// .with_padding(Padding { +// bottom: HOVER_POPOVER_GAP, +// top: HOVER_POPOVER_GAP, +// ..Default::default() +// }) +// .into_any() +// } +// } #[derive(Debug, Clone)] pub struct DiagnosticPopover { diff --git a/crates/editor2/src/inlay_hint_cache.rs b/crates/editor2/src/inlay_hint_cache.rs index 759323ecdf..74d6092ffa 100644 --- a/crates/editor2/src/inlay_hint_cache.rs +++ b/crates/editor2/src/inlay_hint_cache.rs @@ -521,7 +521,7 @@ impl InlayHintCache { buffer_id: u64, excerpt_id: ExcerptId, id: InlayId, - cx: &mut ViewContext<'_, '_, Editor>, + cx: &mut ViewContext<'_, Editor>, ) { if let Some(excerpt_hints) = self.hints.get(&excerpt_id) { let mut guard = excerpt_hints.write(); @@ -582,7 +582,7 @@ fn spawn_new_update_tasks( excerpts_to_query: HashMap, Global, Range)>, invalidate: InvalidationStrategy, update_cache_version: usize, - cx: &mut ViewContext<'_, '_, Editor>, + cx: &mut ViewContext<'_, Editor>, ) { let visible_hints = Arc::new(editor.visible_inlay_hints(cx)); for (excerpt_id, (excerpt_buffer, new_task_buffer_version, excerpt_visible_range)) in @@ -760,7 +760,7 @@ fn new_update_task( visible_hints: Arc>, cached_excerpt_hints: Option>>, lsp_request_limiter: Arc, - cx: &mut ViewContext<'_, '_, Editor>, + cx: &mut ViewContext<'_, Editor>, ) -> Task<()> { cx.spawn(|editor, mut cx| async move { let closure_cx = cx.clone(); @@ -836,134 +836,134 @@ fn new_update_task( }) } -async fn fetch_and_update_hints( - editor: gpui::WeakView, - multi_buffer_snapshot: MultiBufferSnapshot, - buffer_snapshot: BufferSnapshot, - visible_hints: Arc>, - cached_excerpt_hints: Option>>, - query: ExcerptQuery, - invalidate: bool, - fetch_range: Range, - lsp_request_limiter: Arc, - mut cx: gpui::AsyncAppContext, -) -> anyhow::Result<()> { - let (lsp_request_guard, got_throttled) = if query.invalidate.should_invalidate() { - (None, false) - } else { - match lsp_request_limiter.try_acquire() { - Some(guard) => (Some(guard), false), - None => (Some(lsp_request_limiter.acquire().await), true), - } - }; - let fetch_range_to_log = - fetch_range.start.to_point(&buffer_snapshot)..fetch_range.end.to_point(&buffer_snapshot); - let inlay_hints_fetch_task = editor - .update(&mut cx, |editor, cx| { - if got_throttled { - let query_not_around_visible_range = match editor.excerpt_visible_offsets(None, cx).remove(&query.excerpt_id) { - Some((_, _, current_visible_range)) => { - let visible_offset_length = current_visible_range.len(); - let double_visible_range = current_visible_range - .start - .saturating_sub(visible_offset_length) - ..current_visible_range - .end - .saturating_add(visible_offset_length) - .min(buffer_snapshot.len()); - !double_visible_range - .contains(&fetch_range.start.to_offset(&buffer_snapshot)) - && !double_visible_range - .contains(&fetch_range.end.to_offset(&buffer_snapshot)) - }, - None => true, - }; - if query_not_around_visible_range { - log::trace!("Fetching inlay hints for range {fetch_range_to_log:?} got throttled and fell off the current visible range, skipping."); - if let Some(task_ranges) = editor - .inlay_hint_cache - .update_tasks - .get_mut(&query.excerpt_id) - { - task_ranges.invalidate_range(&buffer_snapshot, &fetch_range); - } - return None; - } - } - editor - .buffer() - .read(cx) - .buffer(query.buffer_id) - .and_then(|buffer| { - let project = editor.project.as_ref()?; - Some(project.update(cx, |project, cx| { - project.inlay_hints(buffer, fetch_range.clone(), cx) - })) - }) - }) - .ok() - .flatten(); - let new_hints = match inlay_hints_fetch_task { - Some(fetch_task) => { - log::debug!( - "Fetching inlay hints for range {fetch_range_to_log:?}, reason: {query_reason}, invalidate: {invalidate}", - query_reason = query.reason, - ); - log::trace!( - "Currently visible hints: {visible_hints:?}, cached hints present: {}", - cached_excerpt_hints.is_some(), - ); - fetch_task.await.context("inlay hint fetch task")? - } - None => return Ok(()), - }; - drop(lsp_request_guard); - log::debug!( - "Fetched {} hints for range {fetch_range_to_log:?}", - new_hints.len() - ); - log::trace!("Fetched hints: {new_hints:?}"); +// async fn fetch_and_update_hints( +// editor: gpui::WeakView, +// multi_buffer_snapshot: MultiBufferSnapshot, +// buffer_snapshot: BufferSnapshot, +// visible_hints: Arc>, +// cached_excerpt_hints: Option>>, +// query: ExcerptQuery, +// invalidate: bool, +// fetch_range: Range, +// lsp_request_limiter: Arc, +// mut cx: gpui::AsyncAppContext, +// ) -> anyhow::Result<()> { +// let (lsp_request_guard, got_throttled) = if query.invalidate.should_invalidate() { +// (None, false) +// } else { +// match lsp_request_limiter.try_acquire() { +// Some(guard) => (Some(guard), false), +// None => (Some(lsp_request_limiter.acquire().await), true), +// } +// }; +// let fetch_range_to_log = +// fetch_range.start.to_point(&buffer_snapshot)..fetch_range.end.to_point(&buffer_snapshot); +// let inlay_hints_fetch_task = editor +// .update(&mut cx, |editor, cx| { +// if got_throttled { +// let query_not_around_visible_range = match editor.excerpt_visible_offsets(None, cx).remove(&query.excerpt_id) { +// Some((_, _, current_visible_range)) => { +// let visible_offset_length = current_visible_range.len(); +// let double_visible_range = current_visible_range +// .start +// .saturating_sub(visible_offset_length) +// ..current_visible_range +// .end +// .saturating_add(visible_offset_length) +// .min(buffer_snapshot.len()); +// !double_visible_range +// .contains(&fetch_range.start.to_offset(&buffer_snapshot)) +// && !double_visible_range +// .contains(&fetch_range.end.to_offset(&buffer_snapshot)) +// }, +// None => true, +// }; +// if query_not_around_visible_range { +// log::trace!("Fetching inlay hints for range {fetch_range_to_log:?} got throttled and fell off the current visible range, skipping."); +// if let Some(task_ranges) = editor +// .inlay_hint_cache +// .update_tasks +// .get_mut(&query.excerpt_id) +// { +// task_ranges.invalidate_range(&buffer_snapshot, &fetch_range); +// } +// return None; +// } +// } +// editor +// .buffer() +// .read(cx) +// .buffer(query.buffer_id) +// .and_then(|buffer| { +// let project = editor.project.as_ref()?; +// Some(project.update(cx, |project, cx| { +// project.inlay_hints(buffer, fetch_range.clone(), cx) +// })) +// }) +// }) +// .ok() +// .flatten(); +// let new_hints = match inlay_hints_fetch_task { +// Some(fetch_task) => { +// log::debug!( +// "Fetching inlay hints for range {fetch_range_to_log:?}, reason: {query_reason}, invalidate: {invalidate}", +// query_reason = query.reason, +// ); +// log::trace!( +// "Currently visible hints: {visible_hints:?}, cached hints present: {}", +// cached_excerpt_hints.is_some(), +// ); +// fetch_task.await.context("inlay hint fetch task")? +// } +// None => return Ok(()), +// }; +// drop(lsp_request_guard); +// log::debug!( +// "Fetched {} hints for range {fetch_range_to_log:?}", +// new_hints.len() +// ); +// log::trace!("Fetched hints: {new_hints:?}"); - let background_task_buffer_snapshot = buffer_snapshot.clone(); - let backround_fetch_range = fetch_range.clone(); - let new_update = cx - .background() - .spawn(async move { - calculate_hint_updates( - query.excerpt_id, - invalidate, - backround_fetch_range, - new_hints, - &background_task_buffer_snapshot, - cached_excerpt_hints, - &visible_hints, - ) - }) - .await; - if let Some(new_update) = new_update { - log::debug!( - "Applying update for range {fetch_range_to_log:?}: remove from editor: {}, remove from cache: {}, add to cache: {}", - new_update.remove_from_visible.len(), - new_update.remove_from_cache.len(), - new_update.add_to_cache.len() - ); - log::trace!("New update: {new_update:?}"); - editor - .update(&mut cx, |editor, cx| { - apply_hint_update( - editor, - new_update, - query, - invalidate, - buffer_snapshot, - multi_buffer_snapshot, - cx, - ); - }) - .ok(); - } - Ok(()) -} +// let background_task_buffer_snapshot = buffer_snapshot.clone(); +// let backround_fetch_range = fetch_range.clone(); +// let new_update = cx +// .background() +// .spawn(async move { +// calculate_hint_updates( +// query.excerpt_id, +// invalidate, +// backround_fetch_range, +// new_hints, +// &background_task_buffer_snapshot, +// cached_excerpt_hints, +// &visible_hints, +// ) +// }) +// .await; +// if let Some(new_update) = new_update { +// log::debug!( +// "Applying update for range {fetch_range_to_log:?}: remove from editor: {}, remove from cache: {}, add to cache: {}", +// new_update.remove_from_visible.len(), +// new_update.remove_from_cache.len(), +// new_update.add_to_cache.len() +// ); +// log::trace!("New update: {new_update:?}"); +// editor +// .update(&mut cx, |editor, cx| { +// apply_hint_update( +// editor, +// new_update, +// query, +// invalidate, +// buffer_snapshot, +// multi_buffer_snapshot, +// cx, +// ); +// }) +// .ok(); +// } +// Ok(()) +// } fn calculate_hint_updates( excerpt_id: ExcerptId, @@ -1071,7 +1071,7 @@ fn apply_hint_update( invalidate: bool, buffer_snapshot: BufferSnapshot, multi_buffer_snapshot: MultiBufferSnapshot, - cx: &mut ViewContext<'_, '_, Editor>, + cx: &mut ViewContext<'_, Editor>, ) { let cached_excerpt_hints = editor .inlay_hint_cache diff --git a/crates/editor2/src/items.rs b/crates/editor2/src/items.rs index d5c479ef6b..13d5dc4d1b 100644 --- a/crates/editor2/src/items.rs +++ b/crates/editor2/src/items.rs @@ -7,8 +7,8 @@ use anyhow::{Context, Result}; use collections::HashSet; use futures::future::try_join_all; use gpui::{ - point, AnyElement, AppContext, AsyncAppContext, Entity, Model, Pixels, Subscription, Task, - View, ViewContext, WeakView, + point, AnyElement, AppContext, AsyncAppContext, Entity, Model, Pixels, SharedString, + Subscription, Task, View, ViewContext, WeakView, }; use language::{ proto::serialize_anchor as serialize_text_anchor, Bias, Buffer, OffsetRangeExt, Point, @@ -304,133 +304,133 @@ impl FollowableItem for Editor { } } -async fn update_editor_from_message( - this: WeakView, - project: Model, - message: proto::update_view::Editor, - cx: &mut AsyncAppContext, -) -> Result<()> { - // Open all of the buffers of which excerpts were added to the editor. - let inserted_excerpt_buffer_ids = message - .inserted_excerpts - .iter() - .filter_map(|insertion| Some(insertion.excerpt.as_ref()?.buffer_id)) - .collect::>(); - let inserted_excerpt_buffers = project.update(cx, |project, cx| { - inserted_excerpt_buffer_ids - .into_iter() - .map(|id| project.open_buffer_by_id(id, cx)) - .collect::>() - }); - let _inserted_excerpt_buffers = try_join_all(inserted_excerpt_buffers).await?; +// async fn update_editor_from_message( +// this: WeakView, +// project: Model, +// message: proto::update_view::Editor, +// cx: &mut AsyncAppContext, +// ) -> Result<()> { +// // Open all of the buffers of which excerpts were added to the editor. +// let inserted_excerpt_buffer_ids = message +// .inserted_excerpts +// .iter() +// .filter_map(|insertion| Some(insertion.excerpt.as_ref()?.buffer_id)) +// .collect::>(); +// let inserted_excerpt_buffers = project.update(cx, |project, cx| { +// inserted_excerpt_buffer_ids +// .into_iter() +// .map(|id| project.open_buffer_by_id(id, cx)) +// .collect::>() +// })?; +// let _inserted_excerpt_buffers = try_join_all(inserted_excerpt_buffers).await?; - // Update the editor's excerpts. - this.update(cx, |editor, cx| { - editor.buffer.update(cx, |multibuffer, cx| { - let mut removed_excerpt_ids = message - .deleted_excerpts - .into_iter() - .map(ExcerptId::from_proto) - .collect::>(); - removed_excerpt_ids.sort_by({ - let multibuffer = multibuffer.read(cx); - move |a, b| a.cmp(&b, &multibuffer) - }); +// // Update the editor's excerpts. +// this.update(cx, |editor, cx| { +// editor.buffer.update(cx, |multibuffer, cx| { +// let mut removed_excerpt_ids = message +// .deleted_excerpts +// .into_iter() +// .map(ExcerptId::from_proto) +// .collect::>(); +// removed_excerpt_ids.sort_by({ +// let multibuffer = multibuffer.read(cx); +// move |a, b| a.cmp(&b, &multibuffer) +// }); - let mut insertions = message.inserted_excerpts.into_iter().peekable(); - while let Some(insertion) = insertions.next() { - let Some(excerpt) = insertion.excerpt else { - continue; - }; - let Some(previous_excerpt_id) = insertion.previous_excerpt_id else { - continue; - }; - let buffer_id = excerpt.buffer_id; - let Some(buffer) = project.read(cx).buffer_for_id(buffer_id) else { - continue; - }; +// let mut insertions = message.inserted_excerpts.into_iter().peekable(); +// while let Some(insertion) = insertions.next() { +// let Some(excerpt) = insertion.excerpt else { +// continue; +// }; +// let Some(previous_excerpt_id) = insertion.previous_excerpt_id else { +// continue; +// }; +// let buffer_id = excerpt.buffer_id; +// let Some(buffer) = project.read(cx).buffer_for_id(buffer_id) else { +// continue; +// }; - let adjacent_excerpts = iter::from_fn(|| { - let insertion = insertions.peek()?; - if insertion.previous_excerpt_id.is_none() - && insertion.excerpt.as_ref()?.buffer_id == buffer_id - { - insertions.next()?.excerpt - } else { - None - } - }); +// let adjacent_excerpts = iter::from_fn(|| { +// let insertion = insertions.peek()?; +// if insertion.previous_excerpt_id.is_none() +// && insertion.excerpt.as_ref()?.buffer_id == buffer_id +// { +// insertions.next()?.excerpt +// } else { +// None +// } +// }); - multibuffer.insert_excerpts_with_ids_after( - ExcerptId::from_proto(previous_excerpt_id), - buffer, - [excerpt] - .into_iter() - .chain(adjacent_excerpts) - .filter_map(|excerpt| { - Some(( - ExcerptId::from_proto(excerpt.id), - deserialize_excerpt_range(excerpt)?, - )) - }), - cx, - ); - } +// multibuffer.insert_excerpts_with_ids_after( +// ExcerptId::from_proto(previous_excerpt_id), +// buffer, +// [excerpt] +// .into_iter() +// .chain(adjacent_excerpts) +// .filter_map(|excerpt| { +// Some(( +// ExcerptId::from_proto(excerpt.id), +// deserialize_excerpt_range(excerpt)?, +// )) +// }), +// cx, +// ); +// } - multibuffer.remove_excerpts(removed_excerpt_ids, cx); - }); - })?; +// multibuffer.remove_excerpts(removed_excerpt_ids, cx); +// }); +// })?; - // Deserialize the editor state. - let (selections, pending_selection, scroll_top_anchor) = this.update(cx, |editor, cx| { - let buffer = editor.buffer.read(cx).read(cx); - let selections = message - .selections - .into_iter() - .filter_map(|selection| deserialize_selection(&buffer, selection)) - .collect::>(); - let pending_selection = message - .pending_selection - .and_then(|selection| deserialize_selection(&buffer, selection)); - let scroll_top_anchor = message - .scroll_top_anchor - .and_then(|anchor| deserialize_anchor(&buffer, anchor)); - anyhow::Ok((selections, pending_selection, scroll_top_anchor)) - })??; +// // Deserialize the editor state. +// let (selections, pending_selection, scroll_top_anchor) = this.update(cx, |editor, cx| { +// let buffer = editor.buffer.read(cx).read(cx); +// let selections = message +// .selections +// .into_iter() +// .filter_map(|selection| deserialize_selection(&buffer, selection)) +// .collect::>(); +// let pending_selection = message +// .pending_selection +// .and_then(|selection| deserialize_selection(&buffer, selection)); +// let scroll_top_anchor = message +// .scroll_top_anchor +// .and_then(|anchor| deserialize_anchor(&buffer, anchor)); +// anyhow::Ok((selections, pending_selection, scroll_top_anchor)) +// })??; - // Wait until the buffer has received all of the operations referenced by - // the editor's new state. - this.update(cx, |editor, cx| { - editor.buffer.update(cx, |buffer, cx| { - buffer.wait_for_anchors( - selections - .iter() - .chain(pending_selection.as_ref()) - .flat_map(|selection| [selection.start, selection.end]) - .chain(scroll_top_anchor), - cx, - ) - }) - })? - .await?; +// // Wait until the buffer has received all of the operations referenced by +// // the editor's new state. +// this.update(cx, |editor, cx| { +// editor.buffer.update(cx, |buffer, cx| { +// buffer.wait_for_anchors( +// selections +// .iter() +// .chain(pending_selection.as_ref()) +// .flat_map(|selection| [selection.start, selection.end]) +// .chain(scroll_top_anchor), +// cx, +// ) +// }) +// })? +// .await?; - // Update the editor's state. - this.update(cx, |editor, cx| { - if !selections.is_empty() || pending_selection.is_some() { - editor.set_selections_from_remote(selections, pending_selection, cx); - editor.request_autoscroll_remotely(Autoscroll::newest(), cx); - } else if let Some(scroll_top_anchor) = scroll_top_anchor { - editor.set_scroll_anchor_remote( - ScrollAnchor { - anchor: scroll_top_anchor, - offset: point(message.scroll_x, message.scroll_y), - }, - cx, - ); - } - })?; - Ok(()) -} +// // Update the editor's state. +// this.update(cx, |editor, cx| { +// if !selections.is_empty() || pending_selection.is_some() { +// editor.set_selections_from_remote(selections, pending_selection, cx); +// editor.request_autoscroll_remotely(Autoscroll::newest(), cx); +// } else if let Some(scroll_top_anchor) = scroll_top_anchor { +// editor.set_scroll_anchor_remote( +// ScrollAnchor { +// anchor: scroll_top_anchor, +// offset: point(message.scroll_x, message.scroll_y), +// }, +// cx, +// ); +// } +// })?; +// Ok(()) +// } fn serialize_excerpt( buffer_id: u64, @@ -544,7 +544,7 @@ impl Item for Editor { } } - fn tab_tooltip_text(&self, cx: &AppContext) -> Option> { + fn tab_tooltip_text(&self, cx: &AppContext) -> Option { let file_path = self .buffer() .read(cx) @@ -559,7 +559,7 @@ impl Item for Editor { Some(file_path.into()) } - fn tab_description<'a>(&'a self, detail: usize, cx: &'a AppContext) -> Option> { + fn tab_description<'a>(&'a self, detail: usize, cx: &'a AppContext) -> Option { match path_for_buffer(&self.buffer, detail, true, cx)? { Cow::Borrowed(path) => Some(path.to_string_lossy()), Cow::Owned(path) => Some(path.to_string_lossy().to_string().into()), diff --git a/crates/editor2/src/link_go_to_definition.rs b/crates/editor2/src/link_go_to_definition.rs index 8ac27b480f..cdbab3b3fc 100644 --- a/crates/editor2/src/link_go_to_definition.rs +++ b/crates/editor2/src/link_go_to_definition.rs @@ -168,7 +168,7 @@ pub fn update_inlay_link_and_hover_points( editor: &mut Editor, cmd_held: bool, shift_held: bool, - cx: &mut ViewContext<'_, '_, Editor>, + cx: &mut ViewContext<'_, Editor>, ) { let hovered_offset = if point_for_position.column_overshoot_after_line_end == 0 { Some(snapshot.display_point_to_inlay_offset(point_for_position.exact_unclipped, Bias::Left)) diff --git a/crates/editor2/src/scroll.rs b/crates/editor2/src/scroll.rs index 9a6af2961a..4e809dbef4 100644 --- a/crates/editor2/src/scroll.rs +++ b/crates/editor2/src/scroll.rs @@ -9,7 +9,7 @@ use crate::{ Anchor, DisplayPoint, Editor, EditorMode, Event, InlayHintRefreshReason, MultiBufferSnapshot, ToPoint, }; -use gpui::{point, AppContext, Pixels, Task, ViewContext}; +use gpui::{point, px, AppContext, Pixels, Styled, Task, ViewContext}; use language::{Bias, Point}; use std::{ cmp::Ordering, @@ -44,7 +44,7 @@ impl ScrollAnchor { } } - pub fn scroll_position(&self, snapshot: &DisplaySnapshot) -> Point { + pub fn scroll_position(&self, snapshot: &DisplaySnapshot) -> gpui::Point { let mut scroll_position = self.offset; if self.anchor != Anchor::min() { let scroll_top = self.anchor.to_display_point(snapshot).row() as f32; @@ -80,13 +80,13 @@ impl OngoingScroll { } } - pub fn filter(&self, delta: &mut Point) -> Option { + pub fn filter(&self, delta: &mut gpui::Point) -> Option { const UNLOCK_PERCENT: f32 = 1.9; const UNLOCK_LOWER_BOUND: f32 = 6.; let mut axis = self.axis; - let x = delta.x().abs(); - let y = delta.y().abs(); + let x = delta.x.abs(); + let y = delta.y.abs(); let duration = Instant::now().duration_since(self.last_event); if duration > SCROLL_EVENT_SEPARATION { //New ongoing scroll will start, determine axis @@ -115,8 +115,12 @@ impl OngoingScroll { } match axis { - Some(Axis::Vertical) => *delta = point(0., delta.y()), - Some(Axis::Horizontal) => *delta = point(delta.x(), 0.), + Some(Axis::Vertical) => { + *delta = point(pk(0.), delta.y()); + } + Some(Axis::Horizontal) => { + *delta = point(delta.x(), px(0.)); + } None => {} } @@ -167,13 +171,13 @@ impl ScrollManager { self.ongoing.axis = axis; } - pub fn scroll_position(&self, snapshot: &DisplaySnapshot) -> Point { + pub fn scroll_position(&self, snapshot: &DisplaySnapshot) -> gpui::Point { self.anchor.scroll_position(snapshot) } fn set_scroll_position( &mut self, - scroll_position: Point, + scroll_position: gpui::Point, map: &DisplaySnapshot, local: bool, autoscroll: bool, @@ -282,160 +286,161 @@ impl ScrollManager { } } -impl Editor { - pub fn vertical_scroll_margin(&mut self) -> usize { - self.scroll_manager.vertical_scroll_margin as usize - } +// todo!() +// impl Editor { +// pub fn vertical_scroll_margin(&mut self) -> usize { +// self.scroll_manager.vertical_scroll_margin as usize +// } - pub fn set_vertical_scroll_margin(&mut self, margin_rows: usize, cx: &mut ViewContext) { - self.scroll_manager.vertical_scroll_margin = margin_rows as f32; - cx.notify(); - } +// pub fn set_vertical_scroll_margin(&mut self, margin_rows: usize, cx: &mut ViewContext) { +// self.scroll_manager.vertical_scroll_margin = margin_rows as f32; +// cx.notify(); +// } - pub fn visible_line_count(&self) -> Option { - self.scroll_manager.visible_line_count - } +// pub fn visible_line_count(&self) -> Option { +// self.scroll_manager.visible_line_count +// } - pub(crate) fn set_visible_line_count(&mut self, lines: f32, cx: &mut ViewContext) { - let opened_first_time = self.scroll_manager.visible_line_count.is_none(); - self.scroll_manager.visible_line_count = Some(lines); - if opened_first_time { - cx.spawn(|editor, mut cx| async move { - editor - .update(&mut cx, |editor, cx| { - editor.refresh_inlay_hints(InlayHintRefreshReason::NewLinesShown, cx) - }) - .ok() - }) - .detach() - } - } +// pub(crate) fn set_visible_line_count(&mut self, lines: f32, cx: &mut ViewContext) { +// let opened_first_time = self.scroll_manager.visible_line_count.is_none(); +// self.scroll_manager.visible_line_count = Some(lines); +// if opened_first_time { +// cx.spawn(|editor, mut cx| async move { +// editor +// .update(&mut cx, |editor, cx| { +// editor.refresh_inlay_hints(InlayHintRefreshReason::NewLinesShown, cx) +// }) +// .ok() +// }) +// .detach() +// } +// } - pub fn set_scroll_position( - &mut self, - scroll_position: Point, - cx: &mut ViewContext, - ) { - self.set_scroll_position_internal(scroll_position, true, false, cx); - } +// pub fn set_scroll_position( +// &mut self, +// scroll_position: gpui::Point, +// cx: &mut ViewContext, +// ) { +// self.set_scroll_position_internal(scroll_position, true, false, cx); +// } - pub(crate) fn set_scroll_position_internal( - &mut self, - scroll_position: Point, - local: bool, - autoscroll: bool, - cx: &mut ViewContext, - ) { - let map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); +// pub(crate) fn set_scroll_position_internal( +// &mut self, +// scroll_position: gpui::Point, +// local: bool, +// autoscroll: bool, +// cx: &mut ViewContext, +// ) { +// let map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); - hide_hover(self, cx); - let workspace_id = self.workspace.as_ref().map(|workspace| workspace.1); - self.scroll_manager.set_scroll_position( - scroll_position, - &map, - local, - autoscroll, - workspace_id, - cx, - ); +// hide_hover(self, cx); +// let workspace_id = self.workspace.as_ref().map(|workspace| workspace.1); +// self.scroll_manager.set_scroll_position( +// scroll_position, +// &map, +// local, +// autoscroll, +// workspace_id, +// cx, +// ); - self.refresh_inlay_hints(InlayHintRefreshReason::NewLinesShown, cx); - } +// self.refresh_inlay_hints(InlayHintRefreshReason::NewLinesShown, cx); +// } - pub fn scroll_position(&self, cx: &mut ViewContext) -> Point { - let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); - self.scroll_manager.anchor.scroll_position(&display_map) - } +// pub fn scroll_position(&self, cx: &mut ViewContext) -> gpui::Point { +// let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); +// self.scroll_manager.anchor.scroll_position(&display_map) +// } - pub fn set_scroll_anchor(&mut self, scroll_anchor: ScrollAnchor, cx: &mut ViewContext) { - hide_hover(self, cx); - let workspace_id = self.workspace.as_ref().map(|workspace| workspace.1); - let top_row = scroll_anchor - .anchor - .to_point(&self.buffer().read(cx).snapshot(cx)) - .row; - self.scroll_manager - .set_anchor(scroll_anchor, top_row, true, false, workspace_id, cx); - } +// pub fn set_scroll_anchor(&mut self, scroll_anchor: ScrollAnchor, cx: &mut ViewContext) { +// hide_hover(self, cx); +// let workspace_id = self.workspace.as_ref().map(|workspace| workspace.1); +// let top_row = scroll_anchor +// .anchor +// .to_point(&self.buffer().read(cx).snapshot(cx)) +// .row; +// self.scroll_manager +// .set_anchor(scroll_anchor, top_row, true, false, workspace_id, cx); +// } - pub(crate) fn set_scroll_anchor_remote( - &mut self, - scroll_anchor: ScrollAnchor, - cx: &mut ViewContext, - ) { - hide_hover(self, cx); - let workspace_id = self.workspace.as_ref().map(|workspace| workspace.1); - let top_row = scroll_anchor - .anchor - .to_point(&self.buffer().read(cx).snapshot(cx)) - .row; - self.scroll_manager - .set_anchor(scroll_anchor, top_row, false, false, workspace_id, cx); - } +// pub(crate) fn set_scroll_anchor_remote( +// &mut self, +// scroll_anchor: ScrollAnchor, +// cx: &mut ViewContext, +// ) { +// hide_hover(self, cx); +// let workspace_id = self.workspace.as_ref().map(|workspace| workspace.1); +// let top_row = scroll_anchor +// .anchor +// .to_point(&self.buffer().read(cx).snapshot(cx)) +// .row; +// self.scroll_manager +// .set_anchor(scroll_anchor, top_row, false, false, workspace_id, cx); +// } - pub fn scroll_screen(&mut self, amount: &ScrollAmount, cx: &mut ViewContext) { - if matches!(self.mode, EditorMode::SingleLine) { - cx.propagate_action(); - return; - } +// pub fn scroll_screen(&mut self, amount: &ScrollAmount, cx: &mut ViewContext) { +// if matches!(self.mode, EditorMode::SingleLine) { +// cx.propagate_action(); +// return; +// } - if self.take_rename(true, cx).is_some() { - return; - } +// if self.take_rename(true, cx).is_some() { +// return; +// } - let cur_position = self.scroll_position(cx); - let new_pos = cur_position + point(0., amount.lines(self)); - self.set_scroll_position(new_pos, cx); - } +// let cur_position = self.scroll_position(cx); +// let new_pos = cur_position + point(0., amount.lines(self)); +// self.set_scroll_position(new_pos, cx); +// } - /// Returns an ordering. The newest selection is: - /// Ordering::Equal => on screen - /// Ordering::Less => above the screen - /// Ordering::Greater => below the screen - pub fn newest_selection_on_screen(&self, cx: &mut AppContext) -> Ordering { - let snapshot = self.display_map.update(cx, |map, cx| map.snapshot(cx)); - let newest_head = self - .selections - .newest_anchor() - .head() - .to_display_point(&snapshot); - let screen_top = self - .scroll_manager - .anchor - .anchor - .to_display_point(&snapshot); +// /// Returns an ordering. The newest selection is: +// /// Ordering::Equal => on screen +// /// Ordering::Less => above the screen +// /// Ordering::Greater => below the screen +// pub fn newest_selection_on_screen(&self, cx: &mut AppContext) -> Ordering { +// let snapshot = self.display_map.update(cx, |map, cx| map.snapshot(cx)); +// let newest_head = self +// .selections +// .newest_anchor() +// .head() +// .to_display_point(&snapshot); +// let screen_top = self +// .scroll_manager +// .anchor +// .anchor +// .to_display_point(&snapshot); - if screen_top > newest_head { - return Ordering::Less; - } +// if screen_top > newest_head { +// return Ordering::Less; +// } - if let Some(visible_lines) = self.visible_line_count() { - if newest_head.row() < screen_top.row() + visible_lines as u32 { - return Ordering::Equal; - } - } +// if let Some(visible_lines) = self.visible_line_count() { +// if newest_head.row() < screen_top.row() + visible_lines as u32 { +// return Ordering::Equal; +// } +// } - Ordering::Greater - } +// Ordering::Greater +// } - pub fn read_scroll_position_from_db( - &mut self, - item_id: usize, - workspace_id: WorkspaceId, - cx: &mut ViewContext, - ) { - let scroll_position = DB.get_scroll_position(item_id, workspace_id); - if let Ok(Some((top_row, x, y))) = scroll_position { - let top_anchor = self - .buffer() - .read(cx) - .snapshot(cx) - .anchor_at(Point::new(top_row as u32, 0), Bias::Left); - let scroll_anchor = ScrollAnchor { - offset: Point::new(x, y), - anchor: top_anchor, - }; - self.set_scroll_anchor(scroll_anchor, cx); - } - } -} +// pub fn read_scroll_position_from_db( +// &mut self, +// item_id: usize, +// workspace_id: WorkspaceId, +// cx: &mut ViewContext, +// ) { +// let scroll_position = DB.get_scroll_position(item_id, workspace_id); +// if let Ok(Some((top_row, x, y))) = scroll_position { +// let top_anchor = self +// .buffer() +// .read(cx) +// .snapshot(cx) +// .anchor_at(Point::new(top_row as u32, 0), Bias::Left); +// let scroll_anchor = ScrollAnchor { +// offset: Point::new(x, y), +// anchor: top_anchor, +// }; +// self.set_scroll_anchor(scroll_anchor, cx); +// } +// } +// } diff --git a/crates/editor2/src/selections_collection.rs b/crates/editor2/src/selections_collection.rs index e1ef69ac8a..0d10db7af9 100644 --- a/crates/editor2/src/selections_collection.rs +++ b/crates/editor2/src/selections_collection.rs @@ -593,29 +593,30 @@ impl<'a> MutableSelectionsCollection<'a> { } pub fn select_anchor_ranges>>(&mut self, ranges: I) { - let buffer = self.buffer.read(self.cx).snapshot(self.cx); - let selections = ranges - .into_iter() - .map(|range| { - let mut start = range.start; - let mut end = range.end; - let reversed = if start.cmp(&end, &buffer).is_gt() { - mem::swap(&mut start, &mut end); - true - } else { - false - }; - Selection { - id: post_inc(&mut self.collection.next_selection_id), - start, - end, - reversed, - goal: SelectionGoal::None, - } - }) - .collect::>(); + todo!() + // let buffer = self.buffer.read(self.cx).snapshot(self.cx); + // let selections = ranges + // .into_iter() + // .map(|range| { + // let mut start = range.start; + // let mut end = range.end; + // let reversed = if start.cmp(&end, &buffer).is_gt() { + // mem::swap(&mut start, &mut end); + // true + // } else { + // false + // }; + // Selection { + // id: post_inc(&mut self.collection.next_selection_id), + // start, + // end, + // reversed, + // goal: SelectionGoal::None, + // } + // }) + // .collect::>(); - self.select_anchors(selections) + // self.select_anchors(selections) } pub fn new_selection_id(&mut self) -> usize { diff --git a/crates/editor2/src/test.rs b/crates/editor2/src/test.rs index 8087569925..14619c4a98 100644 --- a/crates/editor2/src/test.rs +++ b/crates/editor2/src/test.rs @@ -1,80 +1,81 @@ pub mod editor_lsp_test_context; pub mod editor_test_context; -use crate::{ - display_map::{DisplayMap, DisplaySnapshot, ToDisplayPoint}, - DisplayPoint, Editor, EditorMode, MultiBuffer, -}; +// todo!() +// use crate::{ +// display_map::{DisplayMap, DisplaySnapshot, ToDisplayPoint}, +// DisplayPoint, Editor, EditorMode, MultiBuffer, +// }; -use gpui::{Model, ViewContext}; +// use gpui::{Model, ViewContext}; -use project::Project; -use util::test::{marked_text_offsets, marked_text_ranges}; +// use project::Project; +// use util::test::{marked_text_offsets, marked_text_ranges}; -#[cfg(test)] -#[ctor::ctor] -fn init_logger() { - if std::env::var("RUST_LOG").is_ok() { - env_logger::init(); - } -} +// #[cfg(test)] +// #[ctor::ctor] +// fn init_logger() { +// if std::env::var("RUST_LOG").is_ok() { +// env_logger::init(); +// } +// } -// Returns a snapshot from text containing '|' character markers with the markers removed, and DisplayPoints for each one. -pub fn marked_display_snapshot( - text: &str, - cx: &mut gpui::AppContext, -) -> (DisplaySnapshot, Vec) { - let (unmarked_text, markers) = marked_text_offsets(text); +// // Returns a snapshot from text containing '|' character markers with the markers removed, and DisplayPoints for each one. +// pub fn marked_display_snapshot( +// text: &str, +// cx: &mut gpui::AppContext, +// ) -> (DisplaySnapshot, Vec) { +// let (unmarked_text, markers) = marked_text_offsets(text); - let family_id = cx - .font_cache() - .load_family(&["Helvetica"], &Default::default()) - .unwrap(); - let font_id = cx - .font_cache() - .select_font(family_id, &Default::default()) - .unwrap(); - let font_size = 14.0; +// let family_id = cx +// .font_cache() +// .load_family(&["Helvetica"], &Default::default()) +// .unwrap(); +// let font_id = cx +// .font_cache() +// .select_font(family_id, &Default::default()) +// .unwrap(); +// let font_size = 14.0; - let buffer = MultiBuffer::build_simple(&unmarked_text, cx); - let display_map = - cx.add_model(|cx| DisplayMap::new(buffer, font_id, font_size, None, 1, 1, cx)); - let snapshot = display_map.update(cx, |map, cx| map.snapshot(cx)); - let markers = markers - .into_iter() - .map(|offset| offset.to_display_point(&snapshot)) - .collect(); +// let buffer = MultiBuffer::build_simple(&unmarked_text, cx); +// let display_map = +// cx.add_model(|cx| DisplayMap::new(buffer, font_id, font_size, None, 1, 1, cx)); +// let snapshot = display_map.update(cx, |map, cx| map.snapshot(cx)); +// let markers = markers +// .into_iter() +// .map(|offset| offset.to_display_point(&snapshot)) +// .collect(); - (snapshot, markers) -} +// (snapshot, markers) +// } -pub fn select_ranges(editor: &mut Editor, marked_text: &str, cx: &mut ViewContext) { - let (unmarked_text, text_ranges) = marked_text_ranges(marked_text, true); - assert_eq!(editor.text(cx), unmarked_text); - editor.change_selections(None, cx, |s| s.select_ranges(text_ranges)); -} +// pub fn select_ranges(editor: &mut Editor, marked_text: &str, cx: &mut ViewContext) { +// let (unmarked_text, text_ranges) = marked_text_ranges(marked_text, true); +// assert_eq!(editor.text(cx), unmarked_text); +// editor.change_selections(None, cx, |s| s.select_ranges(text_ranges)); +// } -pub fn assert_text_with_selections( - editor: &mut Editor, - marked_text: &str, - cx: &mut ViewContext, -) { - let (unmarked_text, text_ranges) = marked_text_ranges(marked_text, true); - assert_eq!(editor.text(cx), unmarked_text); - assert_eq!(editor.selections.ranges(cx), text_ranges); -} +// pub fn assert_text_with_selections( +// editor: &mut Editor, +// marked_text: &str, +// cx: &mut ViewContext, +// ) { +// let (unmarked_text, text_ranges) = marked_text_ranges(marked_text, true); +// assert_eq!(editor.text(cx), unmarked_text); +// assert_eq!(editor.selections.ranges(cx), text_ranges); +// } -// RA thinks this is dead code even though it is used in a whole lot of tests -#[allow(dead_code)] -#[cfg(any(test, feature = "test-support"))] -pub(crate) fn build_editor(buffer: Model, cx: &mut ViewContext) -> Editor { - Editor::new(EditorMode::Full, buffer, None, None, cx) -} +// // RA thinks this is dead code even though it is used in a whole lot of tests +// #[allow(dead_code)] +// #[cfg(any(test, feature = "test-support"))] +// pub(crate) fn build_editor(buffer: Model, cx: &mut ViewContext) -> Editor { +// Editor::new(EditorMode::Full, buffer, None, None, cx) +// } -pub(crate) fn build_editor_with_project( - project: Model, - buffer: Model, - cx: &mut ViewContext, -) -> Editor { - Editor::new(EditorMode::Full, buffer, Some(project), None, cx) -} +// pub(crate) fn build_editor_with_project( +// project: Model, +// buffer: Model, +// cx: &mut ViewContext, +// ) -> Editor { +// Editor::new(EditorMode::Full, buffer, Some(project), None, cx) +// } diff --git a/crates/editor2/src/test/editor_test_context.rs b/crates/editor2/src/test/editor_test_context.rs index c856afeefe..0ca043462e 100644 --- a/crates/editor2/src/test/editor_test_context.rs +++ b/crates/editor2/src/test/editor_test_context.rs @@ -17,304 +17,304 @@ use util::{ test::{generate_marked_text, marked_text_ranges}, }; -use super::build_editor_with_project; +// use super::build_editor_with_project; -pub struct EditorTestContext<'a> { - pub cx: &'a mut gpui::TestAppContext, - pub window: AnyWindowHandle, - pub editor: View, -} +// pub struct EditorTestContext<'a> { +// pub cx: &'a mut gpui::TestAppContext, +// pub window: AnyWindowHandle, +// pub editor: View, +// } -impl<'a> EditorTestContext<'a> { - pub async fn new(cx: &'a mut gpui::TestAppContext) -> EditorTestContext<'a> { - let fs = FakeFs::new(cx.background()); - // fs.insert_file("/file", "".to_owned()).await; - fs.insert_tree( - "/root", - gpui::serde_json::json!({ - "file": "", - }), - ) - .await; - let project = Project::test(fs, ["/root".as_ref()], cx).await; - let buffer = project - .update(cx, |project, cx| { - project.open_local_buffer("/root/file", cx) - }) - .await - .unwrap(); - let window = cx.add_window(|cx| { - cx.focus_self(); - build_editor_with_project(project, MultiBuffer::build_from_buffer(buffer, cx), cx) - }); - let editor = window.root(cx); - Self { - cx, - window: window.into(), - editor, - } - } +// impl<'a> EditorTestContext<'a> { +// pub async fn new(cx: &'a mut gpui::TestAppContext) -> EditorTestContext<'a> { +// let fs = FakeFs::new(cx.background()); +// // fs.insert_file("/file", "".to_owned()).await; +// fs.insert_tree( +// "/root", +// gpui::serde_json::json!({ +// "file": "", +// }), +// ) +// .await; +// let project = Project::test(fs, ["/root".as_ref()], cx).await; +// let buffer = project +// .update(cx, |project, cx| { +// project.open_local_buffer("/root/file", cx) +// }) +// .await +// .unwrap(); +// let window = cx.add_window(|cx| { +// cx.focus_self(); +// build_editor_with_project(project, MultiBuffer::build_from_buffer(buffer, cx), cx) +// }); +// let editor = window.root(cx); +// Self { +// cx, +// window: window.into(), +// editor, +// } +// } - pub fn condition( - &self, - predicate: impl FnMut(&Editor, &AppContext) -> bool, - ) -> impl Future { - self.editor.condition(self.cx, predicate) - } +// pub fn condition( +// &self, +// predicate: impl FnMut(&Editor, &AppContext) -> bool, +// ) -> impl Future { +// self.editor.condition(self.cx, predicate) +// } - pub fn editor(&self, read: F) -> T - where - F: FnOnce(&Editor, &ViewContext) -> T, - { - self.editor.read_with(self.cx, read) - } +// pub fn editor(&self, read: F) -> T +// where +// F: FnOnce(&Editor, &ViewContext) -> T, +// { +// self.editor.update(self.cx, read) +// } - pub fn update_editor(&mut self, update: F) -> T - where - F: FnOnce(&mut Editor, &mut ViewContext) -> T, - { - self.editor.update(self.cx, update) - } +// pub fn update_editor(&mut self, update: F) -> T +// where +// F: FnOnce(&mut Editor, &mut ViewContext) -> T, +// { +// self.editor.update(self.cx, update) +// } - pub fn multibuffer(&self, read: F) -> T - where - F: FnOnce(&MultiBuffer, &AppContext) -> T, - { - self.editor(|editor, cx| read(editor.buffer().read(cx), cx)) - } +// pub fn multibuffer(&self, read: F) -> T +// where +// F: FnOnce(&MultiBuffer, &AppContext) -> T, +// { +// self.editor(|editor, cx| read(editor.buffer().read(cx), cx)) +// } - pub fn update_multibuffer(&mut self, update: F) -> T - where - F: FnOnce(&mut MultiBuffer, &mut ModelContext) -> T, - { - self.update_editor(|editor, cx| editor.buffer().update(cx, update)) - } +// pub fn update_multibuffer(&mut self, update: F) -> T +// where +// F: FnOnce(&mut MultiBuffer, &mut ModelContext) -> T, +// { +// self.update_editor(|editor, cx| editor.buffer().update(cx, update)) +// } - pub fn buffer_text(&self) -> String { - self.multibuffer(|buffer, cx| buffer.snapshot(cx).text()) - } +// pub fn buffer_text(&self) -> String { +// self.multibuffer(|buffer, cx| buffer.snapshot(cx).text()) +// } - pub fn buffer(&self, read: F) -> T - where - F: FnOnce(&Buffer, &AppContext) -> T, - { - self.multibuffer(|multibuffer, cx| { - let buffer = multibuffer.as_singleton().unwrap().read(cx); - read(buffer, cx) - }) - } +// pub fn buffer(&self, read: F) -> T +// where +// F: FnOnce(&Buffer, &AppContext) -> T, +// { +// self.multibuffer(|multibuffer, cx| { +// let buffer = multibuffer.as_singleton().unwrap().read(cx); +// read(buffer, cx) +// }) +// } - pub fn update_buffer(&mut self, update: F) -> T - where - F: FnOnce(&mut Buffer, &mut ModelContext) -> T, - { - self.update_multibuffer(|multibuffer, cx| { - let buffer = multibuffer.as_singleton().unwrap(); - buffer.update(cx, update) - }) - } +// pub fn update_buffer(&mut self, update: F) -> T +// where +// F: FnOnce(&mut Buffer, &mut ModelContext) -> T, +// { +// self.update_multibuffer(|multibuffer, cx| { +// let buffer = multibuffer.as_singleton().unwrap(); +// buffer.update(cx, update) +// }) +// } - pub fn buffer_snapshot(&self) -> BufferSnapshot { - self.buffer(|buffer, _| buffer.snapshot()) - } +// pub fn buffer_snapshot(&self) -> BufferSnapshot { +// self.buffer(|buffer, _| buffer.snapshot()) +// } - // pub fn simulate_keystroke(&mut self, keystroke_text: &str) -> ContextHandle { - // let keystroke_under_test_handle = - // self.add_assertion_context(format!("Simulated Keystroke: {:?}", keystroke_text)); - // let keystroke = Keystroke::parse(keystroke_text).unwrap(); +// pub fn simulate_keystroke(&mut self, keystroke_text: &str) -> ContextHandle { +// let keystroke_under_test_handle = +// self.add_assertion_context(format!("Simulated Keystroke: {:?}", keystroke_text)); +// let keystroke = Keystroke::parse(keystroke_text).unwrap(); - // self.cx.dispatch_keystroke(self.window, keystroke, false); +// self.cx.dispatch_keystroke(self.window, keystroke, false); - // keystroke_under_test_handle - // } +// keystroke_under_test_handle +// } - // pub fn simulate_keystrokes( - // &mut self, - // keystroke_texts: [&str; COUNT], - // ) -> ContextHandle { - // let keystrokes_under_test_handle = - // self.add_assertion_context(format!("Simulated Keystrokes: {:?}", keystroke_texts)); - // for keystroke_text in keystroke_texts.into_iter() { - // self.simulate_keystroke(keystroke_text); - // } - // // it is common for keyboard shortcuts to kick off async actions, so this ensures that they are complete - // // before returning. - // // NOTE: we don't do this in simulate_keystroke() because a possible cause of bugs is that typing too - // // quickly races with async actions. - // if let Foreground::Deterministic { cx_id: _, executor } = self.cx.foreground().as_ref() { - // executor.run_until_parked(); - // } else { - // unreachable!(); - // } +// pub fn simulate_keystrokes( +// &mut self, +// keystroke_texts: [&str; COUNT], +// ) -> ContextHandle { +// let keystrokes_under_test_handle = +// self.add_assertion_context(format!("Simulated Keystrokes: {:?}", keystroke_texts)); +// for keystroke_text in keystroke_texts.into_iter() { +// self.simulate_keystroke(keystroke_text); +// } +// // it is common for keyboard shortcuts to kick off async actions, so this ensures that they are complete +// // before returning. +// // NOTE: we don't do this in simulate_keystroke() because a possible cause of bugs is that typing too +// // quickly races with async actions. +// if let Foreground::Deterministic { cx_id: _, executor } = self.cx.foreground().as_ref() { +// executor.run_until_parked(); +// } else { +// unreachable!(); +// } - // keystrokes_under_test_handle - // } +// keystrokes_under_test_handle +// } - pub fn ranges(&self, marked_text: &str) -> Vec> { - let (unmarked_text, ranges) = marked_text_ranges(marked_text, false); - assert_eq!(self.buffer_text(), unmarked_text); - ranges - } +// pub fn ranges(&self, marked_text: &str) -> Vec> { +// let (unmarked_text, ranges) = marked_text_ranges(marked_text, false); +// assert_eq!(self.buffer_text(), unmarked_text); +// ranges +// } - pub fn display_point(&mut self, marked_text: &str) -> DisplayPoint { - let ranges = self.ranges(marked_text); - let snapshot = self - .editor - .update(self.cx, |editor, cx| editor.snapshot(cx)); - ranges[0].start.to_display_point(&snapshot) - } +// pub fn display_point(&mut self, marked_text: &str) -> DisplayPoint { +// let ranges = self.ranges(marked_text); +// let snapshot = self +// .editor +// .update(self.cx, |editor, cx| editor.snapshot(cx)); +// ranges[0].start.to_display_point(&snapshot) +// } - // Returns anchors for the current buffer using `«` and `»` - pub fn text_anchor_range(&self, marked_text: &str) -> Range { - let ranges = self.ranges(marked_text); - let snapshot = self.buffer_snapshot(); - snapshot.anchor_before(ranges[0].start)..snapshot.anchor_after(ranges[0].end) - } +// // Returns anchors for the current buffer using `«` and `»` +// pub fn text_anchor_range(&self, marked_text: &str) -> Range { +// let ranges = self.ranges(marked_text); +// let snapshot = self.buffer_snapshot(); +// snapshot.anchor_before(ranges[0].start)..snapshot.anchor_after(ranges[0].end) +// } - pub fn set_diff_base(&mut self, diff_base: Option<&str>) { - let diff_base = diff_base.map(String::from); - self.update_buffer(|buffer, cx| buffer.set_diff_base(diff_base, cx)); - } +// pub fn set_diff_base(&mut self, diff_base: Option<&str>) { +// let diff_base = diff_base.map(String::from); +// self.update_buffer(|buffer, cx| buffer.set_diff_base(diff_base, cx)); +// } - // /// Change the editor's text and selections using a string containing - // /// embedded range markers that represent the ranges and directions of - // /// each selection. - // /// - // /// Returns a context handle so that assertion failures can print what - // /// editor state was needed to cause the failure. - // /// - // /// See the `util::test::marked_text_ranges` function for more information. - // pub fn set_state(&mut self, marked_text: &str) -> ContextHandle { - // let state_context = self.add_assertion_context(format!( - // "Initial Editor State: \"{}\"", - // marked_text.escape_debug().to_string() - // )); - // let (unmarked_text, selection_ranges) = marked_text_ranges(marked_text, true); - // self.editor.update(self.cx, |editor, cx| { - // editor.set_text(unmarked_text, cx); - // editor.change_selections(Some(Autoscroll::fit()), cx, |s| { - // s.select_ranges(selection_ranges) - // }) - // }); - // state_context - // } +// /// Change the editor's text and selections using a string containing +// /// embedded range markers that represent the ranges and directions of +// /// each selection. +// /// +// /// Returns a context handle so that assertion failures can print what +// /// editor state was needed to cause the failure. +// /// +// /// See the `util::test::marked_text_ranges` function for more information. +// pub fn set_state(&mut self, marked_text: &str) -> ContextHandle { +// let state_context = self.add_assertion_context(format!( +// "Initial Editor State: \"{}\"", +// marked_text.escape_debug().to_string() +// )); +// let (unmarked_text, selection_ranges) = marked_text_ranges(marked_text, true); +// self.editor.update(self.cx, |editor, cx| { +// editor.set_text(unmarked_text, cx); +// editor.change_selections(Some(Autoscroll::fit()), cx, |s| { +// s.select_ranges(selection_ranges) +// }) +// }); +// state_context +// } - // /// Only change the editor's selections - // pub fn set_selections_state(&mut self, marked_text: &str) -> ContextHandle { - // let state_context = self.add_assertion_context(format!( - // "Initial Editor State: \"{}\"", - // marked_text.escape_debug().to_string() - // )); - // let (unmarked_text, selection_ranges) = marked_text_ranges(marked_text, true); - // self.editor.update(self.cx, |editor, cx| { - // assert_eq!(editor.text(cx), unmarked_text); - // editor.change_selections(Some(Autoscroll::fit()), cx, |s| { - // s.select_ranges(selection_ranges) - // }) - // }); - // state_context - // } +// /// Only change the editor's selections +// pub fn set_selections_state(&mut self, marked_text: &str) -> ContextHandle { +// let state_context = self.add_assertion_context(format!( +// "Initial Editor State: \"{}\"", +// marked_text.escape_debug().to_string() +// )); +// let (unmarked_text, selection_ranges) = marked_text_ranges(marked_text, true); +// self.editor.update(self.cx, |editor, cx| { +// assert_eq!(editor.text(cx), unmarked_text); +// editor.change_selections(Some(Autoscroll::fit()), cx, |s| { +// s.select_ranges(selection_ranges) +// }) +// }); +// state_context +// } - // /// Make an assertion about the editor's text and the ranges and directions - // /// of its selections using a string containing embedded range markers. - // /// - // /// See the `util::test::marked_text_ranges` function for more information. - // #[track_caller] - // pub fn assert_editor_state(&mut self, marked_text: &str) { - // let (unmarked_text, expected_selections) = marked_text_ranges(marked_text, true); - // let buffer_text = self.buffer_text(); +// /// Make an assertion about the editor's text and the ranges and directions +// /// of its selections using a string containing embedded range markers. +// /// +// /// See the `util::test::marked_text_ranges` function for more information. +// #[track_caller] +// pub fn assert_editor_state(&mut self, marked_text: &str) { +// let (unmarked_text, expected_selections) = marked_text_ranges(marked_text, true); +// let buffer_text = self.buffer_text(); - // if buffer_text != unmarked_text { - // panic!("Unmarked text doesn't match buffer text\nBuffer text: {buffer_text:?}\nUnmarked text: {unmarked_text:?}\nRaw buffer text\n{buffer_text}Raw unmarked text\n{unmarked_text}"); - // } +// if buffer_text != unmarked_text { +// panic!("Unmarked text doesn't match buffer text\nBuffer text: {buffer_text:?}\nUnmarked text: {unmarked_text:?}\nRaw buffer text\n{buffer_text}Raw unmarked text\n{unmarked_text}"); +// } - // self.assert_selections(expected_selections, marked_text.to_string()) - // } +// self.assert_selections(expected_selections, marked_text.to_string()) +// } - // pub fn editor_state(&mut self) -> String { - // generate_marked_text(self.buffer_text().as_str(), &self.editor_selections(), true) - // } +// pub fn editor_state(&mut self) -> String { +// generate_marked_text(self.buffer_text().as_str(), &self.editor_selections(), true) +// } - // #[track_caller] - // pub fn assert_editor_background_highlights(&mut self, marked_text: &str) { - // let expected_ranges = self.ranges(marked_text); - // let actual_ranges: Vec> = self.update_editor(|editor, cx| { - // let snapshot = editor.snapshot(cx); - // editor - // .background_highlights - // .get(&TypeId::of::()) - // .map(|h| h.1.clone()) - // .unwrap_or_default() - // .into_iter() - // .map(|range| range.to_offset(&snapshot.buffer_snapshot)) - // .collect() - // }); - // assert_set_eq!(actual_ranges, expected_ranges); - // } +// #[track_caller] +// pub fn assert_editor_background_highlights(&mut self, marked_text: &str) { +// let expected_ranges = self.ranges(marked_text); +// let actual_ranges: Vec> = self.update_editor(|editor, cx| { +// let snapshot = editor.snapshot(cx); +// editor +// .background_highlights +// .get(&TypeId::of::()) +// .map(|h| h.1.clone()) +// .unwrap_or_default() +// .into_iter() +// .map(|range| range.to_offset(&snapshot.buffer_snapshot)) +// .collect() +// }); +// assert_set_eq!(actual_ranges, expected_ranges); +// } - // #[track_caller] - // pub fn assert_editor_text_highlights(&mut self, marked_text: &str) { - // let expected_ranges = self.ranges(marked_text); - // let snapshot = self.update_editor(|editor, cx| editor.snapshot(cx)); - // let actual_ranges: Vec> = snapshot - // .text_highlight_ranges::() - // .map(|ranges| ranges.as_ref().clone().1) - // .unwrap_or_default() - // .into_iter() - // .map(|range| range.to_offset(&snapshot.buffer_snapshot)) - // .collect(); - // assert_set_eq!(actual_ranges, expected_ranges); - // } +// #[track_caller] +// pub fn assert_editor_text_highlights(&mut self, marked_text: &str) { +// let expected_ranges = self.ranges(marked_text); +// let snapshot = self.update_editor(|editor, cx| editor.snapshot(cx)); +// let actual_ranges: Vec> = snapshot +// .text_highlight_ranges::() +// .map(|ranges| ranges.as_ref().clone().1) +// .unwrap_or_default() +// .into_iter() +// .map(|range| range.to_offset(&snapshot.buffer_snapshot)) +// .collect(); +// assert_set_eq!(actual_ranges, expected_ranges); +// } - // #[track_caller] - // pub fn assert_editor_selections(&mut self, expected_selections: Vec>) { - // let expected_marked_text = - // generate_marked_text(&self.buffer_text(), &expected_selections, true); - // self.assert_selections(expected_selections, expected_marked_text) - // } +// #[track_caller] +// pub fn assert_editor_selections(&mut self, expected_selections: Vec>) { +// let expected_marked_text = +// generate_marked_text(&self.buffer_text(), &expected_selections, true); +// self.assert_selections(expected_selections, expected_marked_text) +// } - // fn editor_selections(&self) -> Vec> { - // self.editor - // .read_with(self.cx, |editor, cx| editor.selections.all::(cx)) - // .into_iter() - // .map(|s| { - // if s.reversed { - // s.end..s.start - // } else { - // s.start..s.end - // } - // }) - // .collect::>() - // } +// fn editor_selections(&self) -> Vec> { +// self.editor +// .read_with(self.cx, |editor, cx| editor.selections.all::(cx)) +// .into_iter() +// .map(|s| { +// if s.reversed { +// s.end..s.start +// } else { +// s.start..s.end +// } +// }) +// .collect::>() +// } - // #[track_caller] - // fn assert_selections( - // &mut self, - // expected_selections: Vec>, - // expected_marked_text: String, - // ) { - // let actual_selections = self.editor_selections(); - // let actual_marked_text = - // generate_marked_text(&self.buffer_text(), &actual_selections, true); - // if expected_selections != actual_selections { - // panic!( - // indoc! {" +// #[track_caller] +// fn assert_selections( +// &mut self, +// expected_selections: Vec>, +// expected_marked_text: String, +// ) { +// let actual_selections = self.editor_selections(); +// let actual_marked_text = +// generate_marked_text(&self.buffer_text(), &actual_selections, true); +// if expected_selections != actual_selections { +// panic!( +// indoc! {" - // {}Editor has unexpected selections. +// {}Editor has unexpected selections. - // Expected selections: - // {} +// Expected selections: +// {} - // Actual selections: - // {} - // "}, - // self.assertion_context(), - // expected_marked_text, - // actual_marked_text, - // ); - // } - // } -} +// Actual selections: +// {} +// "}, +// self.assertion_context(), +// expected_marked_text, +// actual_marked_text, +// ); +// } +// } +// } impl<'a> Deref for EditorTestContext<'a> { type Target = gpui::TestAppContext;