7 个版本
0.2.0 | 2024年1月7日 |
---|---|
0.1.0 | 2023年11月6日 |
0.0.5 | 2023年8月7日 |
0.0.4 | 2023年5月1日 |
0.0.3 | 2023年4月18日 |
#299 in 异步
6,997 每月下载量
用于 protols
115KB
2K SLoC
async-lsp
基于 Language Server Protocol (LSP) 的异步框架,基于 tower。
概述
本库以 trait LspService
为中心,主要包含 LSP 请求的 tower Service
和 LSP 通知的处理程序。
按照协议定义,请求可以并发(异步)处理,而通知必须按顺序(同步)处理,改变状态并影响后续请求和/或通知的语义。
请求处理采用解耦方式设计,与 tower-layer 一起使用,因此您可以将多个请求处理层(即中间件)链接起来构建复杂的服务。
尽管名为 LspService
,但它可以用来构建语言服务器和语言客户端。它们在逻辑上是对称的,并且都使用双向通道。唯一的区别是它们支持的请求和通知的类型。
使用方法
请参阅 示例。
类似项目
tower-lsp
async-lsp 在 tower-lsp 上有很大启发,我们都是基于 tower 构建,但设计上存在重大差异。
-
tower-lsp 灵活性较低,难以与 tower 生态系统结合使用。由于
Service
接口是内置的,因此不支持自定义 towerLayer
。服务器生命周期处理和并发逻辑都是内置的,难以优化或定制。async-lsp 使用 tower
Layer
来实现服务器生命周期、并发、跟踪等功能。用户可以选择和组合层,或者创建自定义层。 -
tower-lsp 异步处理通知,这在语义上是不正确的,并引入了 顺序问题。
async-lsp 同步执行通知处理器,并允许它在需要退出或发生错误时控制主循环。
-
tower-lsp 的
trait LanguageServer
接受不可变状态&self
以实现并发。因此,状态变更通知如textDocument/didChange
总是需要异步锁,因为底层通信通道本身就是同步的。async-lsp 接受请求和通知时接受
&mut self
,前者返回一个不借用self
的Future
。请求仅借用不可变状态,可以并发运行,同时在准备过程中仍然可以修改状态(如快照)。 -
tower-lsp 在 LSP 规范之上提供了一些高级抽象,使其更易于使用,例如泛型
Client::show_message
、简化的LanguageServer::shutdown
或计划中的Progress
-API。虽然这不是 async-lsp 的目标。默认情况下,我们不做更多的事情,只是序列化、反序列化和处理请求/响应
id
。参数和接口遵循lsp-types
的Request
和Notification
特性。但你仍然可以自由地实现你自己的Request
以进行扩展,或者为高级 API 实现自定义中间件。 -
tower-lsp 专门用于构建语言服务器。
async-lsp 可以用于语言服务器和客户端。
lsp-server
lsp-server 是一个简单且同步的框架,仅用于语言服务器。您需要手动启动任务和管理正在进行的请求/响应。
许可证
async-lsp 根据 MIT 或 Apache 2.0 许可证的条款分发,任选其一。有关详细信息,请参阅 LICENSE-MIT 和 LICENSE-APACHE。
除非您明确表示,否则您有意提交以包含在工作中的任何贡献都应按照上述方式双重许可,不附加任何其他条款或条件。
依赖关系
~3–14MB
~213K SLoC