【问题标题】:How to Extract AST of given Typescript code using the open source Typescript compiler code?如何使用开源 Typescript 编译器代码提取给定 Typescript 代码的 AST?
【发布时间】:2016-04-08 17:14:47
【问题描述】:

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

【问题讨论】:

标签: typescript abstract-syntax-tree


【解决方案1】:

基本代码:

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 和/或帮助为您做出贡献可能对您更有益。

【讨论】:

  • 我不明白该区域{/*编译器选项转到此处*/}。请解释一下是什么意思?
  • @AhmedRaza 编译器选项,例如 tsconfig.json 中的选项。类型为ts.CompilerOptions。我会更新我的答案。
  • 请分享任何相关的例子。
  • @AhmedRaza 我用一个工作示例对其进行了更新,但您必须弄清楚其余部分。工作量很大。
  • 是的,它很好,但如果我在类和接口中声明任何变量或函数,它也会给出相同的输出。如何提取类中的变量和函数。
【解决方案2】:

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)}
`);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多