跳转到内容

语言服务器

Wippy 内置了 LSP(语言服务器协议)服务器,为 Lua 代码提供 IDE 功能。该服务器作为 Wippy 运行时的一部分运行,通过 TCP 或 HTTP 连接编辑器。

  • 具有类型感知建议的代码补全
  • 显示类型和签名的悬停信息
  • 跳转到定义
  • 查找引用
  • 文档和工作区符号
  • 调用层次结构(传入和传出调用)
  • 实时诊断(解析错误、类型错误)
  • 函数参数签名帮助

.wippy.yaml 中启用 LSP 服务器:

version: "1.0"
lua:
type_system:
enabled: true
lsp:
enabled: true
address: ":7777"
字段默认值描述
enabledfalse启用 TCP 服务器
address:7777TCP 监听地址
http_enabledfalse启用 HTTP 传输
http_address:7778HTTP 监听地址
http_path/lspHTTP 端点路径
http_allow_origin*CORS 允许的来源
max_message_bytes8388608最大传入消息大小(字节)

TCP 服务器使用 JSON-RPC 2.0 协议,采用标准 LSP 消息帧格式(Content-Length 头)。这是编辑器集成的主要传输方式。

HTTP 传输接受带有 JSON-RPC 载荷的 POST 请求。适用于基于浏览器的编辑器和 Web 工具。包含 CORS 头以支持跨域访问。

lsp:
enabled: true
http_enabled: true
http_address: ":7778"
http_path: "/lsp"
http_allow_origin: "*"

LSP 服务器使用 wippy:// URI 方案标识注册表条目:

wippy://namespace:entry_name

编辑器将这些 URI 映射到注册表中的条目 ID。支持 wippy:// 方案和原始 namespace:entry_name 两种格式。

LSP 服务器维护所有代码条目的索引以实现快速查找。索引在后台使用多个工作线程进行。

关键行为:

  • 条目按依赖顺序索引(依赖项优先)
  • 更改会触发受影响条目的重新索引
  • 未保存的编辑器更改存储在覆盖层中
  • 索引是增量的 - 仅重新处理已更改的条目
方法描述
initialize能力协商
textDocument/didOpen跟踪已打开的文档
textDocument/didChange完整文档同步
textDocument/didClose释放文档
textDocument/hover光标处的类型信息
textDocument/definition跳转到定义
textDocument/references查找所有引用
textDocument/completion代码补全
textDocument/signatureHelp函数签名
textDocument/diagnostic文件诊断
textDocument/documentSymbol文件符号
workspace/symbol全局符号搜索
textDocument/prepareCallHierarchy调用层次结构
callHierarchy/incomingCalls查找调用者
callHierarchy/outgoingCalls查找被调用者

补全引擎通过代码图解析类型。它提供:

  • .: 后的成员补全(字段、方法)
  • 局部变量补全
  • 模块级符号补全
  • 触发字符:.:

诊断信息在索引过程中计算,包括:

  • 解析错误(语法问题)
  • 类型检查错误(不匹配、未定义符号)
  • 严重级别:错误、警告、信息、提示

诊断信息通过文档覆盖层系统随输入实时更新。