proto: Add language server support (#18763)

Closes #18762

Release Notes:

- N/A

---------

Co-authored-by: Marshall Bowers <elliott.codes@gmail.com>
This commit is contained in:
Peter 2024-10-06 16:12:06 +02:00 committed by GitHub
parent 200b2bf70a
commit 06bd2431d2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 93 additions and 0 deletions

7
Cargo.lock generated
View file

@ -14863,6 +14863,13 @@ dependencies = [
"zed_extension_api 0.1.0",
]
[[package]]
name = "zed_proto"
version = "0.1.0"
dependencies = [
"zed_extension_api 0.1.0",
]
[[package]]
name = "zed_purescript"
version = "0.0.1"

View file

@ -154,6 +154,7 @@ members = [
"extensions/php",
"extensions/perplexity",
"extensions/prisma",
"extensions/proto",
"extensions/purescript",
"extensions/ruff",
"extensions/ruby",

View file

@ -0,0 +1,16 @@
[package]
name = "zed_proto"
version = "0.1.0"
edition = "2021"
publish = false
license = "Apache-2.0"
[lints]
workspace = true
[lib]
path = "src/proto.rs"
crate-type = ["cdylib"]
[dependencies]
zed_extension_api = "0.1.0"

View file

@ -0,0 +1 @@
../../LICENSE-APACHE

View file

@ -9,3 +9,7 @@ repository = "https://github.com/zed-industries/zed"
[grammars.proto]
repository = "https://github.com/zed-industries/tree-sitter-proto"
commit = "0848bd30a64be48772e15fbb9d5ba8c0cc5772ad"
[language_servers.protobuf-language-server]
name = "Protobuf Language Server"
languages = ["Proto"]

View file

@ -0,0 +1,64 @@
use zed_extension_api::{self as zed, settings::LspSettings, Result};
const PROTOBUF_LANGUAGE_SERVER_NAME: &str = "protobuf-language-server";
struct ProtobufLanguageServerBinary {
path: String,
args: Option<Vec<String>>,
}
struct ProtobufExtension;
impl ProtobufExtension {
fn language_server_binary(
&self,
_language_server_id: &zed::LanguageServerId,
worktree: &zed::Worktree,
) -> Result<ProtobufLanguageServerBinary> {
let binary_settings = LspSettings::for_worktree("protobuf-language-server", worktree)
.ok()
.and_then(|lsp_settings| lsp_settings.binary);
let binary_args = binary_settings
.as_ref()
.and_then(|binary_settings| binary_settings.arguments.clone());
if let Some(path) = binary_settings.and_then(|binary_settings| binary_settings.path) {
return Ok(ProtobufLanguageServerBinary {
path,
args: binary_args,
});
}
if let Some(path) = worktree.which(PROTOBUF_LANGUAGE_SERVER_NAME) {
return Ok(ProtobufLanguageServerBinary {
path,
args: binary_args,
});
}
Err(format!("{PROTOBUF_LANGUAGE_SERVER_NAME} not found in PATH",))
}
}
impl zed::Extension for ProtobufExtension {
fn new() -> Self {
Self
}
fn language_server_command(
&mut self,
language_server_id: &zed_extension_api::LanguageServerId,
worktree: &zed_extension_api::Worktree,
) -> zed_extension_api::Result<zed_extension_api::Command> {
let binary = self.language_server_binary(language_server_id, worktree)?;
Ok(zed::Command {
command: binary.path,
args: binary
.args
.unwrap_or_else(|| vec!["-logs".into(), "".into()]),
env: Default::default(),
})
}
}
zed::register_extension!(ProtobufExtension);