本页面解释了 Sway 编程语言如何通过语言服务器协议 (LSP) 与集成开发环境 (IDE) 集成。有关编译器架构本身的详细信息,请参阅编译器架构。有关语言服务器协议实现内部的信息,请参阅服务器架构。
Sway 语言服务器 (sway-lsp) 实现了语言服务器协议,为 Sway 编程语言提供 IDE 功能。它在任何兼容 LSP 的编辑器中启用智能代码编辑功能,包括:
该服务器充当编辑器和 Sway 编译器之间的桥梁,提供特定于语言的智能功能,同时保持实现与编辑器无关。
来源: sway-lsp/src/lib.rs11-35 sway-lsp/src/server.rs1-8
语言服务器架构遵循客户端-服务器模型,其中 IDE 作为客户端,通过标准化的语言服务器协议与 Sway LSP 服务器通信。
来源: sway-lsp/src/server.rs1-146 sway-lsp/src/lib.rs16-82 sway-lsp/src/server_state.rs1-77
ServerState 是语言服务器的主要状态容器。它管理:
来源: sway-lsp/src/server_state.rs36-77 sway-lsp/src/server_state.rs110-266
一个 Session 代表一个 Sway 项目/工作区。它存储有关项目已解析和已类型化的标记的信息,以及与项目关联的类型引擎。服务器维护一个会话缓存,以避免不必要的项目重新编译。
来源: sway-lsp/src/core/session.rs54-95 sway-lsp/src/core/session.rs98-245
TokenMap 存储 Sway 编译器中所有已解析和已类型化的标记。它提供以下方法:
来源: sway-lsp/src/core/token_map.rs16-252 sway-lsp/src/core/token.rs158-176
LSP 服务器通过带有定义的请求/响应模式的标准化协议与 IDE 进行通信。
来源: sway-lsp/src/server.rs24-143 sway-lsp/src/handlers/notification.rs19-169 sway-lsp/src/handlers/request.rs24-97
Sway 语言服务器实现了全面的 LSP 功能:
| 功能 | 描述 | 实现 |
|---|---|---|
| 代码操作 | 提供快速修复和重构选项 | capabilities::code_actions |
| 代码透镜 | 在代码上方添加可执行命令 | capabilities::code_lens |
| 完成 | 提供上下文感知的代码自动补全 | capabilities::completion |
| 定义 | 启用“跳转到定义”导航 | session::token_definition_response |
| 诊断 | 显示错误和警告 | capabilities::diagnostic |
| 文档符号 | 提供代码大纲/导航 | capabilities::document_symbol |
| 格式化 | 根据样式规则格式化代码 | capabilities::formatting |
| 悬停 | 悬停显示文档 | capabilities::hover |
| 内联提示 | 显示内联类型提示 | capabilities::inlay_hints |
| 参考资料 | 查找符号的所有引用 | session::token_references |
| 重命名 | 跨文件重命名符号 | capabilities::rename |
| 语义标记 | 提供语义高亮 | capabilities::semantic_tokens |
语言服务器通过专用的后台线程管理编译,以保持 UI 响应迅速。
服务器管理增量编译,以在使用户更改代码时有效地更新语言状态。
LSP 实现的关键部分是收集和管理 Sway 编译器 AST 中的标记。
标记收集过程遍历 Sway 程序的已解析和已类型化 AST,收集为 IDE 功能提供支持的语义信息。
LSP 服务器维护编辑器文件视图和编译器文件视图之间的同步。
这种同步确保编译器始终拥有准确的编辑代码视图,同时在明确的保存操作之前保持原始文件不变。
Sway LSP 旨在与编辑器无关,并与任何支持 LSP 的编辑器兼容。当编辑器连接时,将发生以下初始化过程:
服务器在初始化期间公布其功能,使编辑器能够使用所有受支持的功能。
除了标准的 LSP 功能外,Sway LSP 还提供了自定义扩展以增强开发体验:
| 扩展 | 描述 | 命令 |
|---|---|---|
| 显示 AST | 可视化抽象语法树 | sway/show_ast |
| 可视化 | 显示依赖图 | sway/visualize |
| 回车时 | 回车键的自定义行为 | sway/on_enter |
| 评估指标 | 性能指标 | sway/metrics |
这些扩展可由编辑器插件使用,以提供超出标准 LSP 功能的额外功能。
LSP 实现了多种错误处理机制,以提供稳定的开发体验:
适当的错误处理确保 IDE 可以向用户显示有意义的错误消息,并保持稳定的开发环境。
LSP 实施包含多项性能优化:
这些优化确保即使处理大型 Sway 项目也能提供流畅的开发体验。
Sway 语言服务器通过语言服务器协议为 Sway 编程语言提供了全面的 IDE 集成。它弥合了与编辑器无关的语言智能和特定于 IDE 的功能之间的差距,从而在各种编辑器和平台上提供了丰富的开发体验。
开发人员可以利用这种集成来受益于代码自动补全、错误检查、重构和导航等功能,从而使 Sway 的开发过程更高效、更具生产力。