@@ -25,30 +25,36 @@ class Node:
2525 """
2626
2727 def __init__ (
28- self ,
29- name : str ,
30- comments : Comments = None ,
31- tokens : Optional [List [CommonToken ]] = None ,
28+ self ,
29+ name : str ,
30+ comments : Comments = None ,
31+ first_token : Optional [CommonToken ] = None ,
32+ last_token : Optional [CommonToken ] = None ,
3233 ):
3334 """
3435 Args:
3536 name: The name of the node.
3637 comments: Optional comments.
37- tokens: List of Antlr4 tokens composing the node.
38+ first_token: First Antlr token
39+ last_token: Last Antlr token
3840 """
3941 if comments is None :
4042 comments = []
4143 self ._name : str = name
4244 self .comments : Comments = comments
43- self ._tokens : Optional [List [CommonToken ]] = tokens
45+ self ._first_token : Optional [CommonToken ] = first_token
46+ self ._last_token : Optional [CommonToken ] = last_token
4447
4548 # We want to have nodes be serializable with pickle.
4649 # To allow that we must not have mutable fields such as streams.
4750 # Tokens have streams, create a stream-less copy of tokens.
48- if self ._tokens :
49- self ._tokens = [t .clone () for t in self ._tokens ]
50- for t in self ._tokens :
51- t .source = CommonToken .EMPTY_SOURCE
51+ if self ._first_token is not None :
52+ self ._first_token = self ._first_token .clone ()
53+ self ._first_token .source = CommonToken .EMPTY_SOURCE
54+
55+ if self ._last_token is not None :
56+ self ._last_token = self ._last_token .clone ()
57+ self ._last_token .source = CommonToken .EMPTY_SOURCE
5258
5359 @property
5460 def display_name (self ) -> str :
@@ -57,40 +63,39 @@ def display_name(self) -> str:
5763 def __eq__ (self , other ) -> bool :
5864 if isinstance (self , other .__class__ ):
5965 return _equal_dicts (
60- self .__dict__ , other .__dict__ , ["_tokens " ]
66+ self .__dict__ , other .__dict__ , ["_first_token" , "_last_token " ]
6167 )
6268 return False
6369
64- @property
65- def tokens (self ) -> Optional [List [CommonToken ]]:
66- """List of Antlr4 tokens composing the node.
67-
68- Note: Tokens are disconnected from underline source streams.
69- """
70- return self ._tokens
71-
72- @tokens .setter
73- def tokens (self , tokens : Optional [List [CommonToken ]]):
74- if tokens :
75- self ._tokens = [t .clone () for t in tokens ]
76- for t in self ._tokens :
77- t .source = CommonToken .EMPTY_SOURCE
78-
7970 @property
8071 def first_token (self ) -> Optional [CommonToken ]:
81- """First token of a node.
72+ """
73+ First token of a node.
8274
8375 Note: Token is disconnected from underline source streams.
8476 """
85- return self ._tokens [0 ] if self ._tokens else None
77+ return self ._first_token
78+
79+ @first_token .setter
80+ def first_token (self , val : Optional [CommonToken ]):
81+ if val is not None :
82+ self ._first_token = val .clone ()
83+ self ._first_token .source = CommonToken .EMPTY_SOURCE
8684
8785 @property
8886 def last_token (self ) -> Optional [CommonToken ]:
89- """Last token of a node.
87+ """
88+ Last token of a node.
9089
9190 Note: Token is disconnected from underline source streams.
9291 """
93- return self ._tokens [- 1 ] if self ._tokens else None
92+ return self ._last_token
93+
94+ @last_token .setter
95+ def last_token (self , val : Optional [CommonToken ]):
96+ if val is not None :
97+ self ._last_token = val .clone ()
98+ self ._last_token .source = CommonToken .EMPTY_SOURCE
9499
95100 @property
96101 def start_char (self ) -> Optional [int ]:
@@ -144,10 +149,10 @@ class Expression(Node):
144149 """
145150
146151 def __init__ (
147- self ,
148- name : str ,
149- wrapped = False ,
150- ** kwargs ,
152+ self ,
153+ name : str ,
154+ wrapped = False ,
155+ ** kwargs ,
151156 ):
152157 super (Expression , self ).__init__ (name , ** kwargs )
153158 self .wrapped = wrapped
@@ -234,11 +239,11 @@ class Index(Lhs):
234239 """
235240
236241 def __init__ (
237- self ,
238- idx : Expression ,
239- value : Expression ,
240- notation : IndexNotation = IndexNotation .DOT ,
241- ** kwargs
242+ self ,
243+ idx : Expression ,
244+ value : Expression ,
245+ notation : IndexNotation = IndexNotation .DOT ,
246+ ** kwargs
242247 ):
243248 super (Index , self ).__init__ ("Index" , ** kwargs )
244249 self .idx : Expression = idx
@@ -345,7 +350,7 @@ class If(Statement):
345350 """
346351
347352 def __init__ (
348- self , test : Expression , body : Block , orelse : List [Statement ] or ElseIf , ** kwargs
353+ self , test : Expression , body : Block , orelse : List [Statement ] or ElseIf , ** kwargs
349354 ):
350355 super ().__init__ ("If" , ** kwargs )
351356 self .test : Expression = test
@@ -422,13 +427,13 @@ class Fornum(Statement):
422427 """
423428
424429 def __init__ (
425- self ,
426- target : Name ,
427- start : Expression ,
428- stop : Expression ,
429- step : Expression ,
430- body : Block ,
431- ** kwargs
430+ self ,
431+ target : Name ,
432+ start : Expression ,
433+ stop : Expression ,
434+ step : Expression ,
435+ body : Block ,
436+ ** kwargs
432437 ):
433438 super (Fornum , self ).__init__ ("Fornum" , ** kwargs )
434439 self .target : Name = target
@@ -448,7 +453,7 @@ class Forin(Statement):
448453 """
449454
450455 def __init__ (
451- self , body : Block , iter : List [Expression ], targets : List [Name ], ** kwargs
456+ self , body : Block , iter : List [Expression ], targets : List [Name ], ** kwargs
452457 ):
453458 super (Forin , self ).__init__ ("Forin" , ** kwargs )
454459 self .body : Block = body
@@ -547,12 +552,12 @@ class Method(Statement):
547552 """
548553
549554 def __init__ (
550- self ,
551- source : Expression ,
552- name : Expression ,
553- args : List [Expression ],
554- body : Block ,
555- ** kwargs
555+ self ,
556+ source : Expression ,
557+ name : Expression ,
558+ args : List [Expression ],
559+ body : Block ,
560+ ** kwargs
556561 ):
557562 super (Method , self ).__init__ ("Method" , ** kwargs )
558563 self .source : Expression = source
@@ -628,10 +633,10 @@ class String(Expression):
628633 """
629634
630635 def __init__ (
631- self ,
632- s : str ,
633- delimiter : StringDelimiter = StringDelimiter .SINGLE_QUOTE ,
634- ** kwargs
636+ self ,
637+ s : str ,
638+ delimiter : StringDelimiter = StringDelimiter .SINGLE_QUOTE ,
639+ ** kwargs
635640 ):
636641 super (String , self ).__init__ ("String" , ** kwargs )
637642 self .s : str = s
@@ -647,11 +652,11 @@ class Field(Expression):
647652 """
648653
649654 def __init__ (
650- self ,
651- key : Expression ,
652- value : Expression ,
653- between_brackets : bool = False ,
654- ** kwargs
655+ self ,
656+ key : Expression ,
657+ value : Expression ,
658+ between_brackets : bool = False ,
659+ ** kwargs
655660 ):
656661 super ().__init__ ("Field" , ** kwargs )
657662 self .key : Expression = key
0 commit comments