From 3f7533a0b482eb19682cc4049b3b897073c02c01 Mon Sep 17 00:00:00 2001 From: Julia Date: Wed, 26 Apr 2023 15:46:20 -0400 Subject: [PATCH] Show source of diagnostic hovers --- crates/editor/src/hover_popover.rs | 18 +++++++++++++++--- crates/language/src/buffer.rs | 2 ++ crates/language/src/proto.rs | 2 ++ crates/project/src/project.rs | 2 ++ crates/rpc/proto/zed.proto | 17 +++++++++-------- crates/rpc/src/rpc.rs | 2 +- crates/theme/src/theme.rs | 1 + crates/zed/src/languages.rs | 23 +++++++++++++---------- styles/src/styleTree/hoverPopover.ts | 5 +++-- 9 files changed, 48 insertions(+), 24 deletions(-) diff --git a/crates/editor/src/hover_popover.rs b/crates/editor/src/hover_popover.rs index 43c93cf33bd6119dfc3addf01160e719c4ae0eb2..df2570a8ef4daad1ce2a2ef624553d20c03257a6 100644 --- a/crates/editor/src/hover_popover.rs +++ b/crates/editor/src/hover_popover.rs @@ -1,7 +1,7 @@ use futures::FutureExt; use gpui::{ actions, - elements::{Flex, MouseEventHandler, Padding, Text}, + elements::{Flex, MouseEventHandler, Padding, ParentElement, Text}, impl_internal_actions, platform::{CursorStyle, MouseButton}, AnyElement, AppContext, Axis, Element, ModelHandle, Task, ViewContext, @@ -378,6 +378,8 @@ impl DiagnosticPopover { let mut text_style = style.hover_popover.prose.clone(); text_style.font_size = style.text.font_size; + let mut diagnostic_source_style = style.hover_popover.diagnostic_source.clone(); + diagnostic_source_style.font_size = style.text.font_size; let container_style = match self.local_diagnostic.diagnostic.severity { DiagnosticSeverity::HINT => style.hover_popover.info_container, @@ -390,8 +392,18 @@ impl DiagnosticPopover { let tooltip_style = cx.global::().theme.tooltip.clone(); MouseEventHandler::::new(0, cx, |_, _| { - Text::new(self.local_diagnostic.diagnostic.message.clone(), text_style) - .with_soft_wrap(true) + Flex::row() + .with_children( + self.local_diagnostic + .diagnostic + .source + .as_ref() + .map(|source| Text::new(format!("{source}: "), diagnostic_source_style)), + ) + .with_child( + Text::new(self.local_diagnostic.diagnostic.message.clone(), text_style) + .with_soft_wrap(true), + ) .contained() .with_style(container_style) }) diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 65e4d3b8b6f0cc286a8d0f858351e63d7a94b8a2..32cbc260ec126d29e878d526d0db81aeec9b2f98 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -138,6 +138,7 @@ pub struct GroupId { #[derive(Clone, Debug, PartialEq, Eq)] pub struct Diagnostic { + pub source: Option, pub code: Option, pub severity: DiagnosticSeverity, pub message: String, @@ -2881,6 +2882,7 @@ impl operation_queue::Operation for Operation { impl Default for Diagnostic { fn default() -> Self { Self { + source: Default::default(), code: None, severity: DiagnosticSeverity::ERROR, message: Default::default(), diff --git a/crates/language/src/proto.rs b/crates/language/src/proto.rs index bf1d1dd2733e473211945d0683c526142d1eb05d..0de3f704c7f29e4d1cff8f3fe371d0fad36d1f42 100644 --- a/crates/language/src/proto.rs +++ b/crates/language/src/proto.rs @@ -173,6 +173,7 @@ pub fn serialize_diagnostics<'a>( diagnostics .into_iter() .map(|entry| proto::Diagnostic { + source: entry.diagnostic.source.clone(), start: Some(serialize_anchor(&entry.range.start)), end: Some(serialize_anchor(&entry.range.end)), message: entry.diagnostic.message.clone(), @@ -359,6 +360,7 @@ pub fn deserialize_diagnostics( Some(DiagnosticEntry { range: deserialize_anchor(diagnostic.start?)?..deserialize_anchor(diagnostic.end?)?, diagnostic: Diagnostic { + source: diagnostic.source, severity: match proto::diagnostic::Severity::from_i32(diagnostic.severity)? { proto::diagnostic::Severity::Error => DiagnosticSeverity::ERROR, proto::diagnostic::Severity::Warning => DiagnosticSeverity::WARNING, diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index d543f225b20fa2d87488ec832bc335907bef7ac7..3aa332696bc9d51f7ab6256b99558979c265e857 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -2954,6 +2954,7 @@ impl Project { diagnostics.push(DiagnosticEntry { range, diagnostic: Diagnostic { + source: diagnostic.source.clone(), code: code.clone(), severity: diagnostic.severity.unwrap_or(DiagnosticSeverity::ERROR), message: diagnostic.message.clone(), @@ -2971,6 +2972,7 @@ impl Project { diagnostics.push(DiagnosticEntry { range, diagnostic: Diagnostic { + source: diagnostic.source.clone(), code: code.clone(), severity: DiagnosticSeverity::INFORMATION, message: info.message.clone(), diff --git a/crates/rpc/proto/zed.proto b/crates/rpc/proto/zed.proto index 599d80e2bab87c3b923f028d4c6f73005226a2d9..ffd770901508b404023e8f2b31f952cf102a13bb 100644 --- a/crates/rpc/proto/zed.proto +++ b/crates/rpc/proto/zed.proto @@ -1049,14 +1049,15 @@ enum Bias { message Diagnostic { Anchor start = 1; Anchor end = 2; - Severity severity = 3; - string message = 4; - optional string code = 5; - uint64 group_id = 6; - bool is_primary = 7; - bool is_valid = 8; - bool is_disk_based = 9; - bool is_unnecessary = 10; + optional string source = 3; + Severity severity = 4; + string message = 5; + optional string code = 6; + uint64 group_id = 7; + bool is_primary = 8; + bool is_valid = 9; + bool is_disk_based = 10; + bool is_unnecessary = 11; enum Severity { None = 0; diff --git a/crates/rpc/src/rpc.rs b/crates/rpc/src/rpc.rs index f64e6bea4c0176c73464e791ee2c1096678d792a..b7cb59266c73ccf16a69ca0dce8051c4218e0c8d 100644 --- a/crates/rpc/src/rpc.rs +++ b/crates/rpc/src/rpc.rs @@ -6,4 +6,4 @@ pub use conn::Connection; pub use peer::*; mod macros; -pub const PROTOCOL_VERSION: u32 = 52; +pub const PROTOCOL_VERSION: u32 = 53; diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index b98dd5483e7234fb41753c31fc0a127e4942963c..6edf69d0541393681f61e786a6fdbbd49293422a 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -887,6 +887,7 @@ pub struct HoverPopover { pub error_container: ContainerStyle, pub block_style: ContainerStyle, pub prose: TextStyle, + pub diagnostic_source: TextStyle, pub highlight: Color, } diff --git a/crates/zed/src/languages.rs b/crates/zed/src/languages.rs index 9ab6e1d77805393aa3fbd41e43a0deba06d592a9..91b58f634b855743e8dd0421b317cbc5efe6b725 100644 --- a/crates/zed/src/languages.rs +++ b/crates/zed/src/languages.rs @@ -89,23 +89,26 @@ pub fn init( ( "tsx", tree_sitter_typescript::language_tsx(), - vec![adapter_arc(typescript::TypeScriptLspAdapter::new( - node_runtime.clone(), - ))], + vec![ + adapter_arc(typescript::TypeScriptLspAdapter::new(node_runtime.clone())), + adapter_arc(typescript::EsLintLspAdapter::new(node_runtime.clone())), + ], ), ( "typescript", tree_sitter_typescript::language_typescript(), - vec![adapter_arc(typescript::TypeScriptLspAdapter::new( - node_runtime.clone(), - ))], + vec![ + adapter_arc(typescript::TypeScriptLspAdapter::new(node_runtime.clone())), + adapter_arc(typescript::EsLintLspAdapter::new(node_runtime.clone())), + ], ), ( "javascript", tree_sitter_typescript::language_tsx(), - vec![adapter_arc(typescript::TypeScriptLspAdapter::new( - node_runtime.clone(), - ))], + vec![ + adapter_arc(typescript::TypeScriptLspAdapter::new(node_runtime.clone())), + adapter_arc(typescript::EsLintLspAdapter::new(node_runtime.clone())), + ], ), ( "html", @@ -132,7 +135,7 @@ pub fn init( ( "yaml", tree_sitter_yaml::language(), - vec![adapter_arc(yaml::YamlLspAdapter::new(node_runtime.clone()))], + vec![adapter_arc(yaml::YamlLspAdapter::new(node_runtime))], ), ]; diff --git a/styles/src/styleTree/hoverPopover.ts b/styles/src/styleTree/hoverPopover.ts index 032c53112b27f9f6f47f378a23ef59a9ea40ac53..31e1d807788e0d30ed03a498be27f73c86c08e90 100644 --- a/styles/src/styleTree/hoverPopover.ts +++ b/styles/src/styleTree/hoverPopover.ts @@ -1,5 +1,5 @@ import { ColorScheme } from "../themes/common/colorScheme" -import { background, border, text } from "./components" +import { background, border, foreground, text } from "./components" export default function HoverPopover(colorScheme: ColorScheme) { let layer = colorScheme.middle @@ -36,10 +36,11 @@ export default function HoverPopover(colorScheme: ColorScheme) { background: background(layer, "negative"), border: border(layer, "negative"), }, - block_style: { + blockStyle: { padding: { top: 4 }, }, prose: text(layer, "sans", { size: "sm" }), + diagnosticSource: text(layer, "sans", { size: "sm", underline: true, color: foreground(layer, "accent") }), highlight: colorScheme.ramps.neutral(0.5).alpha(0.2).hex(), // TODO: blend was used here. Replace with something better } }