1 个不稳定版本

0.1.0 2023年12月4日

1281开发工具

MIT 许可证

150KB
2.5K SLoC

Sync Lsp

MIT licensed Static Badge

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