【问题标题】:How to parse a TypeScript code base into ASTs如何将 TypeScript 代码库解析为 AST
【发布时间】:2017-06-13 13:03:39
【问题描述】:

我想将 TypeScript 项目解析为 AST。

我可以通过以下方式解析单个文件:

import ts = require("typescript");
var fs          = require('fs');
var util      = require('util');


const ast = ts.createSourceFile('sample.ts', fs.readFileSync('sample.ts').toString(), ts.ScriptTarget.ES6, true);

console.log("AST:"+util.inspect(ast));

我什至可以遍历文件并按扩展名过滤文件并运行上面的代码来生成 ASt。

但是,我想以这样一种方式解析整个项目,以便将关系(如导入)保留在 AST 中。

例如:

如果 a.ts 引用来自 b.ts 的 var x 如下:

a.ts:

var y = x;

b.ts:

var x = 5;

在这种情况下,.ts 中的 x 签名应解析为:b.ts.x 或等效项。

我只希望在我一一解析 .ts 文件时在 ASs 中解决所有此类关系。

【问题讨论】:

    标签: parsing typescript abstract-syntax-tree decompiler


    【解决方案1】:

    您可以使用

    加载您的项目

    ts.createProgram(rootNames: string[], options: CompilerOptions, host?: CompilerHost, oldProgram?: Program)

    rootNames 是项目中所有打字稿文件的列表。据我所知,除非您明确声明类型,否则 AST 不会引用它。

    例如。如果你有

    class MyClass { 
       // some code
    }
    
    let instance1 = new MyClass();
    let instance2: MyClass = new MyClass();
    

    在 AST 中,instance1 的节点将具有未定义的类型属性,对于 instance2,类型属性将具有正确的 TypeReference

    对于类型检查,您可以使用Program.getTypeChecker()。这将返回一个TypeChecker,可用于分析程序中的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2017-07-13
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      相关资源
      最近更新 更多