菜单

IDE 集成

相关源文件

本页面解释了 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(服务器状态)

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(标记映射)

TokenMap 存储 Sway 编译器中所有已解析和已类型化的标记。它提供以下方法:

  • 在特定位置查找标记
  • 跟踪标记引用
  • 解析标记定义
  • 支持各种 IDE 功能

来源: sway-lsp/src/core/token_map.rs16-252 sway-lsp/src/core/token.rs158-176

LSP 通信流程

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

来源: sway-lsp/src/lib.rs36-82 71-142 58-631

编译管道

语言服务器通过专用的后台线程管理编译,以保持 UI 响应迅速。

服务器管理增量编译,以在使用户更改代码时有效地更新语言状态。

来源: 123-219 333-458 461-518

标记收集和管理

LSP 实现的关键部分是收集和管理 Sway 编译器 AST 中的标记。

标记收集过程遍历 Sway 程序的已解析和已类型化 AST,收集为 IDE 功能提供支持的语义信息。

来源: 44-85 24-43 519-619

项目同步

LSP 服务器维护编辑器文件视图和编译器文件视图之间的同步。

这种同步确保编译器始终拥有准确的编辑代码视图,同时在明确的保存操作之前保持原始文件不变。

来源: 28-83 11-114 50-62

编辑器集成

Sway LSP 旨在与编辑器无关,并与任何支持 LSP 的编辑器兼容。当编辑器连接时,将发生以下初始化过程:

服务器在初始化期间公布其功能,使编辑器能够使用所有受支持的功能。

来源: 24-58 36-82 136-155

自定义扩展

除了标准的 LSP 功能外,Sway LSP 还提供了自定义扩展以增强开发体验:

扩展描述命令
显示 AST可视化抽象语法树sway/show_ast
可视化显示依赖图sway/visualize
回车时回车键的自定义行为sway/on_enter
评估指标性能指标sway/metrics

这些扩展可由编辑器插件使用,以提供超出标准 LSP 功能的额外功能。

来源: 25-35 148-165 300-317

错误处理

LSP 实现了多种错误处理机制,以提供稳定的开发体验:

适当的错误处理确保 IDE 可以向用户显示有意义的错误消息,并保持稳定的开发环境。

来源: 5-105 19-47 168-190

性能考量

LSP 实施包含多项性能优化:

  1. 后台编译:编译在单独的线程中运行,以保持 UI 响应迅速。
  2. 标记缓存:标记被缓存以避免冗余处理。
  3. LRU 会话缓存:通过仅保留最近使用的会话来限制内存使用。
  4. 增量更新:仅在文件更改时重新编译必要的部分。
  5. 垃圾回收:可选地清理未使用的类型信息。

这些优化确保即使处理大型 Sway 项目也能提供流畅的开发体验。

来源: 123-219 131-142 8-42

结论

Sway 语言服务器通过语言服务器协议为 Sway 编程语言提供了全面的 IDE 集成。它弥合了与编辑器无关的语言智能和特定于 IDE 的功能之间的差距,从而在各种编辑器和平台上提供了丰富的开发体验。

开发人员可以利用这种集成来受益于代码自动补全、错误检查、重构和导航等功能,从而使 Sway 的开发过程更高效、更具生产力。