我可以加载一个文件并使用babel遍历它,它看起来像这样:
var babylon = require("babylon");
let contents = fs.readFileSync("example.js","utf-8");
let ast = babylon.parse(contents);
现在的问题是,如果我的程序中有多个文件,如何获得AST(抽象语法树)。
main.js
export const getFoo(){
return "a"
}
example.js
import {getFoo} from './main'
let bar = getFoo() + "baz";
显然,我希望将函数声明和函数调用表达式放入相同的AST中,但同时也要获取行号和列(node.loc)信息以显示特定文件。
如果您知道AST的路径并加载它们,则可以从多个文件联系AST。
import {parse} from '@babel/parser';
const a = 'var a = 1;'; // or fs.readFileSync("a.js","utf-8");
const b = 'var b = 2;'; // or fs.readFileSync("b.js","utf-8");
const astA = parse(a, { sourceFilename: 'a.js' });
const astB = parse(b, { sourceFilename: 'b.js' });
const ast = {
type: 'Program',
body: [].concat(astA.program.body, astB.program.body)
};
但是我无法找出如何直接从多个文件中获取AST的方法。我试图编写一个babel插件来分析导入文件中的代码,但我还没有意识到该怎么做。