Typescript: mengakses "Find All References" VS Code secara programatis


Salah satu hal yang saya sukai tentang Typescript di VS Code adalah kemampuan untuk menemukan semua referensi ke sebuah fungsi dengan Shift+F12 (atau klik kanan). Apakah mungkin untuk mengakses pemetaan ini secara programatis, atau mengekspornya dengan cara tertentu?

Keluaran akan berisi informasi seperti:

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

Karena ini mudah dilakukan 'secara manual', saya berharap ini juga bisa dilakukan secara programatik, tapi saya tidak yakin antarmuka apa yang tersedia.

Jawaban #1

Saya sedang dalam pencarian yang sama dan saya melewati postingan Anda, akhirnya saya mendapatkannya menggunakan ts-morph, ini sesederhana mungkin.

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");
            }
        }
    }
}

Jawaban #2

Untuk solusi yang paling fleksibel, Anda akan ingin menggunakan API Layanan Bahasa TypeScript. Metode spesifik yang Anda inginkan adalah findReferences. Pada tingkat yang sangat tinggi, program Anda akan terlihat seperti ini:

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());

Namun itu mungkin berlebihan tergantung pada kebutuhan Anda. Menyiapkan layanan bahasa juga bisa cukup sulit.

Sebagai gantinya, Anda mungkin dapat menggunakan kembali logika temukan semua referensi di VS Code. Untuk melakukan ini, buat ekstensi VS Code yang mengeksekusi perintah vscode.executeReferenceProvider

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
   }
}

Ini berarti bahwa Anda harus menjalankan program Anda sebagai ekstensi VS Code, tetapi jauh lebih mudah untuk menyiapkannya

Artikel terkait