Path: blob/main/python/pylang/src/output/literals.py
1398 views
# vim:fileencoding=utf-81# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>2from __python__ import hash_literals34from ast_types import AST_Binary, AST_Number, AST_String, is_node_type567def print_array(self, output):8output.print('ρσ_list_decorate')910def f_list_decorate():11def f_list_decorate0():12a = self.elements13len_ = a.length14if len_ > 0:15output.space()16for i, exp in enumerate(a):17if i:18output.comma()19exp.print(output)20if len_ > 0:21output.space()2223output.with_square(f_list_decorate0)2425output.with_parens(f_list_decorate)262728def print_obj_literal_slow(self, output):29def f_obj_literal_slow():30output.print('function()')3132def f_obj_literal_slow0():33output.indent()34if self.is_pydict:35output.spaced.apply(output, 'var ρσ_d = ρσ_dict()'.split(' '))36else:37output.spaced(38'var', 'ρσ_d', '=',39('Object.create(null)' if self.is_jshash else '{}'))40output.end_statement()41for i, prop in enumerate(self.properties):42output.indent()43if self.is_pydict:44output.print('ρσ_d.set')4546def f_py_dict():47prop.key.print(output)48output.print(','), output.space()49prop.value.print(output)5051output.with_parens(f_py_dict)52else:53output.print('ρσ_d')54output.with_square(lambda: prop.key.print(output))55output.space(), output.print('='), output.space()56prop.value.print(output)57output.end_statement()58output.indent()59output.spaced('return', 'ρσ_d')60output.end_statement()6162output.with_block(f_obj_literal_slow0)6364output.with_parens(f_obj_literal_slow)65output.print('.call(this)')666768# This simple obj literal printer works fine for literals69# that aren't supposed to be dict's, I think. The function70# print_obj_literal_slow above was what RapydScript had,71# but in running the brython benchmarks, I found it was72# insanely slow, since e.g., {[0]:0} is 100x slower than73# {0:0} in javascript.74def print_obj_literal(self, output):75if self.is_pydict:76print_obj_literal_slow(self, output)77return78output.print("{")79for i, prop in enumerate(self.properties):80if is_node_type(prop.key, AST_Number) or is_node_type(81prop.key, AST_String):82prop.key.print(output)83else:8485def key():86prop.key.print(output)8788output.with_square(key)89output.print(":")90prop.value.print(output)91if i + 1 < len(self.properties):92output.print(",")93output.print("}")949596def print_object(self, output):97if self.is_pydict:98if self.properties.length > 0:99print_obj_literal(self, output)100else:101output.print('ρσ_dict()')102else:103if self.properties.length > 0:104print_obj_literal(self, output)105else:106output.print("Object.create(null)" if self.is_jshash else '{}')107108109def print_set(self, output):110if self.items.length is 0:111output.print('ρσ_set()')112return113114def f_print_set():115output.print('function()')116117def f_print_set0():118output.indent()119output.spaced.apply(output, 'var s = ρσ_set()'.split(' '))120output.end_statement()121for item in self.items:122output.indent()123output.print('s.jsset.add')124output.with_parens(lambda: item.value.print(output))125output.end_statement()126output.indent()127output.spaced('return', 's')128output.end_statement()129130output.with_block(f_print_set0)131132output.with_parens(f_print_set)133output.print('()')134135136def print_regexp(self, output):137str_ = self.value.toString()138if output.options.ascii_only:139str_ = output.to_ascii(str_)140output.print(str_)141p = output.parent()142if is_node_type(p, AST_Binary) and RegExp(r"^in").test(143p.operator) and p.left is self:144output.print(" ")145146147