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

changeset 2779
4d433896b6d6
child 2847
1843ef6e2656
diff -r 43b8060a4b44 -r 4d433896b6d6 ThirdParty/Jasy/jasy/js/parse/VanillaBuilder.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ThirdParty/Jasy/jasy/js/parse/VanillaBuilder.py	Tue Jul 09 19:30:56 2013 +0200
@@ -0,0 +1,678 @@
+#
+# Jasy - Web Tooling Framework
+# Copyright 2010-2012 Zynga Inc.
+#
+
+#
+# License: MPL 1.1/GPL 2.0/LGPL 2.1
+# Authors: 
+#   - Brendan Eich <brendan@mozilla.org> (Original JavaScript) (2004-2010)
+#   - Sebastian Werner <info@sebastian-werner.net> (Python Port) (2010)
+#
+
+import jasy.js.parse.Node
+
+class VanillaBuilder:
+    """The vanilla AST builder."""
+    
+    def COMMENTS_add(self, currNode, prevNode, comments):
+        if not comments:
+            return
+            
+        currComments = []
+        prevComments = []
+        for comment in comments:
+            # post comments - for previous node
+            if comment.context == "inline":
+                prevComments.append(comment)
+                
+            # all other comment styles are attached to the current one
+            else:
+                currComments.append(comment)
+        
+        # Merge with previously added ones
+        if hasattr(currNode, "comments"):
+            currNode.comments.extend(currComments)
+        else:
+            currNode.comments = currComments
+        
+        if prevNode:
+            if hasattr(prevNode, "comments"):
+                prevNode.comments.extend(prevComments)
+            else:
+                prevNode.comments = prevComments
+        else:
+            # Don't loose the comment in tree (if not previous node is there, attach it
+            # to this node)
+            currNode.comments.extend(prevComments)
+    
+    def IF_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "if")
+
+    def IF_setCondition(self, node, expression):
+        node.append(expression, "condition")
+
+    def IF_setThenPart(self, node, statement):
+        node.append(statement, "thenPart")
+
+    def IF_setElsePart(self, node, statement):
+        node.append(statement, "elsePart")
+
+    def IF_finish(self, node):
+        pass
+
+    def SWITCH_build(self, tokenizer):
+        node = jasy.js.parse.Node.Node(tokenizer, "switch")
+        node.defaultIndex = -1
+        return node
+
+    def SWITCH_setDiscriminant(self, node, expression):
+        node.append(expression, "discriminant")
+
+    def SWITCH_setDefaultIndex(self, node, index):
+        node.defaultIndex = index
+
+    def SWITCH_addCase(self, node, childNode):
+        node.append(childNode)
+
+    def SWITCH_finish(self, node):
+        pass
+
+    def CASE_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "case")
+
+    def CASE_setLabel(self, node, expression):
+        node.append(expression, "label")
+
+    def CASE_initializeStatements(self, node, tokenizer):
+        node.append(jasy.js.parse.Node.Node(tokenizer, "block"), "statements")
+
+    def CASE_addStatement(self, node, statement):
+        node.statements.append(statement)
+
+    def CASE_finish(self, node):
+        pass
+
+    def DEFAULT_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "default")
+
+    def DEFAULT_initializeStatements(self, node, tokenizer):
+        node.append(jasy.js.parse.Node.Node(tokenizer, "block"), "statements")
+
+    def DEFAULT_addStatement(self, node, statement):
+        node.statements.append(statement)
+
+    def DEFAULT_finish(self, node):
+        pass
+
+    def FOR_build(self, tokenizer):
+        node = jasy.js.parse.Node.Node(tokenizer, "for")
+        node.isLoop = True
+        node.isEach = False
+        return node
+
+    def FOR_rebuildForEach(self, node):
+        node.isEach = True
+
+    # NB: This function is called after rebuildForEach, if that'statement called at all.
+    def FOR_rebuildForIn(self, node):
+        node.type = "for_in"
+
+    def FOR_setCondition(self, node, expression):
+        node.append(expression, "condition")
+
+    def FOR_setSetup(self, node, expression):
+        node.append(expression, "setup")
+
+    def FOR_setUpdate(self, node, expression):
+        node.append(expression, "update")
+
+    def FOR_setObject(self, node, expression, forBlock=None):
+        # wpbasti: not sure what forBlock stands for but it is used in the parser
+        # JS tolerates the optinal unused parameter, but not so Python.
+        node.append(expression, "object")
+
+    def FOR_setIterator(self, node, expression, forBlock=None):
+        # wpbasti: not sure what forBlock stands for but it is used in the parser
+        # JS tolerates the optinal unused parameter, but not so Python.
+        node.append(expression, "iterator")
+
+    def FOR_setBody(self, node, statement):
+        node.append(statement, "body")
+
+    def FOR_finish(self, node):
+        pass
+
+    def WHILE_build(self, tokenizer):
+        node = jasy.js.parse.Node.Node(tokenizer, "while")
+        node.isLoop = True
+        return node
+
+    def WHILE_setCondition(self, node, expression):
+        node.append(expression, "condition")
+
+    def WHILE_setBody(self, node, statement):
+        node.append(statement, "body")
+
+    def WHILE_finish(self, node):
+        pass
+
+    def DO_build(self, tokenizer):
+        node = jasy.js.parse.Node.Node(tokenizer, "do")
+        node.isLoop = True
+        return node
+
+    def DO_setCondition(self, node, expression):
+        node.append(expression, "condition")
+
+    def DO_setBody(self, node, statement):
+        node.append(statement, "body")
+
+    def DO_finish(self, node):
+        pass
+
+    def BREAK_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "break")
+
+    def BREAK_setLabel(self, node, label):
+        node.label = label
+
+    def BREAK_setTarget(self, node, target):
+        # Hint, no append() - relation, but not a child
+        node.target = target
+
+    def BREAK_finish(self, node):
+        pass
+
+    def CONTINUE_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "continue")
+
+    def CONTINUE_setLabel(self, node, label):
+        node.label = label
+
+    def CONTINUE_setTarget(self, node, target):
+        # Hint, no append() - relation, but not a child
+        node.target = target
+
+    def CONTINUE_finish(self, node):
+        pass
+
+    def TRY_build(self, tokenizer):
+        node = jasy.js.parse.Node.Node(tokenizer, "try")
+        return node
+
+    def TRY_setTryBlock(self, node, statement):
+        node.append(statement, "tryBlock")
+
+    def TRY_addCatch(self, node, childNode):
+        node.append(childNode)
+
+    def TRY_finishCatches(self, node):
+        pass
+
+    def TRY_setFinallyBlock(self, node, statement):
+        node.append(statement, "finallyBlock")
+
+    def TRY_finish(self, node):
+        pass
+
+    def CATCH_build(self, tokenizer):
+        node = jasy.js.parse.Node.Node(tokenizer, "catch")
+        return node
+        
+    def CATCH_wrapException(self, tokenizer):
+        node = jasy.js.parse.Node.Node(tokenizer, "exception")
+        node.value = tokenizer.token.value
+        return node
+
+    def CATCH_setException(self, node, exception):
+        node.append(exception, "exception")
+
+    def CATCH_setGuard(self, node, expression):
+        node.append(expression, "guard")
+
+    def CATCH_setBlock(self, node, statement):
+        node.append(statement, "block")
+
+    def CATCH_finish(self, node):
+        pass
+
+    def THROW_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "throw")
+
+    def THROW_setException(self, node, expression):
+        node.append(expression, "exception")
+
+    def THROW_finish(self, node):
+        pass
+
+    def RETURN_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "return")
+
+    def RETURN_setValue(self, node, expression):
+        node.append(expression, "value")
+
+    def RETURN_finish(self, node):
+        pass
+
+    def YIELD_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "yield")
+
+    def YIELD_setValue(self, node, expression):
+        node.append(expression, "value")
+
+    def YIELD_finish(self, node):
+        pass
+
+    def GENERATOR_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "generator")
+
+    def GENERATOR_setExpression(self, node, expression):
+        node.append(expression, "expression")
+
+    def GENERATOR_setTail(self, node, childNode):
+        node.append(childNode, "tail")
+
+    def GENERATOR_finish(self, node):
+        pass
+
+    def WITH_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "with")
+
+    def WITH_setObject(self, node, expression):
+        node.append(expression, "object")
+
+    def WITH_setBody(self, node, statement):
+        node.append(statement, "body")
+
+    def WITH_finish(self, node):
+        pass
+
+    def DEBUGGER_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "debugger")
+
+    def SEMICOLON_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "semicolon")
+
+    def SEMICOLON_setExpression(self, node, expression):
+        node.append(expression, "expression")
+
+    def SEMICOLON_finish(self, node):
+        pass
+
+    def LABEL_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "label")
+
+    def LABEL_setLabel(self, node, label):
+        node.label = label
+
+    def LABEL_setStatement(self, node, statement):
+        node.append(statement, "statement")
+
+    def LABEL_finish(self, node):
+        pass
+
+    def FUNCTION_build(self, tokenizer):
+        node = jasy.js.parse.Node.Node(tokenizer)
+        if node.type != "function":
+            if tokenizer.token.value == "get":
+                node.type = "getter"
+            else:
+                node.type = "setter"
+                
+        return node
+
+    def FUNCTION_setName(self, node, identifier):
+        node.name = identifier
+
+    def FUNCTION_initParams(self, node, tokenizer):
+        node.append(jasy.js.parse.Node.Node(tokenizer, "list"), "params")
+        
+    def FUNCTION_wrapParam(self, tokenizer):
+        param = jasy.js.parse.Node.Node(tokenizer)
+        param.value = tokenizer.token.value
+        return param
+        
+    def FUNCTION_addParam(self, node, tokenizer, expression):
+        node.params.append(expression)
+        
+    def FUNCTION_setExpressionClosure(self, node, expressionClosure):
+        node.expressionClosure = expressionClosure
+
+    def FUNCTION_setBody(self, node, statement):
+        # copy over function parameters to function body
+        #params = getattr(node, "params", None)
+        #if params:
+        #    statement.params = [param.value for param in params]
+            
+        node.append(statement, "body")
+
+    def FUNCTION_hoistVars(self, x):
+        pass
+
+    def FUNCTION_finish(self, node, x):
+        pass
+
+    def VAR_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "var")
+
+    def VAR_addDecl(self, node, childNode, childContext=None):
+        node.append(childNode)
+
+    def VAR_finish(self, node):
+        pass
+
+    def CONST_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "const")
+
+    def CONST_addDecl(self, node, childNode, childContext=None):
+        node.append(childNode)
+
+    def CONST_finish(self, node):
+        pass
+
+    def LET_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "let")
+
+    def LET_addDecl(self, node, childNode, childContext=None):
+        node.append(childNode)
+
+    def LET_finish(self, node):
+        pass
+
+    def DECL_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "declaration")
+
+    def DECL_setNames(self, node, expression):
+        node.append(expression, "names")
+
+    def DECL_setName(self, node, identifier):
+        node.name = identifier
+
+    def DECL_setInitializer(self, node, expression):
+        node.append(expression, "initializer")
+
+    def DECL_setReadOnly(self, node, readOnly):
+        node.readOnly = readOnly
+
+    def DECL_finish(self, node):
+        pass
+
+    def LETBLOCK_build(self, tokenizer):
+        node = jasy.js.parse.Node.Node(tokenizer, "let_block")
+        return node
+
+    def LETBLOCK_setVariables(self, node, childNode):
+        node.append(childNode, "variables")
+
+    def LETBLOCK_setExpression(self, node, expression):
+        node.append(expression, "expression")
+
+    def LETBLOCK_setBlock(self, node, statement):
+        node.append(statement, "block")
+
+    def LETBLOCK_finish(self, node):
+        pass
+
+    def BLOCK_build(self, tokenizer, id):
+        node = jasy.js.parse.Node.Node(tokenizer, "block")
+        # node.id = id
+        return node
+
+    def BLOCK_hoistLets(self, node):
+        pass
+
+    def BLOCK_addStatement(self, node, childNode):
+        node.append(childNode)
+
+    def BLOCK_finish(self, node):
+        pass
+
+    def EXPRESSION_build(self, tokenizer, tokenType):
+        return jasy.js.parse.Node.Node(tokenizer, tokenType)
+
+    def EXPRESSION_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def EXPRESSION_finish(self, node):
+        pass
+
+    def ASSIGN_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "assign")
+
+    def ASSIGN_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def ASSIGN_setAssignOp(self, node, operator):
+        node.assignOp = operator
+
+    def ASSIGN_finish(self, node):
+        pass
+
+    def HOOK_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "hook")
+
+    def HOOK_setCondition(self, node, expression):
+        node.append(expression, "condition")
+
+    def HOOK_setThenPart(self, node, childNode):
+        node.append(childNode, "thenPart")
+
+    def HOOK_setElsePart(self, node, childNode):
+        node.append(childNode, "elsePart")
+
+    def HOOK_finish(self, node):
+        pass
+
+    def OR_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "or")
+
+    def OR_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def OR_finish(self, node):
+        pass
+
+    def AND_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "and")
+
+    def AND_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def AND_finish(self, node):
+        pass
+
+    def BITWISEOR_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "bitwise_or")
+
+    def BITWISEOR_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def BITWISEOR_finish(self, node):
+        pass
+
+    def BITWISEXOR_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "bitwise_xor")
+
+    def BITWISEXOR_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def BITWISEXOR_finish(self, node):
+        pass
+
+    def BITWISEAND_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "bitwise_and")
+
+    def BITWISEAND_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def BITWISEAND_finish(self, node):
+        pass
+
+    def EQUALITY_build(self, tokenizer):
+        # NB: tokenizer.token.type must be "eq", "ne", "strict_eq", or "strict_ne".
+        return jasy.js.parse.Node.Node(tokenizer)
+
+    def EQUALITY_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def EQUALITY_finish(self, node):
+        pass
+
+    def RELATIONAL_build(self, tokenizer):
+        # NB: tokenizer.token.type must be "lt", "le", "ge", or "gt".
+        return jasy.js.parse.Node.Node(tokenizer)
+
+    def RELATIONAL_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def RELATIONAL_finish(self, node):
+        pass
+
+    def SHIFT_build(self, tokenizer):
+        # NB: tokenizer.token.type must be "lsh", "rsh", or "ursh".
+        return jasy.js.parse.Node.Node(tokenizer)
+
+    def SHIFT_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def SHIFT_finish(self, node):
+        pass
+
+    def ADD_build(self, tokenizer):
+        # NB: tokenizer.token.type must be "plus" or "minus".
+        return jasy.js.parse.Node.Node(tokenizer)
+
+    def ADD_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def ADD_finish(self, node):
+        pass
+
+    def MULTIPLY_build(self, tokenizer):
+        # NB: tokenizer.token.type must be "mul", "div", or "mod".
+        return jasy.js.parse.Node.Node(tokenizer)
+
+    def MULTIPLY_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def MULTIPLY_finish(self, node):
+        pass
+
+    def UNARY_build(self, tokenizer):
+        # NB: tokenizer.token.type must be "delete", "void", "typeof", "not",
+        # "bitwise_not", "unary_plus", "unary_minus", "increment", or "decrement".
+        if tokenizer.token.type == "plus":
+            tokenizer.token.type = "unary_plus"
+        elif tokenizer.token.type == "minus":
+            tokenizer.token.type = "unary_minus"
+            
+        return jasy.js.parse.Node.Node(tokenizer)
+
+    def UNARY_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def UNARY_setPostfix(self, node):
+        node.postfix = True
+
+    def UNARY_finish(self, node):
+        pass
+
+    def MEMBER_build(self, tokenizer, tokenType=None):
+        node = jasy.js.parse.Node.Node(tokenizer, tokenType)
+        if node.type == "identifier":
+            node.value = tokenizer.token.value
+        return node
+
+    def MEMBER_rebuildNewWithArgs(self, node):
+        node.type = "new_with_args"
+
+    def MEMBER_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def MEMBER_finish(self, node):
+        pass
+
+    def PRIMARY_build(self, tokenizer, tokenType):
+        # NB: tokenizer.token.type must be "null", "this", "true", "false", "identifier",
+        # "number", "string", or "regexp".
+        node = jasy.js.parse.Node.Node(tokenizer, tokenType)
+        if tokenType in ("identifier", "string", "regexp", "number"):
+            node.value = tokenizer.token.value
+            
+        return node
+
+    def PRIMARY_finish(self, node):
+        pass
+
+    def ARRAYINIT_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "array_init")
+
+    def ARRAYINIT_addElement(self, node, childNode):
+        node.append(childNode)
+
+    def ARRAYINIT_finish(self, node):
+        pass
+
+    def ARRAYCOMP_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "array_comp")
+    
+    def ARRAYCOMP_setExpression(self, node, expression):
+        node.append(expression, "expression")
+    
+    def ARRAYCOMP_setTail(self, node, childNode):
+        node.append(childNode, "tail")
+    
+    def ARRAYCOMP_finish(self, node):
+        pass
+
+    def COMPTAIL_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "comp_tail")
+
+    def COMPTAIL_setGuard(self, node, expression):
+        node.append(expression, "guard")
+
+    def COMPTAIL_addFor(self, node, childNode):
+        node.append(childNode, "for")
+
+    def COMPTAIL_finish(self, node):
+        pass
+
+    def OBJECTINIT_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "object_init")
+
+    def OBJECTINIT_addProperty(self, node, childNode):
+        node.append(childNode)
+
+    def OBJECTINIT_finish(self, node):
+        pass
+
+    def PROPERTYINIT_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "property_init")
+
+    def PROPERTYINIT_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def PROPERTYINIT_finish(self, node):
+        pass
+
+    def COMMA_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "comma")
+
+    def COMMA_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def COMMA_finish(self, node):
+        pass
+
+    def LIST_build(self, tokenizer):
+        return jasy.js.parse.Node.Node(tokenizer, "list")
+
+    def LIST_addOperand(self, node, childNode):
+        node.append(childNode)
+
+    def LIST_finish(self, node):
+        pass
+
+    def setHoists(self, id, vds):
+        pass

eric ide

mercurial