Flux 10: LSP 支持
一个自研语言只提供 CLI 是不够的。CLI 证明语言能跑,LSP 才决定它能不能舒服地写。对 Flux 这种表达式、pipe、lambda 和 package builtin 很多的语言来说,编辑器体验不是锦上添花,而是降低使用成本的一部分。
cpp/pl/flux/contrib/lsp 的目标就是让 Flux 从“能执行”走到“能日常编辑”:打开文件时能诊断语法错误,输入 array. 时能补 package 函数,光标放在 lambda 参数上能跳回定义,rename 不会误改 shadowing 变量,semantic tokens 能区分 package、函数、参数和引用。
这一篇不按功能列表平铺,而是从一次编辑器请求开始,看 Flux Language Server 如何把 JSON-RPC、文档同步、AST 缓存、符号表和各类 feature handler 串起来。
一次编辑器请求如何流动
假设用户在编辑器里打开了这样一段 Flux:
import "array"
data = array.from(rows: [{host: "edge-1", usage: 91.2}])
data
|> filter(fn: (r) => r.usage > 80.0)
|> keep(columns: ["host", "usage"])当用户输入 array.、保存文件、或者把光标放到 r.usage 上时,编辑器会通过 LSP 向 server 发请求或通知。server 不能每个功能都自己 parse 一遍,也不能把 completion、diagnostics、definition 写成彼此独立的临时逻辑。它需要一套共享的语言服务基础设施。
