@@ -16,11 +16,16 @@ def __init__(self, root_node, tokens, lang = "python"):
1616 self ._ast_nodes = {} # Nodes indexed by an AST node
1717 self ._anonymous_nodes = [] # Unindexed nodes, can only be indexed by traversal
1818
19+ self .token_nodes = []
20+
1921 prev_token = self ._add_token (tokens [0 ])
22+ self .token_nodes .append (prev_token )
23+
2024 for token in tokens [1 :]:
2125 token_node = self ._add_token (token )
2226 prev_token .add_successor (token_node , "next_token" )
2327 prev_token = token_node
28+ self .token_nodes .append (token_node )
2429
2530 self .root_node = self .add_or_get_node (root_node )
2631
@@ -70,7 +75,12 @@ def add_or_get_node(self, node):
7075 except Exception :
7176 raise ValueError ("Cannot add or get node %s. Only AST nodes can be indexed." % str (node ))
7277
73- def add_relation (self , source_node , target_node , relation = "ast" ):
78+ def add_relation (self , source_node , target_node , relation = "ast" , no_create = False ):
79+
80+ if no_create :
81+ if not self .has_node (source_node ): return
82+ if not self .has_node (target_node ): return
83+
7484 source_node = self .add_or_get_node (source_node )
7585 target_node = self .add_or_get_node (target_node )
7686 source_node .add_successor (target_node , relation )
@@ -207,7 +217,8 @@ def __hash__(self):
207217class TokenNode (SyntaxNode ):
208218
209219 def __init__ (self , token ):
210- super ().__init__ (token .ast_node )
220+ token_node = token .ast_node if hasattr (token , 'ast_node' ) else None
221+ super ().__init__ (token_node )
211222 self .token = token
212223
213224 def node_name (self ):
@@ -216,7 +227,7 @@ def node_name(self):
216227 def __hash__ (self ):
217228 if self .ast_node is not None :
218229 return hash (node_key (self .ast_node ))
219- return self .token .text
230+ return hash ( self .token .text )
220231
221232
222233
0 commit comments