我正在尝试使用 TypeScript 编译器 API (1.4) 重命名源文件中的符号,例如重命名一个全局变量和对它的所有引用。我从 instructions here 开始,然后我用它来获取所有标识符
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;
}
一旦创建了类型检查器,您就可以将节点(其中对标识符的每个引用都有一个单独的实例)解析为符号(其中对同一变量的引用具有相同的实例):
var checker = program.getTypeChecker(true);
var symbols = getNodes(sourceFile).map((n, i, array) => checker.getSymbolAtLocation(n));
太棒了。但现在我被卡住了,因为这个符号似乎是不可变的。您是否应该克隆它然后向发射器提供某种查找表?或者自定义 SymbolWriter 或 SymbolDisplayBuilder?我在类中看不到很多扩展点。
最佳答案
for example renaming a global variable and all references to it.
符号内部存储了声明(一些文档 https://basarat.gitbook.io/typescript/overview/binder/binder-declarations)
您可以使用 let declarations = symbol.getDeclarations();
访问这些内容事实上,这正是 getRenameInfo
在 services.ts
确实 ( source code )。
关于typescript - 使用编译器 API 修改 TypeScript 符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31122541/