Я пытаюсь построить график определения и использования переменных в программе для машинописи.
Я использовал машинопись 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
.
Кроме того, я понимаю, что могу вручную построить график, если для каждого идентификатора я посмотрю на его символьную информацию и пойму, где он был объявлен, это будет выводом, является ли это переменной.
Но есть ли более быстрый способ достичь этого? Я подозреваю, что есть встроенный способ сделать это? Не удалось обнаружить это в документации.