typescript - 使用编译器 API 修改 TypeScript 符号

标签 typescript abstract-syntax-tree

我正在尝试使用 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(); 访问这些内容事实上,这正是 getRenameInfoservices.ts确实 ( source code )。

关于typescript - 使用编译器 API 修改 TypeScript 符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31122541/

相关文章:

c - 如何在程序中自动插入 pragma

Angular 哪个组件将首先调用或执行?

用于 ANTLR 的 JAVA 树解析器

javascript - 与 Iframe Angular 交互后的 Chrome 后退按钮问题

TypeScript:迭代接口(interface)字段不起作用

java - VariableDeclarationFragment 节点 resolveBindind() 在 eclipse/jdt/ast 中返回 null

java - 为 Antlr Java 8 语法添加注释

Java AST 解析器 - 获取参数的完整类型、外部项目

typescript - tsconfig.json 的定义

angular - 如何循环使用部分元素以使用 ng-content 进行投影