You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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请求,获取文档内定义的符号列表。

实现步骤与代码示例

  1. 获取当前活动编辑器与文本缓冲区
    通过VS SDK服务获取当前激活的ITextView和对应的ITextBuffer,作为后续操作的基础。

  2. 获取LSP语言服务客户端
    利用ILanguageServiceBroker根据文本缓冲区的内容类型(JavaScript/TypeScript)获取对应的LSP服务实例。

  3. 发送文档符号请求
    构造符合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 07:53:11