Skip to content

Commit 1480344

Browse files
authored
stubgen: Do not consider nested generators (#12463)
Since yields in nested functions will not yield outside of the considered function, they can be ignored.
1 parent c755928 commit 1480344

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

mypy/traverser.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,20 @@ def has_return_statement(fdef: FuncBase) -> bool:
368368
return seeker.found
369369

370370

371-
class YieldSeeker(TraverserVisitor):
371+
class FuncCollectorBase(TraverserVisitor):
372+
def __init__(self) -> None:
373+
self.inside_func = False
374+
375+
def visit_func_def(self, defn: FuncDef) -> None:
376+
if not self.inside_func:
377+
self.inside_func = True
378+
super().visit_func_def(defn)
379+
self.inside_func = False
380+
381+
382+
class YieldSeeker(FuncCollectorBase):
372383
def __init__(self) -> None:
384+
super().__init__()
373385
self.found = False
374386

375387
def visit_yield_expr(self, o: YieldExpr) -> None:
@@ -382,17 +394,6 @@ def has_yield_expression(fdef: FuncBase) -> bool:
382394
return seeker.found
383395

384396

385-
class FuncCollectorBase(TraverserVisitor):
386-
def __init__(self) -> None:
387-
self.inside_func = False
388-
389-
def visit_func_def(self, defn: FuncDef) -> None:
390-
if not self.inside_func:
391-
self.inside_func = True
392-
super().visit_func_def(defn)
393-
self.inside_func = False
394-
395-
396397
class ReturnCollector(FuncCollectorBase):
397398
def __init__(self) -> None:
398399
super().__init__()

test-data/unit/stubgen.test

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2619,3 +2619,12 @@ class PT(Protocol[T, T2]):
26192619
def func(*, non_default_kwarg: bool, default_kwarg: bool = True): ...
26202620
[out]
26212621
def func(*, non_default_kwarg: bool, default_kwarg: bool = ...): ...
2622+
2623+
[case testNestedGenerator]
2624+
def f():
2625+
def g():
2626+
yield 0
2627+
2628+
return 0
2629+
[out]
2630+
def f(): ...

0 commit comments

Comments
 (0)