]> granicus.if.org Git - python/commitdiff
Collapse else: if: ... into elif:
authorMark Dickinson <dickinsm@gmail.com>
Wed, 30 Jun 2010 08:32:11 +0000 (08:32 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Wed, 30 Jun 2010 08:32:11 +0000 (08:32 +0000)
Demo/parser/test_unparse.py
Demo/parser/unparse.py

index f4a3e6611365bec346103cf24ff4fe3b0b2da641..7d85f16cfda079ef1fa89697dcc9e9c92add59df 100644 (file)
@@ -64,6 +64,24 @@ class_decorator = """\
 class Foo: pass
 """
 
+elif1 = """\
+if cond1:
+    suite1
+elif cond2:
+    suite2
+else:
+    suite3
+"""
+
+elif2 = """\
+if cond1:
+    suite1
+elif cond2:
+    suite2
+"""
+
+
+
 class ASTTestCase(unittest.TestCase):
     def assertASTEqual(self, ast1, ast2):
         self.assertEqual(ast.dump(ast1), ast.dump(ast2))
@@ -159,6 +177,10 @@ class UnparseTestCase(ASTTestCase):
     def test_class_definition(self):
         self.check_roundtrip("class A(metaclass=type, *[], **{}): pass")
 
+    def test_elifs(self):
+        self.check_roundtrip(elif1)
+        self.check_roundtrip(elif2)
+
 class DirectoryTestCase(ASTTestCase):
     """Test roundtrip behaviour on all files in Lib and Lib/test."""
 
index 6e4ef6348e11dee25cff820a25d2448ce8146dc3..03dd9e14e1d16049086e4c0f5f03ed54cba5f7a7 100644 (file)
@@ -256,9 +256,18 @@ class Unparser:
         self.fill("if ")
         self.dispatch(t.test)
         self.enter()
-        # XXX elif?
         self.dispatch(t.body)
         self.leave()
+        # collapse nested ifs into equivalent elifs.
+        while (t.orelse and len(t.orelse) == 1 and
+               isinstance(t.orelse[0], ast.If)):
+            t = t.orelse[0]
+            self.fill("elif ")
+            self.dispatch(t.test)
+            self.enter()
+            self.dispatch(t.body)
+            self.leave()
+        # final else
         if t.orelse:
             self.fill("else")
             self.enter()