ThirdParty/Jasy/jasy/js/parse/VanillaBuilder.py

branch
maintenance
changeset 6693
3629d88ae235
parent 6647
2a11e1b2dcbe
parent 6692
c104c120e043
child 6694
1cccd74fd355
equal deleted inserted replaced
6647:2a11e1b2dcbe 6693:3629d88ae235
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

eric ide

mercurial