Skip to content

Commit 134b411

Browse files
committed
added tests for unparsing stmts
1 parent ea9e7a4 commit 134b411

File tree

4 files changed

+528
-23
lines changed

4 files changed

+528
-23
lines changed

src/jast/_jast.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3178,7 +3178,7 @@ class Record(declaration):
31783178
"""
31793179
Represents a record decl in the Java AST.
31803180
3181-
<modifier>* record <qname> (<component>, <component>, ...) [implements <jtype>, <jtype>, ...] {
3181+
<modifier>* record <id> (<component>, <component>, ...) [implements <jtype>, <jtype>, ...] {
31823182
<decl> <decl> ...
31833183
}
31843184
"""

src/jast/_unparse.py

Lines changed: 117 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ def block(self):
138138

139139
def optional_block(self, node):
140140
if isinstance(node, jast.Block):
141+
self.write(" ")
141142
return nullcontext()
142143
else:
143144
return self.block()
@@ -152,12 +153,10 @@ def braced_block(self, elements):
152153
self.fill("}")
153154

154155
@contextmanager
155-
def buffered(self, buffer=None):
156-
if buffer is None:
157-
buffer = []
158-
self._source, original = buffer, self._source
159-
yield buffer
160-
self._source = original
156+
def buffered(self):
157+
self._source, original = [], self._source
158+
yield
159+
self._source = original + self._source
161160

162161
@contextmanager
163162
def delimit(self, start, end):
@@ -739,9 +738,9 @@ def visit_If(self, node: jast.If):
739738
self.visit(node.body)
740739
if node.orelse:
741740
if self.block_end():
742-
self.write(" else ")
741+
self.write(" else")
743742
else:
744-
self.fill("else ")
743+
self.fill("else")
745744
with self.optional_block(node.orelse):
746745
self.visit(node.orelse)
747746

@@ -759,7 +758,11 @@ def visit_Throw(self, node: jast.Throw):
759758
self.write(";")
760759

761760
def visit_Switch(self, node: jast.Switch):
762-
pass
761+
self.fill("switch ")
762+
with self.parens():
763+
self.visit(node.value)
764+
self.write(" ")
765+
self.visit_switchblock(node.body)
763766

764767
def visit_While(self, node: jast.While):
765768
self.fill("while ")
@@ -769,7 +772,7 @@ def visit_While(self, node: jast.While):
769772
self.visit(node.body)
770773

771774
def visit_DoWhile(self, node: jast.DoWhile):
772-
self.fill("do ")
775+
self.fill("do")
773776
with self.optional_block(node.body):
774777
self.visit(node.body)
775778
if self.block_end():
@@ -778,12 +781,35 @@ def visit_DoWhile(self, node: jast.DoWhile):
778781
self.fill("while ")
779782
with self.parens():
780783
self.visit(node.test)
784+
self.write(";")
781785

782786
def visit_For(self, node: jast.For):
783-
pass
787+
self.fill("for ")
788+
with self.parens():
789+
if isinstance(node.init, list):
790+
self.items_view(node.init)
791+
self.write("; ")
792+
else:
793+
with self.buffered():
794+
self.visit_LocalVariable(node.init)
795+
self.write(" ")
796+
self.visit(node.test)
797+
self.write("; ")
798+
self.items_view(node.update)
799+
with self.optional_block(node.body):
800+
self.visit(node.body)
784801

785802
def visit_ForEach(self, node: jast.ForEach):
786-
pass
803+
self.fill("for ")
804+
with self.parens():
805+
self.interleave(node.modifiers, " ", end=" ")
806+
self.visit(node.type)
807+
self.write(" ")
808+
self.visit_variabledeclaratorid(node.id)
809+
self.write(" : ")
810+
self.visit(node.iter)
811+
with self.optional_block(node.body):
812+
self.visit(node.body)
787813

788814
def visit_Break(self, node: jast.Break):
789815
self.fill("break")
@@ -807,39 +833,77 @@ def visit_Return(self, node: jast.Return):
807833
self.write(";")
808834

809835
def visit_Synch(self, node: jast.Synch):
810-
pass
836+
self.fill("synchronized ")
837+
with self.parens():
838+
self.visit(node.lock)
839+
self.write(" ")
840+
self.visit(node.body)
811841

812842
def visit_Try(self, node: jast.Try):
813-
pass
843+
self.fill("try ")
844+
self.visit(node.body)
845+
self.interleave(node.catches, " ", start=" ")
846+
if node.final:
847+
self.write(" finally ")
848+
self.visit(node.final)
814849

815850
def visit_TryWithResources(self, node: jast.TryWithResources):
816-
pass
851+
self.fill("try ")
852+
with self.parens():
853+
self.interleave(node.resources, "; ")
854+
self.write(" ")
855+
self.visit(node.body)
856+
self.interleave(node.catches, " ", start=" ")
857+
if node.final:
858+
self.write(" finally ")
859+
self.visit(node.final)
817860

818861
def visit_Yield(self, node: jast.Yield):
819862
self.fill("yield ")
820863
self.visit(node.value)
821864
self.write(";")
822865

823866
def visit_Match(self, node: jast.Match):
824-
pass
867+
self.visit(node.type)
868+
self.write(" ")
869+
self.visit_identifier(node.id)
825870

826871
def visit_Case(self, node: jast.Case):
827-
pass
872+
self.fill("case ")
873+
self.visit(node.guard)
874+
self.write(":")
828875

829876
def visit_DefaultCase(self, node: jast.DefaultCase):
830-
pass
877+
self.fill("default:")
831878

832879
def visit_switchgroup(self, node: jast.switchgroup):
833-
pass
880+
self.traverse(node.labels)
881+
with self.block():
882+
self.traverse(node.body)
834883

835884
def visit_switchblock(self, node: jast.switchblock):
836-
pass
885+
self.braced_block(node.groups + node.labels)
837886

838887
def visit_catch(self, node: jast.catch):
839-
pass
888+
self.write("catch ")
889+
with self.parens():
890+
self.interleave(node.modifiers, " ", end=" ")
891+
self.interleave(node.excs, " | ", end=" ")
892+
self.visit_identifier(node.id)
893+
self.write(" ")
894+
self.visit(node.body)
840895

841896
def visit_resource(self, node: jast.resource):
842-
pass
897+
self.interleave(node.modifiers, " ", end=" ")
898+
self.visit(node.type)
899+
self.write(" ")
900+
self.visit_declarator(node.variable)
901+
902+
def visit_declarator(self, node):
903+
self.visit(node.id)
904+
if node.init:
905+
self.write(" = ")
906+
self.visit(node.init)
843907

844908
def visit_Package(self, node: jast.Package):
845909
self.fill("package ")
@@ -907,6 +971,37 @@ def visit_Class(self, node: jast.Class):
907971
self.write(" ")
908972
self.braced_block(node.body)
909973

974+
def visit_Interface(self, node: jast.Interface):
975+
self.fill()
976+
self.fill()
977+
self.interleave(node.modifiers, " ", end=" ")
978+
self.write("interface ")
979+
self.visit_identifier(node.id)
980+
self.visit(node.type_params)
981+
if node.extends:
982+
self.write(" extends ")
983+
self.items_view(node.extends)
984+
if node.permits:
985+
self.write(" permits ")
986+
self.items_view(node.permits)
987+
self.write(" ")
988+
self.braced_block(node.body)
989+
990+
def visit_Record(self, node: jast.Record):
991+
self.fill()
992+
self.fill()
993+
self.interleave(node.modifiers, " ", end=" ")
994+
self.write("record ")
995+
self.visit_identifier(node.id)
996+
self.visit(node.type_params)
997+
with self.parens():
998+
self.items_view(node.components)
999+
if node.implements:
1000+
self.write(" implements ")
1001+
self.items_view(node.implements)
1002+
self.write(" ")
1003+
self.braced_block(node.body)
1004+
9101005

9111006
def unparse(node, indent=4):
9121007
return _Unparser(indent).unparse(node)

tests/test_jast.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1868,6 +1868,13 @@ def test_ForEach_error(self):
18681868
id=jast.variabledeclaratorid(jast.identifier("foo")),
18691869
body=jast.Empty(),
18701870
)
1871+
self.assertRaises(
1872+
JASTError,
1873+
jast.ForEach,
1874+
type=jast.Int(),
1875+
id=jast.variabledeclaratorid(jast.identifier("foo")),
1876+
iter=jast.Name(jast.identifier("bar")),
1877+
)
18711878

18721879
def test_Break(self):
18731880
break_ = jast.Break(label=jast.identifier("foo"))

0 commit comments

Comments
 (0)