@@ -230,7 +230,7 @@ impl LanguageServerState {
(
server_id,
(
- status.server_version.clone(),
+ status.server_readable_version.clone(),
status.binary.as_ref().map(|b| b.path.clone()),
status.process_id,
),
@@ -1355,6 +1355,7 @@ impl ServerInfo {
status: LanguageServerStatus {
name: server.name(),
server_version: server.version(),
+ server_readable_version: server.readable_version(),
pending_work: Default::default(),
has_pending_diagnostic_updates: false,
progress_tokens: Default::default(),
@@ -1306,6 +1306,29 @@ impl LanguageServer {
self.version.clone()
}
+ /// Get the readable version of the running language server.
+ pub fn readable_version(&self) -> Option<SharedString> {
+ match self.name().as_ref() {
+ "gopls" => {
+ // Gopls returns a detailed JSON object as its version string; we must parse it to extract the semantic version.
+ // Example: `{"GoVersion":"go1.26.0","Path":"golang.org/x/tools/gopls","Main":{},"Deps":[],"Settings":[],"Version":"v0.21.1"}`
+ self.version
+ .as_ref()
+ .and_then(|obj| {
+ #[derive(Deserialize)]
+ struct GoplsVersion<'a> {
+ #[serde(rename = "Version")]
+ version: &'a str,
+ }
+ let parsed: GoplsVersion = serde_json::from_str(obj.as_str()).ok()?;
+ Some(parsed.version.trim_start_matches("v").to_owned().into())
+ })
+ .or_else(|| self.version.clone())
+ }
+ _ => self.version.clone(),
+ }
+ }
+
/// Get the process name of the running language server.
pub fn process_name(&self) -> &str {
&self.process_name
@@ -4028,6 +4028,7 @@ pub enum LspStoreEvent {
pub struct LanguageServerStatus {
pub name: LanguageServerName,
pub server_version: Option<SharedString>,
+ pub server_readable_version: Option<SharedString>,
pub pending_work: BTreeMap<ProgressToken, LanguageServerProgress>,
pub has_pending_diagnostic_updates: bool,
pub progress_tokens: HashSet<ProgressToken>,
@@ -8201,6 +8202,7 @@ impl LspStore {
LanguageServerStatus {
name,
server_version: None,
+ server_readable_version: None,
pending_work: Default::default(),
has_pending_diagnostic_updates: false,
progress_tokens: Default::default(),
@@ -9391,6 +9393,7 @@ impl LspStore {
LanguageServerStatus {
name: server_name.clone(),
server_version: None,
+ server_readable_version: None,
pending_work: Default::default(),
has_pending_diagnostic_updates: false,
progress_tokens: Default::default(),
@@ -11354,6 +11357,7 @@ impl LspStore {
LanguageServerStatus {
name: language_server.name(),
server_version: language_server.version(),
+ server_readable_version: language_server.readable_version(),
pending_work: Default::default(),
has_pending_diagnostic_updates: false,
progress_tokens: Default::default(),