我正在尝试在打字稿程序中构建变量定义和用法的图形。
我使用打字稿的compiler-api
实现了这一目标。通过玩一会儿,我发现每个节点都与一个Symbol
对象相关联,该对象与此symbolFlag
相关联。从symbolFlag
对象访问此Node
的正确方法是什么?
这是我到目前为止尝试过的-
function get_variable_names(node: ts.Node, pgm: ts.Program): void{
var nodes: ts.Node[] = [];
function getNodes(sf: ts.Node): ts.Node[] {
var nodes: ts.Node[] = [];
function allNodes(n: ts.Node) {
ts.forEachChild(n, n => { nodes.push(n); allNodes(n); return false; })
};
allNodes(sf);
return nodes;
}
var id_nodes = getNodes(node).filter(n => n.kind === ts.SyntaxKind.Identifier);
const checker = pgm.getTypeChecker()
const names = id_nodes.map(n => (checker.getSymbolAtLocation(n).getDeclarations()));
// Not really sure here.
console.log(names);
}
此外,我收到一个编译错误,提示Cannot read property 'getDeclarations' of undefined
。
此外,我意识到我可以手动构造一个图形,如果对于每个标识符,我查看其符号信息并收集其声明位置,则可以推断出它是否是变量。
但是有没有更快的方法来实现这一目标?我怀疑这是一种内置方法吗?在文档中找不到它。