From 0c4f798a2d3278b81a7dbd8e60eaded22c73eeae Mon Sep 17 00:00:00 2001 From: Keith Simmons Date: Tue, 31 May 2022 10:17:29 -0700 Subject: [PATCH 01/14] WIP jump to definition with mouse --- crates/editor/src/editor.rs | 9 +++++++-- crates/editor/src/element.rs | 21 ++++++++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index db287fe65af736f0ed46a5c071fe0b1a75a2efc7..00201dbd3208fcdc44925931ed3f940045dac13d 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -113,6 +113,11 @@ pub struct ConfirmCodeAction { pub item_ix: Option, } +#[derive(Clone, Default)] +pub struct GoToDefinitionAt { + pub location: Option, +} + actions!( editor, [ @@ -173,10 +178,10 @@ actions!( ToggleComments, SelectLargerSyntaxNode, SelectSmallerSyntaxNode, + GoToDefinition, MoveToEnclosingBracket, UndoSelection, RedoSelection, - GoToDefinition, FindAllReferences, Rename, ConfirmRename, @@ -204,7 +209,7 @@ impl_actions!( ] ); -impl_internal_actions!(editor, [Scroll, Select]); +impl_internal_actions!(editor, [Scroll, Select, GoToDefinitionAt]); enum DocumentHighlightRead {} enum DocumentHighlightWrite {} diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 771bc1049c5131db9d9e7c59386693685f46f864..daeb9b56948f65e5e230345d82248bbd83381403 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -5,7 +5,7 @@ use super::{ }; use crate::{ display_map::{DisplaySnapshot, TransformBlock}, - EditorStyle, + EditorStyle, GoToDefinition, }; use clock::ReplicaId; use collections::{BTreeMap, HashMap}; @@ -102,6 +102,7 @@ impl EditorElement { fn mouse_down( &self, position: Vector2F, + cmd: bool, alt: bool, shift: bool, mut click_count: usize, @@ -118,7 +119,11 @@ impl EditorElement { let snapshot = self.snapshot(cx.app); let (position, overshoot) = paint.point_for_position(&snapshot, layout, position); - if shift && alt { + if cmd { + cx.dispatch_action(GoToDefinitionAt { + location: Some(position), + }); + } else if shift && alt { cx.dispatch_action(Select(SelectPhase::BeginColumnar { position, overshoot, @@ -1222,11 +1227,21 @@ impl Element for EditorElement { match event { Event::LeftMouseDown { position, + cmd, alt, shift, click_count, .. - } => self.mouse_down(*position, *alt, *shift, *click_count, layout, paint, cx), + } => self.mouse_down( + *position, + *cmd, + *alt, + *shift, + *click_count, + layout, + paint, + cx, + ), Event::LeftMouseUp { position, .. } => self.mouse_up(*position, cx), Event::LeftMouseDragged { position } => { self.mouse_dragged(*position, layout, paint, cx) From 02249dc2e880c24c062437025abbb9ffae96c246 Mon Sep 17 00:00:00 2001 From: Keith Simmons Date: Fri, 27 May 2022 11:30:58 -0700 Subject: [PATCH 02/14] Rework darkest color in base16, shadows, and add hoverPopover styleTree --- styles/src/styleTree/chatPanel.ts | 7 +- styles/src/styleTree/components.ts | 13 +- styles/src/styleTree/editor.ts | 2 + styles/src/styleTree/hoverPopover.ts | 20 ++++ styles/src/styleTree/picker.ts | 4 +- styles/src/styleTree/workspace.ts | 4 +- styles/src/themes/common/base16.ts | 173 +++++++++++++-------------- styles/src/themes/common/theme.ts | 4 +- 8 files changed, 128 insertions(+), 99 deletions(-) create mode 100644 styles/src/styleTree/hoverPopover.ts diff --git a/styles/src/styleTree/chatPanel.ts b/styles/src/styleTree/chatPanel.ts index 778cd6758480b337a9f3dd8d87caa0ad822687cc..693d464b398ef189b3919689bd12027c40f2055e 100644 --- a/styles/src/styleTree/chatPanel.ts +++ b/styles/src/styleTree/chatPanel.ts @@ -4,9 +4,10 @@ import { backgroundColor, border, player, - shadow, + modalShadow, text, - TextColor + TextColor, + popoverShadow } from "./components"; export default function chatPanel(theme: Theme) { @@ -69,7 +70,7 @@ export default function chatPanel(theme: Theme) { cornerRadius: 6, padding: 4, border: border(theme, "primary"), - shadow: shadow(theme), + shadow: popoverShadow(theme), }, }, signInPrompt: text(theme, "sans", "secondary", { underline: true }), diff --git a/styles/src/styleTree/components.ts b/styles/src/styleTree/components.ts index 2a265377508e81738a105af8a44ea3baf1c096c7..214c255e4b97e4581e572ef2777a4ec6661efaa5 100644 --- a/styles/src/styleTree/components.ts +++ b/styles/src/styleTree/components.ts @@ -1,4 +1,5 @@ import chroma from "chroma-js"; +import { isIPv4 } from "net"; import Theme, { BackgroundColorSet } from "../themes/common/theme"; import { fontFamilies, fontSizes, FontWeight } from "../tokens"; import { Color } from "../utils/color"; @@ -84,10 +85,18 @@ export function backgroundColor( return theme.backgroundColor[name][state || "base"].value; } -export function shadow(theme: Theme) { +export function modalShadow(theme: Theme) { return { blur: 16, - color: chroma("black").alpha(theme.shadowAlpha.value).hex(), + color: theme.shadow.value, offset: [0, 2], }; } + +export function popoverShadow(theme: Theme) { + return { + blur: 4, + color: theme.shadow.value, + offset: [1, 2], + }; +} diff --git a/styles/src/styleTree/editor.ts b/styles/src/styleTree/editor.ts index 3edd205f9a4008d978b2b44e5ab3e289bb82ebbc..d669e4e73482f1e4fe3d6cdde361c0cac0f53885 100644 --- a/styles/src/styleTree/editor.ts +++ b/styles/src/styleTree/editor.ts @@ -4,6 +4,7 @@ import { border, iconColor, player, + popoverShadow, text, TextColor } from "./components"; @@ -80,6 +81,7 @@ export default function editor(theme: Theme) { cornerRadius: 8, padding: 4, border: border(theme, "secondary"), + shadow: popoverShadow(theme), item: autocompleteItem, hoveredItem: { ...autocompleteItem, diff --git a/styles/src/styleTree/hoverPopover.ts b/styles/src/styleTree/hoverPopover.ts new file mode 100644 index 0000000000000000000000000000000000000000..72383abffd1f2afde12e352e6e6f75f401391e78 --- /dev/null +++ b/styles/src/styleTree/hoverPopover.ts @@ -0,0 +1,20 @@ +import Theme from "../themes/common/theme"; +import { backgroundColor, border, popoverShadow } from "./components"; + +export default function HoverPopover(theme: Theme) { + return { + background: backgroundColor(theme, 500), + cornerRadius: 8, + padding: { + left: 8, + right: 8, + top: 4, + bottom: 4 + }, + shadow: popoverShadow(theme), + border: border(theme, "primary"), + margin: { + left: -14, + }, + } +} \ No newline at end of file diff --git a/styles/src/styleTree/picker.ts b/styles/src/styleTree/picker.ts index adb53458d3457e5e1e38776016c7e58a8da5bdca..b3ff654e348458a9be5c7be7c833309a343719a7 100644 --- a/styles/src/styleTree/picker.ts +++ b/styles/src/styleTree/picker.ts @@ -1,5 +1,5 @@ import Theme from "../themes/common/theme"; -import { backgroundColor, border, player, shadow, text } from "./components"; +import { backgroundColor, border, player, modalShadow, text } from "./components"; export default function picker(theme: Theme) { return { @@ -48,6 +48,6 @@ export default function picker(theme: Theme) { top: 7, }, }, - shadow: shadow(theme), + shadow: modalShadow(theme), }; } diff --git a/styles/src/styleTree/workspace.ts b/styles/src/styleTree/workspace.ts index 261656e62abf9fd6fbf2e5d082d4fc354f5bb1cb..17c51bad4cf9343f883888a8bcb7083f7d2363dc 100644 --- a/styles/src/styleTree/workspace.ts +++ b/styles/src/styleTree/workspace.ts @@ -1,6 +1,6 @@ import Theme from "../themes/common/theme"; import { withOpacity } from "../utils/color"; -import { backgroundColor, border, iconColor, shadow, text } from "./components"; +import { backgroundColor, border, iconColor, modalShadow, text } from "./components"; import statusBar from "./statusBar"; export function workspaceBackground(theme: Theme) { @@ -164,7 +164,7 @@ export default function workspace(theme: Theme) { cornerRadius: 6, padding: 12, border: border(theme, "primary"), - shadow: shadow(theme), + shadow: modalShadow(theme), }, notifications: { width: 380, diff --git a/styles/src/themes/common/base16.ts b/styles/src/themes/common/base16.ts index ded4384c02bc1b8eac3ff40a8d0b0cce9a550c35..0bdf455be3a79b435d1dc2b5c2a9d5edcfbfefe2 100644 --- a/styles/src/themes/common/base16.ts +++ b/styles/src/themes/common/base16.ts @@ -14,7 +14,6 @@ export function createTheme( name: string, isLight: boolean, ramps: { [rampName: string]: Scale }, - blend?: number ): Theme { if (isLight) { for (var rampName in ramps) { @@ -25,100 +24,99 @@ export function createTheme( ramps.neutral = ramps.neutral.domain([0, 7]); } - if (blend === undefined) { - blend = isLight ? 0.12 : 0.24; - } + let blend = isLight ? 0.12 : 0.24; - function rampColor(ramp: Scale, index: number): ColorToken { + function sample(ramp: Scale, index: number): ColorToken { return color(ramp(index).hex()); } + const darkest = color(ramps.neutral(isLight ? 7 : 0).hex()); const backgroundColor = { // Title bar 100: { - base: rampColor(ramps.neutral, 1.25), - hovered: rampColor(ramps.neutral, 1.5), - active: rampColor(ramps.neutral, 1.75), + base: sample(ramps.neutral, 1.25), + hovered: sample(ramps.neutral, 1.5), + active: sample(ramps.neutral, 1.75), }, // Midground (panels, etc) 300: { - base: rampColor(ramps.neutral, 1), - hovered: rampColor(ramps.neutral, 1.25), - active: rampColor(ramps.neutral, 1.5), + base: sample(ramps.neutral, 1), + hovered: sample(ramps.neutral, 1.25), + active: sample(ramps.neutral, 1.5), }, // Editor 500: { - base: rampColor(ramps.neutral, 0), - hovered: rampColor(ramps.neutral, 0.25), - active: rampColor(ramps.neutral, 0.5), + base: sample(ramps.neutral, 0), + hovered: sample(ramps.neutral, 0.25), + active: sample(ramps.neutral, 0.5), }, on300: { - base: rampColor(ramps.neutral, 0), - hovered: rampColor(ramps.neutral, 0.25), - active: rampColor(ramps.neutral, 0.5), + base: sample(ramps.neutral, 0), + hovered: sample(ramps.neutral, 0.25), + active: sample(ramps.neutral, 0.5), }, on500: { - base: rampColor(ramps.neutral, 1.25), - hovered: rampColor(ramps.neutral, 1.5), - active: rampColor(ramps.neutral, 1.75), + base: sample(ramps.neutral, 1.25), + hovered: sample(ramps.neutral, 1.5), + active: sample(ramps.neutral, 1.75), }, ok: { - base: withOpacity(rampColor(ramps.green, 0.5), 0.15), - hovered: withOpacity(rampColor(ramps.green, 0.5), 0.2), - active: withOpacity(rampColor(ramps.green, 0.5), 0.25), + base: withOpacity(sample(ramps.green, 0.5), 0.15), + hovered: withOpacity(sample(ramps.green, 0.5), 0.2), + active: withOpacity(sample(ramps.green, 0.5), 0.25), }, error: { - base: withOpacity(rampColor(ramps.red, 0.5), 0.15), - hovered: withOpacity(rampColor(ramps.red, 0.5), 0.2), - active: withOpacity(rampColor(ramps.red, 0.5), 0.25), + base: withOpacity(sample(ramps.red, 0.5), 0.15), + hovered: withOpacity(sample(ramps.red, 0.5), 0.2), + active: withOpacity(sample(ramps.red, 0.5), 0.25), }, warning: { - base: withOpacity(rampColor(ramps.yellow, 0.5), 0.15), - hovered: withOpacity(rampColor(ramps.yellow, 0.5), 0.2), - active: withOpacity(rampColor(ramps.yellow, 0.5), 0.25), + base: withOpacity(sample(ramps.yellow, 0.5), 0.15), + hovered: withOpacity(sample(ramps.yellow, 0.5), 0.2), + active: withOpacity(sample(ramps.yellow, 0.5), 0.25), }, info: { - base: withOpacity(rampColor(ramps.blue, 0.5), 0.15), - hovered: withOpacity(rampColor(ramps.blue, 0.5), 0.2), - active: withOpacity(rampColor(ramps.blue, 0.5), 0.25), + base: withOpacity(sample(ramps.blue, 0.5), 0.15), + hovered: withOpacity(sample(ramps.blue, 0.5), 0.2), + active: withOpacity(sample(ramps.blue, 0.5), 0.25), }, }; const borderColor = { - primary: rampColor(ramps.neutral, isLight ? 1.5 : 0), - secondary: rampColor(ramps.neutral, isLight ? 1.25 : 1), - muted: rampColor(ramps.neutral, isLight ? 1 : 3), - active: rampColor(ramps.neutral, isLight ? 4 : 3), - onMedia: withOpacity(rampColor(ramps.neutral, 0), 0.1), - ok: withOpacity(rampColor(ramps.green, 0.5), 0.15), - error: withOpacity(rampColor(ramps.red, 0.5), 0.15), - warning: withOpacity(rampColor(ramps.yellow, 0.5), 0.15), - info: withOpacity(rampColor(ramps.blue, 0.5), 0.15), + primary: sample(ramps.neutral, isLight ? 1.5 : 0), + secondary: sample(ramps.neutral, isLight ? 1.25 : 1), + muted: sample(ramps.neutral, isLight ? 1 : 3), + active: sample(ramps.neutral, isLight ? 4 : 3), + onMedia: withOpacity(darkest, 0.1), + ok: withOpacity(sample(ramps.green, 0.5), 0.15), + error: withOpacity(sample(ramps.red, 0.5), 0.15), + warning: withOpacity(sample(ramps.yellow, 0.5), 0.15), + info: withOpacity(sample(ramps.blue, 0.5), 0.15), }; const textColor = { - primary: rampColor(ramps.neutral, 6), - secondary: rampColor(ramps.neutral, 5), - muted: rampColor(ramps.neutral, 5), - placeholder: rampColor(ramps.neutral, 4), - active: rampColor(ramps.neutral, 7), - feature: rampColor(ramps.blue, 0.5), - ok: rampColor(ramps.green, 0.5), - error: rampColor(ramps.red, 0.5), - warning: rampColor(ramps.yellow, 0.5), - info: rampColor(ramps.blue, 0.5), - onMedia: rampColor(ramps.neutral, isLight ? 0 : 7), + primary: sample(ramps.neutral, 6), + secondary: sample(ramps.neutral, 5), + muted: sample(ramps.neutral, 5), + placeholder: sample(ramps.neutral, 4), + active: sample(ramps.neutral, 7), + feature: sample(ramps.blue, 0.5), + ok: sample(ramps.green, 0.5), + error: sample(ramps.red, 0.5), + warning: sample(ramps.yellow, 0.5), + info: sample(ramps.blue, 0.5), + onMedia: darkest, }; const player = { - 1: buildPlayer(rampColor(ramps.blue, 0.5)), - 2: buildPlayer(rampColor(ramps.green, 0.5)), - 3: buildPlayer(rampColor(ramps.magenta, 0.5)), - 4: buildPlayer(rampColor(ramps.orange, 0.5)), - 5: buildPlayer(rampColor(ramps.violet, 0.5)), - 6: buildPlayer(rampColor(ramps.cyan, 0.5)), - 7: buildPlayer(rampColor(ramps.red, 0.5)), - 8: buildPlayer(rampColor(ramps.yellow, 0.5)), + 1: buildPlayer(sample(ramps.blue, 0.5)), + 2: buildPlayer(sample(ramps.green, 0.5)), + 3: buildPlayer(sample(ramps.magenta, 0.5)), + 4: buildPlayer(sample(ramps.orange, 0.5)), + 5: buildPlayer(sample(ramps.violet, 0.5)), + 6: buildPlayer(sample(ramps.cyan, 0.5)), + 7: buildPlayer(sample(ramps.red, 0.5)), + 8: buildPlayer(sample(ramps.yellow, 0.5)), }; const editor = { @@ -126,16 +124,16 @@ export function createTheme( indent_guide: borderColor.muted, indent_guide_active: borderColor.secondary, line: { - active: rampColor(ramps.neutral, 1), - highlighted: rampColor(ramps.neutral, 1.25), // TODO: Where is this used? + active: sample(ramps.neutral, 1), + highlighted: sample(ramps.neutral, 1.25), // TODO: Where is this used? }, highlight: { selection: player[1].selectionColor, - occurrence: withOpacity(rampColor(ramps.neutral, 3.5), blend), - activeOccurrence: withOpacity(rampColor(ramps.neutral, 3.5), blend * 2), // TODO: Not hooked up - https://github.com/zed-industries/zed/issues/751 + occurrence: withOpacity(sample(ramps.neutral, 3.5), blend), + activeOccurrence: withOpacity(sample(ramps.neutral, 3.5), blend * 2), // TODO: Not hooked up - https://github.com/zed-industries/zed/issues/751 matchingBracket: backgroundColor[500].active, // TODO: Not hooked up - match: rampColor(ramps.violet, 0.15), - activeMatch: withOpacity(rampColor(ramps.violet, 0.4), blend * 2), // TODO: Not hooked up - https://github.com/zed-industries/zed/issues/751 + match: sample(ramps.violet, 0.15), + activeMatch: withOpacity(sample(ramps.violet, 0.4), blend * 2), // TODO: Not hooked up - https://github.com/zed-industries/zed/issues/751 related: backgroundColor[500].hovered, }, gutter: { @@ -146,59 +144,59 @@ export function createTheme( const syntax: Syntax = { primary: { - color: rampColor(ramps.neutral, 7), + color: sample(ramps.neutral, 7), weight: fontWeights.normal, }, comment: { - color: rampColor(ramps.neutral, 5), + color: sample(ramps.neutral, 5), weight: fontWeights.normal, }, punctuation: { - color: rampColor(ramps.neutral, 6), + color: sample(ramps.neutral, 6), weight: fontWeights.normal, }, constant: { - color: rampColor(ramps.neutral, 4), + color: sample(ramps.neutral, 4), weight: fontWeights.normal, }, keyword: { - color: rampColor(ramps.blue, 0.5), + color: sample(ramps.blue, 0.5), weight: fontWeights.normal, }, function: { - color: rampColor(ramps.yellow, 0.5), + color: sample(ramps.yellow, 0.5), weight: fontWeights.normal, }, type: { - color: rampColor(ramps.cyan, 0.5), + color: sample(ramps.cyan, 0.5), weight: fontWeights.normal, }, variant: { - color: rampColor(ramps.blue, 0.5), + color: sample(ramps.blue, 0.5), weight: fontWeights.normal, }, property: { - color: rampColor(ramps.blue, 0.5), + color: sample(ramps.blue, 0.5), weight: fontWeights.normal, }, enum: { - color: rampColor(ramps.orange, 0.5), + color: sample(ramps.orange, 0.5), weight: fontWeights.normal, }, operator: { - color: rampColor(ramps.orange, 0.5), + color: sample(ramps.orange, 0.5), weight: fontWeights.normal, }, string: { - color: rampColor(ramps.orange, 0.5), + color: sample(ramps.orange, 0.5), weight: fontWeights.normal, }, number: { - color: rampColor(ramps.green, 0.5), + color: sample(ramps.green, 0.5), weight: fontWeights.normal, }, boolean: { - color: rampColor(ramps.green, 0.5), + color: sample(ramps.green, 0.5), weight: fontWeights.normal, }, predictive: { @@ -206,7 +204,7 @@ export function createTheme( weight: fontWeights.normal, }, title: { - color: rampColor(ramps.yellow, 0.5), + color: sample(ramps.yellow, 0.5), weight: fontWeights.bold, }, emphasis: { @@ -218,21 +216,20 @@ export function createTheme( weight: fontWeights.bold, }, linkUri: { - color: rampColor(ramps.green, 0.5), + color: sample(ramps.green, 0.5), weight: fontWeights.normal, underline: true, }, linkText: { - color: rampColor(ramps.orange, 0.5), + color: sample(ramps.orange, 0.5), weight: fontWeights.normal, italic: true, }, }; - const shadowAlpha: NumberToken = { - value: blend, - type: "number", - }; + const shadow = withOpacity( + color(ramps.neutral(isLight ? 7 : 0).darken().hex()), + blend); return { name, @@ -243,6 +240,6 @@ export function createTheme( editor, syntax, player, - shadowAlpha, + shadow, }; } diff --git a/styles/src/themes/common/theme.ts b/styles/src/themes/common/theme.ts index 5f32844cc7114a075318f964242dc3720512a1af..fe47ce8153375ab3048008545e6ad79801d1d3ae 100644 --- a/styles/src/themes/common/theme.ts +++ b/styles/src/themes/common/theme.ts @@ -153,6 +153,6 @@ export default interface Theme { 6: Player; 7: Player; 8: Player; - }; - shadowAlpha: NumberToken; + }, + shadow: ColorToken; } From 0ed8a42bb4dc982621caa5a9286232b777821bb6 Mon Sep 17 00:00:00 2001 From: Keith Simmons Date: Mon, 30 May 2022 00:32:44 -0700 Subject: [PATCH 03/14] WIP --- crates/editor/src/editor.rs | 81 +++++++++++++++++++++++++++++++++++- crates/editor/src/element.rs | 3 +- 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 00201dbd3208fcdc44925931ed3f940045dac13d..0707f7156045254e3a0f7b71c79b4c92f60b3ef7 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -191,6 +191,7 @@ actions!( UnfoldLines, FoldSelectedRanges, ShowCompletions, + ShowHover, OpenExcerpts, RestartLanguageServer, ] @@ -413,6 +414,7 @@ pub struct Editor { next_completion_id: CompletionId, available_code_actions: Option<(ModelHandle, Arc<[CodeAction]>)>, code_actions_task: Option>, + hover_task: Option>, document_highlights_task: Option>, pending_rename: Option, searchable: bool, @@ -559,6 +561,7 @@ struct InvalidationStack(Vec); enum ContextMenu { Completions(CompletionsMenu), CodeActions(CodeActionsMenu), + Hover(HoverPopover), } impl ContextMenu { @@ -567,6 +570,7 @@ impl ContextMenu { match self { ContextMenu::Completions(menu) => menu.select_prev(cx), ContextMenu::CodeActions(menu) => menu.select_prev(cx), + _ => {} } true } else { @@ -579,6 +583,7 @@ impl ContextMenu { match self { ContextMenu::Completions(menu) => menu.select_next(cx), ContextMenu::CodeActions(menu) => menu.select_next(cx), + _ => {} } true } else { @@ -590,6 +595,7 @@ impl ContextMenu { match self { ContextMenu::Completions(menu) => menu.visible(), ContextMenu::CodeActions(menu) => menu.visible(), + ContextMenu::Hover(_) => true, } } @@ -602,6 +608,7 @@ impl ContextMenu { match self { ContextMenu::Completions(menu) => (cursor_position, menu.render(style, cx)), ContextMenu::CodeActions(menu) => menu.render(cursor_position, style, cx), + ContextMenu::Hover(popover) => (cursor_position, popover.render(style)), } } } @@ -846,6 +853,22 @@ impl CodeActionsMenu { } } +#[derive(Clone)] +struct HoverPopover { + pub text: String, + pub runs: Vec<(Range, HighlightStyle)>, +} + +impl HoverPopover { + fn render(&self, style: EditorStyle) -> ElementBox { + Text::new(self.text.clone(), style.text.clone()) + .with_soft_wrap(false) + .with_highlights(self.runs.clone()) + .contained() + .boxed() + } +} + #[derive(Debug)] struct ActiveDiagnosticGroup { primary_range: Range, @@ -2385,6 +2408,59 @@ impl Editor { })) } + fn show_hover(&mut self, _: &ShowHover, cx: &mut ViewContext) { + if self.pending_rename.is_some() { + return; + } + + let project = if let Some(project) = self.project.clone() { + project + } else { + return; + }; + + let position = self.selections.newest_anchor().head(); + let (buffer, buffer_position) = if let Some(output) = self + .buffer + .read(cx) + .text_anchor_for_position(position.clone(), cx) + { + output + } else { + return; + }; + + let hover = HoverPopover { + text: "Test hover information".to_string(), + runs: Vec::new(), + }; + + let id = post_inc(&mut self.next_completion_id); + let task = cx.spawn_weak(|this, mut cx| { + async move { + if let Some(this) = this.upgrade(&cx) { + this.update(&mut cx, |this, cx| { + if !matches!( + this.context_menu.as_ref(), + None | Some(ContextMenu::Hover(_)) + ) { + return; + } + + if this.focused { + this.show_context_menu(ContextMenu::Hover(hover), cx); + } + + cx.notify(); + }); + } + Ok::<_, anyhow::Error>(()) + } + .log_err() + }); + self.completion_tasks.push((id, task)); + } + async fn open_project_transaction( this: ViewHandle, workspace: ViewHandle, @@ -2628,7 +2704,7 @@ impl Editor { ) -> Option<(DisplayPoint, ElementBox)> { self.context_menu .as_ref() - .map(|menu| menu.render(cursor_position, style, cx)) + .map(|menu| menu.render(cursor_position, style)) } fn show_context_menu(&mut self, menu: ContextMenu, cx: &mut ViewContext) { @@ -5665,6 +5741,9 @@ impl View for Editor { Some(ContextMenu::CodeActions(_)) => { context.set.insert("showing_code_actions".into()); } + Some(ContextMenu::Hover(_)) => { + context.set.insert("showing_hover".into()); + } None => {} } diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index daeb9b56948f65e5e230345d82248bbd83381403..5555a8fb11df4014f658cf763c08d5c43924ff3c 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1091,8 +1091,7 @@ impl Element for EditorElement { if (start_row..end_row).contains(&newest_selection_head.row()) { let style = view.style(cx); if view.context_menu_visible() { - context_menu = - view.render_context_menu(newest_selection_head, style.clone(), cx); + context_menu = view.render_context_menu(newest_selection_head, style.clone()); } code_actions_indicator = view From 24ad60a65103afc1019adb1e3b6bfb4cf9fbaf07 Mon Sep 17 00:00:00 2001 From: Isaac Clayton Date: Mon, 30 May 2022 12:27:06 +0200 Subject: [PATCH 04/14] Add hover action and style context menu --- crates/editor/src/editor.rs | 39 +++++++++++++++++++++++------------- crates/editor/src/element.rs | 29 +++++++++++++++++++++------ 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 0707f7156045254e3a0f7b71c79b4c92f60b3ef7..1b938e55258d4ba57ee3ecf2a60bad2d048ba6ae 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -80,6 +80,15 @@ pub struct Scroll(pub Vector2F); #[derive(Clone, PartialEq)] pub struct Select(pub SelectPhase); +#[derive(Clone)] +pub struct ShowHover(DisplayPoint); + +#[derive(Clone)] +pub struct Hover { + point: DisplayPoint, + overshoot: DisplayPoint, +} + #[derive(Clone, Deserialize, PartialEq)] pub struct Input(pub String); @@ -191,7 +200,6 @@ actions!( UnfoldLines, FoldSelectedRanges, ShowCompletions, - ShowHover, OpenExcerpts, RestartLanguageServer, ] @@ -210,7 +218,7 @@ impl_actions!( ] ); -impl_internal_actions!(editor, [Scroll, Select, GoToDefinitionAt]); +impl_internal_actions!(editor, [Scroll, Select, Hover, ShowHover, GoToDefinitionAt]); enum DocumentHighlightRead {} enum DocumentHighlightWrite {} @@ -297,6 +305,8 @@ pub fn init(cx: &mut MutableAppContext) { cx.add_action(Editor::fold_selected_ranges); cx.add_action(Editor::show_completions); cx.add_action(Editor::toggle_code_actions); + cx.add_action(Editor::hover); + cx.add_action(Editor::show_hover); cx.add_action(Editor::open_excerpts); cx.add_action(Editor::restart_language_server); cx.add_async_action(Editor::confirm_completion); @@ -855,16 +865,19 @@ impl CodeActionsMenu { #[derive(Clone)] struct HoverPopover { + pub point: DisplayPoint, pub text: String, pub runs: Vec<(Range, HighlightStyle)>, } impl HoverPopover { fn render(&self, style: EditorStyle) -> ElementBox { + let container_style = style.autocomplete.container; Text::new(self.text.clone(), style.text.clone()) .with_soft_wrap(false) .with_highlights(self.runs.clone()) .contained() + .with_style(container_style) .boxed() } } @@ -1026,6 +1039,7 @@ impl Editor { next_completion_id: 0, available_code_actions: Default::default(), code_actions_task: Default::default(), + hover_task: Default::default(), document_highlights_task: Default::default(), pending_rename: Default::default(), searchable: true, @@ -2408,7 +2422,13 @@ impl Editor { })) } - fn show_hover(&mut self, _: &ShowHover, cx: &mut ViewContext) { + fn hover(&mut self, action: &Hover, cx: &mut ViewContext) { + if action.overshoot.is_zero() { + self.show_hover(&ShowHover(action.point), cx); + } + } + + fn show_hover(&mut self, action: &ShowHover, cx: &mut ViewContext) { if self.pending_rename.is_some() { return; } @@ -2419,18 +2439,9 @@ impl Editor { return; }; - let position = self.selections.newest_anchor().head(); - let (buffer, buffer_position) = if let Some(output) = self - .buffer - .read(cx) - .text_anchor_for_position(position.clone(), cx) - { - output - } else { - return; - }; - let hover = HoverPopover { + // TODO: beginning of symbol based on range + point: action.0, text: "Test hover information".to_string(), runs: Vec::new(), }; diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 5555a8fb11df4014f658cf763c08d5c43924ff3c..73b9b28e82636c701f4932c28bdb9c446757ebcd 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -5,7 +5,7 @@ use super::{ }; use crate::{ display_map::{DisplaySnapshot, TransformBlock}, - EditorStyle, GoToDefinition, + EditorStyle, GoToDefinition, Hover, }; use clock::ReplicaId; use collections::{BTreeMap, HashMap}; @@ -126,7 +126,7 @@ impl EditorElement { } else if shift && alt { cx.dispatch_action(Select(SelectPhase::BeginColumnar { position, - overshoot, + overshoot: overshoot.column(), })); } else if shift { cx.dispatch_action(Select(SelectPhase::Extend { @@ -195,7 +195,7 @@ impl EditorElement { cx.dispatch_action(Select(SelectPhase::Update { position, - overshoot, + overshoot: overshoot.column(), scroll_position: (snapshot.scroll_position() + scroll_delta) .clamp(Vector2F::zero(), layout.scroll_max), })); @@ -1251,6 +1251,16 @@ impl Element for EditorElement { precise, } => self.scroll(*position, *delta, *precise, layout, paint, cx), Event::KeyDown { input, .. } => self.key_down(input.as_deref(), cx), + Event::MouseMoved { position, .. } => { + if paint.text_bounds.contains_point(*position) { + let (point, overshoot) = + paint.point_for_position(&self.snapshot(cx), layout, *position); + cx.dispatch_action(Hover { point, overshoot }); + true + } else { + false + } + } _ => false, } } @@ -1329,16 +1339,20 @@ pub struct PaintState { } impl PaintState { + /// Returns two display points. The first is the nearest valid + /// position in the current buffer and the second is the distance to the + /// nearest valid position if there was overshoot. fn point_for_position( &self, snapshot: &EditorSnapshot, layout: &LayoutState, position: Vector2F, - ) -> (DisplayPoint, u32) { + ) -> (DisplayPoint, DisplayPoint) { let scroll_position = snapshot.scroll_position(); let position = position - self.text_bounds.origin(); let y = position.y().max(0.0).min(layout.size.y()); let row = ((y / layout.line_height) + scroll_position.y()) as u32; + let row_overshoot = row.saturating_sub(snapshot.max_point().row()); let row = cmp::min(row, snapshot.max_point().row()); let line = &layout.line_layouts[(row - scroll_position.y() as u32) as usize]; let x = position.x() + (scroll_position.x() * layout.em_width); @@ -1350,9 +1364,12 @@ impl PaintState { } else { 0 }; - let overshoot = (0f32.max(x - line.width()) / layout.em_advance) as u32; + let column_overshoot = (0f32.max(x - line.width()) / layout.em_advance) as u32; - (DisplayPoint::new(row, column), overshoot) + ( + DisplayPoint::new(row, column), + DisplayPoint::new(row_overshoot, column_overshoot), + ) } } From 470c70d394ccf65d9fb29e1a8f37951be79e102c Mon Sep 17 00:00:00 2001 From: Isaac Clayton Date: Mon, 30 May 2022 17:00:45 +0200 Subject: [PATCH 05/14] Get minimal POC working --- crates/editor/src/editor.rs | 45 ++++++++++++-- crates/project/src/lsp_command.rs | 100 ++++++++++++++++++++++++++++++ crates/project/src/project.rs | 12 ++++ crates/rpc/proto/zed.proto | 84 ++++++++++++++----------- crates/rpc/src/proto.rs | 4 ++ 5 files changed, 204 insertions(+), 41 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 1b938e55258d4ba57ee3ecf2a60bad2d048ba6ae..0220c89cd0f9cfdcc9788a22545db7e9cc4975b7 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -2439,16 +2439,49 @@ impl Editor { return; }; - let hover = HoverPopover { - // TODO: beginning of symbol based on range - point: action.0, - text: "Test hover information".to_string(), - runs: Vec::new(), + let snapshot = self.snapshot(cx); + let (buffer, buffer_position) = if let Some(output) = self + .buffer + .read(cx) + .text_anchor_for_position(action.0.to_point(&snapshot.display_snapshot), cx) + { + output + } else { + return; }; + let hover = project.update(cx, |project, cx| { + project.hover(&buffer, buffer_position.clone(), cx) + }); + + let point = action.0.clone(); + let id = post_inc(&mut self.next_completion_id); let task = cx.spawn_weak(|this, mut cx| { async move { + // TODO: what to show while language server is loading? + let text: String = match hover.await? { + None => "Language server is warming up...".into(), + Some(hover) => match hover.contents { + lsp::HoverContents::Scalar(marked_string) => match marked_string { + lsp::MarkedString::String(string) => string, + lsp::MarkedString::LanguageString(string) => string.value, + }, + lsp::HoverContents::Array(marked_strings) => { + // TODO: what to do? + todo!() + } + lsp::HoverContents::Markup(markup) => markup.value, + }, + }; + + let mut hover_popover = HoverPopover { + // TODO: fix tooltip to beginning of symbol based on range + point, + text, + runs: Vec::new(), + }; + if let Some(this) = this.upgrade(&cx) { this.update(&mut cx, |this, cx| { if !matches!( @@ -2459,7 +2492,7 @@ impl Editor { } if this.focused { - this.show_context_menu(ContextMenu::Hover(hover), cx); + this.show_context_menu(ContextMenu::Hover(hover_popover), cx); } cx.notify(); diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index 1e86bb271965b7062652146d964b81ff651e6099..dec34f8898c804c3aa2075e29a61631b34209889 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -80,6 +80,10 @@ pub(crate) struct GetDocumentHighlights { pub position: PointUtf16, } +pub(crate) struct GetHover { + pub position: PointUtf16, +} + #[async_trait(?Send)] impl LspCommand for PrepareRename { type Response = Option>; @@ -794,3 +798,99 @@ impl LspCommand for GetDocumentHighlights { message.buffer_id } } + +#[async_trait(?Send)] +impl LspCommand for GetHover { + // TODO: proper response type + type Response = Option; + type LspRequest = lsp::request::HoverRequest; + type ProtoRequest = proto::GetHover; + + fn to_lsp(&self, path: &Path, cx: &AppContext) -> lsp::HoverParams { + lsp::HoverParams { + text_document_position_params: lsp::TextDocumentPositionParams { + text_document: lsp::TextDocumentIdentifier { + uri: lsp::Url::from_file_path(path).unwrap(), + }, + position: point_to_lsp(self.position), + }, + work_done_progress_params: Default::default(), + } + } + + async fn response_from_lsp( + self, + message: Option, + project: ModelHandle, + buffer: ModelHandle, + cx: AsyncAppContext, + ) -> Result { + // let (lsp_adapter, language_server) = project + // .read_with(&cx, |project, cx| { + // project + // .language_server_for_buffer(buffer.read(cx), cx) + // .cloned() + // }) + // .ok_or_else(|| anyhow!("no language server found for buffer"))?; + + // TODO: what here? + Ok(Some( + message.ok_or_else(|| anyhow!("invalid lsp response"))?, + )) + } + + fn to_proto(&self, project_id: u64, buffer: &Buffer) -> Self::ProtoRequest { + proto::GetHover { + project_id, + buffer_id: buffer.remote_id(), + position: Some(language::proto::serialize_anchor( + &buffer.anchor_before(self.position), + )), + version: serialize_version(&buffer.version), + } + } + + async fn from_proto( + message: Self::ProtoRequest, + project: ModelHandle, + buffer: ModelHandle, + mut cx: AsyncAppContext, + ) -> Result { + let position = message + .position + .and_then(deserialize_anchor) + .ok_or_else(|| anyhow!("invalid position"))?; + buffer + .update(&mut cx, |buffer, _| { + buffer.wait_for_version(deserialize_version(message.version)) + }) + .await; + Ok(Self { + position: buffer.read_with(&cx, |buffer, _| position.to_point_utf16(buffer)), + }) + } + + fn response_to_proto( + response: Self::Response, + project: &mut Project, + peer_id: PeerId, + buffer_version: &clock::Global, + cx: &AppContext, + ) -> proto::GetHoverResponse { + todo!() + } + + async fn response_from_proto( + self, + message: ::Response, + project: ModelHandle, + buffer: ModelHandle, + cx: AsyncAppContext, + ) -> Result { + todo!() + } + + fn buffer_id_from_proto(message: &Self::ProtoRequest) -> u64 { + message.buffer_id + } +} diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 7575b67f252c640a33811491c214d4a4d4db177f..e7d145b1847d10d96e776c8fe4ba40669e692984 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -302,6 +302,7 @@ impl Project { client.add_model_request_handler(Self::handle_format_buffers); client.add_model_request_handler(Self::handle_get_code_actions); client.add_model_request_handler(Self::handle_get_completions); + client.add_model_request_handler(Self::handle_lsp_command::); client.add_model_request_handler(Self::handle_lsp_command::); client.add_model_request_handler(Self::handle_lsp_command::); client.add_model_request_handler(Self::handle_lsp_command::); @@ -2884,6 +2885,17 @@ impl Project { } } + pub fn hover( + &self, + buffer: &ModelHandle, + position: T, + cx: &mut ModelContext, + ) -> Task>> { + // TODO: proper return type + let position = position.to_point_utf16(buffer.read(cx)); + self.request_lsp(buffer.clone(), GetHover { position }, cx) + } + pub fn completions( &self, source_buffer_handle: &ModelHandle, diff --git a/crates/rpc/proto/zed.proto b/crates/rpc/proto/zed.proto index 44bc673fceba90c7fff398a6b5fd5f1a31c45e36..4b1e4297a5b5381ad778df0257b0dda9f1a54958 100644 --- a/crates/rpc/proto/zed.proto +++ b/crates/rpc/proto/zed.proto @@ -66,41 +66,43 @@ message Envelope { ApplyCompletionAdditionalEditsResponse apply_completion_additional_edits_response = 56; GetCodeActions get_code_actions = 57; GetCodeActionsResponse get_code_actions_response = 58; - ApplyCodeAction apply_code_action = 59; - ApplyCodeActionResponse apply_code_action_response = 60; - PrepareRename prepare_rename = 61; - PrepareRenameResponse prepare_rename_response = 62; - PerformRename perform_rename = 63; - PerformRenameResponse perform_rename_response = 64; - SearchProject search_project = 65; - SearchProjectResponse search_project_response = 66; - - GetChannels get_channels = 67; - GetChannelsResponse get_channels_response = 68; - JoinChannel join_channel = 69; - JoinChannelResponse join_channel_response = 70; - LeaveChannel leave_channel = 71; - SendChannelMessage send_channel_message = 72; - SendChannelMessageResponse send_channel_message_response = 73; - ChannelMessageSent channel_message_sent = 74; - GetChannelMessages get_channel_messages = 75; - GetChannelMessagesResponse get_channel_messages_response = 76; - - UpdateContacts update_contacts = 77; - UpdateInviteInfo update_invite_info = 78; - ShowContacts show_contacts = 79; - - GetUsers get_users = 80; - FuzzySearchUsers fuzzy_search_users = 81; - UsersResponse users_response = 82; - RequestContact request_contact = 83; - RespondToContactRequest respond_to_contact_request = 84; - RemoveContact remove_contact = 85; - - Follow follow = 86; - FollowResponse follow_response = 87; - UpdateFollowers update_followers = 88; - Unfollow unfollow = 89; + GetHover get_hover = 59; + GetHoverResponse get_hover_response = 60; + ApplyCodeAction apply_code_action = 61; + ApplyCodeActionResponse apply_code_action_response = 62; + PrepareRename prepare_rename = 63; + PrepareRenameResponse prepare_rename_response = 64; + PerformRename perform_rename = 65; + PerformRenameResponse perform_rename_response = 66; + SearchProject search_project = 67; + SearchProjectResponse search_project_response = 68; + + GetChannels get_channels = 69; + GetChannelsResponse get_channels_response = 70; + JoinChannel join_channel = 71; + JoinChannelResponse join_channel_response = 72; + LeaveChannel leave_channel = 73; + SendChannelMessage send_channel_message = 74; + SendChannelMessageResponse send_channel_message_response = 75; + ChannelMessageSent channel_message_sent = 76; + GetChannelMessages get_channel_messages = 77; + GetChannelMessagesResponse get_channel_messages_response = 78; + + UpdateContacts update_contacts = 79; + UpdateInviteInfo update_invite_info = 80; + ShowContacts show_contacts = 81; + + GetUsers get_users = 82; + FuzzySearchUsers fuzzy_search_users = 83; + UsersResponse users_response = 84; + RequestContact request_contact = 85; + RespondToContactRequest respond_to_contact_request = 86; + RemoveContact remove_contact = 87; + + Follow follow = 88; + FollowResponse follow_response = 89; + UpdateFollowers update_followers = 90; + Unfollow unfollow = 91; } } @@ -426,6 +428,18 @@ message GetCodeActionsResponse { repeated VectorClockEntry version = 2; } +message GetHover { + uint64 project_id = 1; + uint64 buffer_id = 2; + Anchor position = 3; + repeated VectorClockEntry version = 5; +} + +message GetHoverResponse { + repeated CodeAction actions = 1; + repeated VectorClockEntry version = 2; +} + message ApplyCodeAction { uint64 project_id = 1; uint64 buffer_id = 2; diff --git a/crates/rpc/src/proto.rs b/crates/rpc/src/proto.rs index 0fcb2eaea3b77410ab102123cbb4290901a6523f..6343c05ceac42b2c1733065faa90c90ffcd1294f 100644 --- a/crates/rpc/src/proto.rs +++ b/crates/rpc/src/proto.rs @@ -99,6 +99,8 @@ messages!( (GetChannelsResponse, Foreground), (GetCodeActions, Background), (GetCodeActionsResponse, Background), + (GetHover, Background), + (GetHoverResponse, Background), (GetCompletions, Background), (GetCompletionsResponse, Background), (GetDefinition, Background), @@ -175,6 +177,7 @@ request_messages!( (GetChannelMessages, GetChannelMessagesResponse), (GetChannels, GetChannelsResponse), (GetCodeActions, GetCodeActionsResponse), + (GetHover, GetHoverResponse), (GetCompletions, GetCompletionsResponse), (GetDefinition, GetDefinitionResponse), (GetDocumentHighlights, GetDocumentHighlightsResponse), @@ -221,6 +224,7 @@ entity_messages!( GetCompletions, GetDefinition, GetDocumentHighlights, + GetHover, GetReferences, GetProjectSymbols, JoinProject, From 560dff732945473f4cbdc40252a9db576da5cdc1 Mon Sep 17 00:00:00 2001 From: Keith Simmons Date: Mon, 30 May 2022 21:09:19 -0700 Subject: [PATCH 06/14] Pull hover popover out of context menu --- crates/editor/src/editor.rs | 50 ++++++++++++++----------------- crates/editor/src/element.rs | 40 +++++++++++++++++++++++++ crates/project/src/lsp_command.rs | 37 +++++++++++++---------- crates/project/src/project.rs | 8 ++++- crates/theme/src/theme.rs | 3 +- styles/src/styleTree/editor.ts | 2 ++ 6 files changed, 95 insertions(+), 45 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 0220c89cd0f9cfdcc9788a22545db7e9cc4975b7..c5933388f5815e8779b72fdd63f75a7cfbe87e5f 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -424,7 +424,7 @@ pub struct Editor { next_completion_id: CompletionId, available_code_actions: Option<(ModelHandle, Arc<[CodeAction]>)>, code_actions_task: Option>, - hover_task: Option>, + hover_task: Option>>, document_highlights_task: Option>, pending_rename: Option, searchable: bool, @@ -432,6 +432,7 @@ pub struct Editor { keymap_context_layers: BTreeMap, input_enabled: bool, leader_replica_id: Option, + hover_popover: Option, } pub struct EditorSnapshot { @@ -571,7 +572,6 @@ struct InvalidationStack(Vec); enum ContextMenu { Completions(CompletionsMenu), CodeActions(CodeActionsMenu), - Hover(HoverPopover), } impl ContextMenu { @@ -580,7 +580,6 @@ impl ContextMenu { match self { ContextMenu::Completions(menu) => menu.select_prev(cx), ContextMenu::CodeActions(menu) => menu.select_prev(cx), - _ => {} } true } else { @@ -593,7 +592,6 @@ impl ContextMenu { match self { ContextMenu::Completions(menu) => menu.select_next(cx), ContextMenu::CodeActions(menu) => menu.select_next(cx), - _ => {} } true } else { @@ -605,7 +603,6 @@ impl ContextMenu { match self { ContextMenu::Completions(menu) => menu.visible(), ContextMenu::CodeActions(menu) => menu.visible(), - ContextMenu::Hover(_) => true, } } @@ -871,14 +868,16 @@ struct HoverPopover { } impl HoverPopover { - fn render(&self, style: EditorStyle) -> ElementBox { - let container_style = style.autocomplete.container; - Text::new(self.text.clone(), style.text.clone()) - .with_soft_wrap(false) - .with_highlights(self.runs.clone()) - .contained() - .with_style(container_style) - .boxed() + fn render(&self, style: EditorStyle) -> (DisplayPoint, ElementBox) { + ( + self.point, + Text::new(self.text.clone(), style.text.clone()) + .with_soft_wrap(false) + .with_highlights(self.runs.clone()) + .contained() + .with_style(style.hover_popover) + .boxed(), + ) } } @@ -1048,6 +1047,7 @@ impl Editor { keymap_context_layers: Default::default(), input_enabled: true, leader_replica_id: None, + hover_popover: None, }; this.end_selection(cx); @@ -1433,6 +1433,8 @@ impl Editor { } } + self.hover_popover.take(); + if old_cursor_position.to_display_point(&display_map).row() != new_cursor_position.to_display_point(&display_map).row() { @@ -2456,7 +2458,6 @@ impl Editor { let point = action.0.clone(); - let id = post_inc(&mut self.next_completion_id); let task = cx.spawn_weak(|this, mut cx| { async move { // TODO: what to show while language server is loading? @@ -2475,7 +2476,7 @@ impl Editor { }, }; - let mut hover_popover = HoverPopover { + let hover_popover = HoverPopover { // TODO: fix tooltip to beginning of symbol based on range point, text, @@ -2484,15 +2485,8 @@ impl Editor { if let Some(this) = this.upgrade(&cx) { this.update(&mut cx, |this, cx| { - if !matches!( - this.context_menu.as_ref(), - None | Some(ContextMenu::Hover(_)) - ) { - return; - } - if this.focused { - this.show_context_menu(ContextMenu::Hover(hover_popover), cx); + this.hover_popover = Some(hover_popover); } cx.notify(); @@ -2502,7 +2496,8 @@ impl Editor { } .log_err() }); - self.completion_tasks.push((id, task)); + + self.hover_task = Some(task); } async fn open_project_transaction( @@ -2751,6 +2746,10 @@ impl Editor { .map(|menu| menu.render(cursor_position, style)) } + pub fn render_hover_popover(&self, style: EditorStyle) -> Option<(DisplayPoint, ElementBox)> { + self.hover_popover.as_ref().map(|hover| hover.render(style)) + } + fn show_context_menu(&mut self, menu: ContextMenu, cx: &mut ViewContext) { if !matches!(menu, ContextMenu::Completions(_)) { self.completion_tasks.clear(); @@ -5785,9 +5784,6 @@ impl View for Editor { Some(ContextMenu::CodeActions(_)) => { context.set.insert("showing_code_actions".into()); } - Some(ContextMenu::Hover(_)) => { - context.set.insert("showing_hover".into()); - } None => {} } diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 73b9b28e82636c701f4932c28bdb9c446757ebcd..9095dbbb7b579960ab0d099858a4fd45279b7a06 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -508,6 +508,28 @@ impl EditorElement { cx.scene.pop_stacking_context(); } + if let Some((position, hover_popover)) = layout.hover.as_mut() { + cx.scene.push_stacking_context(None); + + let cursor_row_layout = &layout.line_layouts[(position.row() - start_row) as usize]; + let x = cursor_row_layout.x_for_index(position.column() as usize) - scroll_left; + let y = (position.row() + 1) as f32 * layout.line_height - scroll_top; + let mut popover_origin = content_origin + vec2f(x, y); + let popover_height = hover_popover.size().y(); + + if popover_origin.y() + popover_height > bounds.lower_left().y() { + popover_origin.set_y(popover_origin.y() - layout.line_height - popover_height); + } + + hover_popover.paint( + popover_origin, + RectF::from_points(Vector2F::zero(), vec2f(f32::MAX, f32::MAX)), // Let content bleed outside of editor + cx, + ); + + cx.scene.pop_stacking_context(); + } + cx.scene.pop_layer(); } @@ -1081,6 +1103,7 @@ impl Element for EditorElement { let mut context_menu = None; let mut code_actions_indicator = None; + let mut hover = None; cx.render(&self.view.upgrade(cx).unwrap(), |view, cx| { let newest_selection_head = view .selections @@ -1097,6 +1120,8 @@ impl Element for EditorElement { code_actions_indicator = view .render_code_actions_indicator(&style, cx) .map(|indicator| (newest_selection_head.row(), indicator)); + + hover = view.render_hover_popover(style); } }); @@ -1120,6 +1145,19 @@ impl Element for EditorElement { ); } + if let Some((_, hover)) = hover.as_mut() { + hover.layout( + SizeConstraint { + min: Vector2F::zero(), + max: vec2f( + f32::INFINITY, + (12. * line_height).min((size.y() - line_height) / 2.), + ), + }, + cx, + ); + } + let blocks = self.layout_blocks( start_row..end_row, &snapshot, @@ -1156,6 +1194,7 @@ impl Element for EditorElement { selections, context_menu, code_actions_indicator, + hover, }, ) } @@ -1299,6 +1338,7 @@ pub struct LayoutState { selections: Vec<(ReplicaId, Vec)>, context_menu: Option<(DisplayPoint, ElementBox)>, code_actions_indicator: Option<(u32, ElementBox)>, + hover: Option<(DisplayPoint, ElementBox)>, } fn layout_line( diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index dec34f8898c804c3aa2075e29a61631b34209889..fc0fd3b0dc372f8053e397bfdebb9613e7f019aa 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -1,4 +1,4 @@ -use crate::{DocumentHighlight, Location, Project, ProjectTransaction}; +use crate::{DocumentHighlight, Location, Project, ProjectTransaction, Hover}; use anyhow::{anyhow, Result}; use async_trait::async_trait; use client::{proto, PeerId}; @@ -801,8 +801,7 @@ impl LspCommand for GetDocumentHighlights { #[async_trait(?Send)] impl LspCommand for GetHover { - // TODO: proper response type - type Response = Option; + type Response = Option; type LspRequest = lsp::request::HoverRequest; type ProtoRequest = proto::GetHover; @@ -823,20 +822,26 @@ impl LspCommand for GetHover { message: Option, project: ModelHandle, buffer: ModelHandle, - cx: AsyncAppContext, + mut cx: AsyncAppContext, ) -> Result { - // let (lsp_adapter, language_server) = project - // .read_with(&cx, |project, cx| { - // project - // .language_server_for_buffer(buffer.read(cx), cx) - // .cloned() - // }) - // .ok_or_else(|| anyhow!("no language server found for buffer"))?; - - // TODO: what here? - Ok(Some( - message.ok_or_else(|| anyhow!("invalid lsp response"))?, - )) + Ok(message.map(|hover| { + let range = hover.range.map(|range| { + cx.read(|cx| { + let buffer = buffer.read(cx); + let token_start = buffer + .clip_point_utf16(point_from_lsp(range.start), Bias::Left); + let token_end = buffer + .clip_point_utf16(point_from_lsp(range.end), Bias::Left); + buffer.anchor_after(token_start).. + buffer.anchor_before(token_end) + }) + }); + + Hover { + contents: hover.contents, + range + } + })) } fn to_proto(&self, project_id: u64, buffer: &Buffer) -> Self::ProtoRequest { diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index e7d145b1847d10d96e776c8fe4ba40669e692984..07157c65f7449b094cac9a23293e544be8bbb038 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -216,6 +216,12 @@ pub struct Symbol { pub signature: [u8; 32], } +#[derive(Debug)] +pub struct Hover { + pub contents: lsp::HoverContents, + pub range: Option>, +} + #[derive(Default)] pub struct ProjectTransaction(pub HashMap, language::Transaction>); @@ -2890,7 +2896,7 @@ impl Project { buffer: &ModelHandle, position: T, cx: &mut ModelContext, - ) -> Task>> { + ) -> Task>> { // TODO: proper return type let position = position.to_point_utf16(buffer.read(cx)); self.request_lsp(buffer.clone(), GetHover { position }, cx) diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index f46942392136c8115cfd5666f5f0cc871d1f0e02..92bc9dfc8edb31021cbca5d0ecb9392dada578d7 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -444,6 +444,7 @@ pub struct Editor { pub autocomplete: AutocompleteStyle, pub code_actions_indicator: Color, pub unnecessary_code_fade: f32, + pub hover_popover: ContainerStyle, } #[derive(Clone, Deserialize, Default)] @@ -621,4 +622,4 @@ impl<'de> Deserialize<'de> for SyntaxTheme { Ok(result) } -} +} \ No newline at end of file diff --git a/styles/src/styleTree/editor.ts b/styles/src/styleTree/editor.ts index d669e4e73482f1e4fe3d6cdde361c0cac0f53885..14e7f9449fa1b321d88870a34a037cccbaeefbb5 100644 --- a/styles/src/styleTree/editor.ts +++ b/styles/src/styleTree/editor.ts @@ -8,6 +8,7 @@ import { text, TextColor } from "./components"; +import hoverPopover from "./hoverPopover"; export default function editor(theme: Theme) { const autocompleteItem = { @@ -145,6 +146,7 @@ export default function editor(theme: Theme) { invalidHintDiagnostic: diagnostic(theme, "muted"), invalidInformationDiagnostic: diagnostic(theme, "muted"), invalidWarningDiagnostic: diagnostic(theme, "muted"), + hover_popover: hoverPopover(theme), syntax, }; } From d529a1deb46fe58949508a068a4da58db1948646 Mon Sep 17 00:00:00 2001 From: Isaac Clayton Date: Tue, 31 May 2022 17:57:51 +0200 Subject: [PATCH 07/14] Add basic debounce, fix flickering --- crates/editor/src/editor.rs | 122 +++++++++++++++++++++------ crates/editor/src/element.rs | 57 ++++++++----- crates/project/src/lsp_command.rs | 16 ++-- styles/src/styleTree/hoverPopover.ts | 4 +- 4 files changed, 142 insertions(+), 57 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index c5933388f5815e8779b72fdd63f75a7cfbe87e5f..c7bbfca2d7ee639ba3cb22ac2093bea33e6fd478 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -83,10 +83,15 @@ pub struct Select(pub SelectPhase); #[derive(Clone)] pub struct ShowHover(DisplayPoint); +#[derive(Clone)] +pub struct HideHover; + #[derive(Clone)] pub struct Hover { - point: DisplayPoint, - overshoot: DisplayPoint, + point: Option, + // visible: bool, + // TODO(isaac): remove overshoot + // overshoot: DisplayPoint, } #[derive(Clone, Deserialize, PartialEq)] @@ -218,7 +223,7 @@ impl_actions!( ] ); -impl_internal_actions!(editor, [Scroll, Select, Hover, ShowHover, GoToDefinitionAt]); +impl_internal_actions!(editor, [Scroll, Select, Hover, ShowHover, HideHover, GoToDefinitionAt]); enum DocumentHighlightRead {} enum DocumentHighlightWrite {} @@ -307,6 +312,7 @@ pub fn init(cx: &mut MutableAppContext) { cx.add_action(Editor::toggle_code_actions); cx.add_action(Editor::hover); cx.add_action(Editor::show_hover); + cx.add_action(Editor::hide_hover); cx.add_action(Editor::open_excerpts); cx.add_action(Editor::restart_language_server); cx.add_async_action(Editor::confirm_completion); @@ -432,7 +438,7 @@ pub struct Editor { keymap_context_layers: BTreeMap, input_enabled: bool, leader_replica_id: Option, - hover_popover: Option, + hover_popover: (Option, std::time::Instant, std::time::Instant), } pub struct EditorSnapshot { @@ -1047,7 +1053,7 @@ impl Editor { keymap_context_layers: Default::default(), input_enabled: true, leader_replica_id: None, - hover_popover: None, + hover_popover: (None, std::time::Instant::now(), std::time::Instant::now()), }; this.end_selection(cx); @@ -1433,8 +1439,6 @@ impl Editor { } } - self.hover_popover.take(); - if old_cursor_position.to_display_point(&display_map).row() != new_cursor_position.to_display_point(&display_map).row() { @@ -2425,11 +2429,35 @@ impl Editor { } fn hover(&mut self, action: &Hover, cx: &mut ViewContext) { - if action.overshoot.is_zero() { - self.show_hover(&ShowHover(action.point), cx); + // dbg!("hover"); + if let Some(point) = action.point { + self.show_hover(&ShowHover(point), cx); + } else { + self.hide_hover(&HideHover, cx); } } + fn hide_hover(&mut self, _: &HideHover, cx: &mut ViewContext) { + let task = cx.spawn_weak(|this, mut cx| { + async move { + if let Some(this) = this.upgrade(&cx) { + this.update(&mut cx, |this, cx| { + if this.hover_popover.0.is_some() { + // dbg!("hidden"); + this.hover_popover.0 = None; + this.hover_popover.1 = std::time::Instant::now(); + cx.notify(); + } + }); + } + Ok(()) + } + .log_err() + }); + + self.hover_task = Some(task); + } + fn show_hover(&mut self, action: &ShowHover, cx: &mut ViewContext) { if self.pending_rename.is_some() { return; @@ -2441,29 +2469,38 @@ impl Editor { return; }; + // we use the mouse cursor position by default + let mut point = action.0.clone(); + let snapshot = self.snapshot(cx); let (buffer, buffer_position) = if let Some(output) = self .buffer .read(cx) - .text_anchor_for_position(action.0.to_point(&snapshot.display_snapshot), cx) + .text_anchor_for_position(point.to_point(&snapshot.display_snapshot), cx) { output } else { return; }; + let buffer_snapshot = buffer.read(cx).snapshot(); + let hover = project.update(cx, |project, cx| { project.hover(&buffer, buffer_position.clone(), cx) }); - let point = action.0.clone(); - let task = cx.spawn_weak(|this, mut cx| { async move { - // TODO: what to show while language server is loading? - let text: String = match hover.await? { - None => "Language server is warming up...".into(), - Some(hover) => match hover.contents { + // TODO: what to show while LSP is loading? + let mut text = None; + + let hover = match hover.await { + Ok(hover) => hover, + Err(_) => None, + }; + + if let Some(hover) = hover { + text = Some(match hover.contents { lsp::HoverContents::Scalar(marked_string) => match marked_string { lsp::MarkedString::String(string) => string, lsp::MarkedString::LanguageString(string) => string.value, @@ -2473,23 +2510,57 @@ impl Editor { todo!() } lsp::HoverContents::Markup(markup) => markup.value, - }, + }); + + if let Some(range) = hover.range { + let offset_range = range.to_offset(&buffer_snapshot); + if offset_range + .contains(&point.to_offset(&snapshot.display_snapshot, Bias::Left)) + { + point = offset_range + .start + .to_display_point(&snapshot.display_snapshot); + } else { + text = None; + } + } }; - let hover_popover = HoverPopover { - // TODO: fix tooltip to beginning of symbol based on range + let hover_popover = text.map(|text| HoverPopover { point, text, runs: Vec::new(), - }; + }); if let Some(this) = this.upgrade(&cx) { this.update(&mut cx, |this, cx| { - if this.focused { - this.hover_popover = Some(hover_popover); + let item_hovered_recently = + this.hover_popover.1.elapsed() < std::time::Duration::from_millis(200); + if hover_popover.is_none() { + this.hover_popover.1 = std::time::Instant::now(); } - cx.notify(); + let in_grace_period = + this.hover_popover.2.elapsed() < std::time::Duration::from_millis(100); + if hover_popover.is_some() && !item_hovered_recently { + this.hover_popover.2 = std::time::Instant::now(); + } + + let smooth_handoff = + this.hover_popover.0.is_some() && hover_popover.is_some(); + + let visible = this.hover_popover.0.is_some() || hover_popover.is_some(); + + println!( + "grace: {}\nrecently: {}", + in_grace_period, item_hovered_recently + ); + + if (smooth_handoff || !item_hovered_recently || in_grace_period) && visible + { + this.hover_popover.0 = hover_popover; + cx.notify(); + } }); } Ok::<_, anyhow::Error>(()) @@ -2747,7 +2818,10 @@ impl Editor { } pub fn render_hover_popover(&self, style: EditorStyle) -> Option<(DisplayPoint, ElementBox)> { - self.hover_popover.as_ref().map(|hover| hover.render(style)) + self.hover_popover + .0 + .as_ref() + .map(|hover| hover.render(style)) } fn show_context_menu(&mut self, menu: ContextMenu, cx: &mut ViewContext) { diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 9095dbbb7b579960ab0d099858a4fd45279b7a06..fa703841560585aa8de031d4305d6955580b6afc 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -33,7 +33,7 @@ use std::{ cmp::{self, Ordering}, fmt::Write, iter, - ops::Range, + ops::{Not, Range}, }; struct SelectionLayout { @@ -509,25 +509,32 @@ impl EditorElement { } if let Some((position, hover_popover)) = layout.hover.as_mut() { - cx.scene.push_stacking_context(None); + if position.row() >= start_row { + if let Some(cursor_row_layout) = &layout + .line_layouts + .get((position.row() - start_row) as usize) + { + cx.scene.push_stacking_context(None); + + let x = cursor_row_layout.x_for_index(position.column() as usize) - scroll_left; + let y = (position.row() + 1) as f32 * layout.line_height - scroll_top; + let mut popover_origin = content_origin + vec2f(x, y); + let popover_height = hover_popover.size().y(); + + if popover_origin.y() + popover_height > bounds.lower_left().y() { + popover_origin + .set_y(popover_origin.y() - layout.line_height - popover_height); + } - let cursor_row_layout = &layout.line_layouts[(position.row() - start_row) as usize]; - let x = cursor_row_layout.x_for_index(position.column() as usize) - scroll_left; - let y = (position.row() + 1) as f32 * layout.line_height - scroll_top; - let mut popover_origin = content_origin + vec2f(x, y); - let popover_height = hover_popover.size().y(); + hover_popover.paint( + popover_origin, + RectF::from_points(Vector2F::zero(), vec2f(f32::MAX, f32::MAX)), // Let content bleed outside of editor + cx, + ); - if popover_origin.y() + popover_height > bounds.lower_left().y() { - popover_origin.set_y(popover_origin.y() - layout.line_height - popover_height); + cx.scene.pop_stacking_context(); + } } - - hover_popover.paint( - popover_origin, - RectF::from_points(Vector2F::zero(), vec2f(f32::MAX, f32::MAX)), // Let content bleed outside of editor - cx, - ); - - cx.scene.pop_stacking_context(); } cx.scene.pop_layer(); @@ -1291,14 +1298,20 @@ impl Element for EditorElement { } => self.scroll(*position, *delta, *precise, layout, paint, cx), Event::KeyDown { input, .. } => self.key_down(input.as_deref(), cx), Event::MouseMoved { position, .. } => { - if paint.text_bounds.contains_point(*position) { + let point = if paint.text_bounds.contains_point(*position) { let (point, overshoot) = paint.point_for_position(&self.snapshot(cx), layout, *position); - cx.dispatch_action(Hover { point, overshoot }); - true + if overshoot.is_zero() { + Some(point) + } else { + None + } } else { - false - } + None + }; + + cx.dispatch_action(Hover { point }); + true } _ => false, } diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index fc0fd3b0dc372f8053e397bfdebb9613e7f019aa..a779c01d75794a25a12afaf4125bf84fa0142a03 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -1,4 +1,4 @@ -use crate::{DocumentHighlight, Location, Project, ProjectTransaction, Hover}; +use crate::{DocumentHighlight, Hover, Location, Project, ProjectTransaction}; use anyhow::{anyhow, Result}; use async_trait::async_trait; use client::{proto, PeerId}; @@ -828,18 +828,16 @@ impl LspCommand for GetHover { let range = hover.range.map(|range| { cx.read(|cx| { let buffer = buffer.read(cx); - let token_start = buffer - .clip_point_utf16(point_from_lsp(range.start), Bias::Left); - let token_end = buffer - .clip_point_utf16(point_from_lsp(range.end), Bias::Left); - buffer.anchor_after(token_start).. - buffer.anchor_before(token_end) + let token_start = + buffer.clip_point_utf16(point_from_lsp(range.start), Bias::Left); + let token_end = buffer.clip_point_utf16(point_from_lsp(range.end), Bias::Left); + buffer.anchor_after(token_start)..buffer.anchor_before(token_end) }) }); - + Hover { contents: hover.contents, - range + range, } })) } diff --git a/styles/src/styleTree/hoverPopover.ts b/styles/src/styleTree/hoverPopover.ts index 72383abffd1f2afde12e352e6e6f75f401391e78..54b48b49514eb67e557bd1afab19c628ca637711 100644 --- a/styles/src/styleTree/hoverPopover.ts +++ b/styles/src/styleTree/hoverPopover.ts @@ -3,7 +3,7 @@ import { backgroundColor, border, popoverShadow } from "./components"; export default function HoverPopover(theme: Theme) { return { - background: backgroundColor(theme, 500), + background: backgroundColor(theme, "on500"), cornerRadius: 8, padding: { left: 8, @@ -14,7 +14,7 @@ export default function HoverPopover(theme: Theme) { shadow: popoverShadow(theme), border: border(theme, "primary"), margin: { - left: -14, + left: -8, }, } } \ No newline at end of file From 863a3b1886411ef6e86f9ca04a0055a737124ed7 Mon Sep 17 00:00:00 2001 From: Isaac Clayton Date: Tue, 31 May 2022 18:18:52 +0200 Subject: [PATCH 08/14] Clean up impl a bit --- crates/editor/src/editor.rs | 71 ++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index c7bbfca2d7ee639ba3cb22ac2093bea33e6fd478..0cb8cace92369063865688ed08b9c417cd725ede 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -438,7 +438,32 @@ pub struct Editor { keymap_context_layers: BTreeMap, input_enabled: bool, leader_replica_id: Option, - hover_popover: (Option, std::time::Instant, std::time::Instant), + hover_popover: HoverState, +} + +pub struct HoverState { + popover: Option, + last_hover: std::time::Instant, + start_grace: std::time::Instant, +} + +impl HoverState { + /// Takes whether the cursor is currently hovering over a symbol, + /// and returns a tuple containing whether there was a recent hover, + /// and whether the hover is still in the grace period. + pub fn determine_state(&mut self, hovering: bool) -> (bool, bool) { + let recent_hover = self.last_hover.elapsed() < std::time::Duration::from_millis(200); + if !hovering { + self.last_hover = std::time::Instant::now(); + } + + let in_grace = self.start_grace.elapsed() < std::time::Duration::from_millis(100); + if hovering && !recent_hover { + self.start_grace = std::time::Instant::now(); + } + + return (recent_hover, in_grace); + } } pub struct EditorSnapshot { @@ -1053,7 +1078,11 @@ impl Editor { keymap_context_layers: Default::default(), input_enabled: true, leader_replica_id: None, - hover_popover: (None, std::time::Instant::now(), std::time::Instant::now()), + hover_popover: HoverState { + popover: None, + last_hover: std::time::Instant::now(), + start_grace: std::time::Instant::now(), + }, }; this.end_selection(cx); @@ -2442,10 +2471,9 @@ impl Editor { async move { if let Some(this) = this.upgrade(&cx) { this.update(&mut cx, |this, cx| { - if this.hover_popover.0.is_some() { - // dbg!("hidden"); - this.hover_popover.0 = None; - this.hover_popover.1 = std::time::Instant::now(); + let (recent_hover, in_grace) = this.hover_popover.determine_state(false); + if this.hover_popover.popover.is_some() { + this.hover_popover.popover = None; cx.notify(); } }); @@ -2534,31 +2562,16 @@ impl Editor { if let Some(this) = this.upgrade(&cx) { this.update(&mut cx, |this, cx| { - let item_hovered_recently = - this.hover_popover.1.elapsed() < std::time::Duration::from_millis(200); - if hover_popover.is_none() { - this.hover_popover.1 = std::time::Instant::now(); - } - - let in_grace_period = - this.hover_popover.2.elapsed() < std::time::Duration::from_millis(100); - if hover_popover.is_some() && !item_hovered_recently { - this.hover_popover.2 = std::time::Instant::now(); - } + let (recent_hover, in_grace) = + this.hover_popover.determine_state(hover_popover.is_some()); let smooth_handoff = - this.hover_popover.0.is_some() && hover_popover.is_some(); + this.hover_popover.popover.is_some() && hover_popover.is_some(); + let visible = + this.hover_popover.popover.is_some() || hover_popover.is_some(); - let visible = this.hover_popover.0.is_some() || hover_popover.is_some(); - - println!( - "grace: {}\nrecently: {}", - in_grace_period, item_hovered_recently - ); - - if (smooth_handoff || !item_hovered_recently || in_grace_period) && visible - { - this.hover_popover.0 = hover_popover; + if (smooth_handoff || !recent_hover || in_grace) && visible { + this.hover_popover.popover = hover_popover; cx.notify(); } }); @@ -2819,7 +2832,7 @@ impl Editor { pub fn render_hover_popover(&self, style: EditorStyle) -> Option<(DisplayPoint, ElementBox)> { self.hover_popover - .0 + .popover .as_ref() .map(|hover| hover.render(style)) } From b014352740e4645e08260990c5896a565bdf108f Mon Sep 17 00:00:00 2001 From: Keith Simmons Date: Tue, 31 May 2022 22:49:47 -0700 Subject: [PATCH 09/14] Syntax highlighting working. Getting started on markdown support --- Cargo.lock | 12 ++++++ crates/editor/src/editor.rs | 67 +++++++++++++++---------------- crates/language/src/language.rs | 2 +- crates/lsp/src/lsp.rs | 4 ++ crates/project/Cargo.toml | 1 + crates/project/src/lsp_command.rs | 48 +++++++++++++++++++--- crates/project/src/project.rs | 14 +++++-- 7 files changed, 103 insertions(+), 45 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 94fa1d847327a1a50a3e569b182022f8ec4fab68..0a4474b1e5f17bb3c311c15da951f73dc3316c61 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3419,6 +3419,7 @@ dependencies = [ "lsp", "parking_lot", "postage", + "pulldown-cmark", "rand 0.8.3", "regex", "rocksdb", @@ -3555,6 +3556,17 @@ dependencies = [ "prost 0.9.0", ] +[[package]] +name = "pulldown-cmark" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34f197a544b0c9ab3ae46c359a7ec9cbbb5c7bf97054266fecb7ead794a181d6" +dependencies = [ + "bitflags", + "memchr", + "unicase", +] + [[package]] name = "quote" version = "1.0.9" diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 0cb8cace92369063865688ed08b9c417cd725ede..a7cfba7813d87ab5b689dd41a9fe8e2e0c889610 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -39,7 +39,7 @@ pub use multi_buffer::{ Anchor, AnchorRangeExt, ExcerptId, MultiBuffer, MultiBufferSnapshot, ToOffset, ToPoint, }; use ordered_float::OrderedFloat; -use project::{Project, ProjectTransaction}; +use project::{HoverContents, Project, ProjectTransaction}; use selections_collection::{resolve_multiple, MutableSelectionsCollection, SelectionsCollection}; use serde::{Deserialize, Serialize}; use settings::Settings; @@ -891,20 +891,28 @@ impl CodeActionsMenu { } } -#[derive(Clone)] struct HoverPopover { pub point: DisplayPoint, - pub text: String, - pub runs: Vec<(Range, HighlightStyle)>, + pub contents: Vec, } impl HoverPopover { fn render(&self, style: EditorStyle) -> (DisplayPoint, ElementBox) { + let contents = self.contents.first().unwrap(); ( self.point, - Text::new(self.text.clone(), style.text.clone()) + Text::new(contents.text.clone(), style.text.clone()) .with_soft_wrap(false) - .with_highlights(self.runs.clone()) + .with_highlights( + contents + .runs + .iter() + .filter_map(|(range, id)| { + id.style(style.theme.syntax.as_ref()) + .map(|style| (range.clone(), style)) + }) + .collect(), + ) .contained() .with_style(style.hover_popover) .boxed(), @@ -2458,7 +2466,6 @@ impl Editor { } fn hover(&mut self, action: &Hover, cx: &mut ViewContext) { - // dbg!("hover"); if let Some(point) = action.point { self.show_hover(&ShowHover(point), cx); } else { @@ -2520,7 +2527,7 @@ impl Editor { let task = cx.spawn_weak(|this, mut cx| { async move { // TODO: what to show while LSP is loading? - let mut text = None; + let mut contents = None; let hover = match hover.await { Ok(hover) => hover, @@ -2528,37 +2535,27 @@ impl Editor { }; if let Some(hover) = hover { - text = Some(match hover.contents { - lsp::HoverContents::Scalar(marked_string) => match marked_string { - lsp::MarkedString::String(string) => string, - lsp::MarkedString::LanguageString(string) => string.value, - }, - lsp::HoverContents::Array(marked_strings) => { - // TODO: what to do? - todo!() - } - lsp::HoverContents::Markup(markup) => markup.value, - }); - - if let Some(range) = hover.range { - let offset_range = range.to_offset(&buffer_snapshot); - if offset_range - .contains(&point.to_offset(&snapshot.display_snapshot, Bias::Left)) - { - point = offset_range - .start - .to_display_point(&snapshot.display_snapshot); - } else { - text = None; + if hover.contents.is_empty() { + contents = None; + } else { + contents = Some(hover.contents); + + if let Some(range) = hover.range { + let offset_range = range.to_offset(&buffer_snapshot); + if offset_range + .contains(&point.to_offset(&snapshot.display_snapshot, Bias::Left)) + { + point = offset_range + .start + .to_display_point(&snapshot.display_snapshot); + } else { + contents = None; + } } } }; - let hover_popover = text.map(|text| HoverPopover { - point, - text, - runs: Vec::new(), - }); + let hover_popover = contents.map(|contents| HoverPopover { point, contents }); if let Some(this) = this.upgrade(&cx) { this.update(&mut cx, |this, cx| { diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index f13088f99750c52f82ace0de7a58210bd1f81f23..fbc8182d30f5c8f483e801093f5db7c70a52c783 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -236,7 +236,7 @@ impl LanguageRegistry { self.languages .read() .iter() - .find(|language| language.name().as_ref() == name) + .find(|language| language.name().to_lowercase() == name.to_lowercase()) .cloned() } diff --git a/crates/lsp/src/lsp.rs b/crates/lsp/src/lsp.rs index d5af202516c4134d02213bcb7841422edcaa1606..d22a59e48f60a26954de684113433637c2e59750 100644 --- a/crates/lsp/src/lsp.rs +++ b/crates/lsp/src/lsp.rs @@ -296,6 +296,10 @@ impl LanguageServer { prepare_support: Some(true), ..Default::default() }), + hover: Some(HoverClientCapabilities { + content_format: Some(vec![MarkupKind::Markdown]), + ..Default::default() + }), ..Default::default() }), experimental: Some(json!({ diff --git a/crates/project/Cargo.toml b/crates/project/Cargo.toml index 1fb989ee9c401fa618b9664964deeedc8d0122d3..04597c0a3af1c6f4cedd3bdce92ba75eaf057475 100644 --- a/crates/project/Cargo.toml +++ b/crates/project/Cargo.toml @@ -38,6 +38,7 @@ libc = "0.2" log = { version = "0.4.16", features = ["kv_unstable_serde"] } parking_lot = "0.11.1" postage = { version = "0.4.1", features = ["futures-traits"] } +pulldown-cmark = { version = "0.9.1", default-features = false } rand = "0.8.3" regex = "1.5" serde = { version = "1.0", features = ["derive", "rc"] } diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index a779c01d75794a25a12afaf4125bf84fa0142a03..4fefc80c28fe8bc26929cc0df563638a6429b96e 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -1,4 +1,4 @@ -use crate::{DocumentHighlight, Hover, Location, Project, ProjectTransaction}; +use crate::{DocumentHighlight, Hover, HoverContents, Location, Project, ProjectTransaction}; use anyhow::{anyhow, Result}; use async_trait::async_trait; use client::{proto, PeerId}; @@ -835,10 +835,48 @@ impl LspCommand for GetHover { }) }); - Hover { - contents: hover.contents, - range, + fn highlight(lsp_marked_string: lsp::MarkedString, project: &Project) -> HoverContents { + match lsp_marked_string { + lsp::MarkedString::LanguageString(lsp::LanguageString { language, value }) => { + if let Some(language) = project.languages().get_language(&language) { + let runs = + language.highlight_text(&value.as_str().into(), 0..value.len()); + HoverContents { text: value, runs } + } else { + HoverContents { + text: value, + runs: Vec::new(), + } + } + } + lsp::MarkedString::String(text) => HoverContents { + text, + runs: Vec::new(), + }, + } } + + let contents = cx.read(|cx| { + let project = project.read(cx); + match dbg!(hover.contents) { + lsp::HoverContents::Scalar(marked_string) => { + vec![highlight(marked_string, project)] + } + lsp::HoverContents::Array(marked_strings) => marked_strings + .into_iter() + .map(|marked_string| highlight(marked_string, project)) + .collect(), + lsp::HoverContents::Markup(markup_content) => { + // TODO: handle markdown + vec![HoverContents { + text: markup_content.value, + runs: Vec::new(), + }] + } + } + }); + + Hover { contents, range } })) } @@ -855,7 +893,7 @@ impl LspCommand for GetHover { async fn from_proto( message: Self::ProtoRequest, - project: ModelHandle, + _: ModelHandle, buffer: ModelHandle, mut cx: AsyncAppContext, ) -> Result { diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 07157c65f7449b094cac9a23293e544be8bbb038..12f4e0a06f68eb5282c33d8553854677edb5fe15 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -19,9 +19,9 @@ use language::{ point_to_lsp, proto::{deserialize_anchor, deserialize_version, serialize_anchor, serialize_version}, range_from_lsp, range_to_lsp, Anchor, Bias, Buffer, CodeAction, CodeLabel, Completion, - Diagnostic, DiagnosticEntry, DiagnosticSet, Event as BufferEvent, File as _, Language, - LanguageRegistry, LanguageServerName, LocalFile, LspAdapter, OffsetRangeExt, Operation, Patch, - PointUtf16, TextBufferSnapshot, ToOffset, ToPointUtf16, Transaction, + Diagnostic, DiagnosticEntry, DiagnosticSet, Event as BufferEvent, File as _, HighlightId, + Language, LanguageRegistry, LanguageServerName, LocalFile, LspAdapter, OffsetRangeExt, + Operation, Patch, PointUtf16, TextBufferSnapshot, ToOffset, ToPointUtf16, Transaction, }; use lsp::{DiagnosticSeverity, DiagnosticTag, DocumentHighlightKind, LanguageServer}; use lsp_command::*; @@ -216,9 +216,15 @@ pub struct Symbol { pub signature: [u8; 32], } +#[derive(Debug)] +pub struct HoverContents { + pub text: String, + pub runs: Vec<(Range, HighlightId)>, +} + #[derive(Debug)] pub struct Hover { - pub contents: lsp::HoverContents, + pub contents: Vec, pub range: Option>, } From efd798f5f6727dc8aadbf0306872fc02d112c596 Mon Sep 17 00:00:00 2001 From: Isaac Clayton Date: Wed, 1 Jun 2022 08:57:32 +0200 Subject: [PATCH 10/14] Quick documentation pass --- crates/editor/src/editor.rs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index a7cfba7813d87ab5b689dd41a9fe8e2e0c889610..45177a196ef81fd32a4ae434a6f185a104f02b49 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -441,6 +441,8 @@ pub struct Editor { hover_popover: HoverState, } +/// Keeps track of the state of the [`HoverPopover`]. +/// Times out the initial delay and the grace period. pub struct HoverState { popover: Option, last_hover: std::time::Instant, @@ -452,6 +454,8 @@ impl HoverState { /// and returns a tuple containing whether there was a recent hover, /// and whether the hover is still in the grace period. pub fn determine_state(&mut self, hovering: bool) -> (bool, bool) { + // NOTE: 200ms and 100ms are sane defaults, but it might be + // nice to make these values configurable. let recent_hover = self.last_hover.elapsed() < std::time::Duration::from_millis(200); if !hovering { self.last_hover = std::time::Instant::now(); @@ -2465,6 +2469,8 @@ impl Editor { })) } + /// The hover action dispatches between `show_hover` or `hide_hover` + /// depending on whether a point to hover over is provided. fn hover(&mut self, action: &Hover, cx: &mut ViewContext) { if let Some(point) = action.point { self.show_hover(&ShowHover(point), cx); @@ -2473,12 +2479,17 @@ impl Editor { } } + /// Hides the type information popup ASAP. + /// Triggered by the `Hover` action when the cursor is not over a symbol. fn hide_hover(&mut self, _: &HideHover, cx: &mut ViewContext) { let task = cx.spawn_weak(|this, mut cx| { async move { if let Some(this) = this.upgrade(&cx) { this.update(&mut cx, |this, cx| { - let (recent_hover, in_grace) = this.hover_popover.determine_state(false); + // consistently keep track of state to make handoff smooth + let (_recent_hover, _in_grace) = this.hover_popover.determine_state(false); + + // only notify the context once if this.hover_popover.popover.is_some() { this.hover_popover.popover = None; cx.notify(); @@ -2493,6 +2504,9 @@ impl Editor { self.hover_task = Some(task); } + /// Queries the LSP and shows type info and documentation + /// about the symbol the mouse is currently hovering over. + /// Triggered by the `Hover` action when the cursor may be over a symbol. fn show_hover(&mut self, action: &ShowHover, cx: &mut ViewContext) { if self.pending_rename.is_some() { return; @@ -2520,6 +2534,7 @@ impl Editor { let buffer_snapshot = buffer.read(cx).snapshot(); + // query the LSP for hover info let hover = project.update(cx, |project, cx| { project.hover(&buffer, buffer_position.clone(), cx) }); @@ -2534,6 +2549,7 @@ impl Editor { Err(_) => None, }; + // determine the contents of the popover if let Some(hover) = hover { if hover.contents.is_empty() { contents = None; @@ -2559,14 +2575,22 @@ impl Editor { if let Some(this) = this.upgrade(&cx) { this.update(&mut cx, |this, cx| { + // this was trickier than expected, trying to do a couple things: + // + // 1. if you hover over a symbol, there should be a slight delay + // before the popover shows + // 2. if you move to another symbol when the popover is showing, + // the popover should switch right away, and you should + // not have to wait for it to come up again let (recent_hover, in_grace) = this.hover_popover.determine_state(hover_popover.is_some()); - let smooth_handoff = this.hover_popover.popover.is_some() && hover_popover.is_some(); let visible = this.hover_popover.popover.is_some() || hover_popover.is_some(); + // `smooth_handoff` and `in_grace` determine whether to switch right away. + // `recent_hover` will activate the handoff after the initial delay. if (smooth_handoff || !recent_hover || in_grace) && visible { this.hover_popover.popover = hover_popover; cx.notify(); From c7cc07aafb8af32f5916c21b438069f37b4191a1 Mon Sep 17 00:00:00 2001 From: Keith Simmons Date: Wed, 1 Jun 2022 23:05:31 -0700 Subject: [PATCH 11/14] working markdown rendering --- crates/editor/src/editor.rs | 52 +++++------- crates/editor/src/element.rs | 12 +-- crates/project/src/lsp_command.rs | 131 +++++++++++++++++++++++------- 3 files changed, 125 insertions(+), 70 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 45177a196ef81fd32a4ae434a6f185a104f02b49..12c62d54898067785b69c457ae76f2441ec8da38 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -25,7 +25,7 @@ use gpui::{ geometry::vector::{vec2f, Vector2F}, impl_actions, impl_internal_actions, platform::CursorStyle, - text_layout, AppContext, AsyncAppContext, ClipboardItem, Element, ElementBox, Entity, + text_layout, AppContext, AsyncAppContext, Axis, ClipboardItem, Element, ElementBox, Entity, ModelHandle, MutableAppContext, RenderContext, Task, View, ViewContext, ViewHandle, WeakViewHandle, }; @@ -80,18 +80,9 @@ pub struct Scroll(pub Vector2F); #[derive(Clone, PartialEq)] pub struct Select(pub SelectPhase); -#[derive(Clone)] -pub struct ShowHover(DisplayPoint); - -#[derive(Clone)] -pub struct HideHover; - #[derive(Clone)] pub struct Hover { point: Option, - // visible: bool, - // TODO(isaac): remove overshoot - // overshoot: DisplayPoint, } #[derive(Clone, Deserialize, PartialEq)] @@ -223,7 +214,7 @@ impl_actions!( ] ); -impl_internal_actions!(editor, [Scroll, Select, Hover, ShowHover, HideHover, GoToDefinitionAt]); +impl_internal_actions!(editor, [Scroll, Select, Hover, GoToDefinitionAt]); enum DocumentHighlightRead {} enum DocumentHighlightWrite {} @@ -311,8 +302,6 @@ pub fn init(cx: &mut MutableAppContext) { cx.add_action(Editor::show_completions); cx.add_action(Editor::toggle_code_actions); cx.add_action(Editor::hover); - cx.add_action(Editor::show_hover); - cx.add_action(Editor::hide_hover); cx.add_action(Editor::open_excerpts); cx.add_action(Editor::restart_language_server); cx.add_async_action(Editor::confirm_completion); @@ -454,14 +443,14 @@ impl HoverState { /// and returns a tuple containing whether there was a recent hover, /// and whether the hover is still in the grace period. pub fn determine_state(&mut self, hovering: bool) -> (bool, bool) { - // NOTE: 200ms and 100ms are sane defaults, but it might be + // NOTE: We use some sane defaults, but it might be // nice to make these values configurable. - let recent_hover = self.last_hover.elapsed() < std::time::Duration::from_millis(200); + let recent_hover = self.last_hover.elapsed() < std::time::Duration::from_millis(500); if !hovering { self.last_hover = std::time::Instant::now(); } - let in_grace = self.start_grace.elapsed() < std::time::Duration::from_millis(100); + let in_grace = self.start_grace.elapsed() < std::time::Duration::from_millis(250); if hovering && !recent_hover { self.start_grace = std::time::Instant::now(); } @@ -902,13 +891,12 @@ struct HoverPopover { impl HoverPopover { fn render(&self, style: EditorStyle) -> (DisplayPoint, ElementBox) { - let contents = self.contents.first().unwrap(); - ( - self.point, - Text::new(contents.text.clone(), style.text.clone()) - .with_soft_wrap(false) + let mut flex = Flex::new(Axis::Vertical); + flex.extend(self.contents.iter().map(|content| { + Text::new(content.text.clone(), style.text.clone()) + .with_soft_wrap(true) .with_highlights( - contents + content .runs .iter() .filter_map(|(range, id)| { @@ -917,9 +905,11 @@ impl HoverPopover { }) .collect(), ) - .contained() - .with_style(style.hover_popover) - .boxed(), + .boxed() + })); + ( + self.point, + flex.contained().with_style(style.hover_popover).boxed(), ) } } @@ -2473,15 +2463,15 @@ impl Editor { /// depending on whether a point to hover over is provided. fn hover(&mut self, action: &Hover, cx: &mut ViewContext) { if let Some(point) = action.point { - self.show_hover(&ShowHover(point), cx); + self.show_hover(point, cx); } else { - self.hide_hover(&HideHover, cx); + self.hide_hover(cx); } } /// Hides the type information popup ASAP. /// Triggered by the `Hover` action when the cursor is not over a symbol. - fn hide_hover(&mut self, _: &HideHover, cx: &mut ViewContext) { + fn hide_hover(&mut self, cx: &mut ViewContext) { let task = cx.spawn_weak(|this, mut cx| { async move { if let Some(this) = this.upgrade(&cx) { @@ -2507,7 +2497,7 @@ impl Editor { /// Queries the LSP and shows type info and documentation /// about the symbol the mouse is currently hovering over. /// Triggered by the `Hover` action when the cursor may be over a symbol. - fn show_hover(&mut self, action: &ShowHover, cx: &mut ViewContext) { + fn show_hover(&mut self, mut point: DisplayPoint, cx: &mut ViewContext) { if self.pending_rename.is_some() { return; } @@ -2518,9 +2508,6 @@ impl Editor { return; }; - // we use the mouse cursor position by default - let mut point = action.0.clone(); - let snapshot = self.snapshot(cx); let (buffer, buffer_position) = if let Some(output) = self .buffer @@ -2541,7 +2528,6 @@ impl Editor { let task = cx.spawn_weak(|this, mut cx| { async move { - // TODO: what to show while LSP is loading? let mut contents = None; let hover = match hover.await { diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index fa703841560585aa8de031d4305d6955580b6afc..85e4e3ccaafba5b3a6642afb60b2f5dcb7079af0 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -33,7 +33,7 @@ use std::{ cmp::{self, Ordering}, fmt::Write, iter, - ops::{Not, Range}, + ops::Range, }; struct SelectionLayout { @@ -1118,8 +1118,8 @@ impl Element for EditorElement { .head() .to_display_point(&snapshot); + let style = view.style(cx); if (start_row..end_row).contains(&newest_selection_head.row()) { - let style = view.style(cx); if view.context_menu_visible() { context_menu = view.render_context_menu(newest_selection_head, style.clone()); } @@ -1127,9 +1127,9 @@ impl Element for EditorElement { code_actions_indicator = view .render_code_actions_indicator(&style, cx) .map(|indicator| (newest_selection_head.row(), indicator)); - - hover = view.render_hover_popover(style); } + + hover = view.render_hover_popover(style); }); if let Some((_, context_menu)) = context_menu.as_mut() { @@ -1157,8 +1157,8 @@ impl Element for EditorElement { SizeConstraint { min: Vector2F::zero(), max: vec2f( - f32::INFINITY, - (12. * line_height).min((size.y() - line_height) / 2.), + (120. * em_width).min(size.x()), + (size.y() - line_height) * 3. / 2., ), }, cx, diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index 4fefc80c28fe8bc26929cc0df563638a6429b96e..10c2983bae891b9baddbfab9ff3744aaecc4d38b 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -8,7 +8,8 @@ use language::{ proto::{deserialize_anchor, deserialize_version, serialize_anchor, serialize_version}, range_from_lsp, Anchor, Bias, Buffer, PointUtf16, ToPointUtf16, }; -use lsp::{DocumentHighlightKind, ServerCapabilities}; +use lsp::{DocumentHighlightKind, LanguageString, MarkedString, ServerCapabilities}; +use pulldown_cmark::{CodeBlockKind, Event, Options, Parser, Tag}; use std::{cmp::Reverse, ops::Range, path::Path}; #[async_trait(?Send)] @@ -805,7 +806,7 @@ impl LspCommand for GetHover { type LspRequest = lsp::request::HoverRequest; type ProtoRequest = proto::GetHover; - fn to_lsp(&self, path: &Path, cx: &AppContext) -> lsp::HoverParams { + fn to_lsp(&self, path: &Path, _: &AppContext) -> lsp::HoverParams { lsp::HoverParams { text_document_position_params: lsp::TextDocumentPositionParams { text_document: lsp::TextDocumentIdentifier { @@ -824,7 +825,7 @@ impl LspCommand for GetHover { buffer: ModelHandle, mut cx: AsyncAppContext, ) -> Result { - Ok(message.map(|hover| { + Ok(message.and_then(|hover| { let range = hover.range.map(|range| { cx.read(|cx| { let buffer = buffer.read(cx); @@ -835,48 +836,116 @@ impl LspCommand for GetHover { }) }); - fn highlight(lsp_marked_string: lsp::MarkedString, project: &Project) -> HoverContents { - match lsp_marked_string { - lsp::MarkedString::LanguageString(lsp::LanguageString { language, value }) => { - if let Some(language) = project.languages().get_language(&language) { - let runs = - language.highlight_text(&value.as_str().into(), 0..value.len()); - HoverContents { text: value, runs } - } else { - HoverContents { - text: value, - runs: Vec::new(), - } - } + fn text_and_language(marked_string: MarkedString) -> (String, Option) { + match marked_string { + MarkedString::LanguageString(LanguageString { language, value }) => { + (value, Some(language)) } - lsp::MarkedString::String(text) => HoverContents { - text, + MarkedString::String(text) => (text, None), + } + } + + fn highlight( + text: String, + language: Option, + project: &Project, + ) -> Option { + let text = text.trim(); + if text.is_empty() { + return None; + } + + if let Some(language) = + language.and_then(|language| project.languages().get_language(&language)) + { + let runs = language.highlight_text(&text.into(), 0..text.len()); + Some(HoverContents { + text: text.to_string(), + runs, + }) + } else { + Some(HoverContents { + text: text.to_string(), runs: Vec::new(), - }, + }) } } let contents = cx.read(|cx| { let project = project.read(cx); - match dbg!(hover.contents) { + match hover.contents { lsp::HoverContents::Scalar(marked_string) => { - vec![highlight(marked_string, project)] + let (text, language) = text_and_language(marked_string); + highlight(text, language, project).map(|content| vec![content]) + } + lsp::HoverContents::Array(marked_strings) => { + let content: Vec = marked_strings + .into_iter() + .filter_map(|marked_string| { + let (text, language) = text_and_language(marked_string); + highlight(text, language, project) + }) + .collect(); + if content.is_empty() { + None + } else { + Some(content) + } } - lsp::HoverContents::Array(marked_strings) => marked_strings - .into_iter() - .map(|marked_string| highlight(marked_string, project)) - .collect(), lsp::HoverContents::Markup(markup_content) => { - // TODO: handle markdown - vec![HoverContents { - text: markup_content.value, - runs: Vec::new(), - }] + let mut contents = Vec::new(); + let mut language = None; + let mut current_text = String::new(); + for event in Parser::new_ext(&markup_content.value, Options::all()) { + match event { + Event::Text(text) | Event::Code(text) => { + current_text.push_str(&text.to_string()); + } + Event::Start(Tag::CodeBlock(CodeBlockKind::Fenced( + new_language, + ))) => { + if let Some(content) = + highlight(current_text.clone(), language, project) + { + contents.push(content); + current_text.clear(); + } + + language = if new_language.is_empty() { + None + } else { + Some(new_language.to_string()) + }; + } + Event::End(Tag::CodeBlock(_)) => { + if let Some(content) = + highlight(current_text.clone(), language.clone(), project) + { + contents.push(content); + current_text.clear(); + language = None; + } + } + _ => {} + } + } + + if let Some(content) = + highlight(current_text.clone(), language.clone(), project) + { + contents.push(content); + } + + if contents.is_empty() { + None + } else { + Some(contents) + } } } }); - Hover { contents, range } + contents.map(|contents| Hover { contents, range }) })) } From 67d9abc00f221bd93f2e987ee7744d2dff281f0c Mon Sep 17 00:00:00 2001 From: Keith Simmons Date: Fri, 3 Jun 2022 14:56:21 -0700 Subject: [PATCH 12/14] Move highlighting to editor code and implement proto message types for hover response --- crates/editor/src/editor.rs | 123 ++++++++++----- crates/editor/src/element.rs | 21 ++- crates/project/src/lsp_command.rs | 227 ++++++++++++++------------- crates/project/src/project.rs | 37 ++++- crates/rpc/proto/zed.proto | 10 +- crates/theme/src/theme.rs | 11 +- styles/src/styleTree/hoverPopover.ts | 30 ++-- 7 files changed, 277 insertions(+), 182 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 12c62d54898067785b69c457ae76f2441ec8da38..cb7257d12c82cd730d4e8bf2f638d6307f382e36 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -39,7 +39,7 @@ pub use multi_buffer::{ Anchor, AnchorRangeExt, ExcerptId, MultiBuffer, MultiBufferSnapshot, ToOffset, ToPoint, }; use ordered_float::OrderedFloat; -use project::{HoverContents, Project, ProjectTransaction}; +use project::{HoverBlock, Project, ProjectTransaction}; use selections_collection::{resolve_multiple, MutableSelectionsCollection, SelectionsCollection}; use serde::{Deserialize, Serialize}; use settings::Settings; @@ -427,7 +427,7 @@ pub struct Editor { keymap_context_layers: BTreeMap, input_enabled: bool, leader_replica_id: Option, - hover_popover: HoverState, + hover_state: HoverState, } /// Keeps track of the state of the [`HoverPopover`]. @@ -457,6 +457,10 @@ impl HoverState { return (recent_hover, in_grace); } + + pub fn close(&mut self) { + self.popover.take(); + } } pub struct EditorSnapshot { @@ -885,31 +889,46 @@ impl CodeActionsMenu { } struct HoverPopover { - pub point: DisplayPoint, - pub contents: Vec, + pub range: Range, + pub contents: Vec, } impl HoverPopover { - fn render(&self, style: EditorStyle) -> (DisplayPoint, ElementBox) { + fn render(&self, style: EditorStyle, project: &Project) -> (DisplayPoint, ElementBox) { let mut flex = Flex::new(Axis::Vertical); flex.extend(self.contents.iter().map(|content| { - Text::new(content.text.clone(), style.text.clone()) - .with_soft_wrap(true) - .with_highlights( - content - .runs - .iter() - .filter_map(|(range, id)| { - id.style(style.theme.syntax.as_ref()) - .map(|style| (range.clone(), style)) - }) - .collect(), - ) - .boxed() + if let Some(language) = content + .language + .clone() + .and_then(|language| project.languages().get_language(&language)) + { + let runs = + language.highlight_text(&content.text.as_str().into(), 0..content.text.len()); + + Text::new(content.text.clone(), style.text.clone()) + .with_soft_wrap(true) + .with_highlights( + runs.iter() + .filter_map(|(range, id)| { + id.style(style.theme.syntax.as_ref()) + .map(|style| (range.clone(), style)) + }) + .collect(), + ) + .boxed() + } else { + Text::new(content.text.clone(), style.hover_popover.prose.clone()) + .with_soft_wrap(true) + .contained() + .with_style(style.hover_popover.block_style) + .boxed() + } })); ( - self.point, - flex.contained().with_style(style.hover_popover).boxed(), + self.range.start, + flex.contained() + .with_style(style.hover_popover.container) + .boxed(), ) } } @@ -1080,7 +1099,7 @@ impl Editor { keymap_context_layers: Default::default(), input_enabled: true, leader_replica_id: None, - hover_popover: HoverState { + hover_state: HoverState { popover: None, last_hover: std::time::Instant::now(), start_grace: std::time::Instant::now(), @@ -1470,6 +1489,8 @@ impl Editor { } } + self.hover_state.close(); + if old_cursor_position.to_display_point(&display_map).row() != new_cursor_position.to_display_point(&display_map).row() { @@ -2477,11 +2498,11 @@ impl Editor { if let Some(this) = this.upgrade(&cx) { this.update(&mut cx, |this, cx| { // consistently keep track of state to make handoff smooth - let (_recent_hover, _in_grace) = this.hover_popover.determine_state(false); + let (_recent_hover, _in_grace) = this.hover_state.determine_state(false); // only notify the context once - if this.hover_popover.popover.is_some() { - this.hover_popover.popover = None; + if this.hover_state.popover.is_some() { + this.hover_state.popover = None; cx.notify(); } }); @@ -2497,17 +2518,11 @@ impl Editor { /// Queries the LSP and shows type info and documentation /// about the symbol the mouse is currently hovering over. /// Triggered by the `Hover` action when the cursor may be over a symbol. - fn show_hover(&mut self, mut point: DisplayPoint, cx: &mut ViewContext) { + fn show_hover(&mut self, point: DisplayPoint, cx: &mut ViewContext) { if self.pending_rename.is_some() { return; } - let project = if let Some(project) = self.project.clone() { - project - } else { - return; - }; - let snapshot = self.snapshot(cx); let (buffer, buffer_position) = if let Some(output) = self .buffer @@ -2521,6 +2536,19 @@ impl Editor { let buffer_snapshot = buffer.read(cx).snapshot(); + if let Some(existing_popover) = &self.hover_state.popover { + if existing_popover.range.contains(&point) { + // Hover already contains value. No need to request a new one + return; + } + } + + let project = if let Some(project) = self.project.clone() { + project + } else { + return; + }; + // query the LSP for hover info let hover = project.update(cx, |project, cx| { project.hover(&buffer, buffer_position.clone(), cx) @@ -2535,6 +2563,8 @@ impl Editor { Err(_) => None, }; + let mut symbol_range = point..point; + // determine the contents of the popover if let Some(hover) = hover { if hover.contents.is_empty() { @@ -2547,9 +2577,12 @@ impl Editor { if offset_range .contains(&point.to_offset(&snapshot.display_snapshot, Bias::Left)) { - point = offset_range + symbol_range = offset_range .start - .to_display_point(&snapshot.display_snapshot); + .to_display_point(&snapshot.display_snapshot) + ..offset_range + .end + .to_display_point(&snapshot.display_snapshot); } else { contents = None; } @@ -2557,7 +2590,10 @@ impl Editor { } }; - let hover_popover = contents.map(|contents| HoverPopover { point, contents }); + let hover_popover = contents.map(|contents| HoverPopover { + range: symbol_range, + contents, + }); if let Some(this) = this.upgrade(&cx) { this.update(&mut cx, |this, cx| { @@ -2569,16 +2605,15 @@ impl Editor { // the popover should switch right away, and you should // not have to wait for it to come up again let (recent_hover, in_grace) = - this.hover_popover.determine_state(hover_popover.is_some()); + this.hover_state.determine_state(hover_popover.is_some()); let smooth_handoff = - this.hover_popover.popover.is_some() && hover_popover.is_some(); - let visible = - this.hover_popover.popover.is_some() || hover_popover.is_some(); + this.hover_state.popover.is_some() && hover_popover.is_some(); + let visible = this.hover_state.popover.is_some() || hover_popover.is_some(); // `smooth_handoff` and `in_grace` determine whether to switch right away. // `recent_hover` will activate the handoff after the initial delay. if (smooth_handoff || !recent_hover || in_grace) && visible { - this.hover_popover.popover = hover_popover; + this.hover_state.popover = hover_popover; cx.notify(); } }); @@ -2837,11 +2872,15 @@ impl Editor { .map(|menu| menu.render(cursor_position, style)) } - pub fn render_hover_popover(&self, style: EditorStyle) -> Option<(DisplayPoint, ElementBox)> { - self.hover_popover + pub fn render_hover_popover( + &self, + style: EditorStyle, + project: &Project, + ) -> Option<(DisplayPoint, ElementBox)> { + self.hover_state .popover .as_ref() - .map(|hover| hover.render(style)) + .map(|hover| hover.render(style, project)) } fn show_context_menu(&mut self, menu: ContextMenu, cx: &mut ViewContext) { diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 85e4e3ccaafba5b3a6642afb60b2f5dcb7079af0..aa109783b2226e5ccd10bba5dfdebdf1c1e20531 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -495,7 +495,7 @@ impl EditorElement { let mut list_origin = content_origin + vec2f(x, y); let list_height = context_menu.size().y(); - if list_origin.y() + list_height > bounds.lower_left().y() { + if list_origin.y() + list_height > bounds.max_y() { list_origin.set_y(list_origin.y() - layout.line_height - list_height); } @@ -516,14 +516,18 @@ impl EditorElement { { cx.scene.push_stacking_context(None); + let size = hover_popover.size(); let x = cursor_row_layout.x_for_index(position.column() as usize) - scroll_left; - let y = (position.row() + 1) as f32 * layout.line_height - scroll_top; + let y = position.row() as f32 * layout.line_height - scroll_top - size.y(); let mut popover_origin = content_origin + vec2f(x, y); - let popover_height = hover_popover.size().y(); - if popover_origin.y() + popover_height > bounds.lower_left().y() { - popover_origin - .set_y(popover_origin.y() - layout.line_height - popover_height); + if popover_origin.y() < 0.0 { + popover_origin.set_y(popover_origin.y() + layout.line_height + size.y()); + } + + let x_out_of_bounds = bounds.max_x() - (popover_origin.x() + size.x()); + if x_out_of_bounds < 0.0 { + popover_origin.set_x(popover_origin.x() + x_out_of_bounds); } hover_popover.paint( @@ -1129,7 +1133,10 @@ impl Element for EditorElement { .map(|indicator| (newest_selection_head.row(), indicator)); } - hover = view.render_hover_popover(style); + if let Some(project) = view.project.clone() { + let project = project.read(cx); + hover = view.render_hover_popover(style, project); + } }); if let Some((_, context_menu)) = context_menu.as_mut() { diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index 10c2983bae891b9baddbfab9ff3744aaecc4d38b..d04bb6a7df9de03be1dc01a46a7fec0cc752913e 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -1,4 +1,4 @@ -use crate::{DocumentHighlight, Hover, HoverContents, Location, Project, ProjectTransaction}; +use crate::{DocumentHighlight, Hover, HoverBlock, Location, Project, ProjectTransaction}; use anyhow::{anyhow, Result}; use async_trait::async_trait; use client::{proto, PeerId}; @@ -8,7 +8,7 @@ use language::{ proto::{deserialize_anchor, deserialize_version, serialize_anchor, serialize_version}, range_from_lsp, Anchor, Bias, Buffer, PointUtf16, ToPointUtf16, }; -use lsp::{DocumentHighlightKind, LanguageString, MarkedString, ServerCapabilities}; +use lsp::{DocumentHighlightKind, ServerCapabilities}; use pulldown_cmark::{CodeBlockKind, Event, Options, Parser, Tag}; use std::{cmp::Reverse, ops::Range, path::Path}; @@ -821,7 +821,7 @@ impl LspCommand for GetHover { async fn response_from_lsp( self, message: Option, - project: ModelHandle, + _: ModelHandle, buffer: ModelHandle, mut cx: AsyncAppContext, ) -> Result { @@ -836,111 +836,68 @@ impl LspCommand for GetHover { }) }); - fn text_and_language(marked_string: MarkedString) -> (String, Option) { - match marked_string { - MarkedString::LanguageString(LanguageString { language, value }) => { - (value, Some(language)) - } - MarkedString::String(text) => (text, None), - } - } - - fn highlight( - text: String, - language: Option, - project: &Project, - ) -> Option { - let text = text.trim(); - if text.is_empty() { - return None; - } - - if let Some(language) = - language.and_then(|language| project.languages().get_language(&language)) - { - let runs = language.highlight_text(&text.into(), 0..text.len()); - Some(HoverContents { - text: text.to_string(), - runs, - }) - } else { - Some(HoverContents { - text: text.to_string(), - runs: Vec::new(), - }) + let contents = cx.read(|_| match hover.contents { + lsp::HoverContents::Scalar(marked_string) => { + HoverBlock::try_new(marked_string).map(|contents| vec![contents]) } - } - - let contents = cx.read(|cx| { - let project = project.read(cx); - match hover.contents { - lsp::HoverContents::Scalar(marked_string) => { - let (text, language) = text_and_language(marked_string); - highlight(text, language, project).map(|content| vec![content]) - } - lsp::HoverContents::Array(marked_strings) => { - let content: Vec = marked_strings - .into_iter() - .filter_map(|marked_string| { - let (text, language) = text_and_language(marked_string); - highlight(text, language, project) - }) - .collect(); - if content.is_empty() { - None - } else { - Some(content) - } + lsp::HoverContents::Array(marked_strings) => { + let content: Vec = marked_strings + .into_iter() + .filter_map(|marked_string| HoverBlock::try_new(marked_string)) + .collect(); + if content.is_empty() { + None + } else { + Some(content) } - lsp::HoverContents::Markup(markup_content) => { - let mut contents = Vec::new(); - let mut language = None; - let mut current_text = String::new(); - for event in Parser::new_ext(&markup_content.value, Options::all()) { - match event { - Event::Text(text) | Event::Code(text) => { - current_text.push_str(&text.to_string()); - } - Event::Start(Tag::CodeBlock(CodeBlockKind::Fenced( - new_language, - ))) => { - if let Some(content) = - highlight(current_text.clone(), language, project) - { - contents.push(content); - current_text.clear(); - } - - language = if new_language.is_empty() { - None - } else { - Some(new_language.to_string()) - }; + } + lsp::HoverContents::Markup(markup_content) => { + let mut contents = Vec::new(); + let mut language = None; + let mut current_text = String::new(); + for event in Parser::new_ext(&markup_content.value, Options::all()) { + match event { + Event::Text(text) | Event::Code(text) => { + current_text.push_str(&text.to_string()); + } + Event::Start(Tag::CodeBlock(CodeBlockKind::Fenced(new_language))) => { + if !current_text.is_empty() { + let text = std::mem::replace(&mut current_text, String::new()); + contents.push(HoverBlock { text, language }); } - Event::End(Tag::CodeBlock(_)) => { - if let Some(content) = - highlight(current_text.clone(), language.clone(), project) - { - contents.push(content); - current_text.clear(); - language = None; - } + + language = if new_language.is_empty() { + None + } else { + Some(new_language.to_string()) + }; + } + Event::End(Tag::CodeBlock(_)) + | Event::End(Tag::Paragraph) + | Event::End(Tag::Heading(_, _, _)) + | Event::End(Tag::BlockQuote) => { + if !current_text.is_empty() { + let text = std::mem::replace(&mut current_text, String::new()); + contents.push(HoverBlock { text, language }); + current_text.clear(); } - _ => {} + language = None; } + _ => {} } + } - if let Some(content) = - highlight(current_text.clone(), language.clone(), project) - { - contents.push(content); - } + if !current_text.is_empty() { + contents.push(HoverBlock { + text: current_text, + language, + }); + } - if contents.is_empty() { - None - } else { - Some(contents) - } + if contents.is_empty() { + None + } else { + Some(contents) } } }); @@ -982,22 +939,72 @@ impl LspCommand for GetHover { fn response_to_proto( response: Self::Response, - project: &mut Project, - peer_id: PeerId, - buffer_version: &clock::Global, - cx: &AppContext, + _: &mut Project, + _: PeerId, + _: &clock::Global, + _: &AppContext, ) -> proto::GetHoverResponse { - todo!() + if let Some(response) = response { + let (start, end) = if let Some(range) = response.range { + ( + Some(language::proto::serialize_anchor(&range.start)), + Some(language::proto::serialize_anchor(&range.end)), + ) + } else { + (None, None) + }; + + let contents = response + .contents + .into_iter() + .map(|block| proto::HoverBlock { + text: block.text, + language: block.language, + }) + .collect(); + + proto::GetHoverResponse { + start, + end, + contents, + } + } else { + proto::GetHoverResponse { + start: None, + end: None, + contents: Vec::new(), + } + } } async fn response_from_proto( self, - message: ::Response, - project: ModelHandle, - buffer: ModelHandle, - cx: AsyncAppContext, + message: proto::GetHoverResponse, + _: ModelHandle, + _: ModelHandle, + _: AsyncAppContext, ) -> Result { - todo!() + let range = if let (Some(start), Some(end)) = (message.start, message.end) { + language::proto::deserialize_anchor(start) + .and_then(|start| language::proto::deserialize_anchor(end).map(|end| start..end)) + } else { + None + }; + + let contents: Vec<_> = message + .contents + .into_iter() + .map(|block| HoverBlock { + text: block.text, + language: block.language, + }) + .collect(); + + Ok(if contents.is_empty() { + None + } else { + Some(Hover { contents, range }) + }) } fn buffer_id_from_proto(message: &Self::ProtoRequest) -> u64 { diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 12f4e0a06f68eb5282c33d8553854677edb5fe15..e836202bf7a4d22d65e20abf225df19f4e1f8657 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -19,11 +19,14 @@ use language::{ point_to_lsp, proto::{deserialize_anchor, deserialize_version, serialize_anchor, serialize_version}, range_from_lsp, range_to_lsp, Anchor, Bias, Buffer, CodeAction, CodeLabel, Completion, - Diagnostic, DiagnosticEntry, DiagnosticSet, Event as BufferEvent, File as _, HighlightId, - Language, LanguageRegistry, LanguageServerName, LocalFile, LspAdapter, OffsetRangeExt, - Operation, Patch, PointUtf16, TextBufferSnapshot, ToOffset, ToPointUtf16, Transaction, + Diagnostic, DiagnosticEntry, DiagnosticSet, Event as BufferEvent, File as _, Language, + LanguageRegistry, LanguageServerName, LocalFile, LspAdapter, OffsetRangeExt, Operation, Patch, + PointUtf16, TextBufferSnapshot, ToOffset, ToPointUtf16, Transaction, +}; +use lsp::{ + DiagnosticSeverity, DiagnosticTag, DocumentHighlightKind, LanguageServer, LanguageString, + MarkedString, }; -use lsp::{DiagnosticSeverity, DiagnosticTag, DocumentHighlightKind, LanguageServer}; use lsp_command::*; use parking_lot::Mutex; use postage::stream::Stream; @@ -217,14 +220,34 @@ pub struct Symbol { } #[derive(Debug)] -pub struct HoverContents { +pub struct HoverBlock { pub text: String, - pub runs: Vec<(Range, HighlightId)>, + pub language: Option, +} + +impl HoverBlock { + fn try_new(marked_string: MarkedString) -> Option { + let result = match marked_string { + MarkedString::LanguageString(LanguageString { language, value }) => HoverBlock { + text: value, + language: Some(language), + }, + MarkedString::String(text) => HoverBlock { + text, + language: None, + }, + }; + if result.text.is_empty() { + None + } else { + Some(result) + } + } } #[derive(Debug)] pub struct Hover { - pub contents: Vec, + pub contents: Vec, pub range: Option>, } diff --git a/crates/rpc/proto/zed.proto b/crates/rpc/proto/zed.proto index 4b1e4297a5b5381ad778df0257b0dda9f1a54958..dda104208e4a6271aa37107208d50ba0c63f468e 100644 --- a/crates/rpc/proto/zed.proto +++ b/crates/rpc/proto/zed.proto @@ -436,8 +436,14 @@ message GetHover { } message GetHoverResponse { - repeated CodeAction actions = 1; - repeated VectorClockEntry version = 2; + optional Anchor start = 1; + optional Anchor end = 2; + repeated HoverBlock contents = 3; +} + +message HoverBlock { + string text = 1; + optional string language = 2; } message ApplyCodeAction { diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index 92bc9dfc8edb31021cbca5d0ecb9392dada578d7..d5c9beaec3a7349ca1b634cf8dc4bb344849162a 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -444,7 +444,7 @@ pub struct Editor { pub autocomplete: AutocompleteStyle, pub code_actions_indicator: Color, pub unnecessary_code_fade: f32, - pub hover_popover: ContainerStyle, + pub hover_popover: HoverPopover, } #[derive(Clone, Deserialize, Default)] @@ -622,4 +622,11 @@ impl<'de> Deserialize<'de> for SyntaxTheme { Ok(result) } -} \ No newline at end of file +} + +#[derive(Clone, Deserialize, Default)] +pub struct HoverPopover { + pub container: ContainerStyle, + pub block_style: ContainerStyle, + pub prose: TextStyle, +} diff --git a/styles/src/styleTree/hoverPopover.ts b/styles/src/styleTree/hoverPopover.ts index 54b48b49514eb67e557bd1afab19c628ca637711..2bc8c327300e070d43b00c6eaaf51df26dd32411 100644 --- a/styles/src/styleTree/hoverPopover.ts +++ b/styles/src/styleTree/hoverPopover.ts @@ -1,20 +1,26 @@ import Theme from "../themes/common/theme"; -import { backgroundColor, border, popoverShadow } from "./components"; +import { backgroundColor, border, popoverShadow, text } from "./components"; export default function HoverPopover(theme: Theme) { return { - background: backgroundColor(theme, "on500"), - cornerRadius: 8, - padding: { - left: 8, - right: 8, - top: 4, - bottom: 4 + container: { + background: backgroundColor(theme, "on500"), + cornerRadius: 8, + padding: { + left: 8, + right: 8, + top: 4, + bottom: 4 + }, + shadow: popoverShadow(theme), + border: border(theme, "primary"), + margin: { + left: -8, + }, }, - shadow: popoverShadow(theme), - border: border(theme, "primary"), - margin: { - left: -8, + block_style: { + padding: { top: 4 }, }, + prose: text(theme, "sans", "primary", { "size": "sm" }) } } \ No newline at end of file From a6c0ee472cb958298ae2b8c8ca515af6682f613c Mon Sep 17 00:00:00 2001 From: Keith Simmons Date: Tue, 7 Jun 2022 11:47:17 -0700 Subject: [PATCH 13/14] Add vim bindings for hover Allow scrolling in hover popover --- Cargo.lock | 1490 ++++++++++---------- assets/keymaps/vim.json | 1 + crates/editor/src/editor.rs | 283 ++-- crates/editor/src/element.rs | 99 +- crates/editor/src/selections_collection.rs | 8 + crates/gpui/src/elements/flex.rs | 11 + crates/gpui/src/presenter.rs | 144 +- crates/project/src/lsp_command.rs | 1 + crates/project/src/project.rs | 5 +- crates/theme/src/theme.rs | 1 + styles/src/styleTree/hoverPopover.ts | 3 +- 11 files changed, 1049 insertions(+), 997 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0a4474b1e5f17bb3c311c15da951f73dc3316c61..e57fb7462efaf2e0be07960f81d278a9b3761e6c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -25,11 +25,11 @@ checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" [[package]] name = "ahash" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.2", + "getrandom 0.2.6", "once_cell", "version_check", ] @@ -43,15 +43,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "ansi_term" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "ansi_term" version = "0.12.1" @@ -81,9 +72,9 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "arrayvec" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" [[package]] name = "ascii" @@ -124,9 +115,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.3.12" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2bf394cfbbe876f0ac67b13b6ca819f9c9f2fb9ec67223cceb1555fbab1c31a" +checksum = "345fd392ab01f746c717b1357165b76f0b67a60192007b234058c9045fdcf695" dependencies = [ "flate2", "futures-core", @@ -137,16 +128,16 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb877970c7b440ead138f6321a3b5395d6061183af779340b65e20c0fede9146" +checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" dependencies = [ "async-task", "concurrent-queue", "fastrand", "futures-lite", "once_cell", - "vec-arena", + "slab", ] [[package]] @@ -162,42 +153,40 @@ dependencies = [ [[package]] name = "async-io" -version = "1.3.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9315f8f07556761c3e48fec2e6b276004acf426e6dc068b2c2251854d65ee0fd" +checksum = "e5e18f61464ae81cde0a23e713ae8fd299580c54d697a35820cfd0625b8b0e07" dependencies = [ "concurrent-queue", - "fastrand", "futures-lite", "libc", "log", - "nb-connect", "once_cell", "parking", "polling", - "vec-arena", + "slab", + "socket2", "waker-fn", "winapi 0.3.9", ] [[package]] name = "async-lock" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a8ea61bf9947a1007c5cada31e647dbc77b103c679858150003ba697ea798b" +checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6" dependencies = [ "event-listener", ] [[package]] name = "async-net" -version = "1.5.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06de475c85affe184648202401d7622afb32f0f74e02192857d0201a16defbe5" +checksum = "5373304df79b9b4395068fb080369ec7178608827306ce4d081cba51cac551df" dependencies = [ "async-io", "blocking", - "fastrand", "futures-lite", ] @@ -212,15 +201,16 @@ dependencies = [ [[package]] name = "async-process" -version = "1.0.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef37b86e2fa961bae5a4d212708ea0154f904ce31d1a4a7f47e1bbc33a0c040b" +checksum = "cf2c06e30a24e8c78a3987d07f0930edf76ef35e027e7bdb063fccafdad1f60c" dependencies = [ "async-io", "blocking", "cfg-if 1.0.0", "event-listener", "futures-lite", + "libc", "once_cell", "signal-hook", "winapi 0.3.9", @@ -278,9 +268,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.50" +version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722" +checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" dependencies = [ "proc-macro2", "quote", @@ -312,11 +302,11 @@ dependencies = [ [[package]] name = "atomic" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3410529e8288c463bedb5930f82833bc0c90e5d2fe639a56582a4d09220b281" +checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", ] [[package]] @@ -357,21 +347,24 @@ dependencies = [ [[package]] name = "autocfg" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" +checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" +dependencies = [ + "autocfg 1.1.0", +] [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4af7447fc1214c1f3a1ace861d0216a6c8bb13965b64bbad9650f375b67689a" +checksum = "ab2504b827a8bef941ba3dd64bdffe9cf56ca182908a147edd6189c95fbcae7d" dependencies = [ "async-trait", "axum-core", @@ -383,7 +376,7 @@ dependencies = [ "http", "http-body", "hyper", - "itoa 1.0.1", + "itoa", "matchit", "memchr", "mime", @@ -404,9 +397,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bdc19781b16e32f8a7200368a336fa4509d4b72ef15dd4e41df5290855ee1e6" +checksum = "da31c0ed7b4690e2c78fe4b880d21cd7db04a346ebc658b4270251b695437f17" dependencies = [ "async-trait", "bytes", @@ -437,24 +430,24 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e121dee8023ce33ab248d9ce1493df03c3b38a659b240096fcbd7048ff9c31f" +checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" dependencies = [ "addr2line", "cc", "cfg-if 1.0.0", "libc", - "miniz_oxide 0.4.4", + "miniz_oxide 0.5.3", "object", "rustc-demangle", ] [[package]] name = "base-x" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" +checksum = "dc19a4937b4fbd3fe3379793130e42060d10627a360f2127802b10b87e7baf74" [[package]] name = "base64" @@ -470,9 +463,9 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "base64ct" -version = "1.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d27fb6b6f1e43147af148af49d49329413ba781aa0d5e10979831c210173b5" +checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" [[package]] name = "bincode" @@ -492,7 +485,7 @@ dependencies = [ "bitflags", "cexpr", "clang-sys", - "clap 2.33.3", + "clap 2.34.0", "env_logger", "lazy_static", "lazycell", @@ -512,18 +505,6 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "bitvec" -version = "0.19.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8942c8d352ae1838c9dda0b0ca2ab657696ef2232a20147cf1b30ae1a9cb4321" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - [[package]] name = "block" version = "0.1.6" @@ -550,9 +531,9 @@ dependencies = [ [[package]] name = "blocking" -version = "1.0.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e170dbede1f740736619b776d7251cb1b9095c435c34d8ca9f57fcd2f335e9" +checksum = "c6ccb65d468978a086b69884437ded69a90faab3bbe6e67f242173ea728acccc" dependencies = [ "async-channel", "async-task", @@ -579,36 +560,30 @@ dependencies = [ [[package]] name = "bstr" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40b47ad93e1a5404e6c18dec46b628214fee441c70f4ab5d6942142cc268a3d" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ "memchr", ] -[[package]] -name = "build_const" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" - [[package]] name = "bumpalo" -version = "3.7.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" [[package]] name = "bytemuck" -version = "1.5.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bed57e2090563b83ba8f83366628ce535a7584c9afa4c9fc0612a03925c6df58" +checksum = "cdead85bdec19c194affaeeb670c0e41fe23de31459efd1c174d049269cf02cc" [[package]] name = "byteorder" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" @@ -629,9 +604,9 @@ dependencies = [ [[package]] name = "cache-padded" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" +checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" [[package]] name = "castaway" @@ -641,9 +616,9 @@ checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" [[package]] name = "cc" -version = "1.0.67" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" dependencies = [ "jobserver", ] @@ -654,7 +629,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" dependencies = [ - "nom 7.1.1", + "nom", ] [[package]] @@ -680,7 +655,7 @@ dependencies = [ "postage", "settings", "theme", - "time 0.3.7", + "time 0.3.9", "util", "workspace", ] @@ -694,7 +669,7 @@ dependencies = [ "libc", "num-integer", "num-traits", - "time 0.1.44", + "time 0.1.43", "winapi 0.3.9", ] @@ -715,9 +690,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.1.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54d78e30b388d4815220c8dd03fea5656b6c6d32adb59e89061552a102f8da1" +checksum = "5a050e2153c5be08febd6734e29298e844fdb0fa21aeddd63b4eb7baa106c69b" dependencies = [ "glob", "libc", @@ -726,11 +701,11 @@ dependencies = [ [[package]] name = "clap" -version = "2.33.3" +version = "2.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ - "ansi_term 0.11.0", + "ansi_term", "atty", "bitflags", "strsim 0.8.0", @@ -741,9 +716,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.1.12" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c167e37342afc5f33fd87bbc870cedd020d2a6dffa05d45ccd9241fbdd146db" +checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", "bitflags", @@ -758,9 +733,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.1.7" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1" +checksum = "25320346e922cffe59c0bbc5410c8d8784509efb321488971081313cb1e1a33c" dependencies = [ "heck 0.4.0", "proc-macro-error", @@ -771,9 +746,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189ddd3b5d32a70b35e7686054371742a937b0d99128e76dde6340210e966669" +checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" dependencies = [ "os_str_bytes", ] @@ -783,10 +758,10 @@ name = "cli" version = "0.1.0" dependencies = [ "anyhow", - "clap 3.1.12", + "clap 3.1.18", "core-foundation", "core-services", - "dirs 3.0.1", + "dirs 3.0.2", "ipc-channel", "plist", "serde", @@ -806,14 +781,14 @@ dependencies = [ "isahc", "lazy_static", "log", - "parking_lot", + "parking_lot 0.11.2", "postage", - "rand 0.8.3", + "rand 0.8.5", "rpc", "smol", "sum_tree", "thiserror", - "time 0.3.7", + "time 0.3.9", "tiny_http", "url", "util", @@ -828,9 +803,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.45" +version = "0.1.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb6210b637171dfba4cda12e579ac6dc73f5165ad56133e5d72ef3131f320855" +checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a" dependencies = [ "cc", ] @@ -874,7 +849,7 @@ dependencies = [ "axum", "axum-extra", "base64 0.13.0", - "clap 3.1.12", + "clap 3.1.18", "client", "collections", "ctor", @@ -890,16 +865,16 @@ dependencies = [ "log", "lsp", "nanoid", - "parking_lot", + "parking_lot 0.11.2", "project", - "rand 0.8.3", + "rand 0.8.5", "reqwest", "rpc", "scrypt", "serde", "serde_json", "settings", - "sha-1 0.9.6", + "sha-1 0.9.8", "sqlx", "theme", "time 0.2.27", @@ -957,9 +932,9 @@ dependencies = [ [[package]] name = "const_fn" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92cfa0fd5690b3cf8c1ef2cabbd9b7ef22fa53cf5e1f92b05103f6d5d1cf6e7" +checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935" [[package]] name = "contacts_panel" @@ -1056,36 +1031,33 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.1.4" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed00c67cb5d0a7d64a44f6ad2668db7e7530311dd53ea79bcd4fb022c64911c8" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" dependencies = [ "libc", ] [[package]] -name = "cpufeatures" -version = "0.2.1" +name = "crc" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" dependencies = [ - "libc", + "crc-catalog", ] [[package]] -name = "crc" -version = "1.8.1" +name = "crc-catalog" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" -dependencies = [ - "build_const", -] +checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if 1.0.0", ] @@ -1102,47 +1074,47 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.0" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.2", + "crossbeam-utils 0.8.8", ] [[package]] name = "crossbeam-deque" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" +checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" dependencies = [ "cfg-if 1.0.0", "crossbeam-epoch", - "crossbeam-utils 0.8.2", + "crossbeam-utils 0.8.8", ] [[package]] name = "crossbeam-epoch" -version = "0.9.2" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d60ab4a8dba064f2fbb5aa270c28da5cf4bbd0e72dae1140a6b0353a779dbe00" +checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" dependencies = [ + "autocfg 1.1.0", "cfg-if 1.0.0", - "crossbeam-utils 0.8.2", + "crossbeam-utils 0.8.8", "lazy_static", - "loom", "memoffset", "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.1" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f6cb3c7f5b8e51bc3ebb73a2327ad4abdbd119dc13223f14f961d2f38486756" +checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.2", + "crossbeam-utils 0.8.8", ] [[package]] @@ -1151,21 +1123,19 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "cfg-if 0.1.10", "lazy_static", ] [[package]] name = "crossbeam-utils" -version = "0.8.2" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae8f328835f8f5a6ceb6a7842a7f2d0c03692adb5c889347235d59194731fe3" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" dependencies = [ - "autocfg 1.0.1", "cfg-if 1.0.0", "lazy_static", - "loom", ] [[package]] @@ -1180,19 +1150,9 @@ dependencies = [ [[package]] name = "crypto-mac" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "crypto-mac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" dependencies = [ "generic-array", "subtle", @@ -1200,9 +1160,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.20" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d" +checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" dependencies = [ "quote", "syn", @@ -1210,24 +1170,24 @@ dependencies = [ [[package]] name = "curl" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de97b894edd5b5bcceef8b78d7da9b75b1d2f2f9a910569d0bde3dd31d84939" +checksum = "37d855aeef205b43f65a5001e0997d81f8efca7badad4fad7d897aa7f0d0651f" dependencies = [ "curl-sys", "libc", "openssl-probe", "openssl-sys", "schannel", - "socket2 0.4.0", + "socket2", "winapi 0.3.9", ] [[package]] name = "curl-sys" -version = "0.4.52+curl-7.81.0" +version = "0.4.55+curl-7.83.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b8c2d1023ea5fded5b7b892e4b8e95f70038a421126a056761a84246a28971" +checksum = "23734ec77368ec583c2e61dd3f0b0e5c98b93abe6d2a004ca06b91dd7e3e2762" dependencies = [ "cc", "libc", @@ -1241,9 +1201,9 @@ dependencies = [ [[package]] name = "data-url" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d33fe99ccedd6e84bc035f1931bb2e6be79739d6242bd895e7311c886c50dc9c" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" dependencies = [ "matches", ] @@ -1266,7 +1226,7 @@ checksum = "47003dc9f6368a88e85956c3b2573a7e6872746a3e5d762a8885da3a136a0381" dependencies = [ "backtrace", "lazy_static", - "parking_lot", + "parking_lot 0.11.2", "rustc-hash", "serde", "serde_json", @@ -1311,13 +1271,14 @@ checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" dependencies = [ "block-buffer 0.10.2", "crypto-common", + "subtle", ] [[package]] name = "dirs" -version = "3.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "142995ed02755914747cc6ca76fc7e4583cd18578746716d0508ea6ed558b9ff" +checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" dependencies = [ "dirs-sys", ] @@ -1343,9 +1304,9 @@ dependencies = [ [[package]] name = "dirs-sys" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", "redox_users", @@ -1389,15 +1350,15 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" +checksum = "21e50f3adc76d6a43f5ed73b698a87d0760ca74617f60f7c3b879003536fdd28" [[package]] name = "easy-parallel" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd4afd79212583ff429b913ad6605242ed7eec277e950b1438f300748f948f4" +checksum = "6907e25393cdcc1f4f3f513d9aac1e840eb1cc341a0fccb01171f7d14d10b946" [[package]] name = "editor" @@ -1419,10 +1380,10 @@ dependencies = [ "log", "lsp", "ordered-float", - "parking_lot", + "parking_lot 0.11.2", "postage", "project", - "rand 0.8.3", + "rand 0.8.5", "rpc", "serde", "settings", @@ -1447,9 +1408,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "encoding_rs" -version = "0.8.28" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ "cfg-if 1.0.0", ] @@ -1487,9 +1448,9 @@ dependencies = [ [[package]] name = "etagere" -version = "0.2.4" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520d7de540904fd09b11c03a47d50a7ce4ff37d1aa763f454fa60d9088ef8356" +checksum = "6301151a318f367f392c31395beb1cfba5ccd9abc44d1db0db3a4b27b9601c89" dependencies = [ "euclid", "svg_fmt", @@ -1497,18 +1458,18 @@ dependencies = [ [[package]] name = "euclid" -version = "0.22.2" +version = "0.22.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e5bac4ec41ece6346fd867815a57a221abdf48f4eb931b033789b5b4b6fc70" +checksum = "b52c2ef4a78da0ba68fbe1fd920627411096d2ac478f7f4c9f3a54ba6705bade" dependencies = [ "num-traits", ] [[package]] name = "event-listener" -version = "2.5.1" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" +checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" [[package]] name = "expat-sys" @@ -1557,14 +1518,12 @@ checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" [[package]] name = "flate2" -version = "1.0.20" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" dependencies = [ - "cfg-if 1.0.0", "crc32fast", - "libc", - "miniz_oxide 0.4.4", + "miniz_oxide 0.5.3", ] [[package]] @@ -1611,13 +1570,13 @@ dependencies = [ [[package]] name = "fontdb" -version = "0.5.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428948a0f39fb83fe55991d4423e35a793cdbb0322ebe23853f6024124a330d7" +checksum = "e58903f4f8d5b58c7d300908e4ebe5289c1bfdf5587964330f12023b8ff17fd1" dependencies = [ "log", - "memmap2 0.1.0", - "ttf-parser 0.9.0", + "memmap2", + "ttf-parser 0.12.3", ] [[package]] @@ -1672,15 +1631,15 @@ version = "2.0.2" dependencies = [ "bitflags", "fsevent-sys", - "parking_lot", + "parking_lot 0.11.2", "tempdir", ] [[package]] name = "fsevent-sys" -version = "3.0.2" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a29c77f1ca394c3e73a9a5d24cfcabb734682d9634fc398f2204a63c994120" +checksum = "ca6f5e6817058771c10f0eb0f05ddf1e35844266f972004fe8e4b21fda295bd5" dependencies = [ "libc", ] @@ -1707,17 +1666,11 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - [[package]] name = "futures" -version = "0.3.12" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9052a1a50244d8d5aa9bf55cbc2fb6f357c86cc52e46c62ed390a7180cf150" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" dependencies = [ "futures-channel", "futures-core", @@ -1746,15 +1699,26 @@ checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" [[package]] name = "futures-executor" -version = "0.3.12" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e59fdc009a4b3096bf94f740a0f2424c082521f20a9b08c5c07c48d90fd9b9" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" dependencies = [ "futures-core", "futures-task", "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot 0.11.2", +] + [[package]] name = "futures-io" version = "0.3.21" @@ -1825,24 +1789,11 @@ dependencies = [ "util", ] -[[package]] -name = "generator" -version = "0.6.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cdc09201b2e8ca1b19290cf7e65de2246b8e91fb6874279722189c4de7b94dc" -dependencies = [ - "cc", - "libc", - "log", - "rustc_version", - "winapi 0.3.9", -] - [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" dependencies = [ "typenum", "version_check", @@ -1861,20 +1812,20 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.2" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi 0.10.0+wasi-snapshot-preview1", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] name = "gif" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a668f699973d0f573d15749b7002a9ac9e1f9c6b220e7b165601334c173d8de" +checksum = "c3a7187e78088aead22ceedeee99779455b23fc231fe13ec443f99bb71694e5b" dependencies = [ "color_quant", "weezl", @@ -1949,12 +1900,12 @@ dependencies = [ "objc", "ordered-float", "parking", - "parking_lot", + "parking_lot 0.11.2", "pathfinder_color", "pathfinder_geometry", "png", "postage", - "rand 0.8.3", + "rand 0.8.5", "resvg", "seahash", "serde", @@ -1963,7 +1914,7 @@ dependencies = [ "smallvec", "smol", "sum_tree", - "time 0.3.7", + "time 0.3.9", "tiny-skia", "tree-sitter", "usvg", @@ -1995,7 +1946,7 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util 0.7.1", + "tokio-util 0.7.3", "tracing", ] @@ -2056,12 +2007,15 @@ name = "heck" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] @@ -2073,13 +2027,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "hmac" -version = "0.10.1" +name = "hkdf" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" dependencies = [ - "crypto-mac 0.10.0", - "digest 0.9.0", + "hmac 0.12.1", ] [[package]] @@ -2088,19 +2041,28 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ - "crypto-mac 0.11.0", + "crypto-mac", "digest 0.9.0", ] +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.3", +] + [[package]] name = "http" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ "bytes", "fnv", - "itoa 1.0.1", + "itoa", ] [[package]] @@ -2114,9 +2076,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", "http", @@ -2131,9 +2093,9 @@ checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" [[package]] name = "httparse" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6330e8a36bd8c859f3fa6d9382911fbb7147ec39807f63b923933a247240b9ba" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" @@ -2149,9 +2111,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.18" +version = "0.14.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" +checksum = "42dc3c131584288d375f2d07f822b0cb012d8c6fb899a5b9fdb3cb7eb9b6004f" dependencies = [ "bytes", "futures-channel", @@ -2162,9 +2124,9 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.1", + "itoa", "pin-project-lite 0.2.9", - "socket2 0.4.0", + "socket2", "tokio", "tower-service", "tracing", @@ -2209,11 +2171,11 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.17" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b287fb45c60bb826a0dc68ff08742b9d88a2fea13d6e0c286b3172065aaf878c" +checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" dependencies = [ - "crossbeam-utils 0.8.2", + "crossbeam-utils 0.8.8", "globset", "lazy_static", "log", @@ -2250,24 +2212,21 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6012d540c5baa3589337a98ce73408de9b5a25ec9fc2c6fd6be8f0d39e0ca5a" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "hashbrown", ] [[package]] name = "indoc" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7906a9fababaeacb774f72410e497a1d18de916322e33797bb2cd29baa23c9e" -dependencies = [ - "unindent", -] +checksum = "05a0bd019339e5d968b37855180087b7b9d512c5046fbd244cf8c95687927d6e" [[package]] name = "instant" -version = "0.1.9" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if 1.0.0", ] @@ -2308,13 +2267,13 @@ checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" [[package]] name = "isahc" -version = "1.7.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "437f8808009c031df3c1d532c8fd7e3d73239dfe522ebf0b94b5e34d5d01044b" +checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9" dependencies = [ "async-channel", "castaway", - "crossbeam-utils 0.8.2", + "crossbeam-utils 0.8.8", "curl", "curl-sys", "encoding_rs", @@ -2335,24 +2294,18 @@ dependencies = [ [[package]] name = "itertools" -version = "0.10.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" dependencies = [ "either", ] [[package]] name = "itoa" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" - -[[package]] -name = "itoa" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "jobserver" @@ -2387,9 +2340,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.51" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" dependencies = [ "wasm-bindgen", ] @@ -2412,11 +2365,11 @@ dependencies = [ [[package]] name = "kurbo" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e30b1df631d23875f230ed3ddd1a88c231f269a04b2044eb6ca87e763b5f4c42" +checksum = "7a53776d271cfb873b17c618af0298445c88afc52837f3e948fa3fafd131f449" dependencies = [ - "arrayvec 0.5.2", + "arrayvec 0.7.2", ] [[package]] @@ -2437,9 +2390,9 @@ dependencies = [ "lazy_static", "log", "lsp", - "parking_lot", + "parking_lot 0.11.2", "postage", - "rand 0.8.3", + "rand 0.8.5", "rpc", "serde", "serde_json", @@ -2472,19 +2425,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" -[[package]] -name = "lexical-core" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" -dependencies = [ - "arrayvec 0.5.2", - "bitflags", - "cfg-if 1.0.0", - "ryu", - "static_assertions", -] - [[package]] name = "libc" version = "0.2.126" @@ -2493,9 +2433,9 @@ checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "libloading" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" dependencies = [ "cfg-if 1.0.0", "winapi 0.3.9", @@ -2503,15 +2443,15 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" +checksum = "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db" [[package]] name = "libnghttp2-sys" -version = "0.1.6+1.43.0" +version = "0.1.7+1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0af55541a8827e138d59ec9e5877fb6095ece63fb6f4da45e7491b4fbd262855" +checksum = "57ed28aba195b38d5ff02b9170cbff627e336a20925e43b4945390401c5dc93f" dependencies = [ "cc", "libc", @@ -2534,9 +2474,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.3" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66" +checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" dependencies = [ "cc", "libc", @@ -2555,45 +2495,35 @@ dependencies = [ [[package]] name = "lipsum" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ee7271c76a89032dcc7e595c0a739a9c5514eab483deb0e82981fe2098c56a" +checksum = "a8451846f1f337e44486666989fbce40be804da139d5a4477d6b88ece5dc69f4" dependencies = [ - "rand 0.8.3", - "rand_chacha 0.3.0", + "rand 0.8.5", + "rand_chacha 0.3.1", ] [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg 1.1.0", "scopeguard", ] [[package]] name = "log" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if 1.0.0", "serde", "value-bag", ] -[[package]] -name = "loom" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d44c73b4636e497b4917eb21c33539efa3816741a2d3ff26c6316f1b529481a4" -dependencies = [ - "cfg-if 1.0.0", - "generator", - "scoped-tls", -] - [[package]] name = "lsp" version = "0.1.0" @@ -2607,7 +2537,7 @@ dependencies = [ "gpui", "log", "lsp-types", - "parking_lot", + "parking_lot 0.11.2", "postage", "serde", "serde_json", @@ -2618,9 +2548,9 @@ dependencies = [ [[package]] name = "lsp-types" -version = "0.91.0" +version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be7801b458592d0998af808d97f6a85a6057af3aaf2a2a5c3c677702bbeb4ed7" +checksum = "2368312c59425dd133cb9a327afee65be0a633a8ce471d248e2202a48f8f68ae" dependencies = [ "bitflags", "serde", @@ -2638,12 +2568,6 @@ dependencies = [ "libc", ] -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - [[package]] name = "matchers" version = "0.1.0" @@ -2655,9 +2579,9 @@ dependencies = [ [[package]] name = "matches" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "matchit" @@ -2673,46 +2597,35 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "md-5" -version = "0.9.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15" +checksum = "658646b21e0b72f7866c7038ab086d3d5e1cd6271f060fd37defb241949d0582" dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "opaque-debug", + "digest 0.10.3", ] [[package]] name = "memchr" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" - -[[package]] -name = "memmap2" -version = "0.1.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b70ca2a6103ac8b665dc150b142ef0e4e89df640c9e6cf295d189c3caebe5a" -dependencies = [ - "libc", -] +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memmap2" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397d1a6d6d0563c0f5462bbdae662cf6c784edf5e828e40c7257f85d82bf56dd" +checksum = "723e3ebdcdc5c023db1df315364573789f8857c11b631a2fdfad7c00f5c046b4" dependencies = [ "libc", ] [[package]] name = "memoffset" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83fb6581e8ed1f85fd45c116db8405483899489e38406156c25eb743554361d" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", ] [[package]] @@ -2764,7 +2677,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" dependencies = [ "adler", - "autocfg 1.0.1", + "autocfg 1.1.0", +] + +[[package]] +name = "miniz_oxide" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" +dependencies = [ + "adler", ] [[package]] @@ -2780,7 +2702,7 @@ dependencies = [ "kernel32-sys", "libc", "log", - "miow 0.2.2", + "miow", "net2", "slab", "winapi 0.2.8", @@ -2788,15 +2710,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.7.14" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" dependencies = [ "libc", "log", - "miow 0.3.7", - "ntapi", - "winapi 0.3.9", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", ] [[package]] @@ -2811,15 +2732,6 @@ dependencies = [ "ws2_32-sys", ] -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "multimap" version = "0.8.3" @@ -2832,7 +2744,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" dependencies = [ - "rand 0.8.3", + "rand 0.8.5", ] [[package]] @@ -2853,16 +2765,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "nb-connect" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670361df1bc2399ee1ff50406a0d422587dd3bb0da596e1978fe8e05dabddf4f" -dependencies = [ - "libc", - "socket2 0.3.19", -] - [[package]] name = "net2" version = "0.2.37" @@ -2874,19 +2776,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "nom" -version = "6.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7413f999671bd4745a7b624bd370a569fb6bc574b23c83a3c5ed2e453f3d5e2" -dependencies = [ - "bitvec", - "funty", - "lexical-core", - "memchr", - "version_check", -] - [[package]] name = "nom" version = "7.1.1" @@ -2897,22 +2786,13 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "ntapi" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "num-bigint" -version = "0.4.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d047c1062aa51e256408c560894e5251f08925980e53cf1aa5bd00eec6512" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "num-integer", "num-traits", ] @@ -2923,35 +2803,35 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4547ee5541c18742396ae2c895d0717d0f886d8823b8399cdaf7b07d63ad0480" dependencies = [ - "autocfg 0.1.7", + "autocfg 0.1.8", "byteorder", "lazy_static", "libm", "num-integer", "num-iter", "num-traits", - "rand 0.8.3", + "rand 0.8.5", "smallvec", "zeroize", ] [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "num-integer", "num-traits", ] @@ -2962,26 +2842,26 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "libm", ] [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" dependencies = [ "hermit-abi", "libc", @@ -2989,9 +2869,9 @@ dependencies = [ [[package]] name = "num_threads" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ba99ba6393e2c3734791401b66902d981cb03bf190af674ca69949b6d5fb15" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" dependencies = [ "libc", ] @@ -3017,18 +2897,18 @@ dependencies = [ [[package]] name = "object" -version = "0.27.1" +version = "0.28.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" +checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.5.2" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" +checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" [[package]] name = "opaque-debug" @@ -3064,17 +2944,17 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.73" +version = "0.9.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5fd19fb3e0a8191c1e34935718976a3e70c112ab9a24af6d7cadccd9d90bc0" +checksum = "835363342df5fba8354c5b453325b110ffd54044e588c539cf2f20a8014e4cb1" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "cc", "libc", "pkg-config", @@ -3083,18 +2963,18 @@ dependencies = [ [[package]] name = "ordered-float" -version = "2.1.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "766f840da25490628d8e63e529cd21c014f6600c6b8517add12a6fa6167a6218" +checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" dependencies = [ "num-traits", ] [[package]] name = "os_str_bytes" -version = "6.0.0" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" +checksum = "21326818e99cfe6ce1e524c2a805c189a99b5ae555a35d19f9a284b427d86afa" [[package]] name = "outline" @@ -3127,7 +3007,17 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core", + "parking_lot_core 0.8.5", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.3", ] [[package]] @@ -3144,17 +3034,36 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "parking_lot_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + [[package]] name = "password-hash" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a5d4e9c205d2c1ae73b84aab6240e98218c0e72e63b50422cfb2d1ca952282" +checksum = "77e0b28ace46c5a396546bcf443bf422b57049617433d8854227352a4a9b24e7" dependencies = [ "base64ct", - "rand_core 0.6.2", + "rand_core 0.6.3", "subtle", ] +[[package]] +name = "paste" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" + [[package]] name = "pathfinder_color" version = "0.5.0" @@ -3176,11 +3085,11 @@ dependencies = [ [[package]] name = "pathfinder_simd" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b451513912d6b3440e443aa75a73ab22203afedc4a90df8526d008c0f86f7cb3" +checksum = "39fe46acc5503595e5949c17b818714d26fdf9b4920eacf3b2947f0199f4a6ff" dependencies = [ - "rustc_version", + "rustc_version 0.3.3", ] [[package]] @@ -3189,7 +3098,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" dependencies = [ - "crypto-mac 0.11.0", + "crypto-mac", ] [[package]] @@ -3215,6 +3124,15 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + [[package]] name = "petgraph" version = "0.6.2" @@ -3243,24 +3161,24 @@ dependencies = [ [[package]] name = "pico-args" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d70072c20945e1ab871c472a285fc772aefd4f5407723c206242f2c6f94595d6" +checksum = "db8bcd96cb740d03149cbad5518db9fd87126a10ab519c011893b1754134c468" [[package]] name = "pin-project" -version = "1.0.6" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc174859768806e91ae575187ada95c91a29e96a98dc5d2cd9a1fed039501ba6" +checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.6" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a490329918e856ed1b083f244e3bfe2d8c4f336407e4ea9e1a9f479ff09049e5" +checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" dependencies = [ "proc-macro2", "quote", @@ -3287,9 +3205,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.19" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "plist" @@ -3301,7 +3219,7 @@ dependencies = [ "indexmap", "line-wrap", "serde", - "time 0.3.7", + "time 0.3.9", "xml-rs", ] @@ -3319,22 +3237,22 @@ dependencies = [ [[package]] name = "polling" -version = "2.0.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a7bc6b2a29e632e45451c941832803a18cce6781db04de8a04696cdca8bde4" +checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "libc", "log", - "wepoll-sys", + "wepoll-ffi", "winapi 0.3.9", ] [[package]] name = "pollster" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cce106fd2646acbe31a0e4006f75779d535c26a44f153ada196e9edcfc6d944" +checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" [[package]] name = "postage" @@ -3354,9 +3272,9 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.10" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "proc-macro-error" @@ -3390,11 +3308,11 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.36" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -3417,10 +3335,10 @@ dependencies = [ "libc", "log", "lsp", - "parking_lot", + "parking_lot 0.11.2", "postage", "pulldown-cmark", - "rand 0.8.3", + "rand 0.8.5", "regex", "rocksdb", "rpc", @@ -3569,19 +3487,13 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.9" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "941ba9d78d8e2f7ce474c015eea4d9c6d25b6a3327f9832ee29a4de27f91bbb8" - [[package]] name = "rand" version = "0.4.6" @@ -3605,19 +3517,18 @@ dependencies = [ "libc", "rand_chacha 0.2.2", "rand_core 0.5.1", - "rand_hc 0.2.0", + "rand_hc", ] [[package]] name = "rand" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.2", - "rand_hc 0.3.0", + "rand_chacha 0.3.1", + "rand_core 0.6.3", ] [[package]] @@ -3632,12 +3543,12 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.2", + "rand_core 0.6.3", ] [[package]] @@ -3666,11 +3577,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.2", + "getrandom 0.2.6", ] [[package]] @@ -3682,22 +3593,13 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_hc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" -dependencies = [ - "rand_core 0.6.2", -] - [[package]] name = "rayon" -version = "1.5.0" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "crossbeam-deque", "either", "rayon-core", @@ -3705,14 +3607,13 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" dependencies = [ - "crossbeam-channel 0.5.0", + "crossbeam-channel 0.5.4", "crossbeam-deque", - "crossbeam-utils 0.8.2", - "lazy_static", + "crossbeam-utils 0.8.8", "num_cpus", ] @@ -3733,21 +3634,22 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.4.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.2", + "getrandom 0.2.6", "redox_syscall", + "thiserror", ] [[package]] @@ -3787,9 +3689,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.9" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f242f1488a539a79bac6dbe7c8609ae43b7914b7736210f239a37cccb32525" +checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" dependencies = [ "base64 0.13.0", "bytes", @@ -3823,9 +3725,9 @@ dependencies = [ [[package]] name = "resvg" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9efbe9c239253e11e518352c5f015ec0c69e73658eed153670e853e1b78e40" +checksum = "09697862c5c3f940cbaffef91969c62188b5c8ed385b0aef43a5ff01ddc8000f" dependencies = [ "jpeg-decoder", "log", @@ -3839,9 +3741,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.27" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fddb3b23626145d1776addfc307e1a1851f60ef6ca64f376bcb889697144cf0" +checksum = "e74fdc210d8f24a7dbfedc13b04ba5764f5232754ccebfdf5fff1bad791ccbc6" dependencies = [ "bytemuck", ] @@ -3892,10 +3794,10 @@ dependencies = [ "collections", "futures", "gpui", - "parking_lot", + "parking_lot 0.11.2", "prost 0.8.0", "prost-build", - "rand 0.8.3", + "rand 0.8.5", "rsa", "serde", "smol", @@ -3908,9 +3810,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ef841a26fc5d040ced0417c6c6a64ee851f42489df11cdf0218e545b6f8d28" +checksum = "7b0aeddcca1082112a6eeb43bf25fd7820b066aaf6eaef776e19d0a1febe38fe" dependencies = [ "byteorder", "digest 0.9.0", @@ -3920,7 +3822,7 @@ dependencies = [ "num-iter", "num-traits", "pem", - "rand 0.8.3", + "rand 0.8.5", "simple_asn1", "subtle", "zeroize", @@ -3928,9 +3830,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "6.3.0" +version = "6.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d40377bff8cceee81e28ddb73ac97f5c2856ce5522f0b260b763f434cdfae602" +checksum = "9a17e5ac65b318f397182ae94e532da0ba56b88dd1200b774715d36c4943b1c3" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -3952,20 +3854,20 @@ dependencies = [ [[package]] name = "rust-embed-utils" -version = "7.1.0" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad22c7226e4829104deab21df575e995bfbc4adfad13a595e387477f238c1aec" +checksum = "756feca3afcbb1487a1d01f4ecd94cf8ec98ea074c55a69e7136d29fb6166029" dependencies = [ "globset", - "sha2 0.9.5", + "sha2 0.9.9", "walkdir", ] [[package]] name = "rustc-demangle" -version = "0.1.18" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "rustc-hash" @@ -3979,7 +3881,16 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver", + "semver 0.9.0", +] + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", ] [[package]] @@ -4013,9 +3924,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" [[package]] name = "safe_arch" @@ -4034,9 +3945,9 @@ checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" [[package]] name = "salsa20" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7c5f10864beba947e1a1b43f3ef46c8cc58d1c2ae549fa471713e8ff60787a" +checksum = "ecbd2eb639fd7cab5804a0837fe373cc2172d15437e804c054a9fb885cb923b0" dependencies = [ "cipher", ] @@ -4052,19 +3963,19 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" dependencies = [ "lazy_static", - "winapi 0.3.9", + "windows-sys", ] [[package]] name = "schemars" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6b5a3c80cea1ab61f4260238409510e814e38b4b563c06044edf91e7dc070e3" +checksum = "1847b767a3d62d95cbf3d8a9f0e421cf57a0d8aa4f411d4b16525afb0284d4ed" dependencies = [ "dyn-clone", "schemars_derive", @@ -4074,9 +3985,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ae4dce13e8614c46ac3c38ef1c0d668b101df6ac39817aebdaa26642ddae9b" +checksum = "af4d7e1b012cb3d9129567661a63755ea4b8a7386d339dc945ae187e403c6743" dependencies = [ "proc-macro2", "quote", @@ -4084,12 +3995,6 @@ dependencies = [ "syn", ] -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - [[package]] name = "scoped_threadpool" version = "0.1.9" @@ -4113,7 +4018,7 @@ dependencies = [ "password-hash", "pbkdf2", "salsa20", - "sha2 0.9.5", + "sha2 0.9.9", ] [[package]] @@ -4157,9 +4062,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.4.2" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" dependencies = [ "bitflags", "core-foundation", @@ -4184,7 +4089,16 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser", + "semver-parser 0.7.0", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser 0.10.2", ] [[package]] @@ -4193,20 +4107,29 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + [[package]] name = "serde" -version = "1.0.125" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.125" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ "proc-macro2", "quote", @@ -4215,9 +4138,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", @@ -4240,25 +4163,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ "indexmap", - "itoa 1.0.1", + "itoa", "ryu", "serde", ] [[package]] name = "serde_path_to_error" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f6109f0506e20f7e0f910e51a0079acf41da8e0694e6442527c4ddf5a2b158" +checksum = "d7868ad3b8196a8a0aea99a8220b124278ee5320a55e4fde97794b6f85b1a377" dependencies = [ "serde", ] [[package]] name = "serde_repr" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" +checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" dependencies = [ "proc-macro2", "quote", @@ -4267,12 +4190,12 @@ dependencies = [ [[package]] name = "serde_urlencoded" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 0.4.7", + "itoa", "ryu", "serde", ] @@ -4318,13 +4241,13 @@ dependencies = [ [[package]] name = "sha-1" -version = "0.9.6" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c4cfa741c5832d0ef7fab46cabed29c2aae926db0b11bb2069edd8db5e64e16" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.0", - "cpufeatures 0.1.4", + "cpufeatures", "digest 0.9.0", "opaque-debug", ] @@ -4336,25 +4259,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" dependencies = [ "cfg-if 1.0.0", - "cpufeatures 0.2.1", + "cpufeatures", "digest 0.10.3", ] [[package]] name = "sha1" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" +checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" +dependencies = [ + "sha1_smol", +] + +[[package]] +name = "sha1_smol" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" [[package]] name = "sha2" -version = "0.9.5" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.0", - "cpufeatures 0.1.4", + "cpufeatures", "digest 0.9.0", "opaque-debug", ] @@ -4366,7 +4298,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" dependencies = [ "cfg-if 1.0.0", - "cpufeatures 0.2.1", + "cpufeatures", "digest 0.10.3", ] @@ -4381,15 +4313,15 @@ dependencies = [ [[package]] name = "shlex" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a568c8f2cd051a4d283bd6eb0343ac214c1b0f1ac19f93e1175b2dee38c73d" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" [[package]] name = "signal-hook" -version = "0.3.6" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7f3f92a1da3d6b1d32245d0cbcbbab0cfc45996d8df619c42bccfa6d2bbb5f" +checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" dependencies = [ "libc", "signal-hook-registry", @@ -4397,9 +4329,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" dependencies = [ "libc", ] @@ -4412,9 +4344,9 @@ checksum = "1ad1d488a557b235fc46dae55512ffbfc429d2482b08b4d9435ab07384ca8aec" [[package]] name = "simple_asn1" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc31e6cf34ad4321d3a2b8f934949b429e314519f753a77962f16c664dca8e13" +checksum = "8eb4ea60fb301dc81dfc113df680571045d375ab7345d171c5dc7d7e13107a80" dependencies = [ "chrono", "num-bigint", @@ -4424,9 +4356,9 @@ dependencies = [ [[package]] name = "simplecss" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "596554e63596d556a0dbd681416342ca61c75f1a45203201e7e77d3fa2fa9014" +checksum = "a11be7c62927d9427e9f40f3444d5499d868648e2edbc4e2116de69e7ec0e89d" dependencies = [ "log", ] @@ -4450,26 +4382,26 @@ checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" [[package]] name = "slab" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "sluice" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa0333a60ff2e3474a6775cc611840c2a55610c831dd366503474c02f1a28f5" +checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" dependencies = [ - "futures-channel", + "async-channel", "futures-core", "futures-io", ] [[package]] name = "smallvec" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" [[package]] name = "smol" @@ -4509,20 +4441,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "socket2" -version = "0.4.0" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" dependencies = [ "libc", "winapi 0.3.9", @@ -4536,22 +4457,20 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "sqlformat" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d86e3c77ff882a828346ba401a7ef4b8e440df804491c6064fe8295765de71c" +checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4" dependencies = [ - "lazy_static", - "maplit", - "nom 6.1.2", - "regex", + "itertools", + "nom", "unicode_categories", ] [[package]] name = "sqlx" -version = "0.5.5" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba82f79b31f30acebf19905bcd8b978f46891b9d0723f578447361a8910b6584" +checksum = "551873805652ba0d912fec5bbb0f8b4cdd96baf8e2ebf5970e5671092966019b" dependencies = [ "sqlx-core", "sqlx-macros", @@ -4559,9 +4478,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.5.5" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f23af36748ec8ea8d49ef8499839907be41b0b1178a4e82b8cb45d29f531dc9" +checksum = "e48c61941ccf5ddcada342cd59e3e5173b007c509e1e8e990dafc830294d9dc5" dependencies = [ "ahash", "atoi", @@ -4570,31 +4489,33 @@ dependencies = [ "byteorder", "bytes", "crc", - "crossbeam-channel 0.5.0", "crossbeam-queue", - "crossbeam-utils 0.8.2", - "dirs 3.0.1", + "dirs 4.0.0", "either", + "event-listener", "futures-channel", "futures-core", + "futures-intrusive", "futures-util", "hashlink", "hex", - "hmac 0.10.1", - "itoa 0.4.7", + "hkdf", + "hmac 0.12.1", + "indexmap", + "itoa", "libc", "log", "md-5", "memchr", "once_cell", - "parking_lot", + "paste", "percent-encoding", - "rand 0.8.3", + "rand 0.8.5", "rustls", "serde", "serde_json", - "sha-1 0.9.6", - "sha2 0.9.5", + "sha-1 0.10.0", + "sha2 0.10.2", "smallvec", "sqlformat", "sqlx-rt", @@ -4611,18 +4532,17 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.5.5" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e4a2349d1ffd60a03ca0de3f116ba55d7f406e55a0d84c64a5590866d94c06" +checksum = "bc0fba2b0cae21fc00fe6046f8baa4c7fcb49e379f0f592b04696607f69ed2e1" dependencies = [ "dotenv", "either", - "futures", - "heck 0.3.3", + "heck 0.4.0", "once_cell", "proc-macro2", "quote", - "sha2 0.9.5", + "sha2 0.10.2", "sqlx-core", "sqlx-rt", "syn", @@ -4631,9 +4551,9 @@ dependencies = [ [[package]] name = "sqlx-rt" -version = "0.5.5" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8199b421ecf3493ee9ef3e7bc90c904844cfb2ea7ea2f57347a93f52bfd3e057" +checksum = "4db708cd3e459078f85f39f96a00960bd841f66ee2a669e90bf36907f5a79aae" dependencies = [ "once_cell", "tokio", @@ -4662,7 +4582,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" dependencies = [ "discard", - "rustc_version", + "rustc_version 0.2.3", "stdweb-derive", "stdweb-internal-macros", "stdweb-internal-runtime", @@ -4728,19 +4648,19 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "subtle" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "sum_tree" version = "0.1.0" dependencies = [ - "arrayvec 0.7.1", + "arrayvec 0.7.2", "ctor", "env_logger", "log", - "rand 0.8.3", + "rand 0.8.5", ] [[package]] @@ -4780,13 +4700,13 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.91" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" +checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -4797,9 +4717,9 @@ checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" [[package]] name = "synstructure" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ "proc-macro2", "quote", @@ -4807,12 +4727,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "tempdir" version = "0.3.7" @@ -4839,9 +4753,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" dependencies = [ "winapi-util", ] @@ -4851,7 +4765,7 @@ name = "text" version = "0.1.0" dependencies = [ "anyhow", - "arrayvec 0.7.1", + "arrayvec 0.7.2", "clock", "collections", "ctor", @@ -4859,9 +4773,9 @@ dependencies = [ "gpui", "lazy_static", "log", - "parking_lot", + "parking_lot 0.11.2", "postage", - "rand 0.8.3", + "rand 0.8.5", "smallvec", "sum_tree", "util", @@ -4889,7 +4803,7 @@ dependencies = [ "anyhow", "gpui", "indexmap", - "parking_lot", + "parking_lot 0.11.2", "serde", "serde_json", "serde_path_to_error", @@ -4904,7 +4818,7 @@ dependencies = [ "fuzzy", "gpui", "log", - "parking_lot", + "parking_lot 0.11.2", "picker", "postage", "settings", @@ -4915,18 +4829,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.29" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.29" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", "quote", @@ -4961,12 +4875,11 @@ dependencies = [ [[package]] name = "time" -version = "0.1.44" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ "libc", - "wasi 0.10.0+wasi-snapshot-preview1", "winapi 0.3.9", ] @@ -4987,11 +4900,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "004cbc98f30fa233c61a38bc77e96a9106e65c88f2d3bef182ae952027e5753d" +checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" dependencies = [ - "itoa 1.0.1", + "itoa", "libc", "num_threads", ] @@ -5048,9 +4961,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.2.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -5063,19 +4976,20 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.16.1" +version = "1.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a" +checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" dependencies = [ "bytes", "libc", "memchr", - "mio 0.7.14", + "mio 0.8.3", "num_cpus", "once_cell", - "parking_lot", + "parking_lot 0.12.1", "pin-project-lite 0.2.9", "signal-hook-registry", + "socket2", "tokio-macros", "winapi 0.3.9", ] @@ -5092,9 +5006,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" dependencies = [ "proc-macro2", "quote", @@ -5124,9 +5038,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" dependencies = [ "futures-core", "pin-project-lite 0.2.9", @@ -5147,9 +5061,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ "bytes", "futures-core", @@ -5161,9 +5075,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" dependencies = [ "bytes", "futures-core", @@ -5175,9 +5089,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ "serde", ] @@ -5205,7 +5119,7 @@ dependencies = [ "prost-derive 0.9.0", "tokio", "tokio-stream", - "tokio-util 0.6.9", + "tokio-util 0.6.10", "tower", "tower-layer", "tower-service", @@ -5224,10 +5138,10 @@ dependencies = [ "indexmap", "pin-project", "pin-project-lite 0.2.9", - "rand 0.8.3", + "rand 0.8.5", "slab", "tokio", - "tokio-util 0.7.1", + "tokio-util 0.7.3", "tower-layer", "tower-service", "tracing", @@ -5235,9 +5149,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.3.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79dd37121c38240c4b4fe6520332406218bbf876f2f690fe9e406020189366fd" +checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba" dependencies = [ "bitflags", "bytes", @@ -5335,7 +5249,7 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" dependencies = [ - "ansi_term 0.12.1", + "ansi_term", "lazy_static", "matchers", "regex", @@ -5451,9 +5365,9 @@ checksum = "62ddb402ac6c2af6f7a2844243887631c4e94b51585b229fcfddb43958cd55ca" [[package]] name = "ttf-parser" -version = "0.12.0" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e00391c1f3d171490a3f8bd79999b0002ae38d3da0d6a3a306c754b053d71b" +checksum = "7ae2f58a822f08abdaf668897e96a5656fe72f5a9ce66422423e8849384872e6" [[package]] name = "tungstenite" @@ -5467,8 +5381,8 @@ dependencies = [ "http", "httparse", "log", - "rand 0.8.3", - "sha-1 0.9.6", + "rand 0.8.5", + "sha-1 0.9.8", "thiserror", "url", "utf-8", @@ -5486,7 +5400,7 @@ dependencies = [ "http", "httparse", "log", - "rand 0.8.3", + "rand 0.8.5", "sha-1 0.10.0", "thiserror", "url", @@ -5499,6 +5413,12 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + [[package]] name = "unicase" version = "2.6.0" @@ -5510,12 +5430,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.4" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -dependencies = [ - "matches", -] +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-bidi-mirroring" @@ -5525,9 +5442,9 @@ checksum = "56d12260fb92d52f9008be7e4bca09f584780eb2266dc8fecc6a192bec561694" [[package]] name = "unicode-ccc" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28ae07c514c335bbd0251147bb1de333e28ebc8f57d792014f919ed212d119f6" +checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1" [[package]] name = "unicode-general-category" @@ -5535,6 +5452,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f9af028e052a610d99e066b33304625dea9613170a2563314490a4e6ec5cf7f" +[[package]] +name = "unicode-ident" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" + [[package]] name = "unicode-normalization" version = "0.1.19" @@ -5546,15 +5469,15 @@ dependencies = [ [[package]] name = "unicode-script" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79bf4d5fc96546fdb73f9827097810bbda93b11a6770ff3a54e1f445d4135787" +checksum = "58dd944fd05f2f0b5c674917aea8a4df6af84f2d8de3fe8d988b95d28fb8fb09" [[package]] name = "unicode-segmentation" -version = "1.7.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" [[package]] name = "unicode-vo" @@ -5564,15 +5487,15 @@ checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" [[package]] name = "unicode-width" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" [[package]] name = "unicode_categories" @@ -5582,9 +5505,9 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "unindent" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514672a55d7380da379785a4d70ca8386c8883ff7eaae877be4d2081cebe73d8" +checksum = "52fee519a3e570f7df377a06a1a7775cdbfb7aa460be7e08de2b1f0e69973a44" [[package]] name = "untrusted" @@ -5607,9 +5530,9 @@ dependencies = [ [[package]] name = "usvg" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffbeb91d06989028c9c5e44d14d78b0cacdec56a613bb146e7a70007b1b6163" +checksum = "ef8352f317d8f9a918ba5154797fb2a93e2730244041cf7d5be35148266adfa5" dependencies = [ "base64 0.13.0", "data-url", @@ -5617,7 +5540,7 @@ dependencies = [ "fontdb", "kurbo", "log", - "memmap2 0.2.2", + "memmap2", "pico-args", "rctree", "roxmltree", @@ -5625,7 +5548,7 @@ dependencies = [ "simplecss", "siphasher", "svgtypes", - "ttf-parser 0.12.0", + "ttf-parser 0.12.3", "unicode-bidi", "unicode-script", "unicode-vo", @@ -5645,7 +5568,7 @@ dependencies = [ "anyhow", "futures", "log", - "rand 0.8.3", + "rand 0.8.5", "serde_json", "tempdir", ] @@ -5656,7 +5579,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.2", + "getrandom 0.2.6", ] [[package]] @@ -5667,9 +5590,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.0.0-alpha.8" +version = "1.0.0-alpha.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79923f7731dc61ebfba3633098bf3ac533bbd35ccd8c57e7088d9a5eebe0263f" +checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" dependencies = [ "ctor", "erased-serde", @@ -5681,15 +5604,9 @@ dependencies = [ [[package]] name = "vcpkg" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "025ce40a007e1907e58d5bc1a594def78e5573bb0b1160bc389634e8f12e4faa" - -[[package]] -name = "vec-arena" -version = "1.0.0" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eafc1b9b2dfc6f5529177b62cf806484db55b32dc7c9658a118e11bbeb33061d" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vec_map" @@ -5699,9 +5616,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vim" @@ -5730,9 +5647,9 @@ checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" [[package]] name = "walkdir" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" dependencies = [ "same-file", "winapi 0.3.9", @@ -5757,15 +5674,21 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.74" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -5773,9 +5696,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.74" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" dependencies = [ "bumpalo", "lazy_static", @@ -5788,9 +5711,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.24" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fba7978c679d53ce2d0ac80c8c175840feb849a161664365d1287b41f2e67f1" +checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -5800,9 +5723,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.74" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5810,9 +5733,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.74" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" dependencies = [ "proc-macro2", "quote", @@ -5823,15 +5746,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.74" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" +checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" [[package]] name = "web-sys" -version = "0.3.51" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" +checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" dependencies = [ "js-sys", "wasm-bindgen", @@ -5858,15 +5781,15 @@ dependencies = [ [[package]] name = "weezl" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b77fdfd5a253be4ab714e4ffa3c49caf146b4de743e97510c0656cf90f1e8e" +checksum = "9c97e489d8f836838d497091de568cf16b117486d529ec5579233521065bd5e4" [[package]] -name = "wepoll-sys" -version = "3.0.1" +name = "wepoll-ffi" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcb14dea929042224824779fbc82d9fab8d2e6d3cbc0ac404de8edf489e77ff" +checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" dependencies = [ "cc", ] @@ -5884,9 +5807,9 @@ dependencies = [ [[package]] name = "whoami" -version = "1.1.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4abacf325c958dfeaf1046931d37f2a901b6dfe0968ee965a29e94c6766b2af6" +checksum = "524b58fa5a20a2fb3014dd6358b70e6579692a56ef6fce928834e488f42f65e8" dependencies = [ "wasm-bindgen", "web-sys", @@ -5935,11 +5858,54 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + [[package]] name = "winreg" -version = "0.7.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ "winapi 0.3.9", ] @@ -5965,7 +5931,7 @@ dependencies = [ "gpui", "language", "log", - "parking_lot", + "parking_lot 0.11.2", "postage", "project", "serde", @@ -5986,12 +5952,6 @@ dependencies = [ "winapi-build", ] -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - [[package]] name = "xml-rs" version = "0.8.4" @@ -6033,7 +5993,7 @@ dependencies = [ "context_menu", "ctor", "diagnostics", - "dirs 3.0.1", + "dirs 3.0.2", "easy-parallel", "editor", "env_logger", @@ -6056,12 +6016,12 @@ dependencies = [ "lsp", "num_cpus", "outline", - "parking_lot", + "parking_lot 0.11.2", "postage", "project", "project_panel", "project_symbols", - "rand 0.8.3", + "rand 0.8.5", "regex", "rpc", "rsa", @@ -6108,9 +6068,9 @@ dependencies = [ [[package]] name = "zeroize_derive" -version = "1.1.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2c1e130bebaeab2f23886bf9acbaca14b092408c452543c857f66399cd6dab1" +checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" dependencies = [ "proc-macro2", "quote", @@ -6120,18 +6080,18 @@ dependencies = [ [[package]] name = "zstd" -version = "0.9.0+zstd.1.5.0" +version = "0.9.2+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07749a5dc2cb6b36661290245e350f15ec3bbb304e493db54a1d354480522ccd" +checksum = "2390ea1bf6c038c39674f22d95f0564725fc06034a47129179810b2fc58caa54" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "4.1.1+zstd.1.5.0" +version = "4.1.3+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91c90f2c593b003603e5e0493c837088df4469da25aafff8bce42ba48caf079" +checksum = "e99d81b99fb3c2c2c794e3fe56c305c63d5173a16a46b5850b07c935ffc7db79" dependencies = [ "libc", "zstd-sys", @@ -6139,9 +6099,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "1.6.1+zstd.1.5.0" +version = "1.6.2+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "615120c7a2431d16cf1cf979e7fc31ba7a5b5e5707b29c8a99e5dbf8a8392a33" +checksum = "2daf2f248d9ea44454bfcb2516534e8b8ad2fc91bf818a1885495fc42bc8ac9f" dependencies = [ "cc", "libc", diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json index c1e5d7db8c576ca388653c0662179046000a260d..6fcd5d3d12590761becc8c33dcbfe9ce1baf7e23 100644 --- a/assets/keymaps/vim.json +++ b/assets/keymaps/vim.json @@ -99,6 +99,7 @@ "context": "Editor && vim_operator == g", "bindings": { "g": "vim::StartOfDocument", + "h": "editor::Hover", "escape": [ "vim::SwitchMode", "Normal" diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index cb7257d12c82cd730d4e8bf2f638d6307f382e36..357db59a23777b8460761078200757aea08e7ba0 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -25,9 +25,9 @@ use gpui::{ geometry::vector::{vec2f, Vector2F}, impl_actions, impl_internal_actions, platform::CursorStyle, - text_layout, AppContext, AsyncAppContext, Axis, ClipboardItem, Element, ElementBox, Entity, - ModelHandle, MutableAppContext, RenderContext, Task, View, ViewContext, ViewHandle, - WeakViewHandle, + text_layout, AppContext, AsyncAppContext, Axis, ClipboardItem, Element, ElementBox, + ElementStateContext, Entity, ModelHandle, MutableAppContext, ReadModel, RenderContext, Task, + View, ViewContext, ViewHandle, WeakViewHandle, }; pub use language::{char_kind, CharKind}; use language::{ @@ -81,7 +81,7 @@ pub struct Scroll(pub Vector2F); pub struct Select(pub SelectPhase); #[derive(Clone)] -pub struct Hover { +pub struct HoverAt { point: Option, } @@ -198,6 +198,7 @@ actions!( ShowCompletions, OpenExcerpts, RestartLanguageServer, + Hover, ] ); @@ -214,7 +215,7 @@ impl_actions!( ] ); -impl_internal_actions!(editor, [Scroll, Select, Hover, GoToDefinitionAt]); +impl_internal_actions!(editor, [Scroll, Select, HoverAt, GoToDefinitionAt]); enum DocumentHighlightRead {} enum DocumentHighlightWrite {} @@ -302,6 +303,7 @@ pub fn init(cx: &mut MutableAppContext) { cx.add_action(Editor::show_completions); cx.add_action(Editor::toggle_code_actions); cx.add_action(Editor::hover); + cx.add_action(Editor::hover_at); cx.add_action(Editor::open_excerpts); cx.add_action(Editor::restart_language_server); cx.add_async_action(Editor::confirm_completion); @@ -888,48 +890,64 @@ impl CodeActionsMenu { } } -struct HoverPopover { +#[derive(Clone)] +pub(crate) struct HoverPopover { + pub project: ModelHandle, + pub hover_point: DisplayPoint, pub range: Range, pub contents: Vec, } impl HoverPopover { - fn render(&self, style: EditorStyle, project: &Project) -> (DisplayPoint, ElementBox) { - let mut flex = Flex::new(Axis::Vertical); - flex.extend(self.contents.iter().map(|content| { - if let Some(language) = content - .language - .clone() - .and_then(|language| project.languages().get_language(&language)) - { - let runs = - language.highlight_text(&content.text.as_str().into(), 0..content.text.len()); - - Text::new(content.text.clone(), style.text.clone()) - .with_soft_wrap(true) - .with_highlights( - runs.iter() - .filter_map(|(range, id)| { - id.style(style.theme.syntax.as_ref()) - .map(|style| (range.clone(), style)) - }) - .collect(), - ) - .boxed() - } else { - Text::new(content.text.clone(), style.hover_popover.prose.clone()) - .with_soft_wrap(true) - .contained() - .with_style(style.hover_popover.block_style) - .boxed() - } - })); - ( - self.range.start, + fn render( + &self, + style: EditorStyle, + cx: &mut C, + ) -> (DisplayPoint, ElementBox) { + let element = MouseEventHandler::new::(0, cx, |_, cx| { + let mut flex = Flex::new(Axis::Vertical).scrollable::(1, None, cx); + flex.extend(self.contents.iter().map(|content| { + let project = self.project.read(cx); + if let Some(language) = content + .language + .clone() + .and_then(|language| project.languages().get_language(&language)) + { + let runs = language + .highlight_text(&content.text.as_str().into(), 0..content.text.len()); + + Text::new(content.text.clone(), style.text.clone()) + .with_soft_wrap(true) + .with_highlights( + runs.iter() + .filter_map(|(range, id)| { + id.style(style.theme.syntax.as_ref()) + .map(|style| (range.clone(), style)) + }) + .collect(), + ) + .boxed() + } else { + Text::new(content.text.clone(), style.hover_popover.prose.clone()) + .with_soft_wrap(true) + .contained() + .with_style(style.hover_popover.block_style) + .boxed() + } + })); flex.contained() .with_style(style.hover_popover.container) - .boxed(), - ) + .boxed() + }) + .with_cursor_style(CursorStyle::Arrow) + .with_padding(Padding { + bottom: 5., + top: 5., + ..Default::default() + }) + .boxed(); + + (self.range.start, element) } } @@ -1489,7 +1507,7 @@ impl Editor { } } - self.hover_state.close(); + self.hide_hover(cx); if old_cursor_position.to_display_point(&display_map).row() != new_cursor_position.to_display_point(&display_map).row() @@ -1852,6 +1870,10 @@ impl Editor { return; } + if self.hide_hover(cx) { + return; + } + if self.hide_context_menu(cx).is_some() { return; } @@ -2480,49 +2502,65 @@ impl Editor { })) } - /// The hover action dispatches between `show_hover` or `hide_hover` + /// Bindable action which uses the most recent selection head to trigger a hover + fn hover(&mut self, _: &Hover, cx: &mut ViewContext) { + let head = self.selections.newest_display(cx).head(); + self.show_hover(head, true, cx); + } + + /// The internal hover action dispatches between `show_hover` or `hide_hover` /// depending on whether a point to hover over is provided. - fn hover(&mut self, action: &Hover, cx: &mut ViewContext) { + fn hover_at(&mut self, action: &HoverAt, cx: &mut ViewContext) { if let Some(point) = action.point { - self.show_hover(point, cx); + self.show_hover(point, false, cx); } else { self.hide_hover(cx); } } - /// Hides the type information popup ASAP. - /// Triggered by the `Hover` action when the cursor is not over a symbol. - fn hide_hover(&mut self, cx: &mut ViewContext) { - let task = cx.spawn_weak(|this, mut cx| { - async move { - if let Some(this) = this.upgrade(&cx) { - this.update(&mut cx, |this, cx| { - // consistently keep track of state to make handoff smooth - let (_recent_hover, _in_grace) = this.hover_state.determine_state(false); + /// Hides the type information popup. + /// Triggered by the `Hover` action when the cursor is not over a symbol or when the + /// selecitons changed. + fn hide_hover(&mut self, cx: &mut ViewContext) -> bool { + // consistently keep track of state to make handoff smooth + self.hover_state.determine_state(false); - // only notify the context once - if this.hover_state.popover.is_some() { - this.hover_state.popover = None; - cx.notify(); - } - }); - } - Ok(()) - } - .log_err() - }); + let mut did_hide = false; - self.hover_task = Some(task); + // only notify the context once + if self.hover_state.popover.is_some() { + self.hover_state.popover = None; + did_hide = true; + cx.notify(); + } + + self.clear_background_highlights::(cx); + + self.hover_task = None; + + did_hide } /// Queries the LSP and shows type info and documentation /// about the symbol the mouse is currently hovering over. /// Triggered by the `Hover` action when the cursor may be over a symbol. - fn show_hover(&mut self, point: DisplayPoint, cx: &mut ViewContext) { + fn show_hover( + &mut self, + point: DisplayPoint, + ignore_timeout: bool, + cx: &mut ViewContext, + ) { if self.pending_rename.is_some() { return; } + if let Some(hover) = &self.hover_state.popover { + if hover.hover_point == point { + // Hover triggered from same location as last time. Don't show again. + return; + } + } + let snapshot = self.snapshot(cx); let (buffer, buffer_position) = if let Some(output) = self .buffer @@ -2534,15 +2572,6 @@ impl Editor { return; }; - let buffer_snapshot = buffer.read(cx).snapshot(); - - if let Some(existing_popover) = &self.hover_state.popover { - if existing_popover.range.contains(&point) { - // Hover already contains value. No need to request a new one - return; - } - } - let project = if let Some(project) = self.project.clone() { project } else { @@ -2550,49 +2579,44 @@ impl Editor { }; // query the LSP for hover info - let hover = project.update(cx, |project, cx| { + let hover_request = project.update(cx, |project, cx| { project.hover(&buffer, buffer_position.clone(), cx) }); + let buffer_snapshot = buffer.read(cx).snapshot(); + let task = cx.spawn_weak(|this, mut cx| { async move { - let mut contents = None; - - let hover = match hover.await { - Ok(hover) => hover, - Err(_) => None, - }; + // Construct new hover popover from hover request + let hover_popover = hover_request.await.ok().flatten().and_then(|hover_result| { + if hover_result.contents.is_empty() { + return None; + } - let mut symbol_range = point..point; + let range = if let Some(range) = hover_result.range { + let offset_range = range.to_offset(&buffer_snapshot); + if !offset_range + .contains(&point.to_offset(&snapshot.display_snapshot, Bias::Left)) + { + return None; + } - // determine the contents of the popover - if let Some(hover) = hover { - if hover.contents.is_empty() { - contents = None; + offset_range + .start + .to_display_point(&snapshot.display_snapshot) + ..offset_range + .end + .to_display_point(&snapshot.display_snapshot) } else { - contents = Some(hover.contents); - - if let Some(range) = hover.range { - let offset_range = range.to_offset(&buffer_snapshot); - if offset_range - .contains(&point.to_offset(&snapshot.display_snapshot, Bias::Left)) - { - symbol_range = offset_range - .start - .to_display_point(&snapshot.display_snapshot) - ..offset_range - .end - .to_display_point(&snapshot.display_snapshot); - } else { - contents = None; - } - } - } - }; + point..point + }; - let hover_popover = contents.map(|contents| HoverPopover { - range: symbol_range, - contents, + Some(HoverPopover { + project: project.clone(), + hover_point: point, + range, + contents: hover_result.contents, + }) }); if let Some(this) = this.upgrade(&cx) { @@ -2612,7 +2636,32 @@ impl Editor { // `smooth_handoff` and `in_grace` determine whether to switch right away. // `recent_hover` will activate the handoff after the initial delay. - if (smooth_handoff || !recent_hover || in_grace) && visible { + // `ignore_timeout` is set when the user manually sent the hover action. + if (ignore_timeout || smooth_handoff || !recent_hover || in_grace) + && visible + { + // Highlight the selected symbol using a background highlight + if let Some(display_range) = + hover_popover.as_ref().map(|popover| popover.range.clone()) + { + let start = snapshot.display_snapshot.buffer_snapshot.anchor_after( + display_range + .start + .to_offset(&snapshot.display_snapshot, Bias::Right), + ); + let end = snapshot.display_snapshot.buffer_snapshot.anchor_before( + display_range + .end + .to_offset(&snapshot.display_snapshot, Bias::Left), + ); + + this.highlight_background::( + vec![start..end], + |theme| theme.editor.hover_popover.highlight, + cx, + ); + } + this.hover_state.popover = hover_popover; cx.notify(); } @@ -2869,18 +2918,11 @@ impl Editor { ) -> Option<(DisplayPoint, ElementBox)> { self.context_menu .as_ref() - .map(|menu| menu.render(cursor_position, style)) + .map(|menu| menu.render(cursor_position, style, cx)) } - pub fn render_hover_popover( - &self, - style: EditorStyle, - project: &Project, - ) -> Option<(DisplayPoint, ElementBox)> { - self.hover_state - .popover - .as_ref() - .map(|hover| hover.render(style, project)) + pub(crate) fn hover_popover(&self) -> Option { + self.hover_state.popover.clone() } fn show_context_menu(&mut self, menu: ContextMenu, cx: &mut ViewContext) { @@ -4963,7 +5005,6 @@ impl Editor { // Position the selection in the rename editor so that it matches the current selection. this.show_local_selections = false; let rename_editor = cx.add_view(|cx| { - println!("Rename editor created."); let mut editor = Editor::single_line(None, cx); if let Some(old_highlight_id) = old_highlight_id { editor.override_text_style = diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index aa109783b2226e5ccd10bba5dfdebdf1c1e20531..41f06f0723c9bdcc82992233e575db8a29965e30 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -5,7 +5,7 @@ use super::{ }; use crate::{ display_map::{DisplaySnapshot, TransformBlock}, - EditorStyle, GoToDefinition, Hover, + EditorStyle, GoToDefinition, HoverAt, }; use clock::ReplicaId; use collections::{BTreeMap, HashMap}; @@ -509,36 +509,31 @@ impl EditorElement { } if let Some((position, hover_popover)) = layout.hover.as_mut() { - if position.row() >= start_row { - if let Some(cursor_row_layout) = &layout - .line_layouts - .get((position.row() - start_row) as usize) - { - cx.scene.push_stacking_context(None); - - let size = hover_popover.size(); - let x = cursor_row_layout.x_for_index(position.column() as usize) - scroll_left; - let y = position.row() as f32 * layout.line_height - scroll_top - size.y(); - let mut popover_origin = content_origin + vec2f(x, y); - - if popover_origin.y() < 0.0 { - popover_origin.set_y(popover_origin.y() + layout.line_height + size.y()); - } + cx.scene.push_stacking_context(None); - let x_out_of_bounds = bounds.max_x() - (popover_origin.x() + size.x()); - if x_out_of_bounds < 0.0 { - popover_origin.set_x(popover_origin.x() + x_out_of_bounds); - } + // This is safe because we check on layout whether the required row is available + let hovered_row_layout = &layout.line_layouts[(position.row() - start_row) as usize]; + let size = hover_popover.size(); + let x = hovered_row_layout.x_for_index(position.column() as usize) - scroll_left; + let y = position.row() as f32 * layout.line_height - scroll_top - size.y(); + let mut popover_origin = content_origin + vec2f(x, y); - hover_popover.paint( - popover_origin, - RectF::from_points(Vector2F::zero(), vec2f(f32::MAX, f32::MAX)), // Let content bleed outside of editor - cx, - ); + if popover_origin.y() < 0.0 { + popover_origin.set_y(popover_origin.y() + layout.line_height + size.y()); + } - cx.scene.pop_stacking_context(); - } + let x_out_of_bounds = bounds.max_x() - (popover_origin.x() + size.x()); + if x_out_of_bounds < 0.0 { + popover_origin.set_x(popover_origin.x() + x_out_of_bounds); } + + hover_popover.paint( + popover_origin, + RectF::from_points(Vector2F::zero(), vec2f(f32::MAX, f32::MAX)), // Let content bleed outside of editor + cx, + ); + + cx.scene.pop_stacking_context(); } cx.scene.pop_layer(); @@ -1114,7 +1109,6 @@ impl Element for EditorElement { let mut context_menu = None; let mut code_actions_indicator = None; - let mut hover = None; cx.render(&self.view.upgrade(cx).unwrap(), |view, cx| { let newest_selection_head = view .selections @@ -1125,18 +1119,14 @@ impl Element for EditorElement { let style = view.style(cx); if (start_row..end_row).contains(&newest_selection_head.row()) { if view.context_menu_visible() { - context_menu = view.render_context_menu(newest_selection_head, style.clone()); + context_menu = + view.render_context_menu(newest_selection_head, style.clone(), cx); } code_actions_indicator = view .render_code_actions_indicator(&style, cx) .map(|indicator| (newest_selection_head.row(), indicator)); } - - if let Some(project) = view.project.clone() { - let project = project.read(cx); - hover = view.render_hover_popover(style, project); - } }); if let Some((_, context_menu)) = context_menu.as_mut() { @@ -1159,18 +1149,27 @@ impl Element for EditorElement { ); } - if let Some((_, hover)) = hover.as_mut() { - hover.layout( - SizeConstraint { - min: Vector2F::zero(), - max: vec2f( - (120. * em_width).min(size.x()), - (size.y() - line_height) * 3. / 2., - ), - }, - cx, - ); - } + let hover = self.view(cx).hover_popover().and_then(|hover| { + let (point, mut rendered) = hover.render(style.clone(), cx); + + if point.row() >= snapshot.scroll_position().y() as u32 { + if line_layouts.len() > (point.row() - start_row) as usize { + rendered.layout( + SizeConstraint { + min: Vector2F::zero(), + max: vec2f( + (120. * em_width).min(size.x()), + (size.y() - line_height) * 1. / 2., + ), + }, + cx, + ); + return Some((point, rendered)); + } + } + + None + }); let blocks = self.layout_blocks( start_row..end_row, @@ -1270,6 +1269,12 @@ impl Element for EditorElement { } } + if let Some((_, hover)) = &mut layout.hover { + if hover.dispatch_event(event, cx) { + return true; + } + } + for (_, block) in &mut layout.blocks { if block.dispatch_event(event, cx) { return true; @@ -1317,7 +1322,7 @@ impl Element for EditorElement { None }; - cx.dispatch_action(Hover { point }); + cx.dispatch_action(HoverAt { point }); true } _ => false, diff --git a/crates/editor/src/selections_collection.rs b/crates/editor/src/selections_collection.rs index 7041062133666a645c3ff18212af2945c918937e..f99384bd799b70b72edf6b0fffb0d8fca79255b4 100644 --- a/crates/editor/src/selections_collection.rs +++ b/crates/editor/src/selections_collection.rs @@ -195,6 +195,14 @@ impl SelectionsCollection { resolve(self.newest_anchor(), &self.buffer(cx)) } + pub fn newest_display(&self, cx: &mut MutableAppContext) -> Selection { + let display_map = self.display_map(cx); + let selection = self + .newest_anchor() + .map(|point| point.to_display_point(&display_map)); + selection + } + pub fn oldest_anchor(&self) -> &Selection { self.disjoint .iter() diff --git a/crates/gpui/src/elements/flex.rs b/crates/gpui/src/elements/flex.rs index 8d1fb37a08b0afafdb3ea2671bb14d9bdb7e4317..82a6299d10d07537cca26e179902e2b5b9af4f84 100644 --- a/crates/gpui/src/elements/flex.rs +++ b/crates/gpui/src/elements/flex.rs @@ -319,6 +319,17 @@ impl Element for Flex { } } } + + if !handled { + if let &Event::MouseMoved { position, .. } = event { + // If this is a scrollable flex, and the mouse is over it, eat the scroll event to prevent + // propogating it to the element below. + if self.scroll_state.is_some() && bounds.contains_point(position) { + handled = true; + } + } + } + handled } diff --git a/crates/gpui/src/presenter.rs b/crates/gpui/src/presenter.rs index 720e9e90b5ad314af5f7a9b8eace771538ec6213..eb7f3514443a0cffcb661ab3d2815e15531a0648 100644 --- a/crates/gpui/src/presenter.rs +++ b/crates/gpui/src/presenter.rs @@ -160,7 +160,12 @@ impl Presenter { if cx.window_is_active(self.window_id) { if let Some(event) = self.last_mouse_moved_event.clone() { - self.dispatch_event(event, cx) + let mut invalidated_views = Vec::new(); + self.handle_hover_events(&event, &mut invalidated_views, cx); + + for view_id in invalidated_views { + cx.notify_view(self.window_id, view_id); + } } } } else { @@ -222,8 +227,6 @@ impl Presenter { pub fn dispatch_event(&mut self, event: Event, cx: &mut MutableAppContext) { if let Some(root_view_id) = cx.root_view_id(self.window_id) { let mut invalidated_views = Vec::new(); - let mut hovered_regions = Vec::new(); - let mut unhovered_regions = Vec::new(); let mut mouse_down_out_handlers = Vec::new(); let mut mouse_down_region = None; let mut clicked_region = None; @@ -288,46 +291,8 @@ impl Presenter { } } } - Event::MouseMoved { - position, - left_mouse_down, - } => { + Event::MouseMoved { .. } => { self.last_mouse_moved_event = Some(event.clone()); - - if !left_mouse_down { - let mut style_to_assign = CursorStyle::Arrow; - for region in self.cursor_regions.iter().rev() { - if region.bounds.contains_point(position) { - style_to_assign = region.style; - break; - } - } - cx.platform().set_cursor_style(style_to_assign); - - let mut hover_depth = None; - for (region, depth) in self.mouse_regions.iter().rev() { - if region.bounds.contains_point(position) - && hover_depth.map_or(true, |hover_depth| hover_depth == *depth) - { - hover_depth = Some(*depth); - if let Some(region_id) = region.id() { - if !self.hovered_region_ids.contains(®ion_id) { - invalidated_views.push(region.view_id); - hovered_regions.push((region.clone(), position)); - self.hovered_region_ids.insert(region_id); - } - } - } else { - if let Some(region_id) = region.id() { - if self.hovered_region_ids.contains(®ion_id) { - invalidated_views.push(region.view_id); - unhovered_regions.push((region.clone(), position)); - self.hovered_region_ids.remove(®ion_id); - } - } - } - } - } } Event::LeftMouseDragged { position } => { if let Some((clicked_region, prev_drag_position)) = self @@ -348,25 +313,8 @@ impl Presenter { _ => {} } - let mut event_cx = self.build_event_context(cx); - let mut handled = false; - for (unhovered_region, position) in unhovered_regions { - handled = true; - if let Some(hover_callback) = unhovered_region.hover { - event_cx.with_current_view(unhovered_region.view_id, |event_cx| { - hover_callback(position, false, event_cx); - }) - } - } - - for (hovered_region, position) in hovered_regions { - handled = true; - if let Some(hover_callback) = hovered_region.hover { - event_cx.with_current_view(hovered_region.view_id, |event_cx| { - hover_callback(position, true, event_cx); - }) - } - } + let (mut handled, mut event_cx) = + self.handle_hover_events(&event, &mut invalidated_views, cx); for (handler, view_id, position) in mouse_down_out_handlers { event_cx.with_current_view(view_id, |event_cx| handler(position, event_cx)) @@ -439,6 +387,80 @@ impl Presenter { } } + fn handle_hover_events<'a>( + &'a mut self, + event: &Event, + invalidated_views: &mut Vec, + cx: &'a mut MutableAppContext, + ) -> (bool, EventContext<'a>) { + let mut unhovered_regions = Vec::new(); + let mut hovered_regions = Vec::new(); + + if let Event::MouseMoved { + position, + left_mouse_down, + } = event + { + if !left_mouse_down { + let mut style_to_assign = CursorStyle::Arrow; + for region in self.cursor_regions.iter().rev() { + if region.bounds.contains_point(*position) { + style_to_assign = region.style; + break; + } + } + cx.platform().set_cursor_style(style_to_assign); + + let mut hover_depth = None; + for (region, depth) in self.mouse_regions.iter().rev() { + if region.bounds.contains_point(*position) + && hover_depth.map_or(true, |hover_depth| hover_depth == *depth) + { + hover_depth = Some(*depth); + if let Some(region_id) = region.id() { + if !self.hovered_region_ids.contains(®ion_id) { + invalidated_views.push(region.view_id); + hovered_regions.push((region.clone(), position)); + self.hovered_region_ids.insert(region_id); + } + } + } else { + if let Some(region_id) = region.id() { + if self.hovered_region_ids.contains(®ion_id) { + invalidated_views.push(region.view_id); + unhovered_regions.push((region.clone(), position)); + self.hovered_region_ids.remove(®ion_id); + } + } + } + } + } + } + + let mut event_cx = self.build_event_context(cx); + let mut handled = false; + + for (unhovered_region, position) in unhovered_regions { + handled = true; + if let Some(hover_callback) = unhovered_region.hover { + event_cx.with_current_view(unhovered_region.view_id, |event_cx| { + hover_callback(*position, false, event_cx); + }) + } + } + + for (hovered_region, position) in hovered_regions { + handled = true; + if let Some(hover_callback) = hovered_region.hover { + event_cx.with_current_view(hovered_region.view_id, |event_cx| { + hover_callback(*position, true, event_cx); + }) + } + } + + (handled, event_cx) + } + pub fn build_event_context<'a>( &'a mut self, cx: &'a mut MutableAppContext, diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index d04bb6a7df9de03be1dc01a46a7fec0cc752913e..bd324602f0eb60efae7d5a0bb19934bf9ef24f55 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -984,6 +984,7 @@ impl LspCommand for GetHover { _: ModelHandle, _: AsyncAppContext, ) -> Result { + println!("Response from proto"); let range = if let (Some(start), Some(end)) = (message.start, message.end) { language::proto::deserialize_anchor(start) .and_then(|start| language::proto::deserialize_anchor(end).map(|end| start..end)) diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index e836202bf7a4d22d65e20abf225df19f4e1f8657..f4ce763cb787fc277fe619ddae88e12d8ea6e1d9 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -219,7 +219,7 @@ pub struct Symbol { pub signature: [u8; 32], } -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct HoverBlock { pub text: String, pub language: Option, @@ -2926,7 +2926,6 @@ impl Project { position: T, cx: &mut ModelContext, ) -> Task>> { - // TODO: proper return type let position = position.to_point_utf16(buffer.read(cx)); self.request_lsp(buffer.clone(), GetHover { position }, cx) } @@ -3767,8 +3766,10 @@ impl Project { } else if let Some(project_id) = self.remote_id() { let rpc = self.client.clone(); let message = request.to_proto(project_id, buffer); + dbg!(&message); return cx.spawn(|this, cx| async move { let response = rpc.request(message).await?; + dbg!(&response); request .response_from_proto(response, this, buffer_handle, cx) .await diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index d5c9beaec3a7349ca1b634cf8dc4bb344849162a..a1c8066e8d3eca91f6dc13073252942b159cd4a0 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -629,4 +629,5 @@ pub struct HoverPopover { pub container: ContainerStyle, pub block_style: ContainerStyle, pub prose: TextStyle, + pub highlight: Color, } diff --git a/styles/src/styleTree/hoverPopover.ts b/styles/src/styleTree/hoverPopover.ts index 2bc8c327300e070d43b00c6eaaf51df26dd32411..38b47630e2f24ce01f74de40b36c390c58b827af 100644 --- a/styles/src/styleTree/hoverPopover.ts +++ b/styles/src/styleTree/hoverPopover.ts @@ -21,6 +21,7 @@ export default function HoverPopover(theme: Theme) { block_style: { padding: { top: 4 }, }, - prose: text(theme, "sans", "primary", { "size": "sm" }) + prose: text(theme, "sans", "primary", { "size": "sm" }), + highlight: theme.editor.highlight.occurrence.value, } } \ No newline at end of file From 1b66e1e185802e63c7c7f1dfe2f74f13ef49c717 Mon Sep 17 00:00:00 2001 From: Keith Simmons Date: Tue, 7 Jun 2022 14:22:02 -0700 Subject: [PATCH 14/14] Add integration test and fix hovering over the wire --- crates/collab/src/integration_tests.rs | 98 ++++++++++++++++++++++++++ crates/collab/src/rpc.rs | 1 + crates/editor/src/editor.rs | 15 ++-- crates/editor/src/element.rs | 83 +++++++++++++--------- crates/project/src/lsp_command.rs | 6 +- crates/project/src/project.rs | 4 +- styles/src/styleTree/contextMenu.ts | 4 +- styles/src/styleTree/tooltip.ts | 4 +- 8 files changed, 165 insertions(+), 50 deletions(-) diff --git a/crates/collab/src/integration_tests.rs b/crates/collab/src/integration_tests.rs index d335aabbe460260d880b6b2c2cfda2a9f837bcd1..cf9e7ec8a72e53edcce7cf77452052564fd67982 100644 --- a/crates/collab/src/integration_tests.rs +++ b/crates/collab/src/integration_tests.rs @@ -2281,6 +2281,104 @@ async fn test_document_highlights(cx_a: &mut TestAppContext, cx_b: &mut TestAppC }); } +#[gpui::test(iterations = 10)] +async fn test_lsp_hover(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) { + cx_a.foreground().forbid_parking(); + let mut server = TestServer::start(cx_a.foreground(), cx_a.background()).await; + let client_a = server.create_client(cx_a, "user_a").await; + let client_b = server.create_client(cx_b, "user_b").await; + server + .make_contacts(vec![(&client_a, cx_a), (&client_b, cx_b)]) + .await; + + client_a + .fs + .insert_tree( + "/root-1", + json!({ + "main.rs": "use std::collections::HashMap;", + }), + ) + .await; + + // Set up a fake language server. + let mut language = Language::new( + LanguageConfig { + name: "Rust".into(), + path_suffixes: vec!["rs".to_string()], + ..Default::default() + }, + Some(tree_sitter_rust::language()), + ); + let mut fake_language_servers = language.set_fake_lsp_adapter(Default::default()); + client_a.language_registry.add(Arc::new(language)); + + let (project_a, worktree_id) = client_a.build_local_project("/root-1", cx_a).await; + let project_b = client_b.build_remote_project(&project_a, cx_a, cx_b).await; + + // Open the file as the guest + let buffer_b = cx_b + .background() + .spawn(project_b.update(cx_b, |p, cx| p.open_buffer((worktree_id, "main.rs"), cx))) + .await + .unwrap(); + + // Request hover information as the guest. + let fake_language_server = fake_language_servers.next().await.unwrap(); + fake_language_server.handle_request::( + |params, _| async move { + assert_eq!( + params + .text_document_position_params + .text_document + .uri + .as_str(), + "file:///root-1/main.rs" + ); + assert_eq!( + params.text_document_position_params.position, + lsp::Position::new(0, 22) + ); + Ok(Some(lsp::Hover { + contents: lsp::HoverContents::Array(vec![ + lsp::MarkedString::String("Test hover content.".to_string()), + lsp::MarkedString::LanguageString(lsp::LanguageString { + language: "Rust".to_string(), + value: "let foo = 42;".to_string(), + }), + ]), + range: Some(lsp::Range::new( + lsp::Position::new(0, 22), + lsp::Position::new(0, 29), + )), + })) + }, + ); + + let hover_info = project_b + .update(cx_b, |p, cx| p.hover(&buffer_b, 22, cx)) + .await + .unwrap() + .unwrap(); + buffer_b.read_with(cx_b, |buffer, _| { + let snapshot = buffer.snapshot(); + assert_eq!(hover_info.range.unwrap().to_offset(&snapshot), 22..29); + assert_eq!( + hover_info.contents, + vec![ + project::HoverBlock { + text: "Test hover content.".to_string(), + language: None, + }, + project::HoverBlock { + text: "let foo = 42;".to_string(), + language: Some("Rust".to_string()), + } + ] + ); + }); +} + #[gpui::test(iterations = 10)] async fn test_project_symbols(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) { cx_a.foreground().forbid_parking(); diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 407911c390c776c30ba75d83bc99a78b1f87ccec..40ce95bce61fb7181fae8f4cd644234281b6cacf 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -150,6 +150,7 @@ impl Server { .add_message_handler(Server::start_language_server) .add_message_handler(Server::update_language_server) .add_message_handler(Server::update_diagnostic_summary) + .add_request_handler(Server::forward_project_request::) .add_request_handler(Server::forward_project_request::) .add_request_handler(Server::forward_project_request::) .add_request_handler(Server::forward_project_request::) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 357db59a23777b8460761078200757aea08e7ba0..20bc53db377ce25c029cd6cd128a947c89cc5c49 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -25,9 +25,9 @@ use gpui::{ geometry::vector::{vec2f, Vector2F}, impl_actions, impl_internal_actions, platform::CursorStyle, - text_layout, AppContext, AsyncAppContext, Axis, ClipboardItem, Element, ElementBox, - ElementStateContext, Entity, ModelHandle, MutableAppContext, ReadModel, RenderContext, Task, - View, ViewContext, ViewHandle, WeakViewHandle, + text_layout, AppContext, AsyncAppContext, Axis, ClipboardItem, Element, ElementBox, Entity, + ModelHandle, MutableAppContext, RenderContext, Task, View, ViewContext, ViewHandle, + WeakViewHandle, }; pub use language::{char_kind, CharKind}; use language::{ @@ -80,7 +80,7 @@ pub struct Scroll(pub Vector2F); #[derive(Clone, PartialEq)] pub struct Select(pub SelectPhase); -#[derive(Clone)] +#[derive(Clone, PartialEq)] pub struct HoverAt { point: Option, } @@ -215,7 +215,7 @@ impl_actions!( ] ); -impl_internal_actions!(editor, [Scroll, Select, HoverAt, GoToDefinitionAt]); +impl_internal_actions!(editor, [Scroll, Select, HoverAt]); enum DocumentHighlightRead {} enum DocumentHighlightWrite {} @@ -645,7 +645,6 @@ impl ContextMenu { match self { ContextMenu::Completions(menu) => (cursor_position, menu.render(style, cx)), ContextMenu::CodeActions(menu) => menu.render(cursor_position, style, cx), - ContextMenu::Hover(popover) => (cursor_position, popover.render(style)), } } } @@ -899,10 +898,10 @@ pub(crate) struct HoverPopover { } impl HoverPopover { - fn render( + fn render( &self, style: EditorStyle, - cx: &mut C, + cx: &mut RenderContext, ) -> (DisplayPoint, ElementBox) { let element = MouseEventHandler::new::(0, cx, |_, cx| { let mut flex = Flex::new(Axis::Vertical).scrollable::(1, None, cx); diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 41f06f0723c9bdcc82992233e575db8a29965e30..594c047d5b3e1119c775b43b90309209d2b92ef1 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -5,7 +5,7 @@ use super::{ }; use crate::{ display_map::{DisplaySnapshot, TransformBlock}, - EditorStyle, GoToDefinition, HoverAt, + EditorStyle, HoverAt, }; use clock::ReplicaId; use collections::{BTreeMap, HashMap}; @@ -102,7 +102,7 @@ impl EditorElement { fn mouse_down( &self, position: Vector2F, - cmd: bool, + _: bool, alt: bool, shift: bool, mut click_count: usize, @@ -119,11 +119,7 @@ impl EditorElement { let snapshot = self.snapshot(cx.app); let (position, overshoot) = paint.point_for_position(&snapshot, layout, position); - if cmd { - cx.dispatch_action(GoToDefinitionAt { - location: Some(position), - }); - } else if shift && alt { + if shift && alt { cx.dispatch_action(Select(SelectPhase::BeginColumnar { position, overshoot: overshoot.column(), @@ -354,6 +350,7 @@ impl EditorElement { bounds: RectF, visible_bounds: RectF, layout: &mut LayoutState, + paint: &mut PaintState, cx: &mut PaintContext, ) { let view = self.view(cx.app); @@ -533,6 +530,10 @@ impl EditorElement { cx, ); + paint.hover_bounds = Some( + RectF::new(popover_origin, hover_popover.size()).dilate(Vector2F::new(0., 5.)), + ); + cx.scene.pop_stacking_context(); } @@ -1109,6 +1110,7 @@ impl Element for EditorElement { let mut context_menu = None; let mut code_actions_indicator = None; + let mut hover = None; cx.render(&self.view.upgrade(cx).unwrap(), |view, cx| { let newest_selection_head = view .selections @@ -1127,6 +1129,17 @@ impl Element for EditorElement { .render_code_actions_indicator(&style, cx) .map(|indicator| (newest_selection_head.row(), indicator)); } + + hover = view.hover_popover().and_then(|hover| { + let (point, rendered) = hover.render(style.clone(), cx); + if point.row() >= snapshot.scroll_position().y() as u32 { + if line_layouts.len() > (point.row() - start_row) as usize { + return Some((point, rendered)); + } + } + + None + }); }); if let Some((_, context_menu)) = context_menu.as_mut() { @@ -1149,27 +1162,18 @@ impl Element for EditorElement { ); } - let hover = self.view(cx).hover_popover().and_then(|hover| { - let (point, mut rendered) = hover.render(style.clone(), cx); - - if point.row() >= snapshot.scroll_position().y() as u32 { - if line_layouts.len() > (point.row() - start_row) as usize { - rendered.layout( - SizeConstraint { - min: Vector2F::zero(), - max: vec2f( - (120. * em_width).min(size.x()), - (size.y() - line_height) * 1. / 2., - ), - }, - cx, - ); - return Some((point, rendered)); - } - } - - None - }); + if let Some((_, hover)) = hover.as_mut() { + hover.layout( + SizeConstraint { + min: Vector2F::zero(), + max: vec2f( + (120. * em_width).min(size.x()), + (size.y() - line_height) * 1. / 2., + ), + }, + cx, + ); + } let blocks = self.layout_blocks( start_row..end_row, @@ -1227,11 +1231,18 @@ impl Element for EditorElement { layout.text_size, ); + let mut paint_state = PaintState { + bounds, + gutter_bounds, + text_bounds, + hover_bounds: None, + }; + self.paint_background(gutter_bounds, text_bounds, layout, cx); if layout.gutter_size.x() > 0. { self.paint_gutter(gutter_bounds, visible_bounds, layout, cx); } - self.paint_text(text_bounds, visible_bounds, layout, cx); + self.paint_text(text_bounds, visible_bounds, layout, &mut paint_state, cx); if !layout.blocks.is_empty() { cx.scene.push_layer(Some(bounds)); @@ -1241,11 +1252,7 @@ impl Element for EditorElement { cx.scene.pop_layer(); - PaintState { - bounds, - gutter_bounds, - text_bounds, - } + paint_state } fn dispatch_event( @@ -1310,6 +1317,13 @@ impl Element for EditorElement { } => self.scroll(*position, *delta, *precise, layout, paint, cx), Event::KeyDown { input, .. } => self.key_down(input.as_deref(), cx), Event::MouseMoved { position, .. } => { + if paint + .hover_bounds + .map_or(false, |hover_bounds| hover_bounds.contains_point(*position)) + { + return false; + } + let point = if paint.text_bounds.contains_point(*position) { let (point, overshoot) = paint.point_for_position(&self.snapshot(cx), layout, *position); @@ -1401,6 +1415,7 @@ pub struct PaintState { bounds: RectF, gutter_bounds: RectF, text_bounds: RectF, + hover_bounds: Option, } impl PaintState { diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index bd324602f0eb60efae7d5a0bb19934bf9ef24f55..0a5a4946df0087b06254135299e57376a43b8d69 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -857,6 +857,9 @@ impl LspCommand for GetHover { let mut current_text = String::new(); for event in Parser::new_ext(&markup_content.value, Options::all()) { match event { + Event::SoftBreak => { + current_text.push(' '); + } Event::Text(text) | Event::Code(text) => { current_text.push_str(&text.to_string()); } @@ -875,7 +878,8 @@ impl LspCommand for GetHover { Event::End(Tag::CodeBlock(_)) | Event::End(Tag::Paragraph) | Event::End(Tag::Heading(_, _, _)) - | Event::End(Tag::BlockQuote) => { + | Event::End(Tag::BlockQuote) + | Event::HardBreak => { if !current_text.is_empty() { let text = std::mem::replace(&mut current_text, String::new()); contents.push(HoverBlock { text, language }); diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index f4ce763cb787fc277fe619ddae88e12d8ea6e1d9..da123726ce75a7c114b9facf61b9c84d4dba9903 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -219,7 +219,7 @@ pub struct Symbol { pub signature: [u8; 32], } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub struct HoverBlock { pub text: String, pub language: Option, @@ -3766,10 +3766,8 @@ impl Project { } else if let Some(project_id) = self.remote_id() { let rpc = self.client.clone(); let message = request.to_proto(project_id, buffer); - dbg!(&message); return cx.spawn(|this, cx| async move { let response = rpc.request(message).await?; - dbg!(&response); request .response_from_proto(response, this, buffer_handle, cx) .await diff --git a/styles/src/styleTree/contextMenu.ts b/styles/src/styleTree/contextMenu.ts index eeade2d050aab7d96b266307c72e1d76534af452..f6197930d49530e4dd463225f3c07a094a85368a 100644 --- a/styles/src/styleTree/contextMenu.ts +++ b/styles/src/styleTree/contextMenu.ts @@ -1,12 +1,12 @@ import Theme from "../themes/common/theme"; -import { backgroundColor, border, borderColor, shadow, text } from "./components"; +import { backgroundColor, border, borderColor, popoverShadow, text } from "./components"; export default function contextMenu(theme: Theme) { return { background: backgroundColor(theme, 300, "base"), cornerRadius: 6, padding: 6, - shadow: shadow(theme), + shadow: popoverShadow(theme), border: border(theme, "primary"), item: { padding: { left: 4, right: 4, top: 2, bottom: 2 }, diff --git a/styles/src/styleTree/tooltip.ts b/styles/src/styleTree/tooltip.ts index bfceae168eaeb3e09997f4a6e6d064422dc04b21..c395b9ff3d398ee867cb77422b859013278bee39 100644 --- a/styles/src/styleTree/tooltip.ts +++ b/styles/src/styleTree/tooltip.ts @@ -1,5 +1,5 @@ import Theme from "../themes/common/theme"; -import { backgroundColor, border, shadow, text } from "./components"; +import { backgroundColor, border, popoverShadow, text } from "./components"; export default function tooltip(theme: Theme) { return { @@ -7,7 +7,7 @@ export default function tooltip(theme: Theme) { border: border(theme, "secondary"), padding: { top: 4, bottom: 4, left: 8, right: 8 }, margin: { top: 6, left: 6 }, - shadow: shadow(theme), + shadow: popoverShadow(theme), cornerRadius: 6, text: text(theme, "sans", "secondary", { size: "xs", weight: "bold" }), keystroke: {