@@ -2193,6 +2193,55 @@ def is_class_attr(name: str, klass: nodes.ClassDef) -> bool:
2193
2193
return False
2194
2194
2195
2195
2196
+ def is_defined (name : str , node : nodes .NodeNG ) -> bool :
2197
+ """Checks whether a node defines the given variable name."""
2198
+ is_defined_so_far = False
2199
+
2200
+ if isinstance (node , nodes .NamedExpr ) and node .target .name == name :
2201
+ return True
2202
+
2203
+ if isinstance (node , (nodes .Import , nodes .ImportFrom )) and any (
2204
+ node_name [0 ] == name for node_name in node .names
2205
+ ):
2206
+ return True
2207
+
2208
+ if isinstance (node , nodes .With ):
2209
+ is_defined_so_far = any (
2210
+ isinstance (item [1 ], nodes .AssignName ) and item [1 ].name == name
2211
+ for item in node .items
2212
+ )
2213
+
2214
+ if isinstance (node , (nodes .ClassDef , nodes .FunctionDef )):
2215
+ is_defined_so_far = node .name == name
2216
+
2217
+ if isinstance (node , nodes .AnnAssign ):
2218
+ is_defined_so_far = (
2219
+ node .value
2220
+ and isinstance (node .target , nodes .AssignName )
2221
+ and node .target .name == name
2222
+ )
2223
+
2224
+ if isinstance (node , nodes .Assign ):
2225
+ is_defined_so_far = any (
2226
+ any (
2227
+ (
2228
+ (
2229
+ isinstance (elt , nodes .Starred )
2230
+ and isinstance (elt .value , nodes .AssignName )
2231
+ and elt .value .name == name
2232
+ )
2233
+ or (isinstance (elt , nodes .AssignName ) and elt .name == name )
2234
+ )
2235
+ for elt in get_all_elements (target )
2236
+ )
2237
+ for target in node .targets
2238
+ )
2239
+
2240
+ return is_defined_so_far or any (
2241
+ is_defined (name , child ) for child in node .get_children ()
2242
+ )
2243
+
2244
+
2196
2245
def get_inverse_comparator (op : str ) -> str :
2197
2246
"""Returns the inverse comparator given a comparator.
2198
2247
0 commit comments