Skip to content

Commit d39d81b

Browse files
feat: Introduce Kanayago LSP that provides real-time Ruby syntax checking (#224)
Thank you for developing the Zed Ruby extension. This PR adds support for [**Kanayago (金屋子)**](https://github.com/S-H-GAMELINKS/kanayago), a Ruby Language Server that provides real-time Ruby syntax checking. This is my first contribution to the Zed project, so please let me know if there is anything I should change or improve. ## Summary This PR adds the Kanayago extension to the Zed Ruby extensions repository. ### What is Kanayago? Kanayago is a Ruby Language Server Protocol (LSP) implementation that provides: - Real-time Ruby syntax checking based on Ruby’s `parse.y` AST - AST-based Ruby code analysis - A lightweight LSP implementation written entirely in Ruby ### Requirements Users need to have the `kanayago` command available in their PATH: ```bash gem install kanayago ``` ### Demo https://github.com/user-attachments/assets/f6b8edea-4799-4785-872e-b9b23ee17b84 ### Repository - Kanayago LSP: https://github.com/S-H-GAMELINKS/kanayago
1 parent 4485d0a commit d39d81b

4 files changed

Lines changed: 56 additions & 1 deletion

File tree

extension.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ languages = ["Ruby"]
3838
name = "Herb"
3939
languages = ["HTML+ERB"]
4040

41+
[language_servers.kanayago]
42+
name = "Kanayago"
43+
languages = ["Ruby"]
44+
4145
[grammars.ruby]
4246
repository = "https://github.com/tree-sitter/tree-sitter-ruby"
4347
commit = "71bd32fb7607035768799732addba884a37a6210"

src/language_servers/kanayago.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use super::{language_server::WorktreeLike, LanguageServer};
2+
3+
pub struct Kanayago {}
4+
5+
impl LanguageServer for Kanayago {
6+
const SERVER_ID: &str = "kanayago";
7+
const EXECUTABLE_NAME: &str = "kanayago";
8+
const GEM_NAME: &str = "kanayago";
9+
10+
fn get_executable_args<T: WorktreeLike>(&self, _worktree: &T) -> Vec<String> {
11+
vec!["--lsp".to_string()]
12+
}
13+
}
14+
15+
impl Kanayago {
16+
pub fn new() -> Self {
17+
Self {}
18+
}
19+
}
20+
21+
#[cfg(test)]
22+
mod tests {
23+
use crate::language_servers::{language_server::FakeWorktree, Kanayago, LanguageServer};
24+
25+
#[test]
26+
fn test_server_id() {
27+
assert_eq!(Kanayago::SERVER_ID, "kanayago");
28+
}
29+
30+
#[test]
31+
fn test_executable_name() {
32+
assert_eq!(Kanayago::EXECUTABLE_NAME, "kanayago");
33+
}
34+
35+
#[test]
36+
fn test_executable_args() {
37+
let kanayago = Kanayago::new();
38+
let mock_worktree = FakeWorktree::new("/path/to/project".to_string());
39+
40+
assert_eq!(kanayago.get_executable_args(&mock_worktree), vec!["--lsp"]);
41+
}
42+
}

src/language_servers/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
mod herb;
2+
mod kanayago;
23
mod language_server;
34
mod rubocop;
45
mod ruby_lsp;
@@ -7,6 +8,7 @@ mod sorbet;
78
mod steep;
89

910
pub use herb::Herb;
11+
pub use kanayago::Kanayago;
1012
pub use language_server::LanguageServer;
1113
pub use rubocop::Rubocop;
1214
pub use ruby_lsp::RubyLsp;

src/ruby.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ use std::{collections::HashMap, path::PathBuf};
88
use bundler::Bundler;
99
use command_executor::RealCommandExecutor;
1010
use gemset::{versioned_gem_home, Gemset};
11-
use language_servers::{Herb, LanguageServer, Rubocop, RubyLsp, Solargraph, Sorbet, Steep};
11+
use language_servers::{
12+
Herb, Kanayago, LanguageServer, Rubocop, RubyLsp, Solargraph, Sorbet, Steep,
13+
};
1214
use serde::{Deserialize, Serialize};
1315
use zed_extension_api::{
1416
self as zed, resolve_tcp_template, DebugAdapterBinary, DebugConfig, DebugRequest,
@@ -24,6 +26,7 @@ struct RubyExtension {
2426
sorbet: Option<Sorbet>,
2527
steep: Option<Steep>,
2628
herb: Option<Herb>,
29+
kanayago: Option<Kanayago>,
2730
}
2831

2932
#[derive(Serialize, Deserialize)]
@@ -73,6 +76,10 @@ impl zed::Extension for RubyExtension {
7376
let herb = self.herb.get_or_insert_with(Herb::new);
7477
herb.language_server_command(language_server_id, worktree)
7578
}
79+
Kanayago::SERVER_ID => {
80+
let kanayago = self.kanayago.get_or_insert_with(Kanayago::new);
81+
kanayago.language_server_command(language_server_id, worktree)
82+
}
7683
language_server_id => Err(format!("unknown language server: {language_server_id}")),
7784
}
7885
}

0 commit comments

Comments
 (0)