本文档提供了 Sway 编程语言中语言服务器协议 (LSP) 实现的技术概述。它涵盖了 LSP 系统的架构、组件和交互,该系统支持代码补全、转到定义和诊断等 IDE 功能。有关特定 IDE 集成的信息,请参阅构建系统与依赖项。
Sway 语言服务器实现了语言服务器协议规范,为 IDE 和文本编辑器提供智能语言功能。该服务器充当开发环境和 Sway 编译器之间的桥梁,实时分析代码以提供增强开发人员生产力的功能。
来源
该语言服务器采用多组件架构,旨在高效处理 LSP 请求,同时保持响应能力
来源
这个ServerState 是语言服务器的主要状态容器。它维护
来源
一个Session 包含项目特定信息,是语言服务器提供代码智能的核心能力
TokenMap:存储已解析和已类型化的令牌以供快速查找Engines:访问类型检查器、声明引擎等BuildPlanCache:缓存构建计划以避免重复计算Diagnostics:编译错误和警告这个TokenMap 是一个并发哈希映射,它将令牌标识符映射到令牌,为 LSP 请求提供高效查找。它是语言功能的主要数据结构。
来源
服务器使用专用线程进行编译以保持响应能力
这种方法可以防止主线程在编译期间阻塞。
来源
令牌系统是提供语言功能的基础
该系统使用两种主要类型的令牌
ParsedAstToken:来自已解析但未类型检查的 AST 的令牌TypedAstToken:来自完全类型检查的 AST 的令牌这些令牌代表了编译器理解的不同阶段,并提供了日益丰富的信息。
来源
这个TokenMap 提供以下操作:
这些操作构成了大多数语言功能的基础。
来源
服务器遍历 AST 以在不同阶段收集令牌
遍历系统访问 AST 中的节点并为 TokenMap 收集令牌
LexedTree:从词法分析中收集关键字和令牌ParsedTree:从已解析但未类型化的 AST 中收集令牌TypedTree:从包含类型信息的完全类型化 AST 中收集令牌来源
服务器通过实现LanguageServer trait 来处理 LSP 请求
每个 LSP 请求都遵循类似的模式
LanguageServer 实现接收请求来源
补全系统根据以下内容提供建议:
它使用令牌映射查找当前上下文的类型信息。
来源
定义功能允许跳转到符号的声明
来源
文档符号功能提供了文档的纲要
来源
诊断信息在编译期间收集并发布到客户端
publishDiagnostics 通知发布到客户端来源
语义令牌提供语法高亮信息
来源
服务器维护工作区文件的临时副本
这种方法允许服务器
来源
编译过程是 LSP 功能的核心
当文件更改时
来源
服务器实现了全面的错误处理系统
LanguageServerError:服务器中的顶级错误DocumentError:与文档操作相关的错误DirectoryError:与文件系统操作相关的错误RenameError:重命名操作特有的错误错误会被传播和记录,并向客户端发送适当的响应。
来源
服务器遵循标准的 LSP 生命周期
心跳系统监控客户端进程,如果客户端消失则自动关机。
来源
服务器包含广泛的测试基础设施
这确保了语言服务器的可靠性和性能。
来源
Sway 语言服务器协议实现为 IDE 支持提供了坚实的基础。其多线程架构、高效的令牌系统和全面的功能集为 Sway 程序员提供了高效的开发环境。服务器的设计强调性能、可靠性以及对 LSP 规范的遵守。