10
10
11
11
const esprima = require ( 'esprima' ) ;
12
12
const fs = require ( 'fs' ) ;
13
- const sloc = require ( 'sloc' ) ;
14
13
const escodegen = require ( 'escodegen' ) ;
14
+ const prep = require ( './srcPreprocessor' ) ;
15
15
16
16
/* AST visitor */
17
17
function visit ( root , visitor ) {
@@ -162,57 +162,70 @@ function ppPos(nd) {
162
162
return basename ( nd . attr . enclosingFile ) + "@" + nd . loc . start . line + ":" + nd . range [ 0 ] + "-" + nd . range [ 1 ] ;
163
163
}
164
164
165
- /* Build an AST from a collection of source files. */
166
- function buildAST ( files ) {
167
- var sources = files . map ( function ( file ) {
168
- return { filename : file ,
169
- program : fs . readFileSync ( file , 'utf-8' ) } ;
170
- } ) ;
171
-
172
- var ast = {
165
+ /* Build as AST from a collection of source files */
166
+ function astFromFiles ( files ) {
167
+ const ast = {
173
168
type : 'ProgramCollection' ,
174
169
programs : [ ] ,
175
170
attr : { }
176
- } ;
177
- sources . forEach ( function ( source ) {
178
- var prog = esprima . parseModule ( source . program , { loc : true , range : true , tolerant : true } ) ;
179
- prog . attr = { filename : source . filename , sloc : sloc ( source . program , "js" ) . sloc } ;
180
- ast . programs . push ( prog ) ;
181
- } ) ;
171
+ }
172
+
173
+ for ( let file of files ) {
174
+ let src = fs . readFileSync ( file , 'utf-8' ) ;
175
+ ast . programs . push ( buildProgram ( file , src ) ) ;
176
+ }
182
177
init ( ast ) ;
183
- ast . attr . sloc = ast . programs
184
- . map ( function ( program ) {
185
- return program . attr . sloc ;
186
- } ) . reduce ( function ( previous , current ) {
187
- return previous + current ;
188
- } ) ;
189
178
return ast ;
190
179
}
191
180
192
- function buildSingleAST ( fname , src ) {
193
- let prog ;
194
- try {
195
- prog = esprima . parseModule ( src ,
196
- { loc : true , range : true , tolerant : true , jsx : true } ) ;
197
- }
198
- catch ( err ) {
199
- console . log ( '-------------------------------------------' ) ;
200
- console . log ( 'Warning: Esprima failed to parse ' + fname ) ;
201
- console . log ( err . stack ) ;
202
- console . log ( '-------------------------------------------' ) ;
203
- return null ;
204
- }
205
- prog . attr = { filename : fname , sloc : sloc ( src , 'js' ) . sloc } ;
206
-
181
+ /* Build an AST from file name and source code */
182
+ function astFromSrc ( fname , src ) {
183
+ const prog = buildProgram ( fname , src ) ;
207
184
const ast = {
208
185
'type' : 'ProgramCollection' ,
209
186
'programs' : [ prog ] ,
210
- 'attr' : { sloc : prog . attr . sloc }
187
+ 'attr' : { }
211
188
}
212
189
init ( ast ) ;
213
190
return ast ;
214
191
}
215
192
193
+ function reportError ( msg , err ) {
194
+ console . log ( '-------------------------------------------' ) ;
195
+ console . log ( msg ) ;
196
+ console . log ( err . stack ) ;
197
+ console . log ( '-------------------------------------------' ) ;
198
+ }
199
+
200
+ function buildProgram ( fname , src ) {
201
+ // transpile typescript
202
+ try {
203
+ if ( fname . endsWith ( '.ts' ) )
204
+ src = prep . typescriptPrep ( src ) ;
205
+ }
206
+ catch ( err ) {
207
+ reportError ( 'WARNING: Transpiling typescript failed.' , err ) ;
208
+ return null ;
209
+ }
210
+
211
+ // parse javascript
212
+ let prog ;
213
+ try {
214
+ prog = esprima . parseModule ( src , {
215
+ loc : true ,
216
+ range : true ,
217
+ tolerant : true ,
218
+ jsx : true
219
+ } ) ;
220
+ }
221
+ catch ( err ) {
222
+ reportError ( 'Warning: Esprima failed to parse ' + fname , err ) ;
223
+ return null ;
224
+ }
225
+ prog . attr = { filename : fname } ;
226
+ return prog ;
227
+ }
228
+
216
229
// cf is used by getFunctions
217
230
const cf = funcObj => {
218
231
return funcObj . file + ':' +
@@ -233,7 +246,7 @@ const astToCode = astNode => {
233
246
234
247
Args:
235
248
root - An ast node of type 'ProgramCollection',
236
- - the output of buildSingleAST function,
249
+ - the output of astFromSrc function,
237
250
- thus, root.programs.length is equal to 1
238
251
239
252
Returns:
@@ -415,8 +428,8 @@ module.exports.init = init;
415
428
module . exports . ppPos = ppPos ;
416
429
module . exports . funcname = funcname ;
417
430
module . exports . encFuncName = encFuncName ;
418
- module . exports . buildAST = buildAST ;
419
- module . exports . buildSingleAST = buildSingleAST ;
431
+ module . exports . astFromFiles = astFromFiles ;
432
+ module . exports . astFromSrc = astFromSrc ;
420
433
module . exports . getFunctions = getFunctions ;
421
434
module . exports . isAnon = isAnon ;
422
435
module . exports . isModuleExports = isModuleExports ;
0 commit comments