csharp lsp无法跳转到unity的定义

使用的是spacemacs的csharp layer配置,使用的lsp + omnisharp; 可正常打开untiy项目(unity默认编辑器是vscode),其他都正常;当前遇到的问题是无法跳转打开untiy的函数定义;比如下面的跳转报错: The following file /metadata/Project/Assembly-CSharp/Assembly/UnityEngine/CoreModule/Symbol/UnityEngine/Component.cs is missing, ignoring from the results. 不知道是否有同样适用emacs + untiy的朋友遇到同样的问题,或者可以提供解决思路;拜谢;

没用过 c#,但是我猜这种一般都是需要配置 lsp server 让他找到第三方库的位置之类的

1 个赞

是这样的, 很多语言的定义跳转并不是直接跳转到文件的, 而是先由LSP Server根据定义来生成一些临时的文件, 解析这些临时文件后再返回真的定义。

而这些语言的这种特性并不是 LSP 协议的一部分, 所以需要 LSP Client 来适配不同的 LSP Server。

目前我知道的 Java、Deno都有类似的行为, 详情参考 lsp-bridge/core/handler/peek.py at 4489fa4f5ee353ea94c02f1a4fdc5eb360ee29fd · manateelazycat/lsp-bridge · GitHub

备注: lsp-bridge 本身也有 C# 语言的社区用户反馈 C# 也有类似的问题, 欢迎写 C# 的同学可以贡献一下补丁。

1 个赞

好的;感谢解答;

现在lsp-mode + csharp-ls 是可以跳转到定义的

lsp-bridge还没支持,要改进使用csharp-ls才行 可以参看 Support csharp-ls · Issue #524 · manateelazycat/lsp-bridge · GitHub

lsp-bridge 已经添加了对 csharp-ls 的 csharp:/metadata 协议的支持。

先用 dotnet 安装 csharp-ls, 剩下的事情 lsp-bridge 开箱即用即可支持 C# 的定义跳转。

1 个赞

我手里没有unity代码,但测试过unreal engine的hello world级别代码,支持得很好。非常感谢。

今天推送了几个补丁, 让C#反编译的源代码和当前文件共享一个LSP server, 这样就可以继续在反编译的文件继续跳转其他代码定义了。

Java、C#、Deno这些LSP Server 都有一个特性, 反编译出来的源码必须和原始文件共享 LSP server, 否则会因为缺乏项目信息无法进一步跳转定义。