【问题标题】:Modify existing CodeLens in VS Code Extension在 VS Code Extension 中修改现有 CodeLens
【发布时间】:2019-06-08 19:20:32
【问题描述】:

在 VS Code 中,如果您的语言扩展提供了它,您将获得 codelens 来显示函数、变量和其他符号上方的引用计数。像这样:https://i.imgur.com/HXzgjGh.png

我正在接手一个项目,我的首要任务之一是重组。作为其中的一部分,我希望将引用拉入本地/外部,而不必“显示所有引用”。

我浏览了扩展 API 示例,并且一直是 looking through the API。之后,我构建了一些几乎毫无意义的扩展,以进一步了解它们的工作原理。我可以用我想要的任何数据插入一个codelens,但现在我被卡住了。似乎没有办法获取现有的 codelens,或者真的没有办法访问构建“i 引用”的信息。

我发现的另一个线索:它的工作方式是通过定义符号的语言。但是,似乎也没有任何方法可以迭代它们?我可以重新解析所有内容并进行自己的 codelens 分析,但这比手动检查范围需要更长的时间。它似乎也比必要的复杂。

我希望在生成/更改 codelens 时触发一个事件,并将该 codelens 提供给我。似乎codelens 冒泡了,我无法访问它。

我的理想是两个得到两条信息:

  1. 从“i 引用”中获取数字 i。
  2. 获取它适用的行。

这是可能的还是超出了 API 的范围?我可以重写解析,但某些东西已经在生成该信息,所以我更愿意访问它。

【问题讨论】:

    标签: typescript visual-studio-code vscode-extensions


    【解决方案1】:

    我最终找到了自己问题的答案。即the built in commands。事实证明,您可以使用两个命令(我在此处将其转换为函数)获取文档符号并执行引用提供程序:

    async function getSymbols(document: TextDocument): Promise<SymbolInformation[]>
    {
        return await commands.executeCommand<SymbolInformation[]>('vscode.executeDocumentSymbolProvider', 
                                                                    document.uri) || [];
    }
    
    async function getReferences(location: Location): Promise<Location[]>
    {
        return await commands.executeCommand<Location[]>('vscode.executeReferenceProvider',
                                                        location.uri,
                                                        new Position(
                                                            location.range.start.line,
                                                            location.range.start.character)) || [];
    }
    

    我稍后将这两个链接在涉及某些条件的单独函数调用中。

    这并不是我想要做的(获取 codelens 返回值),但它允许我重复使用已实现的内容,而无需重新发明轮子。

    【讨论】:

    • 嗨,很高兴在这里看到您的解决方案,因为我几乎遇到了类似的问题,并与您提出了相同的想法!然而,困扰我的是,这些 API 似乎并不能保证返回完整和预期的响应。例如,对于Java中的一些文件,返回的符号往往只包含类成员级别,而没有局部变量;对于参考,我总是得到一个空列表。我猜是扩展提供的语言服务器的问题,你有没有注意到同样的问题和解决方案?
    • 嘿@K.Symbol,我不能说我有那种问题。我将其用于特定目的,以查找标记为全局的内容,并在没有外部引用时将它们设为本地。我专门为我正在处理的一个 ERP 项目这样做:github.com/mjmatthiesen/localize-lens 你可以看到我最终在代码中做了什么。由于我很少使用 TS 或编写 vs 代码扩展,因此我添加了相当多的 cmets。
    • 感谢您的回答,我终于知道应该归咎于 LS 扩展。但是,我也想知道您是否最终找到了访问或修改现有代码镜头的方法?我也发现没有 API 可以做到这一点。
    • 我没有尝试修改现有的。这只是搭便车了其现有信息,因此我不必重新运行整个过程。由于它会返回该信息,也许您可​​以尝试在那里对其进行修改,但我只能这么说。
    猜你喜欢
    • 2019-07-14
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多