VS2022扩展开发:如何获取LSP驱动的JS/TS文件定义符号?
在VS 2022扩展中获取LSP驱动的JavaScript/TypeScript文档符号
由于VS 2022中JavaScript/TypeScript的语言服务基于LSP(语言服务器协议)实现,无法直接使用Roslyn的Microsoft.CodeAnalysis.Document体系来获取符号,需要通过VS的LSP扩展API调用语言服务的文档符号查询能力,具体实现方式如下:
核心思路
通过VS的ILanguageServiceBroker获取目标文本缓冲区对应的LSP语言服务客户端,然后发送LSP标准的textDocument/documentSymbol请求,获取文档内定义的符号列表。
实现步骤与代码示例
获取当前活动编辑器与文本缓冲区
通过VS SDK服务获取当前激活的ITextView和对应的ITextBuffer,作为后续操作的基础。获取LSP语言服务客户端
利用ILanguageServiceBroker根据文本缓冲区的内容类型(JavaScript/TypeScript)获取对应的LSP服务实例。发送文档符号请求
构造符合LSP规范的请求参数,发送请求并解析返回的符号结果。
using Microsoft.VisualStudio.LanguageServer.Client; using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.Shell; using System.Threading.Tasks; using LSP = Microsoft.VisualStudio.LanguageServer.Protocol; public async Task<LSP.DocumentSymbol[]> GetTsJsDocumentSymbolsAsync() { // 获取当前活动的文本视图 var textView = await ThreadHelper.JoinableTaskFactory.RunAsync(async () => { var textManager = await ServiceProvider.GetGlobalServiceAsync(typeof(SVsTextManager)) as IVsTextManager; textManager.GetActiveView(1, null, out var vsTextView); return vsTextView as ITextView; }); if (textView?.TextBuffer == null) return null; var textBuffer = textView.TextBuffer; var languageServiceBroker = await ServiceProvider.GetGlobalServiceAsync(typeof(ILanguageServiceBroker)) as ILanguageServiceBroker; // 获取对应内容类型的LSP语言服务 var languageService = await languageServiceBroker.GetLanguageServiceAsync(textBuffer.ContentType.TypeName, textBuffer); if (languageService is not ILanguageServerProtocolClient lspClient) return null; // 构造LSP文档符号请求参数 var requestParams = new LSP.DocumentSymbolParams { TextDocument = new LSP.TextDocumentIdentifier { Uri = textBuffer.GetUri() } }; // 发送LSP请求并获取结果 var symbols = await lspClient.SendRequestAsync<LSP.DocumentSymbolParams, LSP.DocumentSymbol[]>( LSP.Methods.TextDocumentDocumentSymbolName, requestParams, default); return symbols; }
关键注意事项
- 依赖引用:确保扩展项目引用
Microsoft.VisualStudio.LanguageServer.Client、Microsoft.VisualStudio.Text.UI、Microsoft.VisualStudio.Shell等VS SDK相关程序集。 - 线程处理:VS扩展开发中需通过
ThreadHelper.JoinableTaskFactory处理异步操作,避免UI线程阻塞。 - 结果解析:返回的
DocumentSymbol数组包含符号的名称、类型(类、函数、变量等)、位置范围等信息,可直接用于跳转逻辑实现。 - 服务初始化:若语言服务尚未完成初始化,请求可能返回空或抛出异常,需添加对应错误处理逻辑。
内容的提问来源于stack exchange,提问作者gdube
相关产品推荐
相关产品推荐

