mypy-dev 1.9.0.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mypy/__init__.py +1 -0
- mypy/__main__.py +37 -0
- mypy/api.py +94 -0
- mypy/applytype.py +156 -0
- mypy/argmap.py +268 -0
- mypy/binder.py +538 -0
- mypy/bogus_type.py +27 -0
- mypy/build.py +3562 -0
- mypy/checker.py +8372 -0
- mypy/checkexpr.py +6615 -0
- mypy/checkmember.py +1356 -0
- mypy/checkpattern.py +801 -0
- mypy/checkstrformat.py +1109 -0
- mypy/config_parser.py +670 -0
- mypy/constant_fold.py +187 -0
- mypy/constraints.py +1624 -0
- mypy/copytype.py +133 -0
- mypy/defaults.py +46 -0
- mypy/dmypy/__init__.py +0 -0
- mypy/dmypy/__main__.py +6 -0
- mypy/dmypy/client.py +749 -0
- mypy/dmypy_os.py +42 -0
- mypy/dmypy_server.py +1107 -0
- mypy/dmypy_util.py +117 -0
- mypy/erasetype.py +278 -0
- mypy/errorcodes.py +285 -0
- mypy/errors.py +1280 -0
- mypy/evalexpr.py +205 -0
- mypy/expandtype.py +510 -0
- mypy/exprtotype.py +206 -0
- mypy/fastparse.py +2147 -0
- mypy/find_sources.py +243 -0
- mypy/fixup.py +426 -0
- mypy/freetree.py +23 -0
- mypy/fscache.py +309 -0
- mypy/fswatcher.py +106 -0
- mypy/gclogger.py +47 -0
- mypy/git.py +34 -0
- mypy/graph_utils.py +112 -0
- mypy/indirection.py +121 -0
- mypy/infer.py +75 -0
- mypy/inspections.py +627 -0
- mypy/ipc.py +310 -0
- mypy/join.py +866 -0
- mypy/literals.py +306 -0
- mypy/lookup.py +61 -0
- mypy/main.py +1574 -0
- mypy/maptype.py +106 -0
- mypy/meet.py +1140 -0
- mypy/memprofile.py +121 -0
- mypy/message_registry.py +326 -0
- mypy/messages.py +3171 -0
- mypy/metastore.py +225 -0
- mypy/mixedtraverser.py +112 -0
- mypy/modulefinder.py +875 -0
- mypy/moduleinspect.py +184 -0
- mypy/mro.py +62 -0
- mypy/nodes.py +4112 -0
- mypy/operators.py +126 -0
- mypy/options.py +556 -0
- mypy/parse.py +30 -0
- mypy/partially_defined.py +675 -0
- mypy/patterns.py +150 -0
- mypy/plugin.py +901 -0
- mypy/plugins/__init__.py +0 -0
- mypy/plugins/attrs.py +1152 -0
- mypy/plugins/common.py +440 -0
- mypy/plugins/ctypes.py +245 -0
- mypy/plugins/dataclasses.py +1101 -0
- mypy/plugins/default.py +518 -0
- mypy/plugins/enums.py +259 -0
- mypy/plugins/functools.py +104 -0
- mypy/plugins/proper_plugin.py +175 -0
- mypy/plugins/singledispatch.py +224 -0
- mypy/py.typed +1 -0
- mypy/pyinfo.py +78 -0
- mypy/reachability.py +362 -0
- mypy/refinfo.py +92 -0
- mypy/renaming.py +568 -0
- mypy/report.py +924 -0
- mypy/scope.py +125 -0
- mypy/semanal.py +7023 -0
- mypy/semanal_classprop.py +187 -0
- mypy/semanal_enum.py +253 -0
- mypy/semanal_infer.py +128 -0
- mypy/semanal_main.py +511 -0
- mypy/semanal_namedtuple.py +670 -0
- mypy/semanal_newtype.py +273 -0
- mypy/semanal_pass1.py +156 -0
- mypy/semanal_shared.py +490 -0
- mypy/semanal_typeargs.py +265 -0
- mypy/semanal_typeddict.py +575 -0
- mypy/server/__init__.py +0 -0
- mypy/server/astdiff.py +518 -0
- mypy/server/astmerge.py +562 -0
- mypy/server/aststrip.py +281 -0
- mypy/server/deps.py +1137 -0
- mypy/server/mergecheck.py +83 -0
- mypy/server/objgraph.py +101 -0
- mypy/server/subexpr.py +198 -0
- mypy/server/target.py +11 -0
- mypy/server/trigger.py +26 -0
- mypy/server/update.py +1339 -0
- mypy/sharedparse.py +112 -0
- mypy/solve.py +562 -0
- mypy/split_namespace.py +35 -0
- mypy/state.py +28 -0
- mypy/stats.py +489 -0
- mypy/strconv.py +641 -0
- mypy/stubdoc.py +491 -0
- mypy/stubgen.py +1873 -0
- mypy/stubgenc.py +993 -0
- mypy/stubinfo.py +173 -0
- mypy/stubtest.py +2079 -0
- mypy/stubutil.py +807 -0
- mypy/subtypes.py +1967 -0
- mypy/suggestions.py +1046 -0
- mypy/test/__init__.py +0 -0
- mypy/test/config.py +28 -0
- mypy/test/data.py +823 -0
- mypy/test/helpers.py +476 -0
- mypy/test/meta/__init__.py +0 -0
- mypy/test/meta/_pytest.py +72 -0
- mypy/test/meta/test_diff_helper.py +47 -0
- mypy/test/meta/test_parse_data.py +73 -0
- mypy/test/meta/test_update_data.py +135 -0
- mypy/test/test_find_sources.py +376 -0
- mypy/test/test_ref_info.py +45 -0
- mypy/test/testapi.py +45 -0
- mypy/test/testargs.py +77 -0
- mypy/test/testcheck.py +322 -0
- mypy/test/testcmdline.py +152 -0
- mypy/test/testconstraints.py +134 -0
- mypy/test/testdaemon.py +132 -0
- mypy/test/testdeps.py +77 -0
- mypy/test/testdiff.py +67 -0
- mypy/test/testerrorstream.py +46 -0
- mypy/test/testfinegrained.py +438 -0
- mypy/test/testfinegrainedcache.py +18 -0
- mypy/test/testformatter.py +85 -0
- mypy/test/testfscache.py +101 -0
- mypy/test/testgraph.py +83 -0
- mypy/test/testinfer.py +373 -0
- mypy/test/testipc.py +119 -0
- mypy/test/testmerge.py +238 -0
- mypy/test/testmodulefinder.py +278 -0
- mypy/test/testmypyc.py +14 -0
- mypy/test/testparse.py +107 -0
- mypy/test/testpep561.py +211 -0
- mypy/test/testpythoneval.py +117 -0
- mypy/test/testreports.py +55 -0
- mypy/test/testsemanal.py +209 -0
- mypy/test/testsolve.py +285 -0
- mypy/test/teststubgen.py +1412 -0
- mypy/test/teststubinfo.py +12 -0
- mypy/test/teststubtest.py +2492 -0
- mypy/test/testsubtypes.py +303 -0
- mypy/test/testtransform.py +64 -0
- mypy/test/testtypegen.py +83 -0
- mypy/test/testtypes.py +1551 -0
- mypy/test/testutil.py +111 -0
- mypy/test/typefixture.py +415 -0
- mypy/test/update_data.py +87 -0
- mypy/test/visitors.py +63 -0
- mypy/traverser.py +961 -0
- mypy/treetransform.py +800 -0
- mypy/tvar_scope.py +147 -0
- mypy/type_visitor.py +564 -0
- mypy/typeanal.py +2510 -0
- mypy/typeops.py +1082 -0
- mypy/types.py +3686 -0
- mypy/types_utils.py +166 -0
- mypy/typeshed/LICENSE +237 -0
- mypy/typeshed/stdlib/VERSIONS +308 -0
- mypy/typeshed/stdlib/__future__.pyi +36 -0
- mypy/typeshed/stdlib/__main__.pyi +3 -0
- mypy/typeshed/stdlib/_ast.pyi +587 -0
- mypy/typeshed/stdlib/_bisect.pyi +84 -0
- mypy/typeshed/stdlib/_bootlocale.pyi +1 -0
- mypy/typeshed/stdlib/_codecs.pyi +133 -0
- mypy/typeshed/stdlib/_collections_abc.pyi +94 -0
- mypy/typeshed/stdlib/_compat_pickle.pyi +8 -0
- mypy/typeshed/stdlib/_compression.pyi +25 -0
- mypy/typeshed/stdlib/_csv.pyi +90 -0
- mypy/typeshed/stdlib/_ctypes.pyi +205 -0
- mypy/typeshed/stdlib/_curses.pyi +557 -0
- mypy/typeshed/stdlib/_decimal.pyi +281 -0
- mypy/typeshed/stdlib/_dummy_thread.pyi +27 -0
- mypy/typeshed/stdlib/_dummy_threading.pyi +164 -0
- mypy/typeshed/stdlib/_heapq.pyi +11 -0
- mypy/typeshed/stdlib/_imp.pyi +28 -0
- mypy/typeshed/stdlib/_json.pyi +49 -0
- mypy/typeshed/stdlib/_locale.pyi +100 -0
- mypy/typeshed/stdlib/_markupbase.pyi +16 -0
- mypy/typeshed/stdlib/_msi.pyi +91 -0
- mypy/typeshed/stdlib/_operator.pyi +147 -0
- mypy/typeshed/stdlib/_osx_support.pyi +34 -0
- mypy/typeshed/stdlib/_posixsubprocess.pyi +32 -0
- mypy/typeshed/stdlib/_py_abc.pyi +14 -0
- mypy/typeshed/stdlib/_pydecimal.pyi +43 -0
- mypy/typeshed/stdlib/_random.pyi +12 -0
- mypy/typeshed/stdlib/_sitebuiltins.pyi +16 -0
- mypy/typeshed/stdlib/_socket.pyi +802 -0
- mypy/typeshed/stdlib/_stat.pyi +103 -0
- mypy/typeshed/stdlib/_thread.pyi +52 -0
- mypy/typeshed/stdlib/_threading_local.pyi +17 -0
- mypy/typeshed/stdlib/_tkinter.pyi +120 -0
- mypy/typeshed/stdlib/_tracemalloc.pyi +17 -0
- mypy/typeshed/stdlib/_typeshed/__init__.pyi +347 -0
- mypy/typeshed/stdlib/_typeshed/dbapi.pyi +37 -0
- mypy/typeshed/stdlib/_typeshed/wsgi.pyi +44 -0
- mypy/typeshed/stdlib/_typeshed/xml.pyi +9 -0
- mypy/typeshed/stdlib/_warnings.pyi +55 -0
- mypy/typeshed/stdlib/_weakref.pyi +41 -0
- mypy/typeshed/stdlib/_weakrefset.pyi +51 -0
- mypy/typeshed/stdlib/_winapi.pyi +251 -0
- mypy/typeshed/stdlib/abc.pyi +49 -0
- mypy/typeshed/stdlib/aifc.pyi +91 -0
- mypy/typeshed/stdlib/antigravity.pyi +3 -0
- mypy/typeshed/stdlib/argparse.pyi +571 -0
- mypy/typeshed/stdlib/array.pyi +92 -0
- mypy/typeshed/stdlib/ast.pyi +277 -0
- mypy/typeshed/stdlib/asynchat.pyi +21 -0
- mypy/typeshed/stdlib/asyncio/__init__.pyi +41 -0
- mypy/typeshed/stdlib/asyncio/base_events.pyi +440 -0
- mypy/typeshed/stdlib/asyncio/base_futures.pyi +19 -0
- mypy/typeshed/stdlib/asyncio/base_subprocess.pyi +63 -0
- mypy/typeshed/stdlib/asyncio/base_tasks.pyi +9 -0
- mypy/typeshed/stdlib/asyncio/constants.pyi +20 -0
- mypy/typeshed/stdlib/asyncio/coroutines.pyi +26 -0
- mypy/typeshed/stdlib/asyncio/events.pyi +574 -0
- mypy/typeshed/stdlib/asyncio/exceptions.pyi +43 -0
- mypy/typeshed/stdlib/asyncio/format_helpers.pyi +20 -0
- mypy/typeshed/stdlib/asyncio/futures.pyi +57 -0
- mypy/typeshed/stdlib/asyncio/locks.pyi +121 -0
- mypy/typeshed/stdlib/asyncio/log.pyi +3 -0
- mypy/typeshed/stdlib/asyncio/mixins.pyi +9 -0
- mypy/typeshed/stdlib/asyncio/proactor_events.pyi +64 -0
- mypy/typeshed/stdlib/asyncio/protocols.pyi +34 -0
- mypy/typeshed/stdlib/asyncio/queues.pyi +47 -0
- mypy/typeshed/stdlib/asyncio/runners.pyi +32 -0
- mypy/typeshed/stdlib/asyncio/selector_events.pyi +8 -0
- mypy/typeshed/stdlib/asyncio/sslproto.pyi +163 -0
- mypy/typeshed/stdlib/asyncio/staggered.pyi +10 -0
- mypy/typeshed/stdlib/asyncio/streams.pyi +148 -0
- mypy/typeshed/stdlib/asyncio/subprocess.pyi +229 -0
- mypy/typeshed/stdlib/asyncio/taskgroups.pyi +25 -0
- mypy/typeshed/stdlib/asyncio/tasks.pyi +477 -0
- mypy/typeshed/stdlib/asyncio/threads.pyi +9 -0
- mypy/typeshed/stdlib/asyncio/timeouts.pyi +19 -0
- mypy/typeshed/stdlib/asyncio/transports.pyi +47 -0
- mypy/typeshed/stdlib/asyncio/trsock.pyi +98 -0
- mypy/typeshed/stdlib/asyncio/unix_events.pyi +173 -0
- mypy/typeshed/stdlib/asyncio/windows_events.pyi +83 -0
- mypy/typeshed/stdlib/asyncio/windows_utils.pyi +49 -0
- mypy/typeshed/stdlib/asyncore.pyi +90 -0
- mypy/typeshed/stdlib/atexit.pyi +12 -0
- mypy/typeshed/stdlib/audioop.pyi +42 -0
- mypy/typeshed/stdlib/base64.pyi +59 -0
- mypy/typeshed/stdlib/bdb.pyi +102 -0
- mypy/typeshed/stdlib/binascii.pyi +36 -0
- mypy/typeshed/stdlib/binhex.pyi +45 -0
- mypy/typeshed/stdlib/bisect.pyi +4 -0
- mypy/typeshed/stdlib/builtins.pyi +1937 -0
- mypy/typeshed/stdlib/bz2.pyi +146 -0
- mypy/typeshed/stdlib/cProfile.pyi +35 -0
- mypy/typeshed/stdlib/calendar.pyi +206 -0
- mypy/typeshed/stdlib/cgi.pyi +118 -0
- mypy/typeshed/stdlib/cgitb.pyi +32 -0
- mypy/typeshed/stdlib/chunk.pyi +20 -0
- mypy/typeshed/stdlib/cmath.pyi +36 -0
- mypy/typeshed/stdlib/cmd.pyi +45 -0
- mypy/typeshed/stdlib/code.pyi +33 -0
- mypy/typeshed/stdlib/codecs.pyi +285 -0
- mypy/typeshed/stdlib/codeop.pyi +13 -0
- mypy/typeshed/stdlib/collections/__init__.pyi +477 -0
- mypy/typeshed/stdlib/collections/abc.pyi +2 -0
- mypy/typeshed/stdlib/colorsys.pyi +13 -0
- mypy/typeshed/stdlib/compileall.pyi +111 -0
- mypy/typeshed/stdlib/concurrent/__init__.pyi +0 -0
- mypy/typeshed/stdlib/concurrent/futures/__init__.pyi +32 -0
- mypy/typeshed/stdlib/concurrent/futures/_base.pyi +120 -0
- mypy/typeshed/stdlib/concurrent/futures/process.pyi +233 -0
- mypy/typeshed/stdlib/concurrent/futures/thread.pyi +80 -0
- mypy/typeshed/stdlib/configparser.pyi +313 -0
- mypy/typeshed/stdlib/contextlib.pyi +207 -0
- mypy/typeshed/stdlib/contextvars.pyi +63 -0
- mypy/typeshed/stdlib/copy.pyi +16 -0
- mypy/typeshed/stdlib/copyreg.pyi +21 -0
- mypy/typeshed/stdlib/crypt.pyi +12 -0
- mypy/typeshed/stdlib/csv.pyi +147 -0
- mypy/typeshed/stdlib/ctypes/__init__.pyi +187 -0
- mypy/typeshed/stdlib/ctypes/_endian.pyi +19 -0
- mypy/typeshed/stdlib/ctypes/util.pyi +6 -0
- mypy/typeshed/stdlib/ctypes/wintypes.pyi +298 -0
- mypy/typeshed/stdlib/curses/__init__.pyi +21 -0
- mypy/typeshed/stdlib/curses/ascii.pyi +63 -0
- mypy/typeshed/stdlib/curses/has_key.pyi +4 -0
- mypy/typeshed/stdlib/curses/panel.pyi +25 -0
- mypy/typeshed/stdlib/curses/textpad.pyi +13 -0
- mypy/typeshed/stdlib/dataclasses.pyi +313 -0
- mypy/typeshed/stdlib/datetime.pyi +295 -0
- mypy/typeshed/stdlib/dbm/__init__.pyi +95 -0
- mypy/typeshed/stdlib/dbm/dumb.pyi +31 -0
- mypy/typeshed/stdlib/dbm/gnu.pyi +40 -0
- mypy/typeshed/stdlib/dbm/ndbm.pyi +36 -0
- mypy/typeshed/stdlib/decimal.pyi +2 -0
- mypy/typeshed/stdlib/difflib.pyi +140 -0
- mypy/typeshed/stdlib/dis.pyi +144 -0
- mypy/typeshed/stdlib/distutils/__init__.pyi +5 -0
- mypy/typeshed/stdlib/distutils/archive_util.pyi +20 -0
- mypy/typeshed/stdlib/distutils/bcppcompiler.pyi +3 -0
- mypy/typeshed/stdlib/distutils/ccompiler.pyi +152 -0
- mypy/typeshed/stdlib/distutils/cmd.pyi +66 -0
- mypy/typeshed/stdlib/distutils/command/__init__.pyi +0 -0
- mypy/typeshed/stdlib/distutils/command/bdist.pyi +25 -0
- mypy/typeshed/stdlib/distutils/command/bdist_dumb.pyi +21 -0
- mypy/typeshed/stdlib/distutils/command/bdist_msi.pyi +45 -0
- mypy/typeshed/stdlib/distutils/command/bdist_packager.pyi +0 -0
- mypy/typeshed/stdlib/distutils/command/bdist_rpm.pyi +52 -0
- mypy/typeshed/stdlib/distutils/command/bdist_wininst.pyi +16 -0
- mypy/typeshed/stdlib/distutils/command/build.pyi +31 -0
- mypy/typeshed/stdlib/distutils/command/build_clib.pyi +27 -0
- mypy/typeshed/stdlib/distutils/command/build_ext.pyi +50 -0
- mypy/typeshed/stdlib/distutils/command/build_py.pyi +44 -0
- mypy/typeshed/stdlib/distutils/command/build_scripts.pyi +24 -0
- mypy/typeshed/stdlib/distutils/command/check.pyi +39 -0
- mypy/typeshed/stdlib/distutils/command/clean.pyi +17 -0
- mypy/typeshed/stdlib/distutils/command/config.pyi +83 -0
- mypy/typeshed/stdlib/distutils/command/install.pyi +63 -0
- mypy/typeshed/stdlib/distutils/command/install_data.pyi +19 -0
- mypy/typeshed/stdlib/distutils/command/install_egg_info.pyi +18 -0
- mypy/typeshed/stdlib/distutils/command/install_headers.pyi +16 -0
- mypy/typeshed/stdlib/distutils/command/install_lib.pyi +25 -0
- mypy/typeshed/stdlib/distutils/command/install_scripts.pyi +18 -0
- mypy/typeshed/stdlib/distutils/command/register.pyi +18 -0
- mypy/typeshed/stdlib/distutils/command/sdist.pyi +42 -0
- mypy/typeshed/stdlib/distutils/command/upload.pyi +17 -0
- mypy/typeshed/stdlib/distutils/config.pyi +17 -0
- mypy/typeshed/stdlib/distutils/core.pyi +57 -0
- mypy/typeshed/stdlib/distutils/cygwinccompiler.pyi +20 -0
- mypy/typeshed/stdlib/distutils/debug.pyi +1 -0
- mypy/typeshed/stdlib/distutils/dep_util.pyi +3 -0
- mypy/typeshed/stdlib/distutils/dir_util.pyi +13 -0
- mypy/typeshed/stdlib/distutils/dist.pyi +146 -0
- mypy/typeshed/stdlib/distutils/errors.pyi +19 -0
- mypy/typeshed/stdlib/distutils/extension.pyi +36 -0
- mypy/typeshed/stdlib/distutils/fancy_getopt.pyi +34 -0
- mypy/typeshed/stdlib/distutils/file_util.pyi +14 -0
- mypy/typeshed/stdlib/distutils/filelist.pyi +50 -0
- mypy/typeshed/stdlib/distutils/log.pyi +25 -0
- mypy/typeshed/stdlib/distutils/msvccompiler.pyi +3 -0
- mypy/typeshed/stdlib/distutils/spawn.pyi +2 -0
- mypy/typeshed/stdlib/distutils/sysconfig.pyi +22 -0
- mypy/typeshed/stdlib/distutils/text_file.pyi +21 -0
- mypy/typeshed/stdlib/distutils/unixccompiler.pyi +3 -0
- mypy/typeshed/stdlib/distutils/util.pyi +46 -0
- mypy/typeshed/stdlib/distutils/version.pyi +36 -0
- mypy/typeshed/stdlib/doctest.pyi +248 -0
- mypy/typeshed/stdlib/dummy_threading.pyi +2 -0
- mypy/typeshed/stdlib/email/__init__.pyi +29 -0
- mypy/typeshed/stdlib/email/_header_value_parser.pyi +392 -0
- mypy/typeshed/stdlib/email/_policybase.pyi +51 -0
- mypy/typeshed/stdlib/email/base64mime.pyi +13 -0
- mypy/typeshed/stdlib/email/charset.pyi +34 -0
- mypy/typeshed/stdlib/email/contentmanager.pyi +11 -0
- mypy/typeshed/stdlib/email/encoders.pyi +8 -0
- mypy/typeshed/stdlib/email/errors.pyi +39 -0
- mypy/typeshed/stdlib/email/feedparser.pyi +23 -0
- mypy/typeshed/stdlib/email/generator.pyi +40 -0
- mypy/typeshed/stdlib/email/header.pyi +31 -0
- mypy/typeshed/stdlib/email/headerregistry.pyi +178 -0
- mypy/typeshed/stdlib/email/iterators.pyi +12 -0
- mypy/typeshed/stdlib/email/message.pyi +161 -0
- mypy/typeshed/stdlib/email/mime/__init__.pyi +0 -0
- mypy/typeshed/stdlib/email/mime/application.pyi +17 -0
- mypy/typeshed/stdlib/email/mime/audio.pyi +17 -0
- mypy/typeshed/stdlib/email/mime/base.pyi +8 -0
- mypy/typeshed/stdlib/email/mime/image.pyi +17 -0
- mypy/typeshed/stdlib/email/mime/message.pyi +8 -0
- mypy/typeshed/stdlib/email/mime/multipart.pyi +18 -0
- mypy/typeshed/stdlib/email/mime/nonmultipart.pyi +5 -0
- mypy/typeshed/stdlib/email/mime/text.pyi +9 -0
- mypy/typeshed/stdlib/email/parser.pyi +26 -0
- mypy/typeshed/stdlib/email/policy.pyi +38 -0
- mypy/typeshed/stdlib/email/quoprimime.pyi +28 -0
- mypy/typeshed/stdlib/email/utils.pyi +66 -0
- mypy/typeshed/stdlib/encodings/__init__.pyi +10 -0
- mypy/typeshed/stdlib/encodings/utf_8.pyi +21 -0
- mypy/typeshed/stdlib/encodings/utf_8_sig.pyi +22 -0
- mypy/typeshed/stdlib/ensurepip/__init__.pyi +12 -0
- mypy/typeshed/stdlib/enum.pyi +317 -0
- mypy/typeshed/stdlib/errno.pyi +222 -0
- mypy/typeshed/stdlib/faulthandler.pyi +13 -0
- mypy/typeshed/stdlib/fcntl.pyi +127 -0
- mypy/typeshed/stdlib/filecmp.pyi +57 -0
- mypy/typeshed/stdlib/fileinput.pyi +213 -0
- mypy/typeshed/stdlib/fnmatch.pyi +9 -0
- mypy/typeshed/stdlib/formatter.pyi +88 -0
- mypy/typeshed/stdlib/fractions.pyi +150 -0
- mypy/typeshed/stdlib/ftplib.pyi +178 -0
- mypy/typeshed/stdlib/functools.pyi +200 -0
- mypy/typeshed/stdlib/gc.pyi +37 -0
- mypy/typeshed/stdlib/genericpath.pyi +52 -0
- mypy/typeshed/stdlib/getopt.pyi +11 -0
- mypy/typeshed/stdlib/getpass.pyi +8 -0
- mypy/typeshed/stdlib/gettext.pyi +169 -0
- mypy/typeshed/stdlib/glob.pyi +42 -0
- mypy/typeshed/stdlib/graphlib.pyi +28 -0
- mypy/typeshed/stdlib/grp.pyi +21 -0
- mypy/typeshed/stdlib/gzip.pyi +160 -0
- mypy/typeshed/stdlib/hashlib.pyi +165 -0
- mypy/typeshed/stdlib/heapq.pyi +17 -0
- mypy/typeshed/stdlib/hmac.pyi +38 -0
- mypy/typeshed/stdlib/html/__init__.pyi +6 -0
- mypy/typeshed/stdlib/html/entities.pyi +6 -0
- mypy/typeshed/stdlib/html/parser.pyi +34 -0
- mypy/typeshed/stdlib/http/__init__.pyi +105 -0
- mypy/typeshed/stdlib/http/client.pyi +259 -0
- mypy/typeshed/stdlib/http/cookiejar.pyi +159 -0
- mypy/typeshed/stdlib/http/cookies.pyi +60 -0
- mypy/typeshed/stdlib/http/server.pyi +83 -0
- mypy/typeshed/stdlib/imaplib.pyi +168 -0
- mypy/typeshed/stdlib/imghdr.pyi +17 -0
- mypy/typeshed/stdlib/imp.pyi +62 -0
- mypy/typeshed/stdlib/importlib/__init__.pyi +24 -0
- mypy/typeshed/stdlib/importlib/_abc.pyi +15 -0
- mypy/typeshed/stdlib/importlib/abc.pyi +172 -0
- mypy/typeshed/stdlib/importlib/machinery.pyi +179 -0
- mypy/typeshed/stdlib/importlib/metadata/__init__.pyi +276 -0
- mypy/typeshed/stdlib/importlib/metadata/_meta.pyi +40 -0
- mypy/typeshed/stdlib/importlib/readers.pyi +68 -0
- mypy/typeshed/stdlib/importlib/resources/__init__.pyi +46 -0
- mypy/typeshed/stdlib/importlib/resources/abc.pyi +12 -0
- mypy/typeshed/stdlib/importlib/resources/readers.pyi +14 -0
- mypy/typeshed/stdlib/importlib/resources/simple.pyi +49 -0
- mypy/typeshed/stdlib/importlib/simple.pyi +11 -0
- mypy/typeshed/stdlib/importlib/util.pyi +43 -0
- mypy/typeshed/stdlib/inspect.pyi +631 -0
- mypy/typeshed/stdlib/io.pyi +204 -0
- mypy/typeshed/stdlib/ipaddress.pyi +208 -0
- mypy/typeshed/stdlib/itertools.pyi +293 -0
- mypy/typeshed/stdlib/json/__init__.pyi +61 -0
- mypy/typeshed/stdlib/json/decoder.pyi +32 -0
- mypy/typeshed/stdlib/json/encoder.pyi +38 -0
- mypy/typeshed/stdlib/json/tool.pyi +1 -0
- mypy/typeshed/stdlib/keyword.pyi +21 -0
- mypy/typeshed/stdlib/lib2to3/__init__.pyi +0 -0
- mypy/typeshed/stdlib/lib2to3/btm_matcher.pyi +28 -0
- mypy/typeshed/stdlib/lib2to3/fixer_base.pyi +42 -0
- mypy/typeshed/stdlib/lib2to3/fixes/__init__.pyi +0 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_apply.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_asserts.pyi +10 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_basestring.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_buffer.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_dict.pyi +16 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_except.pyi +14 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_exec.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_execfile.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_exitfunc.pyi +13 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_filter.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_funcattrs.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_future.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_getcwdu.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_has_key.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_idioms.pyi +15 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_import.pyi +16 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_imports.pyi +21 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_imports2.pyi +6 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_input.pyi +11 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_intern.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_isinstance.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools_imports.pyi +7 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_long.pyi +7 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_map.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_metaclass.pyi +17 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_methodattrs.pyi +10 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_ne.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_next.pyi +19 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_nonzero.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_numliterals.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_operator.pyi +12 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_paren.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_print.pyi +12 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_raise.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_raw_input.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_reduce.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_reload.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_renames.pyi +17 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_repr.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_set_literal.pyi +7 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_standarderror.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_sys_exc.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_throw.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_tuple_params.pyi +17 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_types.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_unicode.pyi +12 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_urllib.pyi +15 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_ws_comma.pyi +12 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_xrange.pyi +20 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_xreadlines.pyi +8 -0
- mypy/typeshed/stdlib/lib2to3/fixes/fix_zip.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/main.pyi +42 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/__init__.pyi +9 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/driver.pyi +27 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/grammar.pyi +24 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/literals.pyi +7 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/parse.pyi +30 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/pgen.pyi +50 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/token.pyi +67 -0
- mypy/typeshed/stdlib/lib2to3/pgen2/tokenize.pyi +96 -0
- mypy/typeshed/stdlib/lib2to3/pygram.pyi +114 -0
- mypy/typeshed/stdlib/lib2to3/pytree.pyi +117 -0
- mypy/typeshed/stdlib/lib2to3/refactor.pyi +82 -0
- mypy/typeshed/stdlib/linecache.pyi +23 -0
- mypy/typeshed/stdlib/locale.pyi +152 -0
- mypy/typeshed/stdlib/logging/__init__.pyi +655 -0
- mypy/typeshed/stdlib/logging/config.pyi +134 -0
- mypy/typeshed/stdlib/logging/handlers.pyi +275 -0
- mypy/typeshed/stdlib/lzma.pyi +197 -0
- mypy/typeshed/stdlib/mailbox.pyi +256 -0
- mypy/typeshed/stdlib/mailcap.pyi +11 -0
- mypy/typeshed/stdlib/marshal.pyi +33 -0
- mypy/typeshed/stdlib/math.pyi +125 -0
- mypy/typeshed/stdlib/mimetypes.pyi +46 -0
- mypy/typeshed/stdlib/mmap.pyi +113 -0
- mypy/typeshed/stdlib/modulefinder.pyi +66 -0
- mypy/typeshed/stdlib/msilib/__init__.pyi +176 -0
- mypy/typeshed/stdlib/msilib/schema.pyi +94 -0
- mypy/typeshed/stdlib/msilib/sequence.pyi +13 -0
- mypy/typeshed/stdlib/msilib/text.pyi +7 -0
- mypy/typeshed/stdlib/msvcrt.pyi +32 -0
- mypy/typeshed/stdlib/multiprocessing/__init__.pyi +90 -0
- mypy/typeshed/stdlib/multiprocessing/connection.pyi +75 -0
- mypy/typeshed/stdlib/multiprocessing/context.pyi +187 -0
- mypy/typeshed/stdlib/multiprocessing/dummy/__init__.pyi +77 -0
- mypy/typeshed/stdlib/multiprocessing/dummy/connection.pyi +39 -0
- mypy/typeshed/stdlib/multiprocessing/forkserver.pyi +31 -0
- mypy/typeshed/stdlib/multiprocessing/heap.pyi +36 -0
- mypy/typeshed/stdlib/multiprocessing/managers.pyi +212 -0
- mypy/typeshed/stdlib/multiprocessing/pool.pyi +103 -0
- mypy/typeshed/stdlib/multiprocessing/popen_fork.pyi +23 -0
- mypy/typeshed/stdlib/multiprocessing/popen_forkserver.pyi +16 -0
- mypy/typeshed/stdlib/multiprocessing/popen_spawn_posix.pyi +20 -0
- mypy/typeshed/stdlib/multiprocessing/popen_spawn_win32.pyi +30 -0
- mypy/typeshed/stdlib/multiprocessing/process.pyi +39 -0
- mypy/typeshed/stdlib/multiprocessing/queues.pyi +41 -0
- mypy/typeshed/stdlib/multiprocessing/reduction.pyi +89 -0
- mypy/typeshed/stdlib/multiprocessing/resource_sharer.pyi +20 -0
- mypy/typeshed/stdlib/multiprocessing/resource_tracker.pyi +18 -0
- mypy/typeshed/stdlib/multiprocessing/shared_memory.pyi +40 -0
- mypy/typeshed/stdlib/multiprocessing/sharedctypes.pyi +101 -0
- mypy/typeshed/stdlib/multiprocessing/spawn.pyi +32 -0
- mypy/typeshed/stdlib/multiprocessing/synchronize.pyi +54 -0
- mypy/typeshed/stdlib/multiprocessing/util.pyi +79 -0
- mypy/typeshed/stdlib/netrc.pyi +23 -0
- mypy/typeshed/stdlib/nis.pyi +9 -0
- mypy/typeshed/stdlib/nntplib.pyi +125 -0
- mypy/typeshed/stdlib/nt.pyi +111 -0
- mypy/typeshed/stdlib/ntpath.pyi +119 -0
- mypy/typeshed/stdlib/nturl2path.pyi +2 -0
- mypy/typeshed/stdlib/numbers.pyi +154 -0
- mypy/typeshed/stdlib/opcode.pyi +59 -0
- mypy/typeshed/stdlib/operator.pyi +110 -0
- mypy/typeshed/stdlib/optparse.pyi +252 -0
- mypy/typeshed/stdlib/os/__init__.pyi +1139 -0
- mypy/typeshed/stdlib/os/path.pyi +8 -0
- mypy/typeshed/stdlib/ossaudiodev.pyi +131 -0
- mypy/typeshed/stdlib/parser.pyi +24 -0
- mypy/typeshed/stdlib/pathlib.pyi +232 -0
- mypy/typeshed/stdlib/pdb.pyi +181 -0
- mypy/typeshed/stdlib/pickle.pyi +270 -0
- mypy/typeshed/stdlib/pickletools.pyi +167 -0
- mypy/typeshed/stdlib/pipes.pyi +16 -0
- mypy/typeshed/stdlib/pkgutil.pyi +53 -0
- mypy/typeshed/stdlib/platform.pyi +42 -0
- mypy/typeshed/stdlib/plistlib.pyi +113 -0
- mypy/typeshed/stdlib/poplib.pyi +71 -0
- mypy/typeshed/stdlib/posix.pyi +359 -0
- mypy/typeshed/stdlib/posixpath.pyi +161 -0
- mypy/typeshed/stdlib/pprint.pyi +112 -0
- mypy/typeshed/stdlib/profile.pyi +31 -0
- mypy/typeshed/stdlib/pstats.pyi +78 -0
- mypy/typeshed/stdlib/pty.pyi +19 -0
- mypy/typeshed/stdlib/pwd.pyi +27 -0
- mypy/typeshed/stdlib/py_compile.pyi +34 -0
- mypy/typeshed/stdlib/pyclbr.pyi +74 -0
- mypy/typeshed/stdlib/pydoc.pyi +261 -0
- mypy/typeshed/stdlib/pydoc_data/__init__.pyi +0 -0
- mypy/typeshed/stdlib/pydoc_data/topics.pyi +1 -0
- mypy/typeshed/stdlib/pyexpat/__init__.pyi +80 -0
- mypy/typeshed/stdlib/pyexpat/errors.pyi +49 -0
- mypy/typeshed/stdlib/pyexpat/model.pyi +11 -0
- mypy/typeshed/stdlib/queue.pyi +58 -0
- mypy/typeshed/stdlib/quopri.pyi +11 -0
- mypy/typeshed/stdlib/random.pyi +138 -0
- mypy/typeshed/stdlib/re.pyi +290 -0
- mypy/typeshed/stdlib/readline.pyi +36 -0
- mypy/typeshed/stdlib/reprlib.pyi +65 -0
- mypy/typeshed/stdlib/resource.pyi +92 -0
- mypy/typeshed/stdlib/rlcompleter.pyi +9 -0
- mypy/typeshed/stdlib/runpy.pyi +24 -0
- mypy/typeshed/stdlib/sched.pyi +42 -0
- mypy/typeshed/stdlib/secrets.pyi +15 -0
- mypy/typeshed/stdlib/select.pyi +151 -0
- mypy/typeshed/stdlib/selectors.pyi +67 -0
- mypy/typeshed/stdlib/shelve.pyi +46 -0
- mypy/typeshed/stdlib/shlex.pyi +43 -0
- mypy/typeshed/stdlib/shutil.pyi +189 -0
- mypy/typeshed/stdlib/signal.pyi +189 -0
- mypy/typeshed/stdlib/site.pyi +27 -0
- mypy/typeshed/stdlib/smtpd.pyi +91 -0
- mypy/typeshed/stdlib/smtplib.pyi +204 -0
- mypy/typeshed/stdlib/sndhdr.pyi +14 -0
- mypy/typeshed/stdlib/socket.pyi +825 -0
- mypy/typeshed/stdlib/socketserver.pyi +168 -0
- mypy/typeshed/stdlib/spwd.pyi +40 -0
- mypy/typeshed/stdlib/sqlite3/__init__.pyi +1 -0
- mypy/typeshed/stdlib/sqlite3/dbapi2.pyi +469 -0
- mypy/typeshed/stdlib/sre_compile.pyi +11 -0
- mypy/typeshed/stdlib/sre_constants.pyi +130 -0
- mypy/typeshed/stdlib/sre_parse.pyi +104 -0
- mypy/typeshed/stdlib/ssl.pyi +529 -0
- mypy/typeshed/stdlib/stat.pyi +1 -0
- mypy/typeshed/stdlib/statistics.pyi +132 -0
- mypy/typeshed/stdlib/string.pyi +83 -0
- mypy/typeshed/stdlib/stringprep.pyi +27 -0
- mypy/typeshed/stdlib/struct.pyi +26 -0
- mypy/typeshed/stdlib/subprocess.pyi +2614 -0
- mypy/typeshed/stdlib/sunau.pyi +86 -0
- mypy/typeshed/stdlib/symbol.pyi +93 -0
- mypy/typeshed/stdlib/symtable.pyi +58 -0
- mypy/typeshed/stdlib/sys/__init__.pyi +373 -0
- mypy/typeshed/stdlib/sys/_monitoring.pyi +52 -0
- mypy/typeshed/stdlib/sysconfig.pyi +43 -0
- mypy/typeshed/stdlib/syslog.pyi +46 -0
- mypy/typeshed/stdlib/tabnanny.pyi +16 -0
- mypy/typeshed/stdlib/tarfile.pyi +438 -0
- mypy/typeshed/stdlib/telnetlib.pyi +122 -0
- mypy/typeshed/stdlib/tempfile.pyi +477 -0
- mypy/typeshed/stdlib/termios.pyi +267 -0
- mypy/typeshed/stdlib/textwrap.pyi +103 -0
- mypy/typeshed/stdlib/this.pyi +2 -0
- mypy/typeshed/stdlib/threading.pyi +187 -0
- mypy/typeshed/stdlib/time.pyi +107 -0
- mypy/typeshed/stdlib/timeit.pyi +32 -0
- mypy/typeshed/stdlib/tkinter/__init__.pyi +3641 -0
- mypy/typeshed/stdlib/tkinter/colorchooser.pyi +20 -0
- mypy/typeshed/stdlib/tkinter/commondialog.pyi +14 -0
- mypy/typeshed/stdlib/tkinter/constants.pyi +80 -0
- mypy/typeshed/stdlib/tkinter/dialog.pyi +16 -0
- mypy/typeshed/stdlib/tkinter/dnd.pyi +20 -0
- mypy/typeshed/stdlib/tkinter/filedialog.pyi +151 -0
- mypy/typeshed/stdlib/tkinter/font.pyi +116 -0
- mypy/typeshed/stdlib/tkinter/messagebox.pyi +44 -0
- mypy/typeshed/stdlib/tkinter/scrolledtext.pyi +10 -0
- mypy/typeshed/stdlib/tkinter/simpledialog.pyi +54 -0
- mypy/typeshed/stdlib/tkinter/tix.pyi +299 -0
- mypy/typeshed/stdlib/tkinter/ttk.pyi +1191 -0
- mypy/typeshed/stdlib/token.pyi +159 -0
- mypy/typeshed/stdlib/tokenize.pyi +177 -0
- mypy/typeshed/stdlib/tomllib.pyi +10 -0
- mypy/typeshed/stdlib/trace.pyi +79 -0
- mypy/typeshed/stdlib/traceback.pyi +260 -0
- mypy/typeshed/stdlib/tracemalloc.pyi +124 -0
- mypy/typeshed/stdlib/tty.pyi +30 -0
- mypy/typeshed/stdlib/turtle.pyi +713 -0
- mypy/typeshed/stdlib/types.pyi +605 -0
- mypy/typeshed/stdlib/typing.pyi +968 -0
- mypy/typeshed/stdlib/typing_extensions.pyi +503 -0
- mypy/typeshed/stdlib/unicodedata.pyi +71 -0
- mypy/typeshed/stdlib/unittest/__init__.pyi +67 -0
- mypy/typeshed/stdlib/unittest/_log.pyi +27 -0
- mypy/typeshed/stdlib/unittest/async_case.pyi +21 -0
- mypy/typeshed/stdlib/unittest/case.pyi +342 -0
- mypy/typeshed/stdlib/unittest/loader.pyi +51 -0
- mypy/typeshed/stdlib/unittest/main.pyi +69 -0
- mypy/typeshed/stdlib/unittest/mock.pyi +430 -0
- mypy/typeshed/stdlib/unittest/result.pyi +46 -0
- mypy/typeshed/stdlib/unittest/runner.pyi +72 -0
- mypy/typeshed/stdlib/unittest/signals.pyi +15 -0
- mypy/typeshed/stdlib/unittest/suite.pyi +22 -0
- mypy/typeshed/stdlib/unittest/util.pyi +23 -0
- mypy/typeshed/stdlib/urllib/__init__.pyi +0 -0
- mypy/typeshed/stdlib/urllib/error.pyi +23 -0
- mypy/typeshed/stdlib/urllib/parse.pyi +210 -0
- mypy/typeshed/stdlib/urllib/request.pyi +399 -0
- mypy/typeshed/stdlib/urllib/response.pyi +43 -0
- mypy/typeshed/stdlib/urllib/robotparser.pyi +20 -0
- mypy/typeshed/stdlib/uu.pyi +13 -0
- mypy/typeshed/stdlib/uuid.pyi +100 -0
- mypy/typeshed/stdlib/venv/__init__.pyi +79 -0
- mypy/typeshed/stdlib/warnings.pyi +112 -0
- mypy/typeshed/stdlib/wave.pyi +85 -0
- mypy/typeshed/stdlib/weakref.pyi +150 -0
- mypy/typeshed/stdlib/webbrowser.pyi +74 -0
- mypy/typeshed/stdlib/winreg.pyi +103 -0
- mypy/typeshed/stdlib/winsound.pyi +28 -0
- mypy/typeshed/stdlib/wsgiref/__init__.pyi +0 -0
- mypy/typeshed/stdlib/wsgiref/handlers.pyi +91 -0
- mypy/typeshed/stdlib/wsgiref/headers.pyi +26 -0
- mypy/typeshed/stdlib/wsgiref/simple_server.pyi +37 -0
- mypy/typeshed/stdlib/wsgiref/types.pyi +32 -0
- mypy/typeshed/stdlib/wsgiref/util.pyi +24 -0
- mypy/typeshed/stdlib/wsgiref/validate.pyi +50 -0
- mypy/typeshed/stdlib/xdrlib.pyi +57 -0
- mypy/typeshed/stdlib/xml/__init__.pyi +1 -0
- mypy/typeshed/stdlib/xml/dom/NodeFilter.pyi +19 -0
- mypy/typeshed/stdlib/xml/dom/__init__.pyi +69 -0
- mypy/typeshed/stdlib/xml/dom/domreg.pyi +8 -0
- mypy/typeshed/stdlib/xml/dom/expatbuilder.pyi +100 -0
- mypy/typeshed/stdlib/xml/dom/minicompat.pyi +22 -0
- mypy/typeshed/stdlib/xml/dom/minidom.pyi +404 -0
- mypy/typeshed/stdlib/xml/dom/pulldom.pyi +94 -0
- mypy/typeshed/stdlib/xml/dom/xmlbuilder.pyi +108 -0
- mypy/typeshed/stdlib/xml/etree/ElementInclude.pyi +28 -0
- mypy/typeshed/stdlib/xml/etree/ElementPath.pyi +34 -0
- mypy/typeshed/stdlib/xml/etree/ElementTree.pyi +321 -0
- mypy/typeshed/stdlib/xml/etree/__init__.pyi +0 -0
- mypy/typeshed/stdlib/xml/etree/cElementTree.pyi +1 -0
- mypy/typeshed/stdlib/xml/parsers/__init__.pyi +1 -0
- mypy/typeshed/stdlib/xml/parsers/expat/__init__.pyi +1 -0
- mypy/typeshed/stdlib/xml/parsers/expat/errors.pyi +1 -0
- mypy/typeshed/stdlib/xml/parsers/expat/model.pyi +1 -0
- mypy/typeshed/stdlib/xml/sax/__init__.pyi +25 -0
- mypy/typeshed/stdlib/xml/sax/_exceptions.pyi +19 -0
- mypy/typeshed/stdlib/xml/sax/handler.pyi +55 -0
- mypy/typeshed/stdlib/xml/sax/saxutils.pyi +60 -0
- mypy/typeshed/stdlib/xml/sax/xmlreader.pyi +87 -0
- mypy/typeshed/stdlib/xmlrpc/__init__.pyi +0 -0
- mypy/typeshed/stdlib/xmlrpc/client.pyi +296 -0
- mypy/typeshed/stdlib/xmlrpc/server.pyi +143 -0
- mypy/typeshed/stdlib/xxlimited.pyi +22 -0
- mypy/typeshed/stdlib/zipapp.pyi +20 -0
- mypy/typeshed/stdlib/zipfile/__init__.pyi +306 -0
- mypy/typeshed/stdlib/zipfile/_path.pyi +95 -0
- mypy/typeshed/stdlib/zipimport.pyi +32 -0
- mypy/typeshed/stdlib/zlib.pyi +56 -0
- mypy/typeshed/stdlib/zoneinfo/__init__.pyi +38 -0
- mypy/typeshed/stubs/mypy-extensions/mypy_extensions.pyi +218 -0
- mypy/typestate.py +323 -0
- mypy/typetraverser.py +142 -0
- mypy/typevars.py +93 -0
- mypy/typevartuples.py +32 -0
- mypy/util.py +869 -0
- mypy/version.py +1 -0
- mypy/visitor.py +621 -0
- mypy/xml/mypy-html.css +104 -0
- mypy/xml/mypy-html.xslt +81 -0
- mypy/xml/mypy-txt.xslt +100 -0
- mypy/xml/mypy.xsd +50 -0
- mypy_dev-1.9.0.dev0.dist-info/LICENSE +229 -0
- mypy_dev-1.9.0.dev0.dist-info/METADATA +39 -0
- mypy_dev-1.9.0.dev0.dist-info/RECORD +1018 -0
- mypy_dev-1.9.0.dev0.dist-info/WHEEL +5 -0
- mypy_dev-1.9.0.dev0.dist-info/entry_points.txt +6 -0
- mypy_dev-1.9.0.dev0.dist-info/top_level.txt +2 -0
- mypyc/README.md +133 -0
- mypyc/__init__.py +0 -0
- mypyc/__main__.py +57 -0
- mypyc/analysis/__init__.py +0 -0
- mypyc/analysis/attrdefined.py +436 -0
- mypyc/analysis/blockfreq.py +32 -0
- mypyc/analysis/dataflow.py +624 -0
- mypyc/analysis/ircheck.py +429 -0
- mypyc/analysis/selfleaks.py +207 -0
- mypyc/build.py +616 -0
- mypyc/codegen/__init__.py +0 -0
- mypyc/codegen/cstring.py +54 -0
- mypyc/codegen/emit.py +1193 -0
- mypyc/codegen/emitclass.py +1060 -0
- mypyc/codegen/emitfunc.py +846 -0
- mypyc/codegen/emitmodule.py +1131 -0
- mypyc/codegen/emitwrapper.py +979 -0
- mypyc/codegen/literals.py +302 -0
- mypyc/common.py +136 -0
- mypyc/crash.py +31 -0
- mypyc/doc/Makefile +20 -0
- mypyc/doc/bool_operations.rst +27 -0
- mypyc/doc/compilation_units.rst +20 -0
- mypyc/doc/conf.py +59 -0
- mypyc/doc/cpython-timings.md +25 -0
- mypyc/doc/dev-intro.md +548 -0
- mypyc/doc/dict_operations.rst +59 -0
- mypyc/doc/differences_from_python.rst +332 -0
- mypyc/doc/float_operations.rst +50 -0
- mypyc/doc/future.md +42 -0
- mypyc/doc/getting_started.rst +240 -0
- mypyc/doc/index.rst +61 -0
- mypyc/doc/int_operations.rst +162 -0
- mypyc/doc/introduction.rst +150 -0
- mypyc/doc/list_operations.rst +65 -0
- mypyc/doc/make.bat +35 -0
- mypyc/doc/native_classes.rst +206 -0
- mypyc/doc/native_operations.rst +55 -0
- mypyc/doc/performance_tips_and_tricks.rst +244 -0
- mypyc/doc/set_operations.rst +47 -0
- mypyc/doc/str_operations.rst +35 -0
- mypyc/doc/tuple_operations.rst +33 -0
- mypyc/doc/using_type_annotations.rst +398 -0
- mypyc/errors.py +29 -0
- mypyc/external/googletest/LICENSE +28 -0
- mypyc/external/googletest/README.md +280 -0
- mypyc/external/googletest/include/gtest/gtest-death-test.h +294 -0
- mypyc/external/googletest/include/gtest/gtest-message.h +250 -0
- mypyc/external/googletest/include/gtest/gtest-param-test.h +1444 -0
- mypyc/external/googletest/include/gtest/gtest-param-test.h.pump +510 -0
- mypyc/external/googletest/include/gtest/gtest-printers.h +993 -0
- mypyc/external/googletest/include/gtest/gtest-spi.h +232 -0
- mypyc/external/googletest/include/gtest/gtest-test-part.h +179 -0
- mypyc/external/googletest/include/gtest/gtest-typed-test.h +263 -0
- mypyc/external/googletest/include/gtest/gtest.h +2236 -0
- mypyc/external/googletest/include/gtest/gtest_pred_impl.h +358 -0
- mypyc/external/googletest/include/gtest/gtest_prod.h +58 -0
- mypyc/external/googletest/include/gtest/internal/custom/gtest-port.h +69 -0
- mypyc/external/googletest/include/gtest/internal/custom/gtest-printers.h +42 -0
- mypyc/external/googletest/include/gtest/internal/custom/gtest.h +41 -0
- mypyc/external/googletest/include/gtest/internal/gtest-death-test-internal.h +319 -0
- mypyc/external/googletest/include/gtest/internal/gtest-filepath.h +206 -0
- mypyc/external/googletest/include/gtest/internal/gtest-internal.h +1238 -0
- mypyc/external/googletest/include/gtest/internal/gtest-linked_ptr.h +243 -0
- mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h +5146 -0
- mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h.pump +286 -0
- mypyc/external/googletest/include/gtest/internal/gtest-param-util.h +731 -0
- mypyc/external/googletest/include/gtest/internal/gtest-port-arch.h +93 -0
- mypyc/external/googletest/include/gtest/internal/gtest-port.h +2560 -0
- mypyc/external/googletest/include/gtest/internal/gtest-string.h +167 -0
- mypyc/external/googletest/include/gtest/internal/gtest-tuple.h +1020 -0
- mypyc/external/googletest/include/gtest/internal/gtest-tuple.h.pump +347 -0
- mypyc/external/googletest/include/gtest/internal/gtest-type-util.h +3331 -0
- mypyc/external/googletest/include/gtest/internal/gtest-type-util.h.pump +297 -0
- mypyc/external/googletest/make/Makefile +61 -0
- mypyc/external/googletest/src/gtest-all.cc +48 -0
- mypyc/external/googletest/src/gtest-death-test.cc +1342 -0
- mypyc/external/googletest/src/gtest-filepath.cc +387 -0
- mypyc/external/googletest/src/gtest-internal-inl.h +1183 -0
- mypyc/external/googletest/src/gtest-port.cc +1259 -0
- mypyc/external/googletest/src/gtest-printers.cc +373 -0
- mypyc/external/googletest/src/gtest-test-part.cc +110 -0
- mypyc/external/googletest/src/gtest-typed-test.cc +118 -0
- mypyc/external/googletest/src/gtest.cc +5388 -0
- mypyc/external/googletest/src/gtest_main.cc +38 -0
- mypyc/ir/__init__.py +0 -0
- mypyc/ir/class_ir.py +499 -0
- mypyc/ir/func_ir.py +370 -0
- mypyc/ir/module_ir.py +88 -0
- mypyc/ir/ops.py +1642 -0
- mypyc/ir/pprint.py +496 -0
- mypyc/ir/rtypes.py +1038 -0
- mypyc/irbuild/__init__.py +0 -0
- mypyc/irbuild/ast_helpers.py +120 -0
- mypyc/irbuild/builder.py +1398 -0
- mypyc/irbuild/callable_class.py +173 -0
- mypyc/irbuild/classdef.py +850 -0
- mypyc/irbuild/constant_fold.py +95 -0
- mypyc/irbuild/context.py +186 -0
- mypyc/irbuild/env_class.py +223 -0
- mypyc/irbuild/expression.py +1067 -0
- mypyc/irbuild/for_helpers.py +1046 -0
- mypyc/irbuild/format_str_tokenizer.py +250 -0
- mypyc/irbuild/function.py +1089 -0
- mypyc/irbuild/generator.py +346 -0
- mypyc/irbuild/ll_builder.py +2407 -0
- mypyc/irbuild/main.py +153 -0
- mypyc/irbuild/mapper.py +221 -0
- mypyc/irbuild/match.py +355 -0
- mypyc/irbuild/nonlocalcontrol.py +197 -0
- mypyc/irbuild/prebuildvisitor.py +203 -0
- mypyc/irbuild/prepare.py +609 -0
- mypyc/irbuild/specialize.py +822 -0
- mypyc/irbuild/statement.py +1017 -0
- mypyc/irbuild/targets.py +57 -0
- mypyc/irbuild/util.py +189 -0
- mypyc/irbuild/visitor.py +401 -0
- mypyc/irbuild/vtable.py +82 -0
- mypyc/lib-rt/CPy.h +643 -0
- mypyc/lib-rt/bytes_ops.c +143 -0
- mypyc/lib-rt/dict_ops.c +446 -0
- mypyc/lib-rt/exc_ops.c +259 -0
- mypyc/lib-rt/float_ops.c +192 -0
- mypyc/lib-rt/generic_ops.c +64 -0
- mypyc/lib-rt/getargs.c +450 -0
- mypyc/lib-rt/getargsfast.c +569 -0
- mypyc/lib-rt/init.c +13 -0
- mypyc/lib-rt/int_ops.c +803 -0
- mypyc/lib-rt/list_ops.c +335 -0
- mypyc/lib-rt/misc_ops.c +942 -0
- mypyc/lib-rt/module_shim.tmpl +18 -0
- mypyc/lib-rt/mypyc_util.h +118 -0
- mypyc/lib-rt/pythoncapi_compat.h +497 -0
- mypyc/lib-rt/pythonsupport.h +548 -0
- mypyc/lib-rt/set_ops.c +17 -0
- mypyc/lib-rt/setup.py +70 -0
- mypyc/lib-rt/str_ops.c +241 -0
- mypyc/lib-rt/test_capi.cc +585 -0
- mypyc/lib-rt/tuple_ops.c +61 -0
- mypyc/namegen.py +115 -0
- mypyc/options.py +32 -0
- mypyc/primitives/__init__.py +0 -0
- mypyc/primitives/bytes_ops.py +101 -0
- mypyc/primitives/dict_ops.py +325 -0
- mypyc/primitives/exc_ops.py +101 -0
- mypyc/primitives/float_ops.py +168 -0
- mypyc/primitives/generic_ops.py +384 -0
- mypyc/primitives/int_ops.py +304 -0
- mypyc/primitives/list_ops.py +300 -0
- mypyc/primitives/misc_ops.py +241 -0
- mypyc/primitives/registry.py +323 -0
- mypyc/primitives/set_ops.py +121 -0
- mypyc/primitives/str_ops.py +229 -0
- mypyc/primitives/tuple_ops.py +83 -0
- mypyc/rt_subtype.py +77 -0
- mypyc/sametype.py +83 -0
- mypyc/subtype.py +88 -0
- mypyc/test/__init__.py +0 -0
- mypyc/test/config.py +13 -0
- mypyc/test/test_alwaysdefined.py +46 -0
- mypyc/test/test_analysis.py +77 -0
- mypyc/test/test_cheader.py +45 -0
- mypyc/test/test_commandline.py +82 -0
- mypyc/test/test_emit.py +69 -0
- mypyc/test/test_emitclass.py +35 -0
- mypyc/test/test_emitfunc.py +926 -0
- mypyc/test/test_emitwrapper.py +60 -0
- mypyc/test/test_exceptions.py +56 -0
- mypyc/test/test_external.py +49 -0
- mypyc/test/test_irbuild.py +87 -0
- mypyc/test/test_ircheck.py +199 -0
- mypyc/test/test_literals.py +90 -0
- mypyc/test/test_namegen.py +48 -0
- mypyc/test/test_pprint.py +42 -0
- mypyc/test/test_rarray.py +48 -0
- mypyc/test/test_refcount.py +59 -0
- mypyc/test/test_run.py +426 -0
- mypyc/test/test_serialization.py +108 -0
- mypyc/test/test_struct.py +112 -0
- mypyc/test/test_tuplename.py +33 -0
- mypyc/test/test_typeops.py +97 -0
- mypyc/test/testutil.py +283 -0
- mypyc/test-data/alwaysdefined.test +732 -0
- mypyc/test-data/analysis.test +603 -0
- mypyc/test-data/commandline.test +245 -0
- mypyc/test-data/driver/driver.py +48 -0
- mypyc/test-data/exceptions-freq.test +125 -0
- mypyc/test-data/exceptions.test +713 -0
- mypyc/test-data/fixtures/ir.py +373 -0
- mypyc/test-data/fixtures/testutil.py +103 -0
- mypyc/test-data/fixtures/typing-full.pyi +169 -0
- mypyc/test-data/irbuild-any.test +238 -0
- mypyc/test-data/irbuild-basic.test +3690 -0
- mypyc/test-data/irbuild-bool.test +463 -0
- mypyc/test-data/irbuild-bytes.test +184 -0
- mypyc/test-data/irbuild-classes.test +1303 -0
- mypyc/test-data/irbuild-constant-fold.test +480 -0
- mypyc/test-data/irbuild-dict.test +585 -0
- mypyc/test-data/irbuild-dunders.test +223 -0
- mypyc/test-data/irbuild-float.test +497 -0
- mypyc/test-data/irbuild-generics.test +151 -0
- mypyc/test-data/irbuild-glue-methods.test +437 -0
- mypyc/test-data/irbuild-i16.test +526 -0
- mypyc/test-data/irbuild-i32.test +598 -0
- mypyc/test-data/irbuild-i64.test +2164 -0
- mypyc/test-data/irbuild-int.test +235 -0
- mypyc/test-data/irbuild-isinstance.test +109 -0
- mypyc/test-data/irbuild-lists.test +547 -0
- mypyc/test-data/irbuild-match.test +1708 -0
- mypyc/test-data/irbuild-math.test +64 -0
- mypyc/test-data/irbuild-nested.test +807 -0
- mypyc/test-data/irbuild-optional.test +536 -0
- mypyc/test-data/irbuild-set.test +838 -0
- mypyc/test-data/irbuild-singledispatch.test +257 -0
- mypyc/test-data/irbuild-statements.test +1149 -0
- mypyc/test-data/irbuild-str.test +314 -0
- mypyc/test-data/irbuild-strip-asserts.test +12 -0
- mypyc/test-data/irbuild-try.test +523 -0
- mypyc/test-data/irbuild-tuple.test +462 -0
- mypyc/test-data/irbuild-u8.test +543 -0
- mypyc/test-data/irbuild-unreachable.test +241 -0
- mypyc/test-data/irbuild-vectorcall.test +153 -0
- mypyc/test-data/refcount.test +1588 -0
- mypyc/test-data/run-async.test +145 -0
- mypyc/test-data/run-attrs.test +318 -0
- mypyc/test-data/run-bench.test +196 -0
- mypyc/test-data/run-bools.test +229 -0
- mypyc/test-data/run-bytes.test +302 -0
- mypyc/test-data/run-classes.test +2505 -0
- mypyc/test-data/run-dicts.test +334 -0
- mypyc/test-data/run-dunders.test +945 -0
- mypyc/test-data/run-exceptions.test +448 -0
- mypyc/test-data/run-floats.test +516 -0
- mypyc/test-data/run-functions.test +1310 -0
- mypyc/test-data/run-generators.test +681 -0
- mypyc/test-data/run-i16.test +338 -0
- mypyc/test-data/run-i32.test +336 -0
- mypyc/test-data/run-i64.test +1519 -0
- mypyc/test-data/run-imports.test +265 -0
- mypyc/test-data/run-integers.test +540 -0
- mypyc/test-data/run-lists.test +411 -0
- mypyc/test-data/run-loops.test +485 -0
- mypyc/test-data/run-match.test +283 -0
- mypyc/test-data/run-math.test +106 -0
- mypyc/test-data/run-misc.test +1168 -0
- mypyc/test-data/run-multimodule.test +887 -0
- mypyc/test-data/run-mypy-sim.test +138 -0
- mypyc/test-data/run-primitives.test +375 -0
- mypyc/test-data/run-python37.test +159 -0
- mypyc/test-data/run-python38.test +88 -0
- mypyc/test-data/run-sets.test +150 -0
- mypyc/test-data/run-singledispatch.test +698 -0
- mypyc/test-data/run-strings.test +641 -0
- mypyc/test-data/run-traits.test +411 -0
- mypyc/test-data/run-tuples.test +258 -0
- mypyc/test-data/run-u8.test +303 -0
- mypyc/transform/__init__.py +0 -0
- mypyc/transform/exceptions.py +182 -0
- mypyc/transform/refcount.py +294 -0
- mypyc/transform/uninit.py +190 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Final, NamedTuple, Sequence, TypeVar, Union
|
|
4
|
+
from typing_extensions import TypeAlias as _TypeAlias
|
|
5
|
+
|
|
6
|
+
from mypy.messages import format_type
|
|
7
|
+
from mypy.nodes import ARG_POS, Argument, Block, ClassDef, Context, SymbolTable, TypeInfo, Var
|
|
8
|
+
from mypy.options import Options
|
|
9
|
+
from mypy.plugin import CheckerPluginInterface, FunctionContext, MethodContext, MethodSigContext
|
|
10
|
+
from mypy.plugins.common import add_method_to_class
|
|
11
|
+
from mypy.subtypes import is_subtype
|
|
12
|
+
from mypy.types import (
|
|
13
|
+
AnyType,
|
|
14
|
+
CallableType,
|
|
15
|
+
FunctionLike,
|
|
16
|
+
Instance,
|
|
17
|
+
NoneType,
|
|
18
|
+
Overloaded,
|
|
19
|
+
Type,
|
|
20
|
+
TypeOfAny,
|
|
21
|
+
get_proper_type,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class SingledispatchTypeVars(NamedTuple):
|
|
26
|
+
return_type: Type
|
|
27
|
+
fallback: CallableType
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class RegisterCallableInfo(NamedTuple):
|
|
31
|
+
register_type: Type
|
|
32
|
+
singledispatch_obj: Instance
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
SINGLEDISPATCH_TYPE: Final = "functools._SingleDispatchCallable"
|
|
36
|
+
|
|
37
|
+
SINGLEDISPATCH_REGISTER_METHOD: Final = f"{SINGLEDISPATCH_TYPE}.register"
|
|
38
|
+
|
|
39
|
+
SINGLEDISPATCH_CALLABLE_CALL_METHOD: Final = f"{SINGLEDISPATCH_TYPE}.__call__"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def get_singledispatch_info(typ: Instance) -> SingledispatchTypeVars | None:
|
|
43
|
+
if len(typ.args) == 2:
|
|
44
|
+
return SingledispatchTypeVars(*typ.args) # type: ignore[arg-type]
|
|
45
|
+
return None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
T = TypeVar("T")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def get_first_arg(args: list[list[T]]) -> T | None:
|
|
52
|
+
"""Get the element that corresponds to the first argument passed to the function"""
|
|
53
|
+
if args and args[0]:
|
|
54
|
+
return args[0][0]
|
|
55
|
+
return None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
REGISTER_RETURN_CLASS: Final = "_SingleDispatchRegisterCallable"
|
|
59
|
+
|
|
60
|
+
REGISTER_CALLABLE_CALL_METHOD: Final = f"functools.{REGISTER_RETURN_CLASS}.__call__"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def make_fake_register_class_instance(
|
|
64
|
+
api: CheckerPluginInterface, type_args: Sequence[Type]
|
|
65
|
+
) -> Instance:
|
|
66
|
+
defn = ClassDef(REGISTER_RETURN_CLASS, Block([]))
|
|
67
|
+
defn.fullname = f"functools.{REGISTER_RETURN_CLASS}"
|
|
68
|
+
info = TypeInfo(SymbolTable(), defn, "functools")
|
|
69
|
+
obj_type = api.named_generic_type("builtins.object", []).type
|
|
70
|
+
info.bases = [Instance(obj_type, [])]
|
|
71
|
+
info.mro = [info, obj_type]
|
|
72
|
+
defn.info = info
|
|
73
|
+
|
|
74
|
+
func_arg = Argument(Var("name"), AnyType(TypeOfAny.implementation_artifact), None, ARG_POS)
|
|
75
|
+
add_method_to_class(api, defn, "__call__", [func_arg], NoneType())
|
|
76
|
+
|
|
77
|
+
return Instance(info, type_args)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
PluginContext: _TypeAlias = Union[FunctionContext, MethodContext]
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def fail(ctx: PluginContext, msg: str, context: Context | None) -> None:
|
|
84
|
+
"""Emit an error message.
|
|
85
|
+
|
|
86
|
+
This tries to emit an error message at the location specified by `context`, falling back to the
|
|
87
|
+
location specified by `ctx.context`. This is helpful when the only context information about
|
|
88
|
+
where you want to put the error message may be None (like it is for `CallableType.definition`)
|
|
89
|
+
and falling back to the location of the calling function is fine."""
|
|
90
|
+
# TODO: figure out if there is some more reliable way of getting context information, so this
|
|
91
|
+
# function isn't necessary
|
|
92
|
+
if context is not None:
|
|
93
|
+
err_context = context
|
|
94
|
+
else:
|
|
95
|
+
err_context = ctx.context
|
|
96
|
+
ctx.api.fail(msg, err_context)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def create_singledispatch_function_callback(ctx: FunctionContext) -> Type:
|
|
100
|
+
"""Called for functools.singledispatch"""
|
|
101
|
+
func_type = get_proper_type(get_first_arg(ctx.arg_types))
|
|
102
|
+
if isinstance(func_type, CallableType):
|
|
103
|
+
if len(func_type.arg_kinds) < 1:
|
|
104
|
+
fail(
|
|
105
|
+
ctx, "Singledispatch function requires at least one argument", func_type.definition
|
|
106
|
+
)
|
|
107
|
+
return ctx.default_return_type
|
|
108
|
+
|
|
109
|
+
elif not func_type.arg_kinds[0].is_positional(star=True):
|
|
110
|
+
fail(
|
|
111
|
+
ctx,
|
|
112
|
+
"First argument to singledispatch function must be a positional argument",
|
|
113
|
+
func_type.definition,
|
|
114
|
+
)
|
|
115
|
+
return ctx.default_return_type
|
|
116
|
+
|
|
117
|
+
# singledispatch returns an instance of functools._SingleDispatchCallable according to
|
|
118
|
+
# typeshed
|
|
119
|
+
singledispatch_obj = get_proper_type(ctx.default_return_type)
|
|
120
|
+
assert isinstance(singledispatch_obj, Instance)
|
|
121
|
+
singledispatch_obj.args += (func_type,)
|
|
122
|
+
|
|
123
|
+
return ctx.default_return_type
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def singledispatch_register_callback(ctx: MethodContext) -> Type:
|
|
127
|
+
"""Called for functools._SingleDispatchCallable.register"""
|
|
128
|
+
assert isinstance(ctx.type, Instance)
|
|
129
|
+
# TODO: check that there's only one argument
|
|
130
|
+
first_arg_type = get_proper_type(get_first_arg(ctx.arg_types))
|
|
131
|
+
if isinstance(first_arg_type, (CallableType, Overloaded)) and first_arg_type.is_type_obj():
|
|
132
|
+
# HACK: We received a class as an argument to register. We need to be able
|
|
133
|
+
# to access the function that register is being applied to, and the typeshed definition
|
|
134
|
+
# of register has it return a generic Callable, so we create a new
|
|
135
|
+
# SingleDispatchRegisterCallable class, define a __call__ method, and then add a
|
|
136
|
+
# plugin hook for that.
|
|
137
|
+
|
|
138
|
+
# is_subtype doesn't work when the right type is Overloaded, so we need the
|
|
139
|
+
# actual type
|
|
140
|
+
register_type = first_arg_type.items[0].ret_type
|
|
141
|
+
type_args = RegisterCallableInfo(register_type, ctx.type)
|
|
142
|
+
register_callable = make_fake_register_class_instance(ctx.api, type_args)
|
|
143
|
+
return register_callable
|
|
144
|
+
elif isinstance(first_arg_type, CallableType):
|
|
145
|
+
# TODO: do more checking for registered functions
|
|
146
|
+
register_function(ctx, ctx.type, first_arg_type, ctx.api.options)
|
|
147
|
+
# The typeshed stubs for register say that the function returned is Callable[..., T], even
|
|
148
|
+
# though the function returned is the same as the one passed in. We return the type of the
|
|
149
|
+
# function so that mypy can properly type check cases where the registered function is used
|
|
150
|
+
# directly (instead of through singledispatch)
|
|
151
|
+
return first_arg_type
|
|
152
|
+
|
|
153
|
+
# fallback in case we don't recognize the arguments
|
|
154
|
+
return ctx.default_return_type
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def register_function(
|
|
158
|
+
ctx: PluginContext,
|
|
159
|
+
singledispatch_obj: Instance,
|
|
160
|
+
func: Type,
|
|
161
|
+
options: Options,
|
|
162
|
+
register_arg: Type | None = None,
|
|
163
|
+
) -> None:
|
|
164
|
+
"""Register a function"""
|
|
165
|
+
|
|
166
|
+
func = get_proper_type(func)
|
|
167
|
+
if not isinstance(func, CallableType):
|
|
168
|
+
return
|
|
169
|
+
metadata = get_singledispatch_info(singledispatch_obj)
|
|
170
|
+
if metadata is None:
|
|
171
|
+
# if we never added the fallback to the type variables, we already reported an error, so
|
|
172
|
+
# just don't do anything here
|
|
173
|
+
return
|
|
174
|
+
dispatch_type = get_dispatch_type(func, register_arg)
|
|
175
|
+
if dispatch_type is None:
|
|
176
|
+
# TODO: report an error here that singledispatch requires at least one argument
|
|
177
|
+
# (might want to do the error reporting in get_dispatch_type)
|
|
178
|
+
return
|
|
179
|
+
fallback = metadata.fallback
|
|
180
|
+
|
|
181
|
+
fallback_dispatch_type = fallback.arg_types[0]
|
|
182
|
+
if not is_subtype(dispatch_type, fallback_dispatch_type):
|
|
183
|
+
fail(
|
|
184
|
+
ctx,
|
|
185
|
+
"Dispatch type {} must be subtype of fallback function first argument {}".format(
|
|
186
|
+
format_type(dispatch_type, options), format_type(fallback_dispatch_type, options)
|
|
187
|
+
),
|
|
188
|
+
func.definition,
|
|
189
|
+
)
|
|
190
|
+
return
|
|
191
|
+
return
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def get_dispatch_type(func: CallableType, register_arg: Type | None) -> Type | None:
|
|
195
|
+
if register_arg is not None:
|
|
196
|
+
return register_arg
|
|
197
|
+
if func.arg_types:
|
|
198
|
+
return func.arg_types[0]
|
|
199
|
+
return None
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def call_singledispatch_function_after_register_argument(ctx: MethodContext) -> Type:
|
|
203
|
+
"""Called on the function after passing a type to register"""
|
|
204
|
+
register_callable = ctx.type
|
|
205
|
+
if isinstance(register_callable, Instance):
|
|
206
|
+
type_args = RegisterCallableInfo(*register_callable.args) # type: ignore[arg-type]
|
|
207
|
+
func = get_first_arg(ctx.arg_types)
|
|
208
|
+
if func is not None:
|
|
209
|
+
register_function(
|
|
210
|
+
ctx, type_args.singledispatch_obj, func, ctx.api.options, type_args.register_type
|
|
211
|
+
)
|
|
212
|
+
# see call to register_function in the callback for register
|
|
213
|
+
return func
|
|
214
|
+
return ctx.default_return_type
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def call_singledispatch_function_callback(ctx: MethodSigContext) -> FunctionLike:
|
|
218
|
+
"""Called for functools._SingleDispatchCallable.__call__"""
|
|
219
|
+
if not isinstance(ctx.type, Instance):
|
|
220
|
+
return ctx.default_signature
|
|
221
|
+
metadata = get_singledispatch_info(ctx.type)
|
|
222
|
+
if metadata is None:
|
|
223
|
+
return ctx.default_signature
|
|
224
|
+
return metadata.fallback
|
mypy/py.typed
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Marker file for PEP 561. The mypy package uses inline types.
|
mypy/pyinfo.py
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
"""Utilities to find the site and prefix information of a Python executable.
|
|
4
|
+
|
|
5
|
+
This file MUST remain compatible with all Python 3.8+ versions. Since we cannot make any
|
|
6
|
+
assumptions about the Python being executed, this module should not use *any* dependencies outside
|
|
7
|
+
of the standard library found in Python 3.8. This file is run each mypy run, so it should be kept
|
|
8
|
+
as fast as possible.
|
|
9
|
+
"""
|
|
10
|
+
import sys
|
|
11
|
+
|
|
12
|
+
if __name__ == "__main__":
|
|
13
|
+
# HACK: We don't want to pick up mypy.types as the top-level types
|
|
14
|
+
# module. This could happen if this file is run as a script.
|
|
15
|
+
# This workaround fixes this for Python versions before 3.11.
|
|
16
|
+
if sys.version_info < (3, 11):
|
|
17
|
+
old_sys_path = sys.path
|
|
18
|
+
sys.path = sys.path[1:]
|
|
19
|
+
import types # noqa: F401
|
|
20
|
+
|
|
21
|
+
sys.path = old_sys_path
|
|
22
|
+
|
|
23
|
+
import os
|
|
24
|
+
import site
|
|
25
|
+
import sysconfig
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def getsitepackages() -> list[str]:
|
|
29
|
+
res = []
|
|
30
|
+
if hasattr(site, "getsitepackages"):
|
|
31
|
+
res.extend(site.getsitepackages())
|
|
32
|
+
|
|
33
|
+
if hasattr(site, "getusersitepackages") and site.ENABLE_USER_SITE:
|
|
34
|
+
res.insert(0, site.getusersitepackages())
|
|
35
|
+
else:
|
|
36
|
+
res = [sysconfig.get_paths()["purelib"]]
|
|
37
|
+
return res
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def getsyspath() -> list[str]:
|
|
41
|
+
# Do not include things from the standard library
|
|
42
|
+
# because those should come from typeshed.
|
|
43
|
+
stdlib_zip = os.path.join(
|
|
44
|
+
sys.base_exec_prefix,
|
|
45
|
+
getattr(sys, "platlibdir", "lib"),
|
|
46
|
+
f"python{sys.version_info.major}{sys.version_info.minor}.zip",
|
|
47
|
+
)
|
|
48
|
+
stdlib = sysconfig.get_path("stdlib")
|
|
49
|
+
stdlib_ext = os.path.join(stdlib, "lib-dynload")
|
|
50
|
+
excludes = {stdlib_zip, stdlib, stdlib_ext}
|
|
51
|
+
|
|
52
|
+
# Drop the first entry of sys.path
|
|
53
|
+
# - If pyinfo.py is executed as a script (in a subprocess), this is the directory
|
|
54
|
+
# containing pyinfo.py
|
|
55
|
+
# - Otherwise, if mypy launched via console script, this is the directory of the script
|
|
56
|
+
# - Otherwise, if mypy launched via python -m mypy, this is the current directory
|
|
57
|
+
# In all these cases, it is desirable to drop the first entry
|
|
58
|
+
# Note that mypy adds the cwd to SearchPaths.python_path, so we still find things on the
|
|
59
|
+
# cwd consistently (the return value here sets SearchPaths.package_path)
|
|
60
|
+
|
|
61
|
+
# Python 3.11 adds a "safe_path" flag wherein Python won't automatically prepend
|
|
62
|
+
# anything to sys.path. In this case, the first entry of sys.path is no longer special.
|
|
63
|
+
offset = 0 if sys.version_info >= (3, 11) and sys.flags.safe_path else 1
|
|
64
|
+
|
|
65
|
+
abs_sys_path = (os.path.abspath(p) for p in sys.path[offset:])
|
|
66
|
+
return [p for p in abs_sys_path if p not in excludes]
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def getsearchdirs() -> tuple[list[str], list[str]]:
|
|
70
|
+
return (getsyspath(), getsitepackages())
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
if __name__ == "__main__":
|
|
74
|
+
if sys.argv[-1] == "getsearchdirs":
|
|
75
|
+
print(repr(getsearchdirs()))
|
|
76
|
+
else:
|
|
77
|
+
print("ERROR: incorrect argument to pyinfo.py.", file=sys.stderr)
|
|
78
|
+
sys.exit(1)
|
mypy/reachability.py
ADDED
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
"""Utilities related to determining the reachability of code (in semantic analysis)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Final, Tuple, TypeVar
|
|
6
|
+
|
|
7
|
+
from mypy.literals import literal
|
|
8
|
+
from mypy.nodes import (
|
|
9
|
+
LITERAL_YES,
|
|
10
|
+
AssertStmt,
|
|
11
|
+
Block,
|
|
12
|
+
CallExpr,
|
|
13
|
+
ComparisonExpr,
|
|
14
|
+
Expression,
|
|
15
|
+
FuncDef,
|
|
16
|
+
IfStmt,
|
|
17
|
+
Import,
|
|
18
|
+
ImportAll,
|
|
19
|
+
ImportFrom,
|
|
20
|
+
IndexExpr,
|
|
21
|
+
IntExpr,
|
|
22
|
+
MatchStmt,
|
|
23
|
+
MemberExpr,
|
|
24
|
+
NameExpr,
|
|
25
|
+
OpExpr,
|
|
26
|
+
SliceExpr,
|
|
27
|
+
StrExpr,
|
|
28
|
+
TupleExpr,
|
|
29
|
+
UnaryExpr,
|
|
30
|
+
)
|
|
31
|
+
from mypy.options import Options
|
|
32
|
+
from mypy.patterns import AsPattern, OrPattern, Pattern
|
|
33
|
+
from mypy.traverser import TraverserVisitor
|
|
34
|
+
|
|
35
|
+
# Inferred truth value of an expression.
|
|
36
|
+
ALWAYS_TRUE: Final = 1
|
|
37
|
+
MYPY_TRUE: Final = 2 # True in mypy, False at runtime
|
|
38
|
+
ALWAYS_FALSE: Final = 3
|
|
39
|
+
MYPY_FALSE: Final = 4 # False in mypy, True at runtime
|
|
40
|
+
TRUTH_VALUE_UNKNOWN: Final = 5
|
|
41
|
+
|
|
42
|
+
inverted_truth_mapping: Final = {
|
|
43
|
+
ALWAYS_TRUE: ALWAYS_FALSE,
|
|
44
|
+
ALWAYS_FALSE: ALWAYS_TRUE,
|
|
45
|
+
TRUTH_VALUE_UNKNOWN: TRUTH_VALUE_UNKNOWN,
|
|
46
|
+
MYPY_TRUE: MYPY_FALSE,
|
|
47
|
+
MYPY_FALSE: MYPY_TRUE,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
reverse_op: Final = {"==": "==", "!=": "!=", "<": ">", ">": "<", "<=": ">=", ">=": "<="}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def infer_reachability_of_if_statement(s: IfStmt, options: Options) -> None:
|
|
54
|
+
for i in range(len(s.expr)):
|
|
55
|
+
result = infer_condition_value(s.expr[i], options)
|
|
56
|
+
if result in (ALWAYS_FALSE, MYPY_FALSE):
|
|
57
|
+
# The condition is considered always false, so we skip the if/elif body.
|
|
58
|
+
mark_block_unreachable(s.body[i])
|
|
59
|
+
elif result in (ALWAYS_TRUE, MYPY_TRUE):
|
|
60
|
+
# This condition is considered always true, so all of the remaining
|
|
61
|
+
# elif/else bodies should not be checked.
|
|
62
|
+
if result == MYPY_TRUE:
|
|
63
|
+
# This condition is false at runtime; this will affect
|
|
64
|
+
# import priorities.
|
|
65
|
+
mark_block_mypy_only(s.body[i])
|
|
66
|
+
for body in s.body[i + 1 :]:
|
|
67
|
+
mark_block_unreachable(body)
|
|
68
|
+
|
|
69
|
+
# Make sure else body always exists and is marked as
|
|
70
|
+
# unreachable so the type checker always knows that
|
|
71
|
+
# all control flow paths will flow through the if
|
|
72
|
+
# statement body.
|
|
73
|
+
if not s.else_body:
|
|
74
|
+
s.else_body = Block([])
|
|
75
|
+
mark_block_unreachable(s.else_body)
|
|
76
|
+
break
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def infer_reachability_of_match_statement(s: MatchStmt, options: Options) -> None:
|
|
80
|
+
for i, guard in enumerate(s.guards):
|
|
81
|
+
pattern_value = infer_pattern_value(s.patterns[i])
|
|
82
|
+
|
|
83
|
+
if guard is not None:
|
|
84
|
+
guard_value = infer_condition_value(guard, options)
|
|
85
|
+
else:
|
|
86
|
+
guard_value = ALWAYS_TRUE
|
|
87
|
+
|
|
88
|
+
if pattern_value in (ALWAYS_FALSE, MYPY_FALSE) or guard_value in (
|
|
89
|
+
ALWAYS_FALSE,
|
|
90
|
+
MYPY_FALSE,
|
|
91
|
+
):
|
|
92
|
+
# The case is considered always false, so we skip the case body.
|
|
93
|
+
mark_block_unreachable(s.bodies[i])
|
|
94
|
+
elif pattern_value in (ALWAYS_FALSE, MYPY_TRUE) and guard_value in (
|
|
95
|
+
ALWAYS_TRUE,
|
|
96
|
+
MYPY_TRUE,
|
|
97
|
+
):
|
|
98
|
+
for body in s.bodies[i + 1 :]:
|
|
99
|
+
mark_block_unreachable(body)
|
|
100
|
+
|
|
101
|
+
if guard_value == MYPY_TRUE:
|
|
102
|
+
# This condition is false at runtime; this will affect
|
|
103
|
+
# import priorities.
|
|
104
|
+
mark_block_mypy_only(s.bodies[i])
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def assert_will_always_fail(s: AssertStmt, options: Options) -> bool:
|
|
108
|
+
return infer_condition_value(s.expr, options) in (ALWAYS_FALSE, MYPY_FALSE)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def infer_condition_value(expr: Expression, options: Options) -> int:
|
|
112
|
+
"""Infer whether the given condition is always true/false.
|
|
113
|
+
|
|
114
|
+
Return ALWAYS_TRUE if always true, ALWAYS_FALSE if always false,
|
|
115
|
+
MYPY_TRUE if true under mypy and false at runtime, MYPY_FALSE if
|
|
116
|
+
false under mypy and true at runtime, else TRUTH_VALUE_UNKNOWN.
|
|
117
|
+
"""
|
|
118
|
+
pyversion = options.python_version
|
|
119
|
+
name = ""
|
|
120
|
+
negated = False
|
|
121
|
+
alias = expr
|
|
122
|
+
if isinstance(alias, UnaryExpr):
|
|
123
|
+
if alias.op == "not":
|
|
124
|
+
expr = alias.expr
|
|
125
|
+
negated = True
|
|
126
|
+
result = TRUTH_VALUE_UNKNOWN
|
|
127
|
+
if isinstance(expr, NameExpr):
|
|
128
|
+
name = expr.name
|
|
129
|
+
elif isinstance(expr, MemberExpr):
|
|
130
|
+
name = expr.name
|
|
131
|
+
elif isinstance(expr, OpExpr) and expr.op in ("and", "or"):
|
|
132
|
+
left = infer_condition_value(expr.left, options)
|
|
133
|
+
if (left in (ALWAYS_TRUE, MYPY_TRUE) and expr.op == "and") or (
|
|
134
|
+
left in (ALWAYS_FALSE, MYPY_FALSE) and expr.op == "or"
|
|
135
|
+
):
|
|
136
|
+
# Either `True and <other>` or `False or <other>`: the result will
|
|
137
|
+
# always be the right-hand-side.
|
|
138
|
+
return infer_condition_value(expr.right, options)
|
|
139
|
+
else:
|
|
140
|
+
# The result will always be the left-hand-side (e.g. ALWAYS_* or
|
|
141
|
+
# TRUTH_VALUE_UNKNOWN).
|
|
142
|
+
return left
|
|
143
|
+
else:
|
|
144
|
+
result = consider_sys_version_info(expr, pyversion)
|
|
145
|
+
if result == TRUTH_VALUE_UNKNOWN:
|
|
146
|
+
result = consider_sys_platform(expr, options.platform)
|
|
147
|
+
if result == TRUTH_VALUE_UNKNOWN:
|
|
148
|
+
if name == "PY2":
|
|
149
|
+
result = ALWAYS_FALSE
|
|
150
|
+
elif name == "PY3":
|
|
151
|
+
result = ALWAYS_TRUE
|
|
152
|
+
elif name == "MYPY" or name == "TYPE_CHECKING":
|
|
153
|
+
result = MYPY_TRUE
|
|
154
|
+
elif name in options.always_true:
|
|
155
|
+
result = ALWAYS_TRUE
|
|
156
|
+
elif name in options.always_false:
|
|
157
|
+
result = ALWAYS_FALSE
|
|
158
|
+
if negated:
|
|
159
|
+
result = inverted_truth_mapping[result]
|
|
160
|
+
return result
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def infer_pattern_value(pattern: Pattern) -> int:
|
|
164
|
+
if isinstance(pattern, AsPattern) and pattern.pattern is None:
|
|
165
|
+
return ALWAYS_TRUE
|
|
166
|
+
elif isinstance(pattern, OrPattern) and any(
|
|
167
|
+
infer_pattern_value(p) == ALWAYS_TRUE for p in pattern.patterns
|
|
168
|
+
):
|
|
169
|
+
return ALWAYS_TRUE
|
|
170
|
+
else:
|
|
171
|
+
return TRUTH_VALUE_UNKNOWN
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def consider_sys_version_info(expr: Expression, pyversion: tuple[int, ...]) -> int:
|
|
175
|
+
"""Consider whether expr is a comparison involving sys.version_info.
|
|
176
|
+
|
|
177
|
+
Return ALWAYS_TRUE, ALWAYS_FALSE, or TRUTH_VALUE_UNKNOWN.
|
|
178
|
+
"""
|
|
179
|
+
# Cases supported:
|
|
180
|
+
# - sys.version_info[<int>] <compare_op> <int>
|
|
181
|
+
# - sys.version_info[:<int>] <compare_op> <tuple_of_n_ints>
|
|
182
|
+
# - sys.version_info <compare_op> <tuple_of_1_or_2_ints>
|
|
183
|
+
# (in this case <compare_op> must be >, >=, <, <=, but cannot be ==, !=)
|
|
184
|
+
if not isinstance(expr, ComparisonExpr):
|
|
185
|
+
return TRUTH_VALUE_UNKNOWN
|
|
186
|
+
# Let's not yet support chained comparisons.
|
|
187
|
+
if len(expr.operators) > 1:
|
|
188
|
+
return TRUTH_VALUE_UNKNOWN
|
|
189
|
+
op = expr.operators[0]
|
|
190
|
+
if op not in ("==", "!=", "<=", ">=", "<", ">"):
|
|
191
|
+
return TRUTH_VALUE_UNKNOWN
|
|
192
|
+
|
|
193
|
+
index = contains_sys_version_info(expr.operands[0])
|
|
194
|
+
thing = contains_int_or_tuple_of_ints(expr.operands[1])
|
|
195
|
+
if index is None or thing is None:
|
|
196
|
+
index = contains_sys_version_info(expr.operands[1])
|
|
197
|
+
thing = contains_int_or_tuple_of_ints(expr.operands[0])
|
|
198
|
+
op = reverse_op[op]
|
|
199
|
+
if isinstance(index, int) and isinstance(thing, int):
|
|
200
|
+
# sys.version_info[i] <compare_op> k
|
|
201
|
+
if 0 <= index <= 1:
|
|
202
|
+
return fixed_comparison(pyversion[index], op, thing)
|
|
203
|
+
else:
|
|
204
|
+
return TRUTH_VALUE_UNKNOWN
|
|
205
|
+
elif isinstance(index, tuple) and isinstance(thing, tuple):
|
|
206
|
+
lo, hi = index
|
|
207
|
+
if lo is None:
|
|
208
|
+
lo = 0
|
|
209
|
+
if hi is None:
|
|
210
|
+
hi = 2
|
|
211
|
+
if 0 <= lo < hi <= 2:
|
|
212
|
+
val = pyversion[lo:hi]
|
|
213
|
+
if len(val) == len(thing) or len(val) > len(thing) and op not in ("==", "!="):
|
|
214
|
+
return fixed_comparison(val, op, thing)
|
|
215
|
+
return TRUTH_VALUE_UNKNOWN
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def consider_sys_platform(expr: Expression, platform: str) -> int:
|
|
219
|
+
"""Consider whether expr is a comparison involving sys.platform.
|
|
220
|
+
|
|
221
|
+
Return ALWAYS_TRUE, ALWAYS_FALSE, or TRUTH_VALUE_UNKNOWN.
|
|
222
|
+
"""
|
|
223
|
+
# Cases supported:
|
|
224
|
+
# - sys.platform == 'posix'
|
|
225
|
+
# - sys.platform != 'win32'
|
|
226
|
+
# - sys.platform.startswith('win')
|
|
227
|
+
if isinstance(expr, ComparisonExpr):
|
|
228
|
+
# Let's not yet support chained comparisons.
|
|
229
|
+
if len(expr.operators) > 1:
|
|
230
|
+
return TRUTH_VALUE_UNKNOWN
|
|
231
|
+
op = expr.operators[0]
|
|
232
|
+
if op not in ("==", "!="):
|
|
233
|
+
return TRUTH_VALUE_UNKNOWN
|
|
234
|
+
if not is_sys_attr(expr.operands[0], "platform"):
|
|
235
|
+
return TRUTH_VALUE_UNKNOWN
|
|
236
|
+
right = expr.operands[1]
|
|
237
|
+
if not isinstance(right, StrExpr):
|
|
238
|
+
return TRUTH_VALUE_UNKNOWN
|
|
239
|
+
return fixed_comparison(platform, op, right.value)
|
|
240
|
+
elif isinstance(expr, CallExpr):
|
|
241
|
+
if not isinstance(expr.callee, MemberExpr):
|
|
242
|
+
return TRUTH_VALUE_UNKNOWN
|
|
243
|
+
if len(expr.args) != 1 or not isinstance(expr.args[0], StrExpr):
|
|
244
|
+
return TRUTH_VALUE_UNKNOWN
|
|
245
|
+
if not is_sys_attr(expr.callee.expr, "platform"):
|
|
246
|
+
return TRUTH_VALUE_UNKNOWN
|
|
247
|
+
if expr.callee.name != "startswith":
|
|
248
|
+
return TRUTH_VALUE_UNKNOWN
|
|
249
|
+
if platform.startswith(expr.args[0].value):
|
|
250
|
+
return ALWAYS_TRUE
|
|
251
|
+
else:
|
|
252
|
+
return ALWAYS_FALSE
|
|
253
|
+
else:
|
|
254
|
+
return TRUTH_VALUE_UNKNOWN
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
Targ = TypeVar("Targ", int, str, Tuple[int, ...])
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def fixed_comparison(left: Targ, op: str, right: Targ) -> int:
|
|
261
|
+
rmap = {False: ALWAYS_FALSE, True: ALWAYS_TRUE}
|
|
262
|
+
if op == "==":
|
|
263
|
+
return rmap[left == right]
|
|
264
|
+
if op == "!=":
|
|
265
|
+
return rmap[left != right]
|
|
266
|
+
if op == "<=":
|
|
267
|
+
return rmap[left <= right]
|
|
268
|
+
if op == ">=":
|
|
269
|
+
return rmap[left >= right]
|
|
270
|
+
if op == "<":
|
|
271
|
+
return rmap[left < right]
|
|
272
|
+
if op == ">":
|
|
273
|
+
return rmap[left > right]
|
|
274
|
+
return TRUTH_VALUE_UNKNOWN
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def contains_int_or_tuple_of_ints(expr: Expression) -> None | int | tuple[int, ...]:
|
|
278
|
+
if isinstance(expr, IntExpr):
|
|
279
|
+
return expr.value
|
|
280
|
+
if isinstance(expr, TupleExpr):
|
|
281
|
+
if literal(expr) == LITERAL_YES:
|
|
282
|
+
thing = []
|
|
283
|
+
for x in expr.items:
|
|
284
|
+
if not isinstance(x, IntExpr):
|
|
285
|
+
return None
|
|
286
|
+
thing.append(x.value)
|
|
287
|
+
return tuple(thing)
|
|
288
|
+
return None
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
def contains_sys_version_info(expr: Expression) -> None | int | tuple[int | None, int | None]:
|
|
292
|
+
if is_sys_attr(expr, "version_info"):
|
|
293
|
+
return (None, None) # Same as sys.version_info[:]
|
|
294
|
+
if isinstance(expr, IndexExpr) and is_sys_attr(expr.base, "version_info"):
|
|
295
|
+
index = expr.index
|
|
296
|
+
if isinstance(index, IntExpr):
|
|
297
|
+
return index.value
|
|
298
|
+
if isinstance(index, SliceExpr):
|
|
299
|
+
if index.stride is not None:
|
|
300
|
+
if not isinstance(index.stride, IntExpr) or index.stride.value != 1:
|
|
301
|
+
return None
|
|
302
|
+
begin = end = None
|
|
303
|
+
if index.begin_index is not None:
|
|
304
|
+
if not isinstance(index.begin_index, IntExpr):
|
|
305
|
+
return None
|
|
306
|
+
begin = index.begin_index.value
|
|
307
|
+
if index.end_index is not None:
|
|
308
|
+
if not isinstance(index.end_index, IntExpr):
|
|
309
|
+
return None
|
|
310
|
+
end = index.end_index.value
|
|
311
|
+
return (begin, end)
|
|
312
|
+
return None
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def is_sys_attr(expr: Expression, name: str) -> bool:
|
|
316
|
+
# TODO: This currently doesn't work with code like this:
|
|
317
|
+
# - import sys as _sys
|
|
318
|
+
# - from sys import version_info
|
|
319
|
+
if isinstance(expr, MemberExpr) and expr.name == name:
|
|
320
|
+
if isinstance(expr.expr, NameExpr) and expr.expr.name == "sys":
|
|
321
|
+
# TODO: Guard against a local named sys, etc.
|
|
322
|
+
# (Though later passes will still do most checking.)
|
|
323
|
+
return True
|
|
324
|
+
return False
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
def mark_block_unreachable(block: Block) -> None:
|
|
328
|
+
block.is_unreachable = True
|
|
329
|
+
block.accept(MarkImportsUnreachableVisitor())
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
class MarkImportsUnreachableVisitor(TraverserVisitor):
|
|
333
|
+
"""Visitor that flags all imports nested within a node as unreachable."""
|
|
334
|
+
|
|
335
|
+
def visit_import(self, node: Import) -> None:
|
|
336
|
+
node.is_unreachable = True
|
|
337
|
+
|
|
338
|
+
def visit_import_from(self, node: ImportFrom) -> None:
|
|
339
|
+
node.is_unreachable = True
|
|
340
|
+
|
|
341
|
+
def visit_import_all(self, node: ImportAll) -> None:
|
|
342
|
+
node.is_unreachable = True
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def mark_block_mypy_only(block: Block) -> None:
|
|
346
|
+
block.accept(MarkImportsMypyOnlyVisitor())
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
class MarkImportsMypyOnlyVisitor(TraverserVisitor):
|
|
350
|
+
"""Visitor that sets is_mypy_only (which affects priority)."""
|
|
351
|
+
|
|
352
|
+
def visit_import(self, node: Import) -> None:
|
|
353
|
+
node.is_mypy_only = True
|
|
354
|
+
|
|
355
|
+
def visit_import_from(self, node: ImportFrom) -> None:
|
|
356
|
+
node.is_mypy_only = True
|
|
357
|
+
|
|
358
|
+
def visit_import_all(self, node: ImportAll) -> None:
|
|
359
|
+
node.is_mypy_only = True
|
|
360
|
+
|
|
361
|
+
def visit_func_def(self, node: FuncDef) -> None:
|
|
362
|
+
node.is_mypy_only = True
|