@@ -89,6 +89,26 @@ def add_parent_to_classdef(classdef):
8989 for node in classdef .decorator_list :
9090 add_parent (node , parent = classdef , namespace = classdef .namespace )
9191
92+ def add_parent_to_comprehension (node , namespace ):
93+ assert is_ast_node (node , (ast .GeneratorExp , 'SetComp' , 'DictComp' , 'ListComp' ))
94+
95+ if hasattr (node , 'elt' ):
96+ add_parent (node .elt , parent = node , namespace = node )
97+ elif hasattr (node , 'key' ):
98+ add_parent (node .key , parent = node , namespace = node )
99+ add_parent (node .value , parent = node , namespace = node )
100+
101+ iter_namespace = namespace
102+ for generator in node .generators :
103+ generator .parent = node
104+ generator .namespace = node
105+
106+ add_parent (generator .target , parent = generator , namespace = node )
107+ add_parent (generator .iter , parent = generator , namespace = iter_namespace )
108+ iter_namespace = node
109+ for if_ in generator .ifs :
110+ add_parent (if_ , parent = generator , namespace = node )
111+
92112
93113def add_parent (node , parent = None , namespace = None ):
94114 """
@@ -114,6 +134,8 @@ def add_parent(node, parent=None, namespace=None):
114134
115135 if is_ast_node (node , (ast .FunctionDef , 'AsyncFunctionDef' )):
116136 add_parent_to_functiondef (node )
137+ elif is_ast_node (node , (ast .GeneratorExp , 'SetComp' , 'DictComp' , 'ListComp' )):
138+ add_parent_to_comprehension (node , namespace = namespace )
117139 elif isinstance (node , ast .Lambda ):
118140 add_parent_to_arguments (node .args , func = node )
119141 add_parent (node .body , parent = node , namespace = node )
@@ -125,13 +147,6 @@ def add_parent(node, parent=None, namespace=None):
125147
126148 return
127149
128- if isinstance (node , ast .comprehension ):
129- add_parent (node .target , parent = node , namespace = namespace )
130- add_parent (node .iter , parent = node , namespace = namespace )
131- for if_ in node .ifs :
132- add_parent (if_ , parent = node , namespace = namespace )
133- return
134-
135150 if isinstance (node , ast .Global ):
136151 namespace .global_names .update (node .names )
137152 if is_ast_node (node , 'Nonlocal' ):
0 commit comments