@@ -221,6 +221,12 @@ def visit_func_def(self, defn: FuncDef) -> None:
221
221
222
222
defn .is_conditional = self .block_depth [- 1 ] > 0
223
223
224
+ # TODO(jukka): Figure out how to share the various cases. It doesn't
225
+ # make sense to have (almost) duplicate code (here and elsewhere) for
226
+ # 3 cases: module-level, class-level and local names. Maybe implement
227
+ # a common stack of namespaces. As the 3 kinds of namespaces have
228
+ # different semantics, this wouldn't always work, but it might still
229
+ # be a win.
224
230
if self .is_class_scope ():
225
231
# Method definition
226
232
defn .info = self .type
@@ -237,7 +243,15 @@ def visit_func_def(self, defn: FuncDef) -> None:
237
243
elif self .is_func_scope ():
238
244
# Nested function
239
245
if not defn .is_decorated and not defn .is_overload :
240
- self .add_local (defn , defn )
246
+ if defn .name () in self .locals [- 1 ]:
247
+ # Redefinition. Conditional redefinition is okay.
248
+ n = self .locals [- 1 ][defn .name ()].node
249
+ if self .is_conditional_func (n , defn ):
250
+ defn .original_def = cast (FuncDef , n )
251
+ else :
252
+ self .name_already_defined (defn .name (), defn )
253
+ else :
254
+ self .add_local (defn , defn )
241
255
else :
242
256
# Top-level function
243
257
if not defn .is_decorated and not defn .is_overload :
@@ -2026,11 +2040,14 @@ def enter(self) -> None:
2026
2040
self .locals .append (SymbolTable ())
2027
2041
self .global_decls .append (set ())
2028
2042
self .nonlocal_decls .append (set ())
2043
+ # -1 since entering block will increment this to 0.
2044
+ self .block_depth .append (- 1 )
2029
2045
2030
2046
def leave (self ) -> None :
2031
2047
self .locals .pop ()
2032
2048
self .global_decls .pop ()
2033
2049
self .nonlocal_decls .pop ()
2050
+ self .block_depth .pop ()
2034
2051
2035
2052
def is_func_scope (self ) -> bool :
2036
2053
return self .locals [- 1 ] is not None
0 commit comments