👩🏻🚀 这个项目仍然有点实验性。欢迎贡献者和先驱者!
SwiftLSP 提供了一个相当动态的 Swift 对 LSP (Language Server Protocol) 的表示,并有助于许多相关的用例。它是 LSPService 和 LSPServiceKit 的基础。
由于 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
的东西中,它保存了其 header
和 content
部分的 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 还可以帮助
async
函数向 LSP 服务器发出请求一些上下文和必要的类型
顶层源文件夹的内部架构(组成和必要的依赖项)
上面的图像是用 Codeface 生成的。
从版本/标签 0.1.0 开始,SwiftLSP 遵守 语义版本控制。因此,在它达到 1.0.0 之前,它的 API 仍然可能经常中断,但这将在版本更新中体现出来。
SwiftLSP 已经在生产中使用,但 Codeface 仍然是它的主要客户端。 SwiftLSP 将在通过为多个真实世界的客户端提供服务来验证其基本实用性和概念合理性后,迁移到版本 1.0.0。