SwiftLSP

     

👩🏻‍🚀 这个项目仍然有点实验性。欢迎贡献者和先驱者!

是什么?

SwiftLSP 提供了一个相当动态的 Swift 对 LSP (Language Server Protocol) 的表示,并有助于许多相关的用例。它是 LSPServiceLSPServiceKit 的基础。

由于 LSP 标准定义了复杂的、无定形的、大量的有效 JSON 对象,因此它并不完全适合表示为严格的类型系统,该系统会将标准镜像到每个排列和属性。因此,SwiftLSP 在 LSP 消息的更高层级上是严格类型的,但对于细节,它会回退到更动态和灵活的 JSON 表示。严格的类型化可以很容易地根据客户端的需求进行扩展。

如何使用?

其中一些示例建立在前面的示例之上,因此最好从头开始阅读它们。

创建消息

let myRequest = LSP.Request(method: "myMethod", params: nil)
let myRequestMessage = LSP.Message.request(myRequest)

let myNotification = LSP.Notification(method: "myMethod", params: nil)
let myNotificationMessage = LSP.Message.notification(myNotification)

编码和解码消息

SwiftLSP 使用 LSP 兼容的 JSON-RPC 编码 对 LSP 消息进行编码。

let myRequestMessageEncoded = try myRequestMessage.encode()  // Data
let myRequestMessageDecoded = try LSP.Message(myRequestMessageEncoded)

将消息封装在数据包中

为了通过数据通道发送 LSP 消息,该标准定义了如何将 每个消息封装在我们称之为 LSP.Packet 的东西中,它保存了其 headercontent 部分的 Data

let myRequestMessagePacket = try LSP.Packet(myRequestMessage)
let packetHeader = myRequestMessagePacket.header     // Data
let packetContent = myRequestMessagePacket.content   // Data
let packetTotalData = myRequestMessagePacket.data    // Data

从数据包中提取消息

let myRequestMessageUnpacked = try myRequestMessagePacket.message()  // LSP.Message

从数据中提取数据包

与 LSP 服务器通信的客户端可能需要从服务器的输出 Data 流中提取 LSP.Packet

SwiftLSP 可以从 Data 实例的开头解析 LSP.Packet

let dataStartingWithPacket = packetTotalData + "Some other data".data(using: .utf8)!
let detectedPacket = try LSP.Packet(parsingPrefixOf: dataStartingWithPacket)

// now detectedPacket == myRequestMessagePacket

SwiftLSP 还提供了 LSP.PacketDetector 用于增量解析 Data

var streamedPacket: LSP.Packet? = nil
        
let detector = LSP.PacketDetector { packet in
    streamedPacket = packet
}

for byte in dataStartingWithPacket {
    detector.read(byte)
}

// now streamedPacket == myRequestMessagePacket

更多用例

除了上面的示例涉及的内容之外,SwiftLSP 还可以帮助

架构

一些上下文和必要的类型

architecture architecture

顶层源文件夹的内部架构(组成和必要的依赖项)

上面的图像是用 Codeface 生成的。

开发状态

从版本/标签 0.1.0 开始,SwiftLSP 遵守 语义版本控制。因此,在它达到 1.0.0 之前,它的 API 仍然可能经常中断,但这将在版本更新中体现出来。

SwiftLSP 已经在生产中使用,但 Codeface 仍然是它的主要客户端。 SwiftLSP 将在通过为多个真实世界的客户端提供服务来验证其基本实用性和概念合理性后,迁移到版本 1.0.0。