def replace_nodes_in_ast(node: SymbolNode, replacements: Dict[SymbolNode, SymbolNode]) -> SymbolNode: """Replace all references to replacement map keys within an AST node, recursively. Also replace the *identity* of any nodes that have replacements. Return the *replaced* version of the argument node (which may have a different identity, if it's included in the replacement map). """ visitor = NodeReplaceVisitor(replacements) node.accept(visitor) return replacements.get(node, node)
def add_local(self, symbol: SymbolNode, typ: RType, is_arg: bool = False) -> 'Register': assert isinstance(symbol, SymbolNode) reg = Register(typ, symbol.line, is_arg=is_arg) self.symtable[symbol] = AssignmentTargetRegister(reg) self.add(reg, symbol.name()) return reg
def fullname(node: SymbolNode) -> str: name = node.fullname() if name.startswith('builtins.'): return name[9:] else: return name
def replace_nodes_in_ast(node: SymbolNode, replacements: Dict[SymbolNode, SymbolNode]) -> SymbolNode: visitor = NodeReplaceVisitor(replacements) node.accept(visitor) return replacements.get(node, node)