11from __future__ import annotations
22
3- from .named_node import (NamedLeafCls , NamedNodeCls , NamedSizedNodeCls ,
4- register_corresponding_token )
3+ from typing import cast
4+
5+ from util import checked_cast
6+ from ..trees .named_node import (NamedLeafCls , NamedNodeCls , NamedSizedNodeCls ,
7+ register_corresponding_token )
58
69__all__ = [
710 "NumberNode" , "StringNode" , "AnyNameLeaf" , "IdentNode" , "AttrNameNode" ,
1619class ProgramNode (NamedNodeCls ):
1720 name = 'program' # Varargs
1821
22+ @property
23+ def statements (self ):
24+ return self .children
25+
1926
2027# region ---- Expressions ----
2128@register_corresponding_token
@@ -45,30 +52,66 @@ class AttrNameNode(AnyNameLeaf):
4552class AutocatNode (NamedNodeCls ):
4653 name = 'autocat' # Note: this is varargs, unlike regular concat
4754
55+ @property
56+ def parts (self ) -> list [StringNode ]:
57+ return cast (list [StringNode ], self .children )
58+
4859
4960class GetattrNode (NamedSizedNodeCls ):
5061 name = 'getattr'
5162 size = 2
5263
64+ @property
65+ def target (self ):
66+ return self .children [0 ]
67+
68+ @property
69+ def attr (self ):
70+ return self .children [1 ]
71+
5372
5473class GetitemNode (NamedSizedNodeCls ):
5574 name = 'getitem'
5675 size = 2
5776
77+ @property
78+ def target (self ):
79+ return self .children [0 ]
80+
81+ @property
82+ def item (self ):
83+ return checked_cast (AttrNameNode , self .children [1 ])
84+
5885
5986class ParenNode (NamedSizedNodeCls ):
6087 name = 'paren'
6188 size = 1
6289
90+ @property
91+ def contents (self ):
92+ return self .children [0 ]
93+
6394
6495class CallNode (NamedSizedNodeCls ):
6596 name = 'call'
6697 size = 2
6798
99+ @property
100+ def target (self ):
101+ return self .children [0 ]
102+
103+ @property
104+ def arglist (self ) -> CallArgs :
105+ return checked_cast (CallArgs , self .children [1 ])
106+
68107
69108class CallArgs (NamedNodeCls ):
70109 name = 'call_args' # Varargs
71110
111+ @property
112+ def args (self ):
113+ return self .children
114+
72115
73116class OperatorNode (NamedNodeCls ):
74117 pass
@@ -77,6 +120,10 @@ class OperatorNode(NamedNodeCls):
77120class UnaryOpNode (NamedSizedNodeCls , OperatorNode ):
78121 size = 1
79122
123+ @property
124+ def operand (self ):
125+ return self .children [0 ]
126+
80127
81128@register_corresponding_token ('+' , arity = 1 )
82129@register_corresponding_token ()
@@ -98,6 +145,14 @@ class NotNode(UnaryOpNode):
98145class BinOpNode (NamedSizedNodeCls , OperatorNode ):
99146 size = 2
100147
148+ @property
149+ def left (self ):
150+ return self .children [0 ]
151+
152+ @property
153+ def right (self ):
154+ return self .children [1 ]
155+
101156
102157@register_corresponding_token
103158class AddNode (BinOpNode ):
@@ -188,25 +243,61 @@ class NopNode(NamedLeafCls):
188243class BlockNode (NamedNodeCls ):
189244 name = 'block' # Varargs
190245
246+ @property
247+ def statements (self ):
248+ return self .children
249+
191250
192251class ConditionalBlock (NamedNodeCls ): # Varargs: if, *elseif, else
193252 name = 'conditional'
194253
254+ @property
255+ def if_block (self ):
256+ return checked_cast (IfBlock , self .children [0 ])
257+
258+ @property
259+ def elseif_blocks (self ):
260+ return cast (list [ElseIfBlock ], self .children [1 :- 1 ])
261+
262+ @property
263+ def else_block (self ) -> ElseBlock | NullElseBlock :
264+ return checked_cast (ElseBlock | NullElseBlock , self .children [- 1 ])
265+
195266
196267class IfBlock (NamedSizedNodeCls ):
197268 name = 'if'
198269 size = 2 # condition, block
199270
271+ @property
272+ def cond (self ):
273+ return self .children [0 ]
274+
275+ @property
276+ def block (self ):
277+ return checked_cast (BlockNode , self .children [1 ])
278+
200279
201280class ElseIfBlock (NamedSizedNodeCls ):
202281 name = 'elseif'
203282 size = 2
204283
284+ @property
285+ def cond (self ):
286+ return self .children [0 ]
287+
288+ @property
289+ def block (self ):
290+ return checked_cast (BlockNode , self .children [1 ])
291+
205292
206293class ElseBlock (NamedSizedNodeCls ):
207294 name = 'else'
208295 size = 1 # just the BlockNode
209296
297+ @property
298+ def block (self ):
299+ return checked_cast (BlockNode , self .children [0 ])
300+
210301
211302class NullElseBlock (NamedLeafCls ):
212303 name = 'else_null'
@@ -217,42 +308,106 @@ class WhileBlock(NamedSizedNodeCls):
217308 name = 'while'
218309 size = 2
219310
311+ @property
312+ def cond (self ):
313+ return self .children [0 ]
314+
315+ @property
316+ def block (self ):
317+ return checked_cast (BlockNode , self .children [1 ])
318+
220319
221320class RepeatBlock (NamedSizedNodeCls ):
222321 name = 'repeat'
223322 size = 2
224323
324+ @property
325+ def count (self ):
326+ return self .children [0 ]
327+
328+ @property
329+ def block (self ):
330+ return checked_cast (BlockNode , self .children [1 ])
331+
225332
226333class DefineNode (NamedSizedNodeCls ):
227334 name = 'def'
228335 size = 3 # name, args_decl, block
229336
337+ @property
338+ def ident (self ):
339+ return checked_cast (IdentNode , self .children [0 ])
340+
341+ @property
342+ def args_decl (self ):
343+ return checked_cast (ArgsDeclNode , self .children [1 ])
344+
345+ @property
346+ def block (self ):
347+ return checked_cast (BlockNode , self .children [1 ])
348+
230349
231350class ArgsDeclNode (NamedNodeCls ):
232351 name = 'args_decl' # Varargs
233352
353+ @property
354+ def decls (self ):
355+ return cast (list [ArgDeclNode ], self .children )
356+
234357
235358class ArgDeclNode (NamedSizedNodeCls ):
236359 name = 'arg_decl'
237360 size = 2 # type and name
238361
362+ @property
363+ def type (self ):
364+ return checked_cast (IdentNode , self .children [0 ])
365+
366+ @property
367+ def ident (self ):
368+ return checked_cast (IdentNode , self .children [1 ])
369+ # endregion
370+
239371
240372class DeclItemNode (NamedNodeCls ):
241373 name = 'decl_item' # 1 or 2 (name and optional value)
242- # endregion
374+
375+ @property
376+ def ident (self ):
377+ return checked_cast (IdentNode , self .children [0 ])
378+
379+ @property
380+ def value (self ):
381+ if len (self .children ) <= 1 :
382+ return None
383+ return self .children [1 ]
243384
244385
245386class LetNode (NamedNodeCls ):
246387 name = 'let_decl' # Varargs
247388
389+ @property
390+ def decls (self ):
391+ return cast (list [DeclItemNode ], self .children )
392+
248393
249394class GlobalNode (NamedNodeCls ):
250395 name = 'global_decl' # Varargs
251396
397+ @property
398+ def decls (self ):
399+ return cast (list [DeclItemNode ], self .children )
400+
252401
253402# region ---- Assignment-ops ----
254403class AssignOpNode (BinOpNode ):
255- pass
404+ @property
405+ def target (self ):
406+ return self .children [0 ]
407+
408+ @property
409+ def source (self ):
410+ return self .children [1 ]
256411
257412
258413@register_corresponding_token
0 commit comments