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,187 @@
|
|
|
1
|
+
"""Calculate some properties of classes.
|
|
2
|
+
|
|
3
|
+
These happen after semantic analysis and before type checking.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from typing import Final
|
|
9
|
+
|
|
10
|
+
from mypy.errors import Errors
|
|
11
|
+
from mypy.nodes import (
|
|
12
|
+
IMPLICITLY_ABSTRACT,
|
|
13
|
+
IS_ABSTRACT,
|
|
14
|
+
CallExpr,
|
|
15
|
+
Decorator,
|
|
16
|
+
FuncDef,
|
|
17
|
+
Node,
|
|
18
|
+
OverloadedFuncDef,
|
|
19
|
+
PromoteExpr,
|
|
20
|
+
SymbolTable,
|
|
21
|
+
TypeInfo,
|
|
22
|
+
Var,
|
|
23
|
+
)
|
|
24
|
+
from mypy.options import Options
|
|
25
|
+
from mypy.types import MYPYC_NATIVE_INT_NAMES, Instance, ProperType
|
|
26
|
+
|
|
27
|
+
# Hard coded type promotions (shared between all Python versions).
|
|
28
|
+
# These add extra ad-hoc edges to the subtyping relation. For example,
|
|
29
|
+
# int is considered a subtype of float, even though there is no
|
|
30
|
+
# subclass relationship.
|
|
31
|
+
# Note that the bytearray -> bytes promotion is a little unsafe
|
|
32
|
+
# as some functions only accept bytes objects. Here convenience
|
|
33
|
+
# trumps safety.
|
|
34
|
+
TYPE_PROMOTIONS: Final = {
|
|
35
|
+
"builtins.int": "float",
|
|
36
|
+
"builtins.float": "complex",
|
|
37
|
+
"builtins.bytearray": "bytes",
|
|
38
|
+
"builtins.memoryview": "bytes",
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def calculate_class_abstract_status(typ: TypeInfo, is_stub_file: bool, errors: Errors) -> None:
|
|
43
|
+
"""Calculate abstract status of a class.
|
|
44
|
+
|
|
45
|
+
Set is_abstract of the type to True if the type has an unimplemented
|
|
46
|
+
abstract attribute. Also compute a list of abstract attributes.
|
|
47
|
+
Report error is required ABCMeta metaclass is missing.
|
|
48
|
+
"""
|
|
49
|
+
typ.is_abstract = False
|
|
50
|
+
typ.abstract_attributes = []
|
|
51
|
+
if typ.typeddict_type:
|
|
52
|
+
return # TypedDict can't be abstract
|
|
53
|
+
concrete: set[str] = set()
|
|
54
|
+
# List of abstract attributes together with their abstract status
|
|
55
|
+
abstract: list[tuple[str, int]] = []
|
|
56
|
+
abstract_in_this_class: list[str] = []
|
|
57
|
+
if typ.is_newtype:
|
|
58
|
+
# Special case: NewTypes are considered as always non-abstract, so they can be used as:
|
|
59
|
+
# Config = NewType('Config', Mapping[str, str])
|
|
60
|
+
# default = Config({'cannot': 'modify'}) # OK
|
|
61
|
+
return
|
|
62
|
+
for base in typ.mro:
|
|
63
|
+
for name, symnode in base.names.items():
|
|
64
|
+
node = symnode.node
|
|
65
|
+
if isinstance(node, OverloadedFuncDef):
|
|
66
|
+
# Unwrap an overloaded function definition. We can just
|
|
67
|
+
# check arbitrarily the first overload item. If the
|
|
68
|
+
# different items have a different abstract status, there
|
|
69
|
+
# should be an error reported elsewhere.
|
|
70
|
+
if node.items: # can be empty for invalid overloads
|
|
71
|
+
func: Node | None = node.items[0]
|
|
72
|
+
else:
|
|
73
|
+
func = None
|
|
74
|
+
else:
|
|
75
|
+
func = node
|
|
76
|
+
if isinstance(func, Decorator):
|
|
77
|
+
func = func.func
|
|
78
|
+
if isinstance(func, FuncDef):
|
|
79
|
+
if (
|
|
80
|
+
func.abstract_status in (IS_ABSTRACT, IMPLICITLY_ABSTRACT)
|
|
81
|
+
and name not in concrete
|
|
82
|
+
):
|
|
83
|
+
typ.is_abstract = True
|
|
84
|
+
abstract.append((name, func.abstract_status))
|
|
85
|
+
if base is typ:
|
|
86
|
+
abstract_in_this_class.append(name)
|
|
87
|
+
elif isinstance(node, Var):
|
|
88
|
+
if node.is_abstract_var and name not in concrete:
|
|
89
|
+
typ.is_abstract = True
|
|
90
|
+
abstract.append((name, IS_ABSTRACT))
|
|
91
|
+
if base is typ:
|
|
92
|
+
abstract_in_this_class.append(name)
|
|
93
|
+
concrete.add(name)
|
|
94
|
+
# In stubs, abstract classes need to be explicitly marked because it is too
|
|
95
|
+
# easy to accidentally leave a concrete class abstract by forgetting to
|
|
96
|
+
# implement some methods.
|
|
97
|
+
typ.abstract_attributes = sorted(abstract)
|
|
98
|
+
if is_stub_file:
|
|
99
|
+
if typ.declared_metaclass and typ.declared_metaclass.type.has_base("abc.ABCMeta"):
|
|
100
|
+
return
|
|
101
|
+
if typ.is_protocol:
|
|
102
|
+
return
|
|
103
|
+
if abstract and not abstract_in_this_class:
|
|
104
|
+
|
|
105
|
+
def report(message: str, severity: str) -> None:
|
|
106
|
+
errors.report(typ.line, typ.column, message, severity=severity)
|
|
107
|
+
|
|
108
|
+
attrs = ", ".join(f'"{attr}"' for attr, _ in sorted(abstract))
|
|
109
|
+
report(f"Class {typ.fullname} has abstract attributes {attrs}", "error")
|
|
110
|
+
report(
|
|
111
|
+
"If it is meant to be abstract, add 'abc.ABCMeta' as an explicit metaclass", "note"
|
|
112
|
+
)
|
|
113
|
+
if typ.is_final and abstract:
|
|
114
|
+
attrs = ", ".join(f'"{attr}"' for attr, _ in sorted(abstract))
|
|
115
|
+
errors.report(
|
|
116
|
+
typ.line, typ.column, f"Final class {typ.fullname} has abstract attributes {attrs}"
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def check_protocol_status(info: TypeInfo, errors: Errors) -> None:
|
|
121
|
+
"""Check that all classes in MRO of a protocol are protocols"""
|
|
122
|
+
if info.is_protocol:
|
|
123
|
+
for type in info.bases:
|
|
124
|
+
if not type.type.is_protocol and type.type.fullname != "builtins.object":
|
|
125
|
+
|
|
126
|
+
def report(message: str, severity: str) -> None:
|
|
127
|
+
errors.report(info.line, info.column, message, severity=severity)
|
|
128
|
+
|
|
129
|
+
report("All bases of a protocol must be protocols", "error")
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def calculate_class_vars(info: TypeInfo) -> None:
|
|
133
|
+
"""Try to infer additional class variables.
|
|
134
|
+
|
|
135
|
+
Subclass attribute assignments with no type annotation are assumed
|
|
136
|
+
to be classvar if overriding a declared classvar from the base
|
|
137
|
+
class.
|
|
138
|
+
|
|
139
|
+
This must happen after the main semantic analysis pass, since
|
|
140
|
+
this depends on base class bodies having been fully analyzed.
|
|
141
|
+
"""
|
|
142
|
+
for name, sym in info.names.items():
|
|
143
|
+
node = sym.node
|
|
144
|
+
if isinstance(node, Var) and node.info and node.is_inferred and not node.is_classvar:
|
|
145
|
+
for base in info.mro[1:]:
|
|
146
|
+
member = base.names.get(name)
|
|
147
|
+
if member is not None and isinstance(member.node, Var) and member.node.is_classvar:
|
|
148
|
+
node.is_classvar = True
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def add_type_promotion(
|
|
152
|
+
info: TypeInfo, module_names: SymbolTable, options: Options, builtin_names: SymbolTable
|
|
153
|
+
) -> None:
|
|
154
|
+
"""Setup extra, ad-hoc subtyping relationships between classes (promotion).
|
|
155
|
+
|
|
156
|
+
This includes things like 'int' being compatible with 'float'.
|
|
157
|
+
"""
|
|
158
|
+
defn = info.defn
|
|
159
|
+
promote_targets: list[ProperType] = []
|
|
160
|
+
for decorator in defn.decorators:
|
|
161
|
+
if isinstance(decorator, CallExpr):
|
|
162
|
+
analyzed = decorator.analyzed
|
|
163
|
+
if isinstance(analyzed, PromoteExpr):
|
|
164
|
+
# _promote class decorator (undocumented feature).
|
|
165
|
+
promote_targets.append(analyzed.type)
|
|
166
|
+
if not promote_targets:
|
|
167
|
+
if defn.fullname in TYPE_PROMOTIONS:
|
|
168
|
+
target_sym = module_names.get(TYPE_PROMOTIONS[defn.fullname])
|
|
169
|
+
if defn.fullname == "builtins.bytearray" and options.disable_bytearray_promotion:
|
|
170
|
+
target_sym = None
|
|
171
|
+
elif defn.fullname == "builtins.memoryview" and options.disable_memoryview_promotion:
|
|
172
|
+
target_sym = None
|
|
173
|
+
# With test stubs, the target may not exist.
|
|
174
|
+
if target_sym:
|
|
175
|
+
target_info = target_sym.node
|
|
176
|
+
assert isinstance(target_info, TypeInfo)
|
|
177
|
+
promote_targets.append(Instance(target_info, []))
|
|
178
|
+
# Special case the promotions between 'int' and native integer types.
|
|
179
|
+
# These have promotions going both ways, such as from 'int' to 'i64'
|
|
180
|
+
# and 'i64' to 'int', for convenience.
|
|
181
|
+
if defn.fullname in MYPYC_NATIVE_INT_NAMES:
|
|
182
|
+
int_sym = builtin_names["int"]
|
|
183
|
+
assert isinstance(int_sym.node, TypeInfo)
|
|
184
|
+
int_sym.node._promote.append(Instance(defn.info, []))
|
|
185
|
+
defn.info.alt_promote = Instance(int_sym.node, [])
|
|
186
|
+
if promote_targets:
|
|
187
|
+
defn.info._promote.extend(promote_targets)
|
mypy/semanal_enum.py
ADDED
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"""Semantic analysis of call-based Enum definitions.
|
|
2
|
+
|
|
3
|
+
This is conceptually part of mypy.semanal (semantic analyzer pass 2).
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from typing import Final, cast
|
|
9
|
+
|
|
10
|
+
from mypy.nodes import (
|
|
11
|
+
ARG_NAMED,
|
|
12
|
+
ARG_POS,
|
|
13
|
+
MDEF,
|
|
14
|
+
AssignmentStmt,
|
|
15
|
+
CallExpr,
|
|
16
|
+
Context,
|
|
17
|
+
DictExpr,
|
|
18
|
+
EnumCallExpr,
|
|
19
|
+
Expression,
|
|
20
|
+
ListExpr,
|
|
21
|
+
MemberExpr,
|
|
22
|
+
NameExpr,
|
|
23
|
+
RefExpr,
|
|
24
|
+
StrExpr,
|
|
25
|
+
SymbolTableNode,
|
|
26
|
+
TupleExpr,
|
|
27
|
+
TypeInfo,
|
|
28
|
+
Var,
|
|
29
|
+
is_StrExpr_list,
|
|
30
|
+
)
|
|
31
|
+
from mypy.options import Options
|
|
32
|
+
from mypy.semanal_shared import SemanticAnalyzerInterface
|
|
33
|
+
from mypy.types import ENUM_REMOVED_PROPS, LiteralType, get_proper_type
|
|
34
|
+
|
|
35
|
+
# Note: 'enum.EnumMeta' is deliberately excluded from this list. Classes that directly use
|
|
36
|
+
# enum.EnumMeta do not necessarily automatically have the 'name' and 'value' attributes.
|
|
37
|
+
ENUM_BASES: Final = frozenset(
|
|
38
|
+
("enum.Enum", "enum.IntEnum", "enum.Flag", "enum.IntFlag", "enum.StrEnum")
|
|
39
|
+
)
|
|
40
|
+
ENUM_SPECIAL_PROPS: Final = frozenset(
|
|
41
|
+
(
|
|
42
|
+
"name",
|
|
43
|
+
"value",
|
|
44
|
+
"_name_",
|
|
45
|
+
"_value_",
|
|
46
|
+
*ENUM_REMOVED_PROPS,
|
|
47
|
+
# Also attributes from `object`:
|
|
48
|
+
"__module__",
|
|
49
|
+
"__annotations__",
|
|
50
|
+
"__doc__",
|
|
51
|
+
"__slots__",
|
|
52
|
+
"__dict__",
|
|
53
|
+
)
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class EnumCallAnalyzer:
|
|
58
|
+
def __init__(self, options: Options, api: SemanticAnalyzerInterface) -> None:
|
|
59
|
+
self.options = options
|
|
60
|
+
self.api = api
|
|
61
|
+
|
|
62
|
+
def process_enum_call(self, s: AssignmentStmt, is_func_scope: bool) -> bool:
|
|
63
|
+
"""Check if s defines an Enum; if yes, store the definition in symbol table.
|
|
64
|
+
|
|
65
|
+
Return True if this looks like an Enum definition (but maybe with errors),
|
|
66
|
+
otherwise return False.
|
|
67
|
+
"""
|
|
68
|
+
if len(s.lvalues) != 1 or not isinstance(s.lvalues[0], (NameExpr, MemberExpr)):
|
|
69
|
+
return False
|
|
70
|
+
lvalue = s.lvalues[0]
|
|
71
|
+
name = lvalue.name
|
|
72
|
+
enum_call = self.check_enum_call(s.rvalue, name, is_func_scope)
|
|
73
|
+
if enum_call is None:
|
|
74
|
+
return False
|
|
75
|
+
if isinstance(lvalue, MemberExpr):
|
|
76
|
+
self.fail("Enum type as attribute is not supported", lvalue)
|
|
77
|
+
return False
|
|
78
|
+
# Yes, it's a valid Enum definition. Add it to the symbol table.
|
|
79
|
+
self.api.add_symbol(name, enum_call, s)
|
|
80
|
+
return True
|
|
81
|
+
|
|
82
|
+
def check_enum_call(
|
|
83
|
+
self, node: Expression, var_name: str, is_func_scope: bool
|
|
84
|
+
) -> TypeInfo | None:
|
|
85
|
+
"""Check if a call defines an Enum.
|
|
86
|
+
|
|
87
|
+
Example:
|
|
88
|
+
|
|
89
|
+
A = enum.Enum('A', 'foo bar')
|
|
90
|
+
|
|
91
|
+
is equivalent to:
|
|
92
|
+
|
|
93
|
+
class A(enum.Enum):
|
|
94
|
+
foo = 1
|
|
95
|
+
bar = 2
|
|
96
|
+
"""
|
|
97
|
+
if not isinstance(node, CallExpr):
|
|
98
|
+
return None
|
|
99
|
+
call = node
|
|
100
|
+
callee = call.callee
|
|
101
|
+
if not isinstance(callee, RefExpr):
|
|
102
|
+
return None
|
|
103
|
+
fullname = callee.fullname
|
|
104
|
+
if fullname not in ENUM_BASES:
|
|
105
|
+
return None
|
|
106
|
+
items, values, ok = self.parse_enum_call_args(call, fullname.split(".")[-1])
|
|
107
|
+
if not ok:
|
|
108
|
+
# Error. Construct dummy return value.
|
|
109
|
+
name = var_name
|
|
110
|
+
if is_func_scope:
|
|
111
|
+
name += "@" + str(call.line)
|
|
112
|
+
info = self.build_enum_call_typeinfo(name, [], fullname, node.line)
|
|
113
|
+
else:
|
|
114
|
+
name = cast(StrExpr, call.args[0]).value
|
|
115
|
+
if name != var_name or is_func_scope:
|
|
116
|
+
# Give it a unique name derived from the line number.
|
|
117
|
+
name += "@" + str(call.line)
|
|
118
|
+
info = self.build_enum_call_typeinfo(name, items, fullname, call.line)
|
|
119
|
+
# Store generated TypeInfo under both names, see semanal_namedtuple for more details.
|
|
120
|
+
if name != var_name or is_func_scope:
|
|
121
|
+
self.api.add_symbol_skip_local(name, info)
|
|
122
|
+
call.analyzed = EnumCallExpr(info, items, values)
|
|
123
|
+
call.analyzed.set_line(call)
|
|
124
|
+
info.line = node.line
|
|
125
|
+
return info
|
|
126
|
+
|
|
127
|
+
def build_enum_call_typeinfo(
|
|
128
|
+
self, name: str, items: list[str], fullname: str, line: int
|
|
129
|
+
) -> TypeInfo:
|
|
130
|
+
base = self.api.named_type_or_none(fullname)
|
|
131
|
+
assert base is not None
|
|
132
|
+
info = self.api.basic_new_typeinfo(name, base, line)
|
|
133
|
+
info.metaclass_type = info.calculate_metaclass_type()
|
|
134
|
+
info.is_enum = True
|
|
135
|
+
for item in items:
|
|
136
|
+
var = Var(item)
|
|
137
|
+
var.info = info
|
|
138
|
+
var.is_property = True
|
|
139
|
+
var._fullname = f"{info.fullname}.{item}"
|
|
140
|
+
info.names[item] = SymbolTableNode(MDEF, var)
|
|
141
|
+
return info
|
|
142
|
+
|
|
143
|
+
def parse_enum_call_args(
|
|
144
|
+
self, call: CallExpr, class_name: str
|
|
145
|
+
) -> tuple[list[str], list[Expression | None], bool]:
|
|
146
|
+
"""Parse arguments of an Enum call.
|
|
147
|
+
|
|
148
|
+
Return a tuple of fields, values, was there an error.
|
|
149
|
+
"""
|
|
150
|
+
args = call.args
|
|
151
|
+
if not all(arg_kind in [ARG_POS, ARG_NAMED] for arg_kind in call.arg_kinds):
|
|
152
|
+
return self.fail_enum_call_arg(f"Unexpected arguments to {class_name}()", call)
|
|
153
|
+
if len(args) < 2:
|
|
154
|
+
return self.fail_enum_call_arg(f"Too few arguments for {class_name}()", call)
|
|
155
|
+
if len(args) > 6:
|
|
156
|
+
return self.fail_enum_call_arg(f"Too many arguments for {class_name}()", call)
|
|
157
|
+
valid_name = [None, "value", "names", "module", "qualname", "type", "start"]
|
|
158
|
+
for arg_name in call.arg_names:
|
|
159
|
+
if arg_name not in valid_name:
|
|
160
|
+
self.fail_enum_call_arg(f'Unexpected keyword argument "{arg_name}"', call)
|
|
161
|
+
value, names = None, None
|
|
162
|
+
for arg_name, arg in zip(call.arg_names, args):
|
|
163
|
+
if arg_name == "value":
|
|
164
|
+
value = arg
|
|
165
|
+
if arg_name == "names":
|
|
166
|
+
names = arg
|
|
167
|
+
if value is None:
|
|
168
|
+
value = args[0]
|
|
169
|
+
if names is None:
|
|
170
|
+
names = args[1]
|
|
171
|
+
if not isinstance(value, StrExpr):
|
|
172
|
+
return self.fail_enum_call_arg(
|
|
173
|
+
f"{class_name}() expects a string literal as the first argument", call
|
|
174
|
+
)
|
|
175
|
+
items = []
|
|
176
|
+
values: list[Expression | None] = []
|
|
177
|
+
if isinstance(names, StrExpr):
|
|
178
|
+
fields = names.value
|
|
179
|
+
for field in fields.replace(",", " ").split():
|
|
180
|
+
items.append(field)
|
|
181
|
+
elif isinstance(names, (TupleExpr, ListExpr)):
|
|
182
|
+
seq_items = names.items
|
|
183
|
+
if is_StrExpr_list(seq_items):
|
|
184
|
+
items = [seq_item.value for seq_item in seq_items]
|
|
185
|
+
elif all(
|
|
186
|
+
isinstance(seq_item, (TupleExpr, ListExpr))
|
|
187
|
+
and len(seq_item.items) == 2
|
|
188
|
+
and isinstance(seq_item.items[0], StrExpr)
|
|
189
|
+
for seq_item in seq_items
|
|
190
|
+
):
|
|
191
|
+
for seq_item in seq_items:
|
|
192
|
+
assert isinstance(seq_item, (TupleExpr, ListExpr))
|
|
193
|
+
name, value = seq_item.items
|
|
194
|
+
assert isinstance(name, StrExpr)
|
|
195
|
+
items.append(name.value)
|
|
196
|
+
values.append(value)
|
|
197
|
+
else:
|
|
198
|
+
return self.fail_enum_call_arg(
|
|
199
|
+
"%s() with tuple or list expects strings or (name, value) pairs" % class_name,
|
|
200
|
+
call,
|
|
201
|
+
)
|
|
202
|
+
elif isinstance(names, DictExpr):
|
|
203
|
+
for key, value in names.items:
|
|
204
|
+
if not isinstance(key, StrExpr):
|
|
205
|
+
return self.fail_enum_call_arg(
|
|
206
|
+
f"{class_name}() with dict literal requires string literals", call
|
|
207
|
+
)
|
|
208
|
+
items.append(key.value)
|
|
209
|
+
values.append(value)
|
|
210
|
+
elif isinstance(args[1], RefExpr) and isinstance(args[1].node, Var):
|
|
211
|
+
proper_type = get_proper_type(args[1].node.type)
|
|
212
|
+
if (
|
|
213
|
+
proper_type is not None
|
|
214
|
+
and isinstance(proper_type, LiteralType)
|
|
215
|
+
and isinstance(proper_type.value, str)
|
|
216
|
+
):
|
|
217
|
+
fields = proper_type.value
|
|
218
|
+
for field in fields.replace(",", " ").split():
|
|
219
|
+
items.append(field)
|
|
220
|
+
elif args[1].node.is_final and isinstance(args[1].node.final_value, str):
|
|
221
|
+
fields = args[1].node.final_value
|
|
222
|
+
for field in fields.replace(",", " ").split():
|
|
223
|
+
items.append(field)
|
|
224
|
+
else:
|
|
225
|
+
return self.fail_enum_call_arg(
|
|
226
|
+
"Second argument of %s() must be string, tuple, list or dict literal for mypy to determine Enum members"
|
|
227
|
+
% class_name,
|
|
228
|
+
call,
|
|
229
|
+
)
|
|
230
|
+
else:
|
|
231
|
+
# TODO: Allow dict(x=1, y=2) as a substitute for {'x': 1, 'y': 2}?
|
|
232
|
+
return self.fail_enum_call_arg(
|
|
233
|
+
"Second argument of %s() must be string, tuple, list or dict literal for mypy to determine Enum members"
|
|
234
|
+
% class_name,
|
|
235
|
+
call,
|
|
236
|
+
)
|
|
237
|
+
if not items:
|
|
238
|
+
return self.fail_enum_call_arg(f"{class_name}() needs at least one item", call)
|
|
239
|
+
if not values:
|
|
240
|
+
values = [None] * len(items)
|
|
241
|
+
assert len(items) == len(values)
|
|
242
|
+
return items, values, True
|
|
243
|
+
|
|
244
|
+
def fail_enum_call_arg(
|
|
245
|
+
self, message: str, context: Context
|
|
246
|
+
) -> tuple[list[str], list[Expression | None], bool]:
|
|
247
|
+
self.fail(message, context)
|
|
248
|
+
return [], [], False
|
|
249
|
+
|
|
250
|
+
# Helpers
|
|
251
|
+
|
|
252
|
+
def fail(self, msg: str, ctx: Context) -> None:
|
|
253
|
+
self.api.fail(msg, ctx)
|
mypy/semanal_infer.py
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"""Simple type inference for decorated functions during semantic analysis."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from mypy.nodes import ARG_POS, CallExpr, Decorator, Expression, FuncDef, RefExpr, Var
|
|
6
|
+
from mypy.semanal_shared import SemanticAnalyzerInterface
|
|
7
|
+
from mypy.typeops import function_type
|
|
8
|
+
from mypy.types import (
|
|
9
|
+
AnyType,
|
|
10
|
+
CallableType,
|
|
11
|
+
ProperType,
|
|
12
|
+
Type,
|
|
13
|
+
TypeOfAny,
|
|
14
|
+
TypeVarType,
|
|
15
|
+
get_proper_type,
|
|
16
|
+
)
|
|
17
|
+
from mypy.typevars import has_no_typevars
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def infer_decorator_signature_if_simple(
|
|
21
|
+
dec: Decorator, analyzer: SemanticAnalyzerInterface
|
|
22
|
+
) -> None:
|
|
23
|
+
"""Try to infer the type of the decorated function.
|
|
24
|
+
|
|
25
|
+
This lets us resolve additional references to decorated functions
|
|
26
|
+
during type checking. Otherwise the type might not be available
|
|
27
|
+
when we need it, since module top levels can't be deferred.
|
|
28
|
+
|
|
29
|
+
This basically uses a simple special-purpose type inference
|
|
30
|
+
engine just for decorators.
|
|
31
|
+
"""
|
|
32
|
+
if dec.var.is_property:
|
|
33
|
+
# Decorators are expected to have a callable type (it's a little odd).
|
|
34
|
+
if dec.func.type is None:
|
|
35
|
+
dec.var.type = CallableType(
|
|
36
|
+
[AnyType(TypeOfAny.special_form)],
|
|
37
|
+
[ARG_POS],
|
|
38
|
+
[None],
|
|
39
|
+
AnyType(TypeOfAny.special_form),
|
|
40
|
+
analyzer.named_type("builtins.function"),
|
|
41
|
+
name=dec.var.name,
|
|
42
|
+
)
|
|
43
|
+
elif isinstance(dec.func.type, CallableType):
|
|
44
|
+
dec.var.type = dec.func.type
|
|
45
|
+
return
|
|
46
|
+
decorator_preserves_type = True
|
|
47
|
+
for expr in dec.decorators:
|
|
48
|
+
preserve_type = False
|
|
49
|
+
if isinstance(expr, RefExpr) and isinstance(expr.node, FuncDef):
|
|
50
|
+
if expr.node.type and is_identity_signature(expr.node.type):
|
|
51
|
+
preserve_type = True
|
|
52
|
+
if not preserve_type:
|
|
53
|
+
decorator_preserves_type = False
|
|
54
|
+
break
|
|
55
|
+
if decorator_preserves_type:
|
|
56
|
+
# No non-identity decorators left. We can trivially infer the type
|
|
57
|
+
# of the function here.
|
|
58
|
+
dec.var.type = function_type(dec.func, analyzer.named_type("builtins.function"))
|
|
59
|
+
if dec.decorators:
|
|
60
|
+
return_type = calculate_return_type(dec.decorators[0])
|
|
61
|
+
if return_type and isinstance(return_type, AnyType):
|
|
62
|
+
# The outermost decorator will return Any so we know the type of the
|
|
63
|
+
# decorated function.
|
|
64
|
+
dec.var.type = AnyType(TypeOfAny.from_another_any, source_any=return_type)
|
|
65
|
+
sig = find_fixed_callable_return(dec.decorators[0])
|
|
66
|
+
if sig:
|
|
67
|
+
# The outermost decorator always returns the same kind of function,
|
|
68
|
+
# so we know that this is the type of the decorated function.
|
|
69
|
+
orig_sig = function_type(dec.func, analyzer.named_type("builtins.function"))
|
|
70
|
+
sig.name = orig_sig.items[0].name
|
|
71
|
+
dec.var.type = sig
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def is_identity_signature(sig: Type) -> bool:
|
|
75
|
+
"""Is type a callable of form T -> T (where T is a type variable)?"""
|
|
76
|
+
sig = get_proper_type(sig)
|
|
77
|
+
if isinstance(sig, CallableType) and sig.arg_kinds == [ARG_POS]:
|
|
78
|
+
if isinstance(sig.arg_types[0], TypeVarType) and isinstance(sig.ret_type, TypeVarType):
|
|
79
|
+
return sig.arg_types[0].id == sig.ret_type.id
|
|
80
|
+
return False
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def calculate_return_type(expr: Expression) -> ProperType | None:
|
|
84
|
+
"""Return the return type if we can calculate it.
|
|
85
|
+
|
|
86
|
+
This only uses information available during semantic analysis so this
|
|
87
|
+
will sometimes return None because of insufficient information (as
|
|
88
|
+
type inference hasn't run yet).
|
|
89
|
+
"""
|
|
90
|
+
if isinstance(expr, RefExpr):
|
|
91
|
+
if isinstance(expr.node, FuncDef):
|
|
92
|
+
typ = expr.node.type
|
|
93
|
+
if typ is None:
|
|
94
|
+
# No signature -> default to Any.
|
|
95
|
+
return AnyType(TypeOfAny.unannotated)
|
|
96
|
+
# Explicit Any return?
|
|
97
|
+
if isinstance(typ, CallableType):
|
|
98
|
+
return get_proper_type(typ.ret_type)
|
|
99
|
+
return None
|
|
100
|
+
elif isinstance(expr.node, Var):
|
|
101
|
+
return get_proper_type(expr.node.type)
|
|
102
|
+
elif isinstance(expr, CallExpr):
|
|
103
|
+
return calculate_return_type(expr.callee)
|
|
104
|
+
return None
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def find_fixed_callable_return(expr: Expression) -> CallableType | None:
|
|
108
|
+
"""Return the return type, if expression refers to a callable that returns a callable.
|
|
109
|
+
|
|
110
|
+
But only do this if the return type has no type variables. Return None otherwise.
|
|
111
|
+
This approximates things a lot as this is supposed to be called before type checking
|
|
112
|
+
when full type information is not available yet.
|
|
113
|
+
"""
|
|
114
|
+
if isinstance(expr, RefExpr):
|
|
115
|
+
if isinstance(expr.node, FuncDef):
|
|
116
|
+
typ = expr.node.type
|
|
117
|
+
if typ:
|
|
118
|
+
if isinstance(typ, CallableType) and has_no_typevars(typ.ret_type):
|
|
119
|
+
ret_type = get_proper_type(typ.ret_type)
|
|
120
|
+
if isinstance(ret_type, CallableType):
|
|
121
|
+
return ret_type
|
|
122
|
+
elif isinstance(expr, CallExpr):
|
|
123
|
+
t = find_fixed_callable_return(expr.callee)
|
|
124
|
+
if t:
|
|
125
|
+
ret_type = get_proper_type(t.ret_type)
|
|
126
|
+
if isinstance(ret_type, CallableType):
|
|
127
|
+
return ret_type
|
|
128
|
+
return None
|