1 个不稳定版本
0.1.0 | 2023年12月4日 |
---|
1281 在 开发工具
150KB
2.5K SLoC
Sync Lsp
Sync Lsp 是语言服务器的同步 lsp 实现。以下是该库的主要功能
-
自动化: Sync Lsp 会自动处理注册和注销以及能力协商。此外,该库的用户不会看到任何生命周期消息。
-
兼容性: 能力处理也是内部完成的。这意味着该库的用户不需要担心客户端是否支持某个特定功能。
-
错误处理: 几乎所有与协议相关的错误都由内部处理。因此,API 使用起来非常简单,不需要用户实现自己的错误处理。
示例
use sync_lsp::{
Transport,
TypeProvider,
Server,
text_document::did_open::TextDocumentItem
};
use sync_lsp::window::{
MessageType,
show_message_request::MessageActionItem
};
// The state of the server, in this case it's empty,
// but it could be used to store information like
// syntax trees, diagnostics, etc.
struct MyServerState;
// Configuring the server to use strings as the
// data attached to show message requests and
// using the default implementation for the rest
// by using a macro
#[sync_lsp::type_provider]
impl TypeProvider for MyServerState {
type ShowMessageRequestData = String;
}
fn main() {
// Creating a transport that uses stdin and stdout
let transport = Transport::stdio();
let mut server = Server::new(MyServerState, transport);
// Listeners for events can be set via server.on_* methods
server.on_open(MyServerState::on_open);
server.on_show_message_response(MyServerState::on_show_message_response);
// Block the current thread and listen for messages
server.serve().unwrap();
}
impl MyServerState {
fn on_open(server: &mut Server<Self>, document: TextDocumentItem) {
server.connection.show_message_request(
MessageType::Warning,
format!("Example query: {}", document.uri),
vec![
MessageActionItem {
title: "Action 1".to_string(),
data: document.uri.clone()
},
MessageActionItem {
title: "Action 2".to_string(),
data: document.uri.clone()
}
]
);
}
fn on_show_message_response(server: &mut Server<Self>, item: MessageActionItem<String>) {
server.connection.show_message(
MessageType::Info,
format!("Performing {} on {}", item.title, item.data)
);
}
}
功能标志
标志 | 描述 |
---|---|
mio |
将使用 mio crate 来轮询消息,从而启用请求取消支持。如果没有这个标志,Connection::cancelled 方法仍然可用,但将始终返回 false。 |
dynamic-callbacks |
如果禁用此功能,则在调用 Server::server 之后,不应调用 Server::on_* ,这可能会提高服务器的性能。请注意,这主要是性能特性,并不等同于客户端通过 lsp 动态注册能力的能力。 |
依赖关系
~1–12MB
~94K SLoC