1 # |
1 # |
2 # Jasy - Web Tooling Framework |
2 # Jasy - Web Tooling Framework |
3 # Copyright 2010-2012 Zynga Inc. |
3 # Copyright 2010-2012 Zynga Inc. |
|
4 # Copyright 2013-2014 Sebastian Werner |
4 # |
5 # |
5 |
6 |
6 # |
7 # |
7 # License: MPL 1.1/GPL 2.0/LGPL 2.1 |
8 # License: MPL 1.1/GPL 2.0/LGPL 2.1 |
8 # Authors: |
9 # Authors: |
9 # - Brendan Eich <brendan@mozilla.org> (Original JavaScript) (2004-2010) |
10 # - Brendan Eich <brendan@mozilla.org> (Original JavaScript) (2004-2010) |
10 # - Sebastian Werner <info@sebastian-werner.net> (Python Port) (2010) |
11 # - Sebastian Werner <info@sebastian-werner.net> (Python Port) (2010) |
11 # |
12 # |
12 |
13 |
13 from __future__ import unicode_literals |
14 from __future__ import unicode_literals |
14 |
15 |
15 import jasy.js.parse.Node |
16 import jasy.js.parse.Node |
16 |
17 |
17 class VanillaBuilder: |
18 class VanillaBuilder: |
18 """The vanilla AST builder.""" |
19 """The vanilla AST builder.""" |
19 |
20 |
20 def COMMENTS_add(self, currNode, prevNode, comments): |
21 def COMMENTS_add(self, currNode, prevNode, comments): |
21 if not comments: |
22 if not comments: |
22 return |
23 return |
23 |
24 |
24 currComments = [] |
25 currComments = [] |
25 prevComments = [] |
26 prevComments = [] |
26 for comment in comments: |
27 for comment in comments: |
27 # post comments - for previous node |
28 # post comments - for previous node |
28 if comment.context == "inline": |
29 if comment.context == "inline": |
29 prevComments.append(comment) |
30 prevComments.append(comment) |
30 |
31 |
31 # all other comment styles are attached to the current one |
32 # all other comment styles are attached to the current one |
32 else: |
33 else: |
33 currComments.append(comment) |
34 currComments.append(comment) |
34 |
35 |
35 # Merge with previously added ones |
36 # Merge with previously added ones |
36 if hasattr(currNode, "comments"): |
37 if hasattr(currNode, "comments"): |
37 currNode.comments.extend(currComments) |
38 currNode.comments.extend(currComments) |
38 else: |
39 else: |
39 currNode.comments = currComments |
40 currNode.comments = currComments |
40 |
41 |
41 if prevNode: |
42 if prevNode: |
42 if hasattr(prevNode, "comments"): |
43 if hasattr(prevNode, "comments"): |
43 prevNode.comments.extend(prevComments) |
44 prevNode.comments.extend(prevComments) |
44 else: |
45 else: |
45 prevNode.comments = prevComments |
46 prevNode.comments = prevComments |
46 else: |
47 else: |
47 # Don't loose the comment in tree (if not previous node is there, attach it |
48 # Don't loose the comment in tree (if not previous node is there, attach it to this node) |
48 # to this node) |
|
49 currNode.comments.extend(prevComments) |
49 currNode.comments.extend(prevComments) |
50 |
50 |
51 def IF_build(self, tokenizer): |
51 def IF_build(self, tokenizer): |
52 return jasy.js.parse.Node.Node(tokenizer, "if") |
52 return jasy.js.parse.Node.Node(tokenizer, "if") |
53 |
53 |
54 def IF_setCondition(self, node, expression): |
54 def IF_setCondition(self, node, expression): |
55 node.append(expression, "condition") |
55 node.append(expression, "condition") |
319 if node.type != "function": |
319 if node.type != "function": |
320 if tokenizer.token.value == "get": |
320 if tokenizer.token.value == "get": |
321 node.type = "getter" |
321 node.type = "getter" |
322 else: |
322 else: |
323 node.type = "setter" |
323 node.type = "setter" |
324 |
324 |
325 return node |
325 return node |
326 |
326 |
327 def FUNCTION_setName(self, node, identifier): |
327 def FUNCTION_setName(self, node, identifier): |
328 node.name = identifier |
328 node.name = identifier |
329 |
329 |
330 def FUNCTION_initParams(self, node, tokenizer): |
330 def FUNCTION_initParams(self, node, tokenizer): |
331 node.append(jasy.js.parse.Node.Node(tokenizer, "list"), "params") |
331 node.append(jasy.js.parse.Node.Node(tokenizer, "list"), "params") |
332 |
332 |
333 def FUNCTION_wrapParam(self, tokenizer): |
333 def FUNCTION_wrapParam(self, tokenizer): |
334 param = jasy.js.parse.Node.Node(tokenizer) |
334 param = jasy.js.parse.Node.Node(tokenizer) |
335 param.value = tokenizer.token.value |
335 param.value = tokenizer.token.value |
336 return param |
336 return param |
337 |
337 |
338 def FUNCTION_addParam(self, node, tokenizer, expression): |
338 def FUNCTION_addParam(self, node, tokenizer, expression): |
339 node.params.append(expression) |
339 node.params.append(expression) |
340 |
340 |
341 def FUNCTION_setExpressionClosure(self, node, expressionClosure): |
341 def FUNCTION_setExpressionClosure(self, node, expressionClosure): |
342 node.expressionClosure = expressionClosure |
342 node.expressionClosure = expressionClosure |
343 |
343 |
344 def FUNCTION_setBody(self, node, statement): |
344 def FUNCTION_setBody(self, node, statement): |
345 # copy over function parameters to function body |
345 # copy over function parameters to function body |
346 #params = getattr(node, "params", None) |
346 params = getattr(node, "params", None) |
347 #if params: |
347 #if params: |
348 # statement.params = [param.value for param in params] |
348 # statement.params = [param.value for param in params] |
349 |
349 |
350 node.append(statement, "body") |
350 node.append(statement, "body") |
351 |
351 |
352 def FUNCTION_hoistVars(self, x): |
352 def FUNCTION_hoistVars(self, x): |
353 pass |
353 pass |
354 |
354 |
560 |
560 |
561 def MULTIPLY_finish(self, node): |
561 def MULTIPLY_finish(self, node): |
562 pass |
562 pass |
563 |
563 |
564 def UNARY_build(self, tokenizer): |
564 def UNARY_build(self, tokenizer): |
565 # NB: tokenizer.token.type must be "delete", "void", "typeof", "not", |
565 # NB: tokenizer.token.type must be "delete", "void", "typeof", "not", "bitwise_not", |
566 # "bitwise_not", "unary_plus", "unary_minus", "increment", or "decrement". |
566 # "unary_plus", "unary_minus", "increment", or "decrement". |
567 if tokenizer.token.type == "plus": |
567 if tokenizer.token.type == "plus": |
568 tokenizer.token.type = "unary_plus" |
568 tokenizer.token.type = "unary_plus" |
569 elif tokenizer.token.type == "minus": |
569 elif tokenizer.token.type == "minus": |
570 tokenizer.token.type = "unary_minus" |
570 tokenizer.token.type = "unary_minus" |
571 |
571 |
572 return jasy.js.parse.Node.Node(tokenizer) |
572 return jasy.js.parse.Node.Node(tokenizer) |
573 |
573 |
574 def UNARY_addOperand(self, node, childNode): |
574 def UNARY_addOperand(self, node, childNode): |
575 node.append(childNode) |
575 node.append(childNode) |
576 |
576 |
594 |
594 |
595 def MEMBER_finish(self, node): |
595 def MEMBER_finish(self, node): |
596 pass |
596 pass |
597 |
597 |
598 def PRIMARY_build(self, tokenizer, tokenType): |
598 def PRIMARY_build(self, tokenizer, tokenType): |
599 # NB: tokenizer.token.type must be "null", "this", "true", "false", "identifier", |
599 # NB: tokenizer.token.type must be "null", "this", "true", "false", "identifier", "number", "string", or "regexp". |
600 # "number", "string", or "regexp". |
|
601 node = jasy.js.parse.Node.Node(tokenizer, tokenType) |
600 node = jasy.js.parse.Node.Node(tokenizer, tokenType) |
602 if tokenType in ("identifier", "string", "regexp", "number"): |
601 if tokenType in ("identifier", "string", "regexp", "number"): |
603 node.value = tokenizer.token.value |
602 node.value = tokenizer.token.value |
604 |
603 |
605 return node |
604 return node |
606 |
605 |
607 def PRIMARY_finish(self, node): |
606 def PRIMARY_finish(self, node): |
608 pass |
607 pass |
609 |
608 |
616 def ARRAYINIT_finish(self, node): |
615 def ARRAYINIT_finish(self, node): |
617 pass |
616 pass |
618 |
617 |
619 def ARRAYCOMP_build(self, tokenizer): |
618 def ARRAYCOMP_build(self, tokenizer): |
620 return jasy.js.parse.Node.Node(tokenizer, "array_comp") |
619 return jasy.js.parse.Node.Node(tokenizer, "array_comp") |
621 |
620 |
622 def ARRAYCOMP_setExpression(self, node, expression): |
621 def ARRAYCOMP_setExpression(self, node, expression): |
623 node.append(expression, "expression") |
622 node.append(expression, "expression") |
624 |
623 |
625 def ARRAYCOMP_setTail(self, node, childNode): |
624 def ARRAYCOMP_setTail(self, node, childNode): |
626 node.append(childNode, "tail") |
625 node.append(childNode, "tail") |
627 |
626 |
628 def ARRAYCOMP_finish(self, node): |
627 def ARRAYCOMP_finish(self, node): |
629 pass |
628 pass |
630 |
629 |
631 def COMPTAIL_build(self, tokenizer): |
630 def COMPTAIL_build(self, tokenizer): |
632 return jasy.js.parse.Node.Node(tokenizer, "comp_tail") |
631 return jasy.js.parse.Node.Node(tokenizer, "comp_tail") |