|
59 | 59 | Expression, IntExpr, UnaryExpr, StrExpr, BytesExpr, NameExpr, FloatExpr, MemberExpr, TupleExpr,
|
60 | 60 | ListExpr, ComparisonExpr, CallExpr, IndexExpr, EllipsisExpr,
|
61 | 61 | ClassDef, MypyFile, Decorator, AssignmentStmt,
|
62 |
| - IfStmt, ImportAll, ImportFrom, Import, FuncDef, FuncBase, TempNode, |
| 62 | + IfStmt, ReturnStmt, ImportAll, ImportFrom, Import, FuncDef, FuncBase, TempNode, |
63 | 63 | ARG_POS, ARG_STAR, ARG_STAR2, ARG_NAMED, ARG_NAMED_OPT,
|
64 | 64 | )
|
65 | 65 | from mypy.stubgenc import parse_all_signatures, find_unique_signatures, generate_stub_for_c_module
|
@@ -475,7 +475,7 @@ def visit_func_def(self, o: FuncDef) -> None:
|
475 | 475 | retname = None
|
476 | 476 | if isinstance(o.type, CallableType):
|
477 | 477 | retname = self.print_annotation(o.type.ret_type)
|
478 |
| - elif o.name() == '__init__': |
| 478 | + elif o.name() == '__init__' or not has_return_statement(o): |
479 | 479 | retname = 'None'
|
480 | 480 | retfield = ''
|
481 | 481 | if retname is not None:
|
@@ -814,6 +814,19 @@ def visit_assignment_stmt(self, o: AssignmentStmt) -> None:
|
814 | 814 | return results
|
815 | 815 |
|
816 | 816 |
|
| 817 | +def has_return_statement(fdef: FuncBase) -> bool: |
| 818 | + class ReturnSeeker(mypy.traverser.TraverserVisitor): |
| 819 | + def __init__(self) -> None: |
| 820 | + self.found = False |
| 821 | + |
| 822 | + def visit_return_stmt(self, o: ReturnStmt) -> None: |
| 823 | + self.found = True |
| 824 | + |
| 825 | + seeker = ReturnSeeker() |
| 826 | + fdef.accept(seeker) |
| 827 | + return seeker.found |
| 828 | + |
| 829 | + |
817 | 830 | def get_qualified_name(o: Expression) -> str:
|
818 | 831 | if isinstance(o, NameExpr):
|
819 | 832 | return o.name
|
|
0 commit comments