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

如何使用开源Typescript编译器代码提取给定Typescript代码的AST?,typescript,abstract-syntax-tree,Typescript,Abstract Syntax Tree,众所周知,Typescript现在是完全开源的。可在以下网址获得:。我正在构建一个应用程序,它将Typescript代码作为输入,并将给定代码的AST作为输出。提供一种正确的方法来提取输入类型脚本代码的AST(抽象语法树),而不是将其编译并转换为Javascript。基本代码: const fileNames = ["C:\\MyFile.ts"]; const compilerOptions: ts.CompilerOptions = { // compiler options go

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

基本代码:

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 {}
它将输出
MyClass
MyInterface


要想弄清楚我刚才所展示的以外的一切是一项艰巨的工作。查看和/或帮助您对其做出贡献可能更为有益。

TypeScript编译器不支持它,但您可以使用重铸和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)}
`);

我不理解{/*编译器选项转到这里*/}的区域。请解释它的意思?@AhmedRaza编译器选项,如tsconfig.json中的选项。类型将为
ts.CompilerOptions
。我会更新我的答案。请分享任何与之相关的例子。@AhmedRaza我用一个有效的例子更新了它,但你必须弄清楚其余的。是的,这很好,但如果我在类和接口中声明任何变量或函数,它也会给出相同的输出。如何在类中提取变量和函数。您还可以在