abstrakt syntakstræ - Ændring af TypeScript-symbol ved hjælp af compiler-API
Jeg prøver at bruge TypeScript-compiler-API'en (1.4) til at omdøbe symboler på tværs af kildefiler, for eksempel ved at omdøbe en global variabel og alle referencer til den. Jeg startede med instruktionerne her, og brugte derefter denne til at hente alle identifikatorer
function getNodes(sf: ts.SourceFile): ts.Node[]
{
var nodes: ts.Node[] = [];
function allNodes(n: ts.Node)
{
ts.forEachChild(n, n => { if (n.kind == ts.SyntaxKind.Identifier) nodes.push(n); allNodes(n); return false; })
};
allNodes(sf);
return nodes;
}
Når du har oprettet din typekontrol, kan du derefter løse dine noder (hvor hver reference til identifikatoren har en separat instans) til symboler (hvor referencer til den samme variabel har den samme instans):
var checker = program.getTypeChecker(true);
var symbols = getNodes(sourceFile).map((n, i, array) => checker.getSymbolAtLocation(n));
Fantastisk. Men nu sidder jeg fast, da symbolet ser ud til at være uforanderligt. Skal man klone det og derefter give en slags opslagstabel til emitteren? Eller en brugerdefineret SymbolWriter, eller SymbolDisplayBuilder? Jeg kan ikke se mange udvidelsespunkter i klasserne.
Svar #1
for eksempel at omdøbe en global variabel og alle henvisninger til den.
Symboler har deklarationer gemt inde i sig (nogle dokumenter https://basarat.gitbook.io/typescript/overview/binder/binder-declarations)
Du kan få adgang til disse ved at bruge let declarations=symbol.getDeclarations();, og faktisk er det præcis, hvad getRenameInfo i services.ts gør (kildekode).