From 8d0fcbe9b2b714db2f34d202353547c840f26eec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= Date: Wed, 22 Apr 2020 01:07:26 +0300 Subject: [PATCH 1/2] bpo-38870: Don't start generated output with newlines --- Lib/ast.py | 14 ++++++++++---- Lib/test/test_unparse.py | 12 +++++------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Lib/ast.py b/Lib/ast.py index 401af5647a240ce..ff0fe6cc5452c5d 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -669,10 +669,16 @@ def items_view(self, traverser, items): else: self.interleave(lambda: self.write(", "), traverser, items) + def newline(self): + """Adds a newline if it isn't the start of generated source""" + if self._source: + self.write("\n") + def fill(self, text=""): """Indent a piece of text and append it, according to the current indentation level""" - self.write("\n" + " " * self._indent + text) + self.newline() + self.write(" " * self._indent + text) def write(self, text): """Append a piece of text""" @@ -916,7 +922,7 @@ def visit_ExceptHandler(self, node): self.traverse(node.body) def visit_ClassDef(self, node): - self.write("\n") + self.newline() for deco in node.decorator_list: self.fill("@") self.traverse(deco) @@ -946,7 +952,7 @@ def visit_AsyncFunctionDef(self, node): self._function_helper(node, "async def") def _function_helper(self, node, fill_suffix): - self.write("\n") + self.newline() for deco in node.decorator_list: self.fill("@") self.traverse(deco) @@ -1043,7 +1049,7 @@ def _fstring_FormattedValue(self, node, write): write("{") unparser = type(self)() unparser.set_precedence(_Precedence.TEST.next(), node.value) - expr = unparser.visit(node.value).rstrip("\n") + expr = unparser.visit(node.value) if expr.startswith("{"): write(" ") # Separate pair of opening brackets as "{ {" write(expr) diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index d4089a3fc1cdf8f..2be44b246aa697b 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -128,19 +128,17 @@ def check_ast_roundtrip(self, code1, **kwargs): def check_invalid(self, node, raises=ValueError): self.assertRaises(raises, ast.unparse, node) - def get_source(self, code1, code2=None, strip=True): + def get_source(self, code1, code2=None): code2 = code2 or code1 code1 = ast.unparse(ast.parse(code1)) - if strip: - code1 = code1.strip() return code1, code2 - def check_src_roundtrip(self, code1, code2=None, strip=True): - code1, code2 = self.get_source(code1, code2, strip) + def check_src_roundtrip(self, code1, code2=None): + code1, code2 = self.get_source(code1, code2) self.assertEqual(code2, code1) - def check_src_dont_roundtrip(self, code1, code2=None, strip=True): - code1, code2 = self.get_source(code1, code2, strip) + def check_src_dont_roundtrip(self, code1, code2=None): + code1, code2 = self.get_source(code1, code2) self.assertNotEqual(code2, code1) class UnparseTestCase(ASTTestCase): From 3c67ff7907ec19ae5ad6d11af46a9ac1d6a5ea37 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Sun, 3 May 2020 17:35:31 +0300 Subject: [PATCH 2/2] Rename newline to maybe_newline --- Lib/ast.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/ast.py b/Lib/ast.py index ff0fe6cc5452c5d..5c68c4a66e1dd06 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -669,7 +669,7 @@ def items_view(self, traverser, items): else: self.interleave(lambda: self.write(", "), traverser, items) - def newline(self): + def maybe_newline(self): """Adds a newline if it isn't the start of generated source""" if self._source: self.write("\n") @@ -677,7 +677,7 @@ def newline(self): def fill(self, text=""): """Indent a piece of text and append it, according to the current indentation level""" - self.newline() + self.maybe_newline() self.write(" " * self._indent + text) def write(self, text): @@ -922,7 +922,7 @@ def visit_ExceptHandler(self, node): self.traverse(node.body) def visit_ClassDef(self, node): - self.newline() + self.maybe_newline() for deco in node.decorator_list: self.fill("@") self.traverse(deco) @@ -952,7 +952,7 @@ def visit_AsyncFunctionDef(self, node): self._function_helper(node, "async def") def _function_helper(self, node, fill_suffix): - self.newline() + self.maybe_newline() for deco in node.decorator_list: self.fill("@") self.traverse(deco)