Swift 语言服务器

macOS Linux Apache 2 Build Status Join the chat at https://gitter.im/langserver-swift

概述

一个基于开放 语言服务器协议 的 Swift 实现。语言服务器协议用于工具(客户端)和语言智能提供者(服务器)之间,以将诸如自动完成、跳转到定义、查找所有引用等功能集成到工具中。

目前,此实现被 Swift for Visual Studio Code 使用。

先决条件

Swift

macOS

Linux

构建

% cd <path-to-clone>
% make debug

或使用 Xcode

% cd <path-to-clone>
% make xcodeproj

测试

% cd <path-to-clone>
% make test

调试和开发

语言服务器本身依赖于语言服务器客户端与之交互。 此服务器已被开发为与 Visual Studio Code 配合使用。 但应该注意的是,任何实现了该协议的客户端应该都可以工作,因此也会被支持。

本节提供了一个使用 Visual Studio Code 客户端以交互方式调试语言服务器的工作流程示例。 这些说明分为两个部分。 第一部分解释了如何生成和配置用于调试的 Xcode 项目。 第二部分解释了如何配置 Visual Studio Code 插件以使用调试可执行文件。

Xcode (例如,langserver-swift)

在包含此存储库克隆的目录中使用 SwiftPM 生成一个 Xcode 项目。

% git clone https://github.com/RLovelett/langserver-swift.git
% cd langserver-swift
% make xcodeproj

由于语言服务器客户端(例如,VSCode)实际上会启动语言服务器,因此需要告知 LLDB 等待应用程序启动。 这可以在 Xcode 中打开生成的项目后进行配置。 见下面的截图。

screen shot 2017-02-22 at 8 55 57 am

下一步是构建可执行文件并启动 LLDB。 这两个步骤都可以通过转到“Product > Run”或键盘快捷键 ⌘R 来执行。 构建完成后,Xcode 应报告类似“Waiting to attach to LanguageServer : LanguageServer”的内容。

screen shot 2017-02-22 at 9 40 33 am

最后一步是确定 TARGET_BUILD_DIR。 这用于在下一节中告诉 VSCode 扩展调试语言服务器的位置。

从当前工作目录包含先前由 SwiftPM 生成的 Xcode 项目的终端,您可以从 xcodebuild 获取此信息。

% xcodebuild -project langserver-swift.xcodeproj -target "LanguageServer" -showBuildSettings | grep "TARGET_BUILD_DIR"
   TARGET_BUILD_DIR = /Users/ryan/Library/Developer/Xcode/DerivedData/langserver-swift-gellhgzzpradfqbgjnbtkvzjqymv/Build/Products/Debug

或者使用 make

% make print_target_build_dir

记下此值,稍后会用到。

VSCode (例如,vscode-swift)

在 Visual Studio Code 中打开包含 Visual Studio Code 扩展克隆的目录。

% git clone https://github.com/RLovelett/vscode-swift.git
% code .

启动 TypeScript 编译器或构建任务(例如,⇧⌘B 或 Tasks: Run Build Task)。

现在打开 src/extension.ts 并为调试可执行文件提供 TARGET_BUILD_DIR 的值。 更改应类似于以下补丁。

diff --git a/src/extension.ts b/src/extension.ts
index b5ad751..7970ae1 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -13,7 +13,7 @@ export function activate(context: ExtensionContext) {
         .get("languageServerPath", "/usr/local/bin/LanguageServer");

     let run: Executable = { command: executableCommand };
-    let debug: Executable = run;
+    let debug: Executable = { command: "${TARGET_BUILD_DIR}/LanguageServer" };
     let serverOptions: ServerOptions = {
         run: run,
         debug: debug

注意: 确保 ${TARGET_BUILD_DIR} 填充了您在 Xcode 部分中生成的值。 它不是环境变量,因此不会被评估。

完成此操作后,您应该能够打开 VSCode 调试器并选择 Launch Extension。 这应该以调试模式启动语言服务器 (Xcode/Swift) 和扩展 (VScode/TypeScript)。

注意事项

  1. 如上所述,您可能无法捕获语言服务器最初启动时的所有命令。 目前的假设是 LLDB(Swift 调试器)实际上需要一些时间才能附加到正在运行的进程,因此会错过一些指令。

一个建议是在 handle.swift 中设置一个断点,因为这很可能是服务器陷入麻烦的地方。

  1. 消息使用 me.lovelett.langserver-swift 子系统记录到 Console.app。 可以在那里查找原始语言服务器 JSON-RPC 消息。