1 # |
|
2 # Jasy - Web Tooling Framework |
|
3 # Copyright 2010-2012 Zynga Inc. |
|
4 # Copyright 2013-2014 Sebastian Werner |
|
5 # |
|
6 |
|
7 # |
|
8 # License: MPL 1.1/GPL 2.0/LGPL 2.1 |
|
9 # Authors: |
|
10 # - Brendan Eich <brendan@mozilla.org> (Original JavaScript) (2004-2010) |
|
11 # - Sebastian Werner <info@sebastian-werner.net> (Python Port) (2010) |
|
12 # |
|
13 |
|
14 from __future__ import unicode_literals |
|
15 |
|
16 import jasy.js.parse.Node |
|
17 |
|
18 class VanillaBuilder: |
|
19 """The vanilla AST builder.""" |
|
20 |
|
21 def COMMENTS_add(self, currNode, prevNode, comments): |
|
22 if not comments: |
|
23 return |
|
24 |
|
25 currComments = [] |
|
26 prevComments = [] |
|
27 for comment in comments: |
|
28 # post comments - for previous node |
|
29 if comment.context == "inline": |
|
30 prevComments.append(comment) |
|
31 |
|
32 # all other comment styles are attached to the current one |
|
33 else: |
|
34 currComments.append(comment) |
|
35 |
|
36 # Merge with previously added ones |
|
37 if hasattr(currNode, "comments"): |
|
38 currNode.comments.extend(currComments) |
|
39 else: |
|
40 currNode.comments = currComments |
|
41 |
|
42 if prevNode: |
|
43 if hasattr(prevNode, "comments"): |
|
44 prevNode.comments.extend(prevComments) |
|
45 else: |
|
46 prevNode.comments = prevComments |
|
47 else: |
|
48 # Don't loose the comment in tree (if not previous node is there, attach it to this node) |
|
49 currNode.comments.extend(prevComments) |
|
50 |
|
51 def IF_build(self, tokenizer): |
|
52 return jasy.js.parse.Node.Node(tokenizer, "if") |
|
53 |
|
54 def IF_setCondition(self, node, expression): |
|
55 node.append(expression, "condition") |
|
56 |
|
57 def IF_setThenPart(self, node, statement): |
|
58 node.append(statement, "thenPart") |
|
59 |
|
60 def IF_setElsePart(self, node, statement): |
|
61 node.append(statement, "elsePart") |
|
62 |
|
63 def IF_finish(self, node): |
|
64 pass |
|
65 |
|
66 def SWITCH_build(self, tokenizer): |
|
67 node = jasy.js.parse.Node.Node(tokenizer, "switch") |
|
68 node.defaultIndex = -1 |
|
69 return node |
|
70 |
|
71 def SWITCH_setDiscriminant(self, node, expression): |
|
72 node.append(expression, "discriminant") |
|
73 |
|
74 def SWITCH_setDefaultIndex(self, node, index): |
|
75 node.defaultIndex = index |
|
76 |
|
77 def SWITCH_addCase(self, node, childNode): |
|
78 node.append(childNode) |
|
79 |
|
80 def SWITCH_finish(self, node): |
|
81 pass |
|
82 |
|
83 def CASE_build(self, tokenizer): |
|
84 return jasy.js.parse.Node.Node(tokenizer, "case") |
|
85 |
|
86 def CASE_setLabel(self, node, expression): |
|
87 node.append(expression, "label") |
|
88 |
|
89 def CASE_initializeStatements(self, node, tokenizer): |
|
90 node.append(jasy.js.parse.Node.Node(tokenizer, "block"), "statements") |
|
91 |
|
92 def CASE_addStatement(self, node, statement): |
|
93 node.statements.append(statement) |
|
94 |
|
95 def CASE_finish(self, node): |
|
96 pass |
|
97 |
|
98 def DEFAULT_build(self, tokenizer): |
|
99 return jasy.js.parse.Node.Node(tokenizer, "default") |
|
100 |
|
101 def DEFAULT_initializeStatements(self, node, tokenizer): |
|
102 node.append(jasy.js.parse.Node.Node(tokenizer, "block"), "statements") |
|
103 |
|
104 def DEFAULT_addStatement(self, node, statement): |
|
105 node.statements.append(statement) |
|
106 |
|
107 def DEFAULT_finish(self, node): |
|
108 pass |
|
109 |
|
110 def FOR_build(self, tokenizer): |
|
111 node = jasy.js.parse.Node.Node(tokenizer, "for") |
|
112 node.isLoop = True |
|
113 node.isEach = False |
|
114 return node |
|
115 |
|
116 def FOR_rebuildForEach(self, node): |
|
117 node.isEach = True |
|
118 |
|
119 # NB: This function is called after rebuildForEach, if that'statement called at all. |
|
120 def FOR_rebuildForIn(self, node): |
|
121 node.type = "for_in" |
|
122 |
|
123 def FOR_setCondition(self, node, expression): |
|
124 node.append(expression, "condition") |
|
125 |
|
126 def FOR_setSetup(self, node, expression): |
|
127 node.append(expression, "setup") |
|
128 |
|
129 def FOR_setUpdate(self, node, expression): |
|
130 node.append(expression, "update") |
|
131 |
|
132 def FOR_setObject(self, node, expression, forBlock=None): |
|
133 # wpbasti: not sure what forBlock stands for but it is used in the parser |
|
134 # JS tolerates the optinal unused parameter, but not so Python. |
|
135 node.append(expression, "object") |
|
136 |
|
137 def FOR_setIterator(self, node, expression, forBlock=None): |
|
138 # wpbasti: not sure what forBlock stands for but it is used in the parser |
|
139 # JS tolerates the optinal unused parameter, but not so Python. |
|
140 node.append(expression, "iterator") |
|
141 |
|
142 def FOR_setBody(self, node, statement): |
|
143 node.append(statement, "body") |
|
144 |
|
145 def FOR_finish(self, node): |
|
146 pass |
|
147 |
|
148 def WHILE_build(self, tokenizer): |
|
149 node = jasy.js.parse.Node.Node(tokenizer, "while") |
|
150 node.isLoop = True |
|
151 return node |
|
152 |
|
153 def WHILE_setCondition(self, node, expression): |
|
154 node.append(expression, "condition") |
|
155 |
|
156 def WHILE_setBody(self, node, statement): |
|
157 node.append(statement, "body") |
|
158 |
|
159 def WHILE_finish(self, node): |
|
160 pass |
|
161 |
|
162 def DO_build(self, tokenizer): |
|
163 node = jasy.js.parse.Node.Node(tokenizer, "do") |
|
164 node.isLoop = True |
|
165 return node |
|
166 |
|
167 def DO_setCondition(self, node, expression): |
|
168 node.append(expression, "condition") |
|
169 |
|
170 def DO_setBody(self, node, statement): |
|
171 node.append(statement, "body") |
|
172 |
|
173 def DO_finish(self, node): |
|
174 pass |
|
175 |
|
176 def BREAK_build(self, tokenizer): |
|
177 return jasy.js.parse.Node.Node(tokenizer, "break") |
|
178 |
|
179 def BREAK_setLabel(self, node, label): |
|
180 node.label = label |
|
181 |
|
182 def BREAK_setTarget(self, node, target): |
|
183 # Hint, no append() - relation, but not a child |
|
184 node.target = target |
|
185 |
|
186 def BREAK_finish(self, node): |
|
187 pass |
|
188 |
|
189 def CONTINUE_build(self, tokenizer): |
|
190 return jasy.js.parse.Node.Node(tokenizer, "continue") |
|
191 |
|
192 def CONTINUE_setLabel(self, node, label): |
|
193 node.label = label |
|
194 |
|
195 def CONTINUE_setTarget(self, node, target): |
|
196 # Hint, no append() - relation, but not a child |
|
197 node.target = target |
|
198 |
|
199 def CONTINUE_finish(self, node): |
|
200 pass |
|
201 |
|
202 def TRY_build(self, tokenizer): |
|
203 node = jasy.js.parse.Node.Node(tokenizer, "try") |
|
204 return node |
|
205 |
|
206 def TRY_setTryBlock(self, node, statement): |
|
207 node.append(statement, "tryBlock") |
|
208 |
|
209 def TRY_addCatch(self, node, childNode): |
|
210 node.append(childNode) |
|
211 |
|
212 def TRY_finishCatches(self, node): |
|
213 pass |
|
214 |
|
215 def TRY_setFinallyBlock(self, node, statement): |
|
216 node.append(statement, "finallyBlock") |
|
217 |
|
218 def TRY_finish(self, node): |
|
219 pass |
|
220 |
|
221 def CATCH_build(self, tokenizer): |
|
222 node = jasy.js.parse.Node.Node(tokenizer, "catch") |
|
223 return node |
|
224 |
|
225 def CATCH_wrapException(self, tokenizer): |
|
226 node = jasy.js.parse.Node.Node(tokenizer, "exception") |
|
227 node.value = tokenizer.token.value |
|
228 return node |
|
229 |
|
230 def CATCH_setException(self, node, exception): |
|
231 node.append(exception, "exception") |
|
232 |
|
233 def CATCH_setGuard(self, node, expression): |
|
234 node.append(expression, "guard") |
|
235 |
|
236 def CATCH_setBlock(self, node, statement): |
|
237 node.append(statement, "block") |
|
238 |
|
239 def CATCH_finish(self, node): |
|
240 pass |
|
241 |
|
242 def THROW_build(self, tokenizer): |
|
243 return jasy.js.parse.Node.Node(tokenizer, "throw") |
|
244 |
|
245 def THROW_setException(self, node, expression): |
|
246 node.append(expression, "exception") |
|
247 |
|
248 def THROW_finish(self, node): |
|
249 pass |
|
250 |
|
251 def RETURN_build(self, tokenizer): |
|
252 return jasy.js.parse.Node.Node(tokenizer, "return") |
|
253 |
|
254 def RETURN_setValue(self, node, expression): |
|
255 node.append(expression, "value") |
|
256 |
|
257 def RETURN_finish(self, node): |
|
258 pass |
|
259 |
|
260 def YIELD_build(self, tokenizer): |
|
261 return jasy.js.parse.Node.Node(tokenizer, "yield") |
|
262 |
|
263 def YIELD_setValue(self, node, expression): |
|
264 node.append(expression, "value") |
|
265 |
|
266 def YIELD_finish(self, node): |
|
267 pass |
|
268 |
|
269 def GENERATOR_build(self, tokenizer): |
|
270 return jasy.js.parse.Node.Node(tokenizer, "generator") |
|
271 |
|
272 def GENERATOR_setExpression(self, node, expression): |
|
273 node.append(expression, "expression") |
|
274 |
|
275 def GENERATOR_setTail(self, node, childNode): |
|
276 node.append(childNode, "tail") |
|
277 |
|
278 def GENERATOR_finish(self, node): |
|
279 pass |
|
280 |
|
281 def WITH_build(self, tokenizer): |
|
282 return jasy.js.parse.Node.Node(tokenizer, "with") |
|
283 |
|
284 def WITH_setObject(self, node, expression): |
|
285 node.append(expression, "object") |
|
286 |
|
287 def WITH_setBody(self, node, statement): |
|
288 node.append(statement, "body") |
|
289 |
|
290 def WITH_finish(self, node): |
|
291 pass |
|
292 |
|
293 def DEBUGGER_build(self, tokenizer): |
|
294 return jasy.js.parse.Node.Node(tokenizer, "debugger") |
|
295 |
|
296 def SEMICOLON_build(self, tokenizer): |
|
297 return jasy.js.parse.Node.Node(tokenizer, "semicolon") |
|
298 |
|
299 def SEMICOLON_setExpression(self, node, expression): |
|
300 node.append(expression, "expression") |
|
301 |
|
302 def SEMICOLON_finish(self, node): |
|
303 pass |
|
304 |
|
305 def LABEL_build(self, tokenizer): |
|
306 return jasy.js.parse.Node.Node(tokenizer, "label") |
|
307 |
|
308 def LABEL_setLabel(self, node, label): |
|
309 node.label = label |
|
310 |
|
311 def LABEL_setStatement(self, node, statement): |
|
312 node.append(statement, "statement") |
|
313 |
|
314 def LABEL_finish(self, node): |
|
315 pass |
|
316 |
|
317 def FUNCTION_build(self, tokenizer): |
|
318 node = jasy.js.parse.Node.Node(tokenizer) |
|
319 if node.type != "function": |
|
320 if tokenizer.token.value == "get": |
|
321 node.type = "getter" |
|
322 else: |
|
323 node.type = "setter" |
|
324 |
|
325 return node |
|
326 |
|
327 def FUNCTION_setName(self, node, identifier): |
|
328 node.name = identifier |
|
329 |
|
330 def FUNCTION_initParams(self, node, tokenizer): |
|
331 node.append(jasy.js.parse.Node.Node(tokenizer, "list"), "params") |
|
332 |
|
333 def FUNCTION_wrapParam(self, tokenizer): |
|
334 param = jasy.js.parse.Node.Node(tokenizer) |
|
335 param.value = tokenizer.token.value |
|
336 return param |
|
337 |
|
338 def FUNCTION_addParam(self, node, tokenizer, expression): |
|
339 node.params.append(expression) |
|
340 |
|
341 def FUNCTION_setExpressionClosure(self, node, expressionClosure): |
|
342 node.expressionClosure = expressionClosure |
|
343 |
|
344 def FUNCTION_setBody(self, node, statement): |
|
345 # copy over function parameters to function body |
|
346 params = getattr(node, "params", None) |
|
347 #if params: |
|
348 # statement.params = [param.value for param in params] |
|
349 |
|
350 node.append(statement, "body") |
|
351 |
|
352 def FUNCTION_hoistVars(self, x): |
|
353 pass |
|
354 |
|
355 def FUNCTION_finish(self, node, x): |
|
356 pass |
|
357 |
|
358 def VAR_build(self, tokenizer): |
|
359 return jasy.js.parse.Node.Node(tokenizer, "var") |
|
360 |
|
361 def VAR_addDecl(self, node, childNode, childContext=None): |
|
362 node.append(childNode) |
|
363 |
|
364 def VAR_finish(self, node): |
|
365 pass |
|
366 |
|
367 def CONST_build(self, tokenizer): |
|
368 return jasy.js.parse.Node.Node(tokenizer, "const") |
|
369 |
|
370 def CONST_addDecl(self, node, childNode, childContext=None): |
|
371 node.append(childNode) |
|
372 |
|
373 def CONST_finish(self, node): |
|
374 pass |
|
375 |
|
376 def LET_build(self, tokenizer): |
|
377 return jasy.js.parse.Node.Node(tokenizer, "let") |
|
378 |
|
379 def LET_addDecl(self, node, childNode, childContext=None): |
|
380 node.append(childNode) |
|
381 |
|
382 def LET_finish(self, node): |
|
383 pass |
|
384 |
|
385 def DECL_build(self, tokenizer): |
|
386 return jasy.js.parse.Node.Node(tokenizer, "declaration") |
|
387 |
|
388 def DECL_setNames(self, node, expression): |
|
389 node.append(expression, "names") |
|
390 |
|
391 def DECL_setName(self, node, identifier): |
|
392 node.name = identifier |
|
393 |
|
394 def DECL_setInitializer(self, node, expression): |
|
395 node.append(expression, "initializer") |
|
396 |
|
397 def DECL_setReadOnly(self, node, readOnly): |
|
398 node.readOnly = readOnly |
|
399 |
|
400 def DECL_finish(self, node): |
|
401 pass |
|
402 |
|
403 def LETBLOCK_build(self, tokenizer): |
|
404 node = jasy.js.parse.Node.Node(tokenizer, "let_block") |
|
405 return node |
|
406 |
|
407 def LETBLOCK_setVariables(self, node, childNode): |
|
408 node.append(childNode, "variables") |
|
409 |
|
410 def LETBLOCK_setExpression(self, node, expression): |
|
411 node.append(expression, "expression") |
|
412 |
|
413 def LETBLOCK_setBlock(self, node, statement): |
|
414 node.append(statement, "block") |
|
415 |
|
416 def LETBLOCK_finish(self, node): |
|
417 pass |
|
418 |
|
419 def BLOCK_build(self, tokenizer, id): |
|
420 node = jasy.js.parse.Node.Node(tokenizer, "block") |
|
421 # node.id = id |
|
422 return node |
|
423 |
|
424 def BLOCK_hoistLets(self, node): |
|
425 pass |
|
426 |
|
427 def BLOCK_addStatement(self, node, childNode): |
|
428 node.append(childNode) |
|
429 |
|
430 def BLOCK_finish(self, node): |
|
431 pass |
|
432 |
|
433 def EXPRESSION_build(self, tokenizer, tokenType): |
|
434 return jasy.js.parse.Node.Node(tokenizer, tokenType) |
|
435 |
|
436 def EXPRESSION_addOperand(self, node, childNode): |
|
437 node.append(childNode) |
|
438 |
|
439 def EXPRESSION_finish(self, node): |
|
440 pass |
|
441 |
|
442 def ASSIGN_build(self, tokenizer): |
|
443 return jasy.js.parse.Node.Node(tokenizer, "assign") |
|
444 |
|
445 def ASSIGN_addOperand(self, node, childNode): |
|
446 node.append(childNode) |
|
447 |
|
448 def ASSIGN_setAssignOp(self, node, operator): |
|
449 node.assignOp = operator |
|
450 |
|
451 def ASSIGN_finish(self, node): |
|
452 pass |
|
453 |
|
454 def HOOK_build(self, tokenizer): |
|
455 return jasy.js.parse.Node.Node(tokenizer, "hook") |
|
456 |
|
457 def HOOK_setCondition(self, node, expression): |
|
458 node.append(expression, "condition") |
|
459 |
|
460 def HOOK_setThenPart(self, node, childNode): |
|
461 node.append(childNode, "thenPart") |
|
462 |
|
463 def HOOK_setElsePart(self, node, childNode): |
|
464 node.append(childNode, "elsePart") |
|
465 |
|
466 def HOOK_finish(self, node): |
|
467 pass |
|
468 |
|
469 def OR_build(self, tokenizer): |
|
470 return jasy.js.parse.Node.Node(tokenizer, "or") |
|
471 |
|
472 def OR_addOperand(self, node, childNode): |
|
473 node.append(childNode) |
|
474 |
|
475 def OR_finish(self, node): |
|
476 pass |
|
477 |
|
478 def AND_build(self, tokenizer): |
|
479 return jasy.js.parse.Node.Node(tokenizer, "and") |
|
480 |
|
481 def AND_addOperand(self, node, childNode): |
|
482 node.append(childNode) |
|
483 |
|
484 def AND_finish(self, node): |
|
485 pass |
|
486 |
|
487 def BITWISEOR_build(self, tokenizer): |
|
488 return jasy.js.parse.Node.Node(tokenizer, "bitwise_or") |
|
489 |
|
490 def BITWISEOR_addOperand(self, node, childNode): |
|
491 node.append(childNode) |
|
492 |
|
493 def BITWISEOR_finish(self, node): |
|
494 pass |
|
495 |
|
496 def BITWISEXOR_build(self, tokenizer): |
|
497 return jasy.js.parse.Node.Node(tokenizer, "bitwise_xor") |
|
498 |
|
499 def BITWISEXOR_addOperand(self, node, childNode): |
|
500 node.append(childNode) |
|
501 |
|
502 def BITWISEXOR_finish(self, node): |
|
503 pass |
|
504 |
|
505 def BITWISEAND_build(self, tokenizer): |
|
506 return jasy.js.parse.Node.Node(tokenizer, "bitwise_and") |
|
507 |
|
508 def BITWISEAND_addOperand(self, node, childNode): |
|
509 node.append(childNode) |
|
510 |
|
511 def BITWISEAND_finish(self, node): |
|
512 pass |
|
513 |
|
514 def EQUALITY_build(self, tokenizer): |
|
515 # NB: tokenizer.token.type must be "eq", "ne", "strict_eq", or "strict_ne". |
|
516 return jasy.js.parse.Node.Node(tokenizer) |
|
517 |
|
518 def EQUALITY_addOperand(self, node, childNode): |
|
519 node.append(childNode) |
|
520 |
|
521 def EQUALITY_finish(self, node): |
|
522 pass |
|
523 |
|
524 def RELATIONAL_build(self, tokenizer): |
|
525 # NB: tokenizer.token.type must be "lt", "le", "ge", or "gt". |
|
526 return jasy.js.parse.Node.Node(tokenizer) |
|
527 |
|
528 def RELATIONAL_addOperand(self, node, childNode): |
|
529 node.append(childNode) |
|
530 |
|
531 def RELATIONAL_finish(self, node): |
|
532 pass |
|
533 |
|
534 def SHIFT_build(self, tokenizer): |
|
535 # NB: tokenizer.token.type must be "lsh", "rsh", or "ursh". |
|
536 return jasy.js.parse.Node.Node(tokenizer) |
|
537 |
|
538 def SHIFT_addOperand(self, node, childNode): |
|
539 node.append(childNode) |
|
540 |
|
541 def SHIFT_finish(self, node): |
|
542 pass |
|
543 |
|
544 def ADD_build(self, tokenizer): |
|
545 # NB: tokenizer.token.type must be "plus" or "minus". |
|
546 return jasy.js.parse.Node.Node(tokenizer) |
|
547 |
|
548 def ADD_addOperand(self, node, childNode): |
|
549 node.append(childNode) |
|
550 |
|
551 def ADD_finish(self, node): |
|
552 pass |
|
553 |
|
554 def MULTIPLY_build(self, tokenizer): |
|
555 # NB: tokenizer.token.type must be "mul", "div", or "mod". |
|
556 return jasy.js.parse.Node.Node(tokenizer) |
|
557 |
|
558 def MULTIPLY_addOperand(self, node, childNode): |
|
559 node.append(childNode) |
|
560 |
|
561 def MULTIPLY_finish(self, node): |
|
562 pass |
|
563 |
|
564 def UNARY_build(self, tokenizer): |
|
565 # NB: tokenizer.token.type must be "delete", "void", "typeof", "not", "bitwise_not", |
|
566 # "unary_plus", "unary_minus", "increment", or "decrement". |
|
567 if tokenizer.token.type == "plus": |
|
568 tokenizer.token.type = "unary_plus" |
|
569 elif tokenizer.token.type == "minus": |
|
570 tokenizer.token.type = "unary_minus" |
|
571 |
|
572 return jasy.js.parse.Node.Node(tokenizer) |
|
573 |
|
574 def UNARY_addOperand(self, node, childNode): |
|
575 node.append(childNode) |
|
576 |
|
577 def UNARY_setPostfix(self, node): |
|
578 node.postfix = True |
|
579 |
|
580 def UNARY_finish(self, node): |
|
581 pass |
|
582 |
|
583 def MEMBER_build(self, tokenizer, tokenType=None): |
|
584 node = jasy.js.parse.Node.Node(tokenizer, tokenType) |
|
585 if node.type == "identifier": |
|
586 node.value = tokenizer.token.value |
|
587 return node |
|
588 |
|
589 def MEMBER_rebuildNewWithArgs(self, node): |
|
590 node.type = "new_with_args" |
|
591 |
|
592 def MEMBER_addOperand(self, node, childNode): |
|
593 node.append(childNode) |
|
594 |
|
595 def MEMBER_finish(self, node): |
|
596 pass |
|
597 |
|
598 def PRIMARY_build(self, tokenizer, tokenType): |
|
599 # NB: tokenizer.token.type must be "null", "this", "true", "false", "identifier", "number", "string", or "regexp". |
|
600 node = jasy.js.parse.Node.Node(tokenizer, tokenType) |
|
601 if tokenType in ("identifier", "string", "regexp", "number"): |
|
602 node.value = tokenizer.token.value |
|
603 |
|
604 return node |
|
605 |
|
606 def PRIMARY_finish(self, node): |
|
607 pass |
|
608 |
|
609 def ARRAYINIT_build(self, tokenizer): |
|
610 return jasy.js.parse.Node.Node(tokenizer, "array_init") |
|
611 |
|
612 def ARRAYINIT_addElement(self, node, childNode): |
|
613 node.append(childNode) |
|
614 |
|
615 def ARRAYINIT_finish(self, node): |
|
616 pass |
|
617 |
|
618 def ARRAYCOMP_build(self, tokenizer): |
|
619 return jasy.js.parse.Node.Node(tokenizer, "array_comp") |
|
620 |
|
621 def ARRAYCOMP_setExpression(self, node, expression): |
|
622 node.append(expression, "expression") |
|
623 |
|
624 def ARRAYCOMP_setTail(self, node, childNode): |
|
625 node.append(childNode, "tail") |
|
626 |
|
627 def ARRAYCOMP_finish(self, node): |
|
628 pass |
|
629 |
|
630 def COMPTAIL_build(self, tokenizer): |
|
631 return jasy.js.parse.Node.Node(tokenizer, "comp_tail") |
|
632 |
|
633 def COMPTAIL_setGuard(self, node, expression): |
|
634 node.append(expression, "guard") |
|
635 |
|
636 def COMPTAIL_addFor(self, node, childNode): |
|
637 node.append(childNode, "for") |
|
638 |
|
639 def COMPTAIL_finish(self, node): |
|
640 pass |
|
641 |
|
642 def OBJECTINIT_build(self, tokenizer): |
|
643 return jasy.js.parse.Node.Node(tokenizer, "object_init") |
|
644 |
|
645 def OBJECTINIT_addProperty(self, node, childNode): |
|
646 node.append(childNode) |
|
647 |
|
648 def OBJECTINIT_finish(self, node): |
|
649 pass |
|
650 |
|
651 def PROPERTYINIT_build(self, tokenizer): |
|
652 return jasy.js.parse.Node.Node(tokenizer, "property_init") |
|
653 |
|
654 def PROPERTYINIT_addOperand(self, node, childNode): |
|
655 node.append(childNode) |
|
656 |
|
657 def PROPERTYINIT_finish(self, node): |
|
658 pass |
|
659 |
|
660 def COMMA_build(self, tokenizer): |
|
661 return jasy.js.parse.Node.Node(tokenizer, "comma") |
|
662 |
|
663 def COMMA_addOperand(self, node, childNode): |
|
664 node.append(childNode) |
|
665 |
|
666 def COMMA_finish(self, node): |
|
667 pass |
|
668 |
|
669 def LIST_build(self, tokenizer): |
|
670 return jasy.js.parse.Node.Node(tokenizer, "list") |
|
671 |
|
672 def LIST_addOperand(self, node, childNode): |
|
673 node.append(childNode) |
|
674 |
|
675 def LIST_finish(self, node): |
|
676 pass |
|
677 |
|
678 def setHoists(self, id, vds): |
|
679 pass |
|