From 3058802b9322551116f72dff77dc6212bfcc015a Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Fri, 9 Jun 2023 22:12:17 +0100 Subject: [PATCH 1/2] Fix crash on follow_imports_for_stubs --- mypy/build.py | 6 +++++- test-data/unit/check-flags.test | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/mypy/build.py b/mypy/build.py index c239afb56236..07f4376b2784 100644 --- a/mypy/build.py +++ b/mypy/build.py @@ -117,6 +117,10 @@ "typing_extensions", "mypy_extensions", "_importlib_modulespec", + "_typeshed", + "_collections_abc", + "collections", + "collections.abc", "sys", "abc", } @@ -2637,7 +2641,7 @@ def find_module_and_diagnose( result.endswith(".pyi") # Stubs are always normal and not options.follow_imports_for_stubs # except when they aren't ) - or id in mypy.semanal_main.core_modules # core is always normal + or id in CORE_BUILTIN_MODULES # core is always normal ): follow_imports = "normal" if skip_diagnose: diff --git a/test-data/unit/check-flags.test b/test-data/unit/check-flags.test index 39fcef1db673..4a43224260d1 100644 --- a/test-data/unit/check-flags.test +++ b/test-data/unit/check-flags.test @@ -2174,3 +2174,13 @@ def f(x: bytes, y: bytearray, z: memoryview) -> None: x in y x in z [builtins fixtures/primitives.pyi] + +[case testNoCrashFollowImportsForStubs] +# flags: --config-file tmp/mypy.ini +{**{"x": "y"}} + +[file mypy.ini] +\[mypy] +follow_imports = skip +follow_imports_for_stubs = true +[builtins fixtures/dict.pyi] From 9ae347c083f26fe70e2054ddddba04607fb5bc3f Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Fri, 9 Jun 2023 23:31:45 +0100 Subject: [PATCH 2/2] Update tests; delete _importlib_modulespec --- mypy/build.py | 3 --- mypy/messages.py | 2 +- test-data/unit/cmdline.test | 8 ++++++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/mypy/build.py b/mypy/build.py index 07f4376b2784..7913eae9c6ed 100644 --- a/mypy/build.py +++ b/mypy/build.py @@ -116,7 +116,6 @@ "types", "typing_extensions", "mypy_extensions", - "_importlib_modulespec", "_typeshed", "_collections_abc", "collections", @@ -663,8 +662,6 @@ def __init__( for module in CORE_BUILTIN_MODULES: if options.use_builtins_fixtures: continue - if module == "_importlib_modulespec": - continue path = self.find_module_cache.find_module(module) if not isinstance(path, str): raise CompileError( diff --git a/mypy/messages.py b/mypy/messages.py index cb95fb1c0bde..9d703a1a974a 100644 --- a/mypy/messages.py +++ b/mypy/messages.py @@ -2437,7 +2437,7 @@ def format_literal_value(typ: LiteralType) -> str: if isinstance(typ, Instance): itype = typ # Get the short name of the type. - if itype.type.fullname in ("types.ModuleType", "_importlib_modulespec.ModuleType"): + if itype.type.fullname == "types.ModuleType": # Make some common error messages simpler and tidier. base_str = "Module" if itype.extra_attrs and itype.extra_attrs.mod_name and module_names: diff --git a/test-data/unit/cmdline.test b/test-data/unit/cmdline.test index c2e98cdb74f9..b87bb7f17eb0 100644 --- a/test-data/unit/cmdline.test +++ b/test-data/unit/cmdline.test @@ -1484,6 +1484,10 @@ note: A user-defined top-level module with name "typing" is not supported [file dir/stdlib/types.pyi] [file dir/stdlib/typing.pyi] [file dir/stdlib/typing_extensions.pyi] +[file dir/stdlib/_typeshed.pyi] +[file dir/stdlib/_collections_abc.pyi] +[file dir/stdlib/collections/abc.pyi] +[file dir/stdlib/collections/__init__.pyi] [file dir/stdlib/VERSIONS] [out] Failed to find builtin module mypy_extensions, perhaps typeshed is broken? @@ -1523,6 +1527,10 @@ class dict: pass [file dir/stdlib/typing.pyi] [file dir/stdlib/mypy_extensions.pyi] [file dir/stdlib/typing_extensions.pyi] +[file dir/stdlib/_typeshed.pyi] +[file dir/stdlib/_collections_abc.pyi] +[file dir/stdlib/collections/abc.pyi] +[file dir/stdlib/collections/__init__.pyi] [file dir/stdlib/foo.pyi] 1() # Errors are reported if the file was explicitly passed on the command line [file dir/stdlib/VERSIONS]