@@ -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
9111006def unparse (node , indent = 4 ):
9121007 return _Unparser (indent ).unparse (node )
0 commit comments