|
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