22from dataclasses import dataclass
33from typing import Sequence
44
5+ from .pdl_dumper import blocks_to_dict , dump_yaml
6+
57from .pdl_ast import (
68 AdvancedBlockType ,
79 ArrayBlock ,
810 Block ,
11+ BlocksType ,
912 BlockType ,
1013 CallBlock ,
1114 CodeBlock ,
@@ -44,7 +47,7 @@ def with_implicit_ignore(self, b):
4447
4548def unused_warning (block : BlockType ):
4649 global _DISPLAY_UNUSED_HINT # pylint: disable= global-statement
47- print (f"Warning: the result of block `{ block } ` is not used." , file = sys .stderr )
50+ print (f"Warning: the result of block `{ dump_yaml ( blocks_to_dict ( block , json_compatible = True )) } ` is not used." , file = sys .stderr )
4851 if _DISPLAY_UNUSED_HINT :
4952 _DISPLAY_UNUSED_HINT = False
5053 print (
@@ -55,15 +58,22 @@ def unused_warning(block: BlockType):
5558
5659def unused_program (prog : Program ) -> None :
5760 state = UnusedConfig (implicit_ignore = False )
58- unused_advanced_block (state , LastOfBlock (lastOf = prog .root ))
61+ unused_blocks (state , prog .root )
62+
63+
64+ def unused_blocks (state : UnusedConfig , blocks : BlocksType ) -> None :
65+ if not isinstance (blocks , str ) and isinstance (blocks , Sequence ):
66+ unused_advanced_block (state , LastOfBlock (lastOf = blocks ))
67+ else :
68+ unused_block (state , blocks )
5969
6070
61- def unused_block (state , block : BlockType ) -> None :
62- if not isinstance (block , Block ):
71+ def unused_block (state , blocks : BlockType ) -> None :
72+ if isinstance (blocks , Block ):
73+ unused_advanced_block (state , blocks )
74+ else :
6375 if state .implicit_ignore :
64- unused_warning (block )
65- return
66- unused_advanced_block (state , block )
76+ unused_warning (blocks )
6777
6878
6979def unused_advanced_block (state : UnusedConfig , block : AdvancedBlockType ) -> None :
@@ -80,26 +90,46 @@ def unused_advanced_block(state: UnusedConfig, block: AdvancedBlockType) -> None
8090 unused_block (state , block .lastOf [- 1 ])
8191 else :
8292 unused_block (state , block .lastOf )
83- # Leaf blocks without side effects
84- case DataBlock () | FunctionBlock () | GetBlock () | ModelBlock () | ReadBlock ():
93+ case ArrayBlock () | ObjectBlock () | TextBlock ():
8594 if state .implicit_ignore :
8695 unused_warning (block )
87- return
88- # Leaf blocks with side effects
89- case CallBlock () | CodeBlock () | EmptyBlock () | ErrorBlock ():
90- return
91- # Non-leaf blocks
96+ iter_block_children ((lambda blocks : used_blocks (state , blocks )), block )
97+ # Leaf blocks
9298 case (
93- ArrayBlock ()
94- | ForBlock ()
95- | IfBlock ()
96- | IncludeBlock ()
99+ DataBlock ()
100+ | FunctionBlock ()
101+ | GetBlock ()
97102 | MessageBlock ()
98- | ObjectBlock ()
99- | RepeatBlock ()
100- | RepeatUntilBlock ()
101- | TextBlock ()
103+ | ModelBlock ()
104+ | CallBlock ()
105+ | CodeBlock ()
106+ | EmptyBlock ()
107+ | ReadBlock ()
102108 ):
103- iter_block_children ((lambda b : unused_block (state , b )), block )
109+ if state .implicit_ignore :
110+ unused_warning (block )
111+ iter_block_children (
112+ (
113+ lambda blocks : unused_blocks (
114+ state .with_implicit_ignore (False ), blocks
115+ )
116+ ),
117+ block ,
118+ )
119+ case ErrorBlock ():
120+ pass
121+ # Non-leaf blocks
122+ case (
123+ ForBlock () | IfBlock () | IncludeBlock () | RepeatBlock () | RepeatUntilBlock ()
124+ ):
125+ iter_block_children ((lambda blocks : unused_blocks (state , blocks )), block )
104126 case _:
105127 assert False
128+
129+
130+ def used_blocks (state : UnusedConfig , blocks : BlocksType ) -> None :
131+ if not isinstance (blocks , str ) and isinstance (blocks , Sequence ):
132+ for block in blocks :
133+ unused_block (state .with_implicit_ignore (False ), block )
134+ else :
135+ unused_block (state .with_implicit_ignore (False ), blocks )
0 commit comments