背景和吐槽
大家好,经常看见论坛里的大佬写 lsp client
说到 LSP 的话,目前个人感觉体验最好的支持是 Jetbrains的IDEA 为 Java/Kotlin 提供的支持
后来去学习 Julia 语言,做了一些数据结构的项目,虽然是门现代语言,他的类型设计比隔壁的
Python 好那么一点,有静态类型和动态类型,但是他的 LanguageServer 支持是由社区支持的,理论上来讲他的实现会比 Python 更好实现, 结果在开发的时候没有良好的补全和诊断支持,导致大部分错误发生在运行时,需要手动code review,而且可能还没有错误提示
不经感叹,Python LSP 的贡献人员真多,还有大厂人员的支持,Julia语言任重道远啊(架不住别人有一个好爹啊)
我的尝试
我今天尝试了下用 lsp4j 写 LSP 服务端实现,然而自己光顾着看 GPT 尝试的答案,调试的时候发现自己不知道怎么触发补全
class YamlLanguageServer: LanguageServer, LanguageClientAware, KoinComponent {
val _textDocumentService: TextDocumentService by inject<TextDocumentService>()
val _workspaceService: WorkspaceService by inject<WorkspaceService>()
var client: LanguageClient? = null
override fun initialize(params: InitializeParams): CompletableFuture<InitializeResult> {
val capabilities = ServerCapabilities().apply {
setTextDocumentSync(TextDocumentSyncKind.Full)
completionProvider = CompletionOptions()
}
val result = InitializeResult(capabilities)
return CompletableFuture.completedFuture(result)
}
override fun shutdown(): CompletableFuture<Any> {
return CompletableFuture.completedFuture(null)
}
override fun exit() {
System.exit(0)
}
override fun getTextDocumentService(): TextDocumentService {
return _textDocumentService
}
override fun getWorkspaceService(): WorkspaceService {
return _workspaceService
}
override fun connect(client: LanguageClient) {
this.client = client
}
}
然后我发现,不止要写后端,还要写前端适配他,工作量又大了起来(怪不得大家都写 lsp client 给 emacs)
我的目的
扩展和强化 Julia 的 LanguageServer.jl 实现,可能的话改下 julia 的 vscode plugin 关于 LSP 前端的实现
明天
明天我打算看下这些中文资料,现在感觉自己有点钻牛角尖,病急乱投医的感觉了,
我得调整下状态,明天继续探索
就是资料有点旧,没有进行更新
我的计划和需要帮助的地方
我打算一步一步来,先做几个简单的语言支持,比如说
- yaml
- toml
- markdown (这个好像不是很简单)
然后我去看了下 vscode 的 redhat-developer 的 yaml 支持,这种配置语言没必要写那么多的代码吧
然后我想做个简单的 Julia LSP,然后依次实现
- 代码补全
- 错误诊断
- 代码导航
- 重构支持
- 文档交互
- 代码格式化
想看看有没有入门级项目可以参考的,其实我已经找过好多仓库了(这代码量太大了,看不下去😭), 怕自己走太多弯路,看看有没有大佬指路
这里还有几个问题
- LSP 中需要用到编译原理来进行更强大的解析吗
- LSP 需要处理语法高亮吗
- 编译原理学的不怎么好,分不清 tree-sitter 和 antlr4
ps: 我怎么感觉写着写着就变成吐槽和抱怨了,请见谅