def process(tree, id_): # refresh scopes to get a check-set tree = scopes.create_scopes(tree) check_set = tree.scope.all_var_names() check_set.update(lang.RESERVED.keys()) # assuming a <file> or <block> node statementsNode = tree.getChild("statements") # create a map for strings to var names stringMap = search(statementsNode, verbose=False) if len(stringMap) == 0: return tree # apply the vars #stringList = sort(stringMap) replace(statementsNode, stringMap, check_set) # create a 'var' decl for the string vars stringReplacement = replacement(stringMap) repl_tree = treeutil.compileString(stringReplacement, id_ + "||stringopt") # ensure a wrapping closure closure, closure_block = treeutil.ensureClosureWrapper(statementsNode.children) statementsNode.removeAllChildren() statementsNode.addChild(closure) # add 'var' decl to closure closure_block.addChild(repl_tree, 0) # 'var ...'; decl to front of statement list return tree
def process(tree, id_): # refresh scopes to get a check-set tree = scopes.create_scopes(tree) check_set = tree.scope.all_var_names() check_set.update(lang.RESERVED.keys()) # assuming a <file> or <block> node statementsNode = tree.getChild("statements") # create a map for strings to var names stringMap = search(statementsNode) if len(stringMap) == 0: return tree # apply the vars #stringList = sort(stringMap) replace(statementsNode, stringMap, check_set) # create a 'var' decl for the string vars stringReplacement = replacement(stringMap) repl_tree = treeutil.compileString(stringReplacement, id_ + "||stringopt") # ensure a wrapping closure closure, closure_block = treeutil.ensureClosureWrapper( statementsNode.children) statementsNode.removeAllChildren() statementsNode.addChild(closure) # add 'var' decl to closure closure_block.addChild(repl_tree, 0) # 'var ...'; decl to front of statement list return tree
def propagate_new_globals(node, new_symbols, globals_map): # make sure there is a wrapping closure node, closure_block = treeutil.ensureClosureWrapper(node) # add new statements at end for new_symbol in new_symbols: # construct statement stmt = "%s = %s;" % (globals_map[new_symbol], new_symbol) # compile to JS stmt_tree = treegenerator.parse(stmt) # attach to node tree closure_block.addChild(stmt_tree) # does append by default
def propagate_new_globals(node, new_symbols, globals_map): # assuming a container <node>, like <file> or <block> # make sure there is a wrapping closure stmtsNode = node.getChild("statements") new_node, closure_block = treeutil.ensureClosureWrapper(stmtsNode.children) stmtsNode.removeAllChildren() stmtsNode.addChild(new_node) # add new statements at end for new_symbol in new_symbols: # construct statement stmt = "%s = %s;" % (globals_map[new_symbol], new_symbol) # compile to JS stmt_tree = treegenerator.parse(stmt).getFirstChild() # unwrap from 'statments' node # attach to node tree closure_block.addChild(stmt_tree) # does append by default return node