Skip to content

Commit 0e61a26

Browse files
committed
Upgraded babel parser and fixed babylon_parser.
1 parent 9125555 commit 0e61a26

File tree

2 files changed

+40
-11
lines changed

2 files changed

+40
-11
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
"prettier": "^1.19.0"
6262
},
6363
"dependencies": {
64+
"@babel/parser": "^7.8.3",
6465
"@babel/runtime": "^7.8.3",
6566
"@babel/traverse": "^7.6.2",
6667
"@babel/types": "^7.8.3",

src/parsers/babylon_parser.ts

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,35 @@ import {readFileSync} from 'fs';
1313
import {
1414
File as BabylonFile,
1515
Node as BabylonNode,
16+
BlockStatement as BabylonBlockStatement,
17+
ArrowFunctionExpression as BabylonArrowFunctionExpression,
18+
FunctionExpression as BabylonFunctionExpression,
1619
ExpressionStatement as BabylonExpressionStatement,
1720
CallExpression as BabylonCallExpression,
1821
} from '@babel/types';
19-
import {parse as babylonParse, BabylonOptions} from 'babylon';
22+
import {parse as babylonParse, ParserOptions as BabylonOptions} from '@babel/parser';
2023
import {ParsedNodeType, NamedBlock, ParsedRange, ParseResult, ParsedNode} from './parser_nodes';
2124

2225
// eslint-disable no-underscore-dangle
2326
const _getASTfor = (file: string, data?: string): [BabylonFile, string] => {
2427
const _data = data || readFileSync(file).toString();
25-
const config: BabylonOptions = {plugins: ['*'] as any[], sourceType: 'module'};
28+
const config: BabylonOptions = {
29+
// https://babeljs.io/docs/en/v7-migration-api#babel-parser-known-as-babylon
30+
plugins: [
31+
'asyncGenerators',
32+
'classProperties',
33+
'decorators-legacy',
34+
'doExpressions',
35+
'dynamicImport',
36+
// 'exportExtensions', this doesn't seem to be a valid option according to type definitions.
37+
'flow',
38+
'functionBind',
39+
'functionSent',
40+
'jsx',
41+
'objectRestSpread',
42+
],
43+
sourceType: 'module',
44+
};
2645
return [babylonParse(_data, config), _data];
2746
};
2847

@@ -130,11 +149,11 @@ export const parse = (file: string, data?: string): ParseResult => {
130149
// Look through the node's children
131150
let child: ParsedNode | undefined;
132151

133-
if (!babylonParent.body) {
152+
if (!(babylonParent as BabylonBlockStatement).body) {
134153
return;
135154
}
136155

137-
babylonParent.body.forEach(element => {
156+
(babylonParent as BabylonBlockStatement).body.forEach(element => {
138157
child = undefined;
139158
// Pull out the node
140159
// const element = babylonParent.body[node];
@@ -148,7 +167,9 @@ export const parse = (file: string, data?: string): ParseResult => {
148167
} else if (element && element.type === 'VariableDeclaration') {
149168
element.declarations
150169
.filter(declaration => declaration.init && isFunctionDeclaration(declaration.init.type))
151-
.forEach(declaration => searchNodes(declaration.init.body, parent));
170+
.forEach(declaration =>
171+
searchNodes((declaration.init as BabylonArrowFunctionExpression | BabylonFunctionExpression).body, parent)
172+
);
152173
} else if (
153174
element &&
154175
element.type === 'ExpressionStatement' &&
@@ -157,17 +178,24 @@ export const parse = (file: string, data?: string): ParseResult => {
157178
element.expression.right &&
158179
isFunctionDeclaration(element.expression.right.type)
159180
) {
160-
searchNodes(element.expression.right.body, parent);
161-
} else if (element.type === 'ReturnStatement' && element.argument.arguments) {
162-
element.argument.arguments
181+
searchNodes(
182+
(element.expression.right as BabylonArrowFunctionExpression | BabylonFunctionExpression).body,
183+
parent
184+
);
185+
} else if (element.type === 'ReturnStatement' && (element?.argument as BabylonCallExpression)?.arguments) {
186+
(element.argument as BabylonCallExpression).arguments
163187
.filter(argument => isFunctionDeclaration(argument.type))
164-
.forEach(argument => searchNodes(argument.body, parent));
188+
.forEach(argument =>
189+
searchNodes((argument as BabylonArrowFunctionExpression | BabylonFunctionExpression).body, parent)
190+
);
165191
}
166192

167193
if (isFunctionCall(element)) {
168-
element.expression.arguments
194+
((element as BabylonExpressionStatement).expression as BabylonCallExpression).arguments
169195
.filter(argument => isFunctionDeclaration(argument.type))
170-
.forEach(argument => searchNodes(argument.body, child || parent));
196+
.forEach(argument =>
197+
searchNodes((argument as BabylonArrowFunctionExpression | BabylonFunctionExpression).body, child || parent)
198+
);
171199
}
172200
});
173201
};

0 commit comments

Comments
 (0)