|
13 | 13 | from typing import Any, Callable
|
14 | 14 |
|
15 | 15 | import mypy.stubtest
|
| 16 | +from mypy import build, nodes |
| 17 | +from mypy.modulefinder import BuildSource |
| 18 | +from mypy.options import Options |
16 | 19 | from mypy.stubtest import parse_options, test_stubs
|
| 20 | +from mypy.test.config import test_temp_dir |
17 | 21 | from mypy.test.data import root_dir
|
18 | 22 |
|
19 | 23 |
|
@@ -158,6 +162,14 @@ def __invert__(self: _T) -> _T: pass
|
158 | 162 | """
|
159 | 163 |
|
160 | 164 |
|
| 165 | +def build_helper(source: str) -> build.BuildResult: |
| 166 | + return build.build( |
| 167 | + sources=[BuildSource("main.pyi", None, textwrap.dedent(source))], |
| 168 | + options=Options(), |
| 169 | + alt_lib_path=test_temp_dir, |
| 170 | + ) |
| 171 | + |
| 172 | + |
161 | 173 | def run_stubtest_with_stderr(
|
162 | 174 | stub: str, runtime: str, options: list[str], config_file: str | None = None
|
163 | 175 | ) -> tuple[str, str]:
|
@@ -842,6 +854,18 @@ def f2(self, *a) -> int: ...
|
842 | 854 | """,
|
843 | 855 | error=None,
|
844 | 856 | )
|
| 857 | + yield Case( |
| 858 | + stub=""" |
| 859 | + @overload |
| 860 | + def f(a: int) -> int: ... |
| 861 | + @overload |
| 862 | + def f(a: int, b: str, /) -> str: ... |
| 863 | + """, |
| 864 | + runtime=""" |
| 865 | + def f(a, *args): ... |
| 866 | + """, |
| 867 | + error=None, |
| 868 | + ) |
845 | 869 |
|
846 | 870 | @collect_cases
|
847 | 871 | def test_property(self) -> Iterator[Case]:
|
@@ -2790,6 +2814,25 @@ def test_builtin_signature_with_unrepresentable_default(self) -> None:
|
2790 | 2814 | == "def (self, sep = ..., bytes_per_sep = ...)"
|
2791 | 2815 | )
|
2792 | 2816 |
|
| 2817 | + def test_overload_signature(self) -> None: |
| 2818 | + # The same argument as both positional-only and pos-or-kw in |
| 2819 | + # different overloads previously produced incorrect signatures |
| 2820 | + source = """ |
| 2821 | + from typing import overload |
| 2822 | + @overload |
| 2823 | + def myfunction(arg: int) -> None: ... |
| 2824 | + @overload |
| 2825 | + def myfunction(arg: str, /) -> None: ... |
| 2826 | + """ |
| 2827 | + result = build_helper(source) |
| 2828 | + stub = result.files["__main__"].names["myfunction"].node |
| 2829 | + assert isinstance(stub, nodes.OverloadedFuncDef) |
| 2830 | + sig = mypy.stubtest.Signature.from_overloadedfuncdef(stub) |
| 2831 | + if sys.version_info >= (3, 10): |
| 2832 | + assert str(sig) == "def (arg: builtins.int | builtins.str)" |
| 2833 | + else: |
| 2834 | + assert str(sig) == "def (arg: Union[builtins.int, builtins.str])" |
| 2835 | + |
2793 | 2836 | def test_config_file(self) -> None:
|
2794 | 2837 | runtime = "temp = 5\n"
|
2795 | 2838 | stub = "from decimal import Decimal\ntemp: Decimal\n"
|
|
0 commit comments