11/* tslint:disable: max-classes-per-file */
2+ /* tslint:disable: object-literal-shorthand*/
23import * as es from 'estree'
34import * as constants from './constants'
45import { toJS } from './interop'
@@ -124,31 +125,41 @@ function* getArgs(context: Context, call: es.CallExpression) {
124125
125126export type Evaluator < T extends es . Node > = ( node : T , context : Context ) => IterableIterator < Value >
126127
128+ /**
129+ * WARNING: Do not use object literal shorthands, e.g.
130+ * {
131+ * *Literal(node: es.Literal, ...) {...},
132+ * *ThisExpression(node: es.ThisExpression, ..._ {...},
133+ * ...
134+ * }
135+ * They do not minify well, raising uncaught syntax errors in production.
136+ * See: https://github.com/webpack/webpack/issues/7566
137+ */
127138export const evaluators : { [ nodeType : string ] : Evaluator < es . Node > } = {
128139 /** Simple Values */
129- * Literal ( node : es . Literal , context : Context ) {
140+ Literal : function * ( node : es . Literal , context : Context ) {
130141 return node . value
131142 } ,
132- * ThisExpression ( node : es . ThisExpression , context : Context ) {
143+ ThisExpression : function * ( node : es . ThisExpression , context : Context ) {
133144 return context . runtime . frames [ 0 ] . thisContext
134145 } ,
135- * ArrayExpression ( node : es . ArrayExpression , context : Context ) {
146+ ArrayExpression : function * ( node : es . ArrayExpression , context : Context ) {
136147 const res = [ ]
137148 for ( const n of node . elements ) {
138149 res . push ( yield * evaluate ( n , context ) )
139150 }
140151 return res
141152 } ,
142- * FunctionExpression ( node : es . FunctionExpression , context : Context ) {
153+ FunctionExpression : function * ( node : es . FunctionExpression , context : Context ) {
143154 return new Closure ( node , currentFrame ( context ) , context )
144155 } ,
145- * ArrowFunctionExpression ( node : es . Function , context : Context ) {
156+ ArrowFunctionExpression : function * ( node : es . Function , context : Context ) {
146157 return new ArrowClosure ( node , currentFrame ( context ) , context )
147158 } ,
148- * Identifier ( node : es . Identifier , context : Context ) {
159+ Identifier : function * ( node : es . Identifier , context : Context ) {
149160 return getVariable ( context , node . name )
150161 } ,
151- * CallExpression ( node : es . CallExpression , context : Context ) {
162+ CallExpression : function * ( node : es . CallExpression , context : Context ) {
152163 const callee = yield * evaluate ( node . callee , context )
153164 const args = yield * getArgs ( context , node )
154165 let thisContext
@@ -158,7 +169,7 @@ export const evaluators: { [nodeType: string]: Evaluator<es.Node> } = {
158169 const result = yield * apply ( context , callee , args , node , thisContext )
159170 return result
160171 } ,
161- * NewExpression ( node : es . NewExpression , context : Context ) {
172+ NewExpression : function * ( node : es . NewExpression , context : Context ) {
162173 const callee = yield * evaluate ( node . callee , context )
163174 const args = [ ]
164175 for ( const arg of node . arguments ) {
@@ -174,7 +185,7 @@ export const evaluators: { [nodeType: string]: Evaluator<es.Node> } = {
174185 }
175186 return obj
176187 } ,
177- * UnaryExpression ( node : es . UnaryExpression , context : Context ) {
188+ UnaryExpression : function * ( node : es . UnaryExpression , context : Context ) {
178189 const value = yield * evaluate ( node . argument , context )
179190
180191 const error = rttc . checkUnaryExpression ( context , node . operator , value )
@@ -191,7 +202,7 @@ export const evaluators: { [nodeType: string]: Evaluator<es.Node> } = {
191202 return + value
192203 }
193204 } ,
194- * BinaryExpression ( node : es . BinaryExpression , context : Context ) {
205+ BinaryExpression : function * ( node : es . BinaryExpression , context : Context ) {
195206 const left = yield * evaluate ( node . left , context )
196207 const right = yield * evaluate ( node . right , context )
197208
@@ -241,10 +252,10 @@ export const evaluators: { [nodeType: string]: Evaluator<es.Node> } = {
241252 }
242253 return result
243254 } ,
244- * ConditionalExpression ( node : es . ConditionalExpression , context : Context ) {
255+ ConditionalExpression : function * ( node : es . ConditionalExpression , context : Context ) {
245256 return yield * this . IfStatement ( node , context )
246257 } ,
247- * LogicalExpression ( node : es . LogicalExpression , context : Context ) {
258+ LogicalExpression : function * ( node : es . LogicalExpression , context : Context ) {
248259 const left = yield * evaluate ( node . left , context )
249260 let error = rttc . checkLogicalExpression ( context , left , true )
250261 if ( error ) {
@@ -264,20 +275,20 @@ export const evaluators: { [nodeType: string]: Evaluator<es.Node> } = {
264275 return left
265276 }
266277 } ,
267- * VariableDeclaration ( node : es . VariableDeclaration , context : Context ) {
278+ VariableDeclaration : function * ( node : es . VariableDeclaration , context : Context ) {
268279 const declaration = node . declarations [ 0 ]
269280 const id = declaration . id as es . Identifier
270281 const value = yield * evaluate ( declaration . init ! , context )
271282 defineVariable ( context , id . name , value )
272283 return undefined
273284 } ,
274- * ContinueStatement ( node : es . ContinueStatement , context : Context ) {
285+ ContinueStatement : function * ( node : es . ContinueStatement , context : Context ) {
275286 return new ContinueValue ( )
276287 } ,
277- * BreakStatement ( node : es . BreakStatement , context : Context ) {
288+ BreakStatement : function * ( node : es . BreakStatement , context : Context ) {
278289 return new BreakValue ( )
279290 } ,
280- * ForStatement ( node : es . ForStatement , context : Context ) {
291+ ForStatement : function * ( node : es . ForStatement , context : Context ) {
281292 if ( node . init ) {
282293 yield * evaluate ( node . init , context )
283294 }
@@ -305,7 +316,7 @@ export const evaluators: { [nodeType: string]: Evaluator<es.Node> } = {
305316 }
306317 return value
307318 } ,
308- * MemberExpression ( node : es . MemberExpression , context : Context ) {
319+ MemberExpression : function * ( node : es . MemberExpression , context : Context ) {
309320 let obj = yield * evaluate ( node . object , context )
310321 if ( obj instanceof Closure ) {
311322 obj = obj . fun
@@ -322,7 +333,7 @@ export const evaluators: { [nodeType: string]: Evaluator<es.Node> } = {
322333 }
323334 }
324335 } ,
325- * AssignmentExpression ( node : es . AssignmentExpression , context : Context ) {
336+ AssignmentExpression : function * ( node : es . AssignmentExpression , context : Context ) {
326337 if ( node . left . type === 'MemberExpression' ) {
327338 const left = node . left
328339 const obj = yield * evaluate ( left . object , context )
@@ -342,7 +353,7 @@ export const evaluators: { [nodeType: string]: Evaluator<es.Node> } = {
342353 setVariable ( context , id . name , value )
343354 return value
344355 } ,
345- * FunctionDeclaration ( node : es . FunctionDeclaration , context : Context ) {
356+ FunctionDeclaration : function * ( node : es . FunctionDeclaration , context : Context ) {
346357 const id = node . id as es . Identifier
347358 // tslint:disable-next-line:no-any
348359 const closure = new Closure ( node as any , currentFrame ( context ) , context )
@@ -366,7 +377,7 @@ export const evaluators: { [nodeType: string]: Evaluator<es.Node> } = {
366377 return undefined
367378 }
368379 } ,
369- * ExpressionStatement ( node : es . ExpressionStatement , context : Context ) {
380+ ExpressionStatement : function * ( node : es . ExpressionStatement , context : Context ) {
370381 return yield * evaluate ( node . expression , context )
371382 } ,
372383 * ReturnStatement ( node : es . ReturnStatement , context : Context ) {
@@ -382,7 +393,7 @@ export const evaluators: { [nodeType: string]: Evaluator<es.Node> } = {
382393 return new ReturnValue ( undefined )
383394 }
384395 } ,
385- * WhileStatement ( node : es . WhileStatement , context : Context ) {
396+ WhileStatement : function * ( node : es . WhileStatement , context : Context ) {
386397 let value : any // tslint:disable-line
387398 let test
388399 while (
@@ -399,7 +410,7 @@ export const evaluators: { [nodeType: string]: Evaluator<es.Node> } = {
399410 }
400411 return value
401412 } ,
402- * ObjectExpression ( node : es . ObjectExpression , context : Context ) {
413+ ObjectExpression : function * ( node : es . ObjectExpression , context : Context ) {
403414 const obj = { }
404415 for ( const prop of node . properties ) {
405416 let key
@@ -412,7 +423,7 @@ export const evaluators: { [nodeType: string]: Evaluator<es.Node> } = {
412423 }
413424 return obj
414425 } ,
415- * BlockStatement ( node : es . BlockStatement , context : Context ) {
426+ BlockStatement : function * ( node : es . BlockStatement , context : Context ) {
416427 let result : Value
417428 for ( const statement of node . body ) {
418429 result = yield * evaluate ( statement , context )
@@ -426,7 +437,7 @@ export const evaluators: { [nodeType: string]: Evaluator<es.Node> } = {
426437 }
427438 return result
428439 } ,
429- * Program ( node : es . BlockStatement , context : Context ) {
440+ Program : function * ( node : es . BlockStatement , context : Context ) {
430441 let result : Value
431442 for ( const statement of node . body ) {
432443 result = yield * evaluate ( statement , context )
0 commit comments