如何使用开源的Typescript编译器代码提取给定的Typescript代码的AST?

时间:2016-04-08 17:14:47

标签: typescript abstract-syntax-tree

众所周知,Typescript现在是完全开源的。可在Tyescript获取。我正在构建一个应用程序,它将获得Typescript代码作为输入,并为输出提供给定代码的AST。为我提供一个正确的方法来提取输入Typescript代码的AST(抽象语法树),而不是压缩它并将其转换为Javascript。

2 个答案:

答案 0 :(得分:4)

基本代码:

const fileNames = ["C:\\MyFile.ts"];
const compilerOptions: ts.CompilerOptions = {
    // compiler options go here if any...
    // look at ts.CompilerOptions to see what's available
};
const program = ts.createProgram(fileNames, compilerOptions);
const typeChecker = program.getTypeChecker();
const sourceFiles = program.getSourceFiles();

sourceFiles.filter(f => /MyFile\.ts$/.test(f.fileName)).forEach(sourceFile => {
    ts.forEachChild(sourceFile, node => {
        const declaration = node as ts.Declaration;
        if (declaration.name) {
            console.log(declaration.name.getText());
        }
    });
});

因此,如果您提供C:\MyFile.ts之类的话:

class MyClass {}
interface MyInterface {}

它会输出MyClassMyInterface

找出超出我刚刚展示的所有内容是很多工作。您可能更有利于查看和/或帮助this work in progress

答案 1 :(得分:0)

TypeScript编译器不支持它,但是您可以使用recast和babylon @ next来实现。尽管您将不得不信任这些技术定义的用于表示TypeScript代码AST的语法,并且它们将保持最新状态-因为TypeScript具有逐个版本发布(短时间)的新语言功能-与其他语言(JavaScript)不同),您具有定义明确的版本并以标准发布-因此,如果您的用户开始使用新的语言功能,则这些技术(主要是巴比伦)应该保持最新状态:

// npm install recast babylon@next
const source = `
interface I {
  color: string
}
class C implements I{
  color: string='blue'
}
`
const recast = require('recast')
const tsParser = require("recast/parsers/typescript")
const ast = recast.parse(source, {
  parser: tsParser
});
console.log(`
CODE: 

${source}

AST: 

${JSON.stringify(ast)}
`);