打字稿:访问VS Code""查找所有参考文献"编程

时间:2018-01-11 12:55:18

标签: typescript visual-studio-code static-analysis

我喜欢VS Code中的Typescript的一个方面是能够使用Shift + F12(或右键单击)查找对函数的所有引用。是可以以编程方式进行此映射,还是以某种方式导出它?

输出将包含以下信息:

fileA.ClassA.methodA is referenced in fileB.ClassB.methodB

由于这很容易用手工做,我希望它也可以以编程方式完成,但我不确定哪些接口可用。

修改

由于这个问题正在接受投票,我想提一下,stackoverflow是VS Code建议提问的地方:

enter image description here

enter image description here

5 个答案:

答案 0 :(得分:3)

您需要使用Compiler API。它允许您使用JS API(tsc是“仅”命令行版本)引用TypeScript的所有功能,包括模块层次结构。我没有查看源代码,但很可能这就是TS VSC语​​言服务器在内部使用的内容。

最糟糕的情况是,您获得文件的AST,以便您可以以任何方式搜索事件。

答案 1 :(得分:3)

对于最灵活的解决方案,您将需要使用TypeScript Language Service API。您想要的特定方法是findReferences。在超高级别上,您的程序将如下所示:

import ts from 'typescript'

// create service host
// see https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API#incremental-build-support-using-the-language-services

const services = ts.createLanguageService(servicesHost, ts.createDocumentRegistry());

但是,根据您的需要,这可能会过大。设置语言服务也可能相当困难。

相反,您可以重用VS Code的“查找所有引用”逻辑。为此,请创建一个执行vscode.executeReferenceProvider command

的VS代码扩展
import * vscode from 'vscode';

export async function activate() {
    const referenceLocation = await vscode.commands.executeCommand('vscode.executeReferenceProvider',
        tsDocumentURI, // Uri of document containing symbol to find references for
        new vscode.Position(0, 10), // Position (line, column) of symbol find references for
    );

   for (const location of referenceLocation) {
       // do something with the locations, such as writing them to disk as json
   }
}

这意味着您将必须以VS Code扩展名运行程序,但设置起来要容易得多

答案 2 :(得分:1)

无法为您的任务提供解决方案,但是当您长时间在这个问题上苦苦挣扎时,我会尽力为您指明正确的方向:

  1. 由于您可能必须编写 VSCode 的扩展名,因此您应该以VS Code API开始。或附有教程。也许这一个:Your First Extension
  2. 然后,有一个官方的extension处理“查找所有引用”命令。我调查了-只有4个代码文件,它们看起来也不是很神秘。因此,您可以将此扩展作为起点并调整您的需求。

我认为这种方式比 Compiler API

答案 3 :(得分:1)

我在同一个任务中,并且我通过了您的帖子,我终于使用ts-morph了, 就这么简单。

import { Project } from "ts-morph";
const project = new Project({
    tsConfigFilePath: "<yourproject>\\tsconfig.json",
});

for(const sourceFile of project.getSourceFiles()){
    for(const classDeclaration  of sourceFile.getClasses()){
        console.log("---------")
        console.log("Class ",classDeclaration.getName())
        console.log("---------")
        const referencedSymbols = classDeclaration.findReferences();

        for (const referencedSymbol of referencedSymbols) {
            for (const reference of referencedSymbol.getReferences()) {
                console.log("---------")
                console.log("REFERENCE")
                console.log("---------")
                console.log("File path: " + reference.getSourceFile().getFilePath());
                console.log("Start: " + reference.getTextSpan().getStart());
                console.log("Length: " + reference.getTextSpan().getLength());
                console.log("Parent kind: " + reference.getNode().getParentOrThrow().getKindName());
                console.log("\n");
            }
        }
    }
}

答案 4 :(得分:0)

我刚刚找到了软件包ts-simple-ast。它们提供了功能.findReferences()(请参阅here)。