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
mypy/inspections.py
ADDED
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from collections import defaultdict
|
|
5
|
+
from functools import cmp_to_key
|
|
6
|
+
from typing import Callable
|
|
7
|
+
|
|
8
|
+
from mypy.build import State
|
|
9
|
+
from mypy.messages import format_type
|
|
10
|
+
from mypy.modulefinder import PYTHON_EXTENSIONS
|
|
11
|
+
from mypy.nodes import (
|
|
12
|
+
LDEF,
|
|
13
|
+
Decorator,
|
|
14
|
+
Expression,
|
|
15
|
+
FuncBase,
|
|
16
|
+
MemberExpr,
|
|
17
|
+
MypyFile,
|
|
18
|
+
Node,
|
|
19
|
+
OverloadedFuncDef,
|
|
20
|
+
RefExpr,
|
|
21
|
+
SymbolNode,
|
|
22
|
+
TypeInfo,
|
|
23
|
+
Var,
|
|
24
|
+
)
|
|
25
|
+
from mypy.server.update import FineGrainedBuildManager
|
|
26
|
+
from mypy.traverser import ExtendedTraverserVisitor
|
|
27
|
+
from mypy.typeops import tuple_fallback
|
|
28
|
+
from mypy.types import (
|
|
29
|
+
FunctionLike,
|
|
30
|
+
Instance,
|
|
31
|
+
LiteralType,
|
|
32
|
+
ProperType,
|
|
33
|
+
TupleType,
|
|
34
|
+
TypedDictType,
|
|
35
|
+
TypeVarType,
|
|
36
|
+
UnionType,
|
|
37
|
+
get_proper_type,
|
|
38
|
+
)
|
|
39
|
+
from mypy.typevars import fill_typevars_with_any
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def node_starts_after(o: Node, line: int, column: int) -> bool:
|
|
43
|
+
return o.line > line or o.line == line and o.column > column
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def node_ends_before(o: Node, line: int, column: int) -> bool:
|
|
47
|
+
# Unfortunately, end positions for some statements are a mess,
|
|
48
|
+
# e.g. overloaded functions, so we return False when we don't know.
|
|
49
|
+
if o.end_line is not None and o.end_column is not None:
|
|
50
|
+
if o.end_line < line or o.end_line == line and o.end_column < column:
|
|
51
|
+
return True
|
|
52
|
+
return False
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def expr_span(expr: Expression) -> str:
|
|
56
|
+
"""Format expression span as in mypy error messages."""
|
|
57
|
+
return f"{expr.line}:{expr.column + 1}:{expr.end_line}:{expr.end_column}"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def get_instance_fallback(typ: ProperType) -> list[Instance]:
|
|
61
|
+
"""Returns the Instance fallback for this type if one exists or None."""
|
|
62
|
+
if isinstance(typ, Instance):
|
|
63
|
+
return [typ]
|
|
64
|
+
elif isinstance(typ, TupleType):
|
|
65
|
+
return [tuple_fallback(typ)]
|
|
66
|
+
elif isinstance(typ, TypedDictType):
|
|
67
|
+
return [typ.fallback]
|
|
68
|
+
elif isinstance(typ, FunctionLike):
|
|
69
|
+
return [typ.fallback]
|
|
70
|
+
elif isinstance(typ, LiteralType):
|
|
71
|
+
return [typ.fallback]
|
|
72
|
+
elif isinstance(typ, TypeVarType):
|
|
73
|
+
if typ.values:
|
|
74
|
+
res = []
|
|
75
|
+
for t in typ.values:
|
|
76
|
+
res.extend(get_instance_fallback(get_proper_type(t)))
|
|
77
|
+
return res
|
|
78
|
+
return get_instance_fallback(get_proper_type(typ.upper_bound))
|
|
79
|
+
elif isinstance(typ, UnionType):
|
|
80
|
+
res = []
|
|
81
|
+
for t in typ.items:
|
|
82
|
+
res.extend(get_instance_fallback(get_proper_type(t)))
|
|
83
|
+
return res
|
|
84
|
+
return []
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def find_node(name: str, info: TypeInfo) -> Var | FuncBase | None:
|
|
88
|
+
"""Find the node defining member 'name' in given TypeInfo."""
|
|
89
|
+
# TODO: this code shares some logic with checkmember.py
|
|
90
|
+
method = info.get_method(name)
|
|
91
|
+
if method:
|
|
92
|
+
if isinstance(method, Decorator):
|
|
93
|
+
return method.var
|
|
94
|
+
if method.is_property:
|
|
95
|
+
assert isinstance(method, OverloadedFuncDef)
|
|
96
|
+
dec = method.items[0]
|
|
97
|
+
assert isinstance(dec, Decorator)
|
|
98
|
+
return dec.var
|
|
99
|
+
return method
|
|
100
|
+
else:
|
|
101
|
+
# don't have such method, maybe variable?
|
|
102
|
+
node = info.get(name)
|
|
103
|
+
v = node.node if node else None
|
|
104
|
+
if isinstance(v, Var):
|
|
105
|
+
return v
|
|
106
|
+
return None
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def find_module_by_fullname(fullname: str, modules: dict[str, State]) -> State | None:
|
|
110
|
+
"""Find module by a node fullname.
|
|
111
|
+
|
|
112
|
+
This logic mimics the one we use in fixup, so should be good enough.
|
|
113
|
+
"""
|
|
114
|
+
head = fullname
|
|
115
|
+
# Special case: a module symbol is considered to be defined in itself, not in enclosing
|
|
116
|
+
# package, since this is what users want when clicking go to definition on a module.
|
|
117
|
+
if head in modules:
|
|
118
|
+
return modules[head]
|
|
119
|
+
while True:
|
|
120
|
+
if "." not in head:
|
|
121
|
+
return None
|
|
122
|
+
head, tail = head.rsplit(".", maxsplit=1)
|
|
123
|
+
mod = modules.get(head)
|
|
124
|
+
if mod is not None:
|
|
125
|
+
return mod
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class SearchVisitor(ExtendedTraverserVisitor):
|
|
129
|
+
"""Visitor looking for an expression whose span matches given one exactly."""
|
|
130
|
+
|
|
131
|
+
def __init__(self, line: int, column: int, end_line: int, end_column: int) -> None:
|
|
132
|
+
self.line = line
|
|
133
|
+
self.column = column
|
|
134
|
+
self.end_line = end_line
|
|
135
|
+
self.end_column = end_column
|
|
136
|
+
self.result: Expression | None = None
|
|
137
|
+
|
|
138
|
+
def visit(self, o: Node) -> bool:
|
|
139
|
+
if node_starts_after(o, self.line, self.column):
|
|
140
|
+
return False
|
|
141
|
+
if node_ends_before(o, self.end_line, self.end_column):
|
|
142
|
+
return False
|
|
143
|
+
if (
|
|
144
|
+
o.line == self.line
|
|
145
|
+
and o.end_line == self.end_line
|
|
146
|
+
and o.column == self.column
|
|
147
|
+
and o.end_column == self.end_column
|
|
148
|
+
):
|
|
149
|
+
if isinstance(o, Expression):
|
|
150
|
+
self.result = o
|
|
151
|
+
return self.result is None
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def find_by_location(
|
|
155
|
+
tree: MypyFile, line: int, column: int, end_line: int, end_column: int
|
|
156
|
+
) -> Expression | None:
|
|
157
|
+
"""Find an expression matching given span, or None if not found."""
|
|
158
|
+
if end_line < line:
|
|
159
|
+
raise ValueError('"end_line" must not be before "line"')
|
|
160
|
+
if end_line == line and end_column <= column:
|
|
161
|
+
raise ValueError('"end_column" must be after "column"')
|
|
162
|
+
visitor = SearchVisitor(line, column, end_line, end_column)
|
|
163
|
+
tree.accept(visitor)
|
|
164
|
+
return visitor.result
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class SearchAllVisitor(ExtendedTraverserVisitor):
|
|
168
|
+
"""Visitor looking for all expressions whose spans enclose given position."""
|
|
169
|
+
|
|
170
|
+
def __init__(self, line: int, column: int) -> None:
|
|
171
|
+
self.line = line
|
|
172
|
+
self.column = column
|
|
173
|
+
self.result: list[Expression] = []
|
|
174
|
+
|
|
175
|
+
def visit(self, o: Node) -> bool:
|
|
176
|
+
if node_starts_after(o, self.line, self.column):
|
|
177
|
+
return False
|
|
178
|
+
if node_ends_before(o, self.line, self.column):
|
|
179
|
+
return False
|
|
180
|
+
if isinstance(o, Expression):
|
|
181
|
+
self.result.append(o)
|
|
182
|
+
return True
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def find_all_by_location(tree: MypyFile, line: int, column: int) -> list[Expression]:
|
|
186
|
+
"""Find all expressions enclosing given position starting from innermost."""
|
|
187
|
+
visitor = SearchAllVisitor(line, column)
|
|
188
|
+
tree.accept(visitor)
|
|
189
|
+
return list(reversed(visitor.result))
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class InspectionEngine:
|
|
193
|
+
"""Engine for locating and statically inspecting expressions."""
|
|
194
|
+
|
|
195
|
+
def __init__(
|
|
196
|
+
self,
|
|
197
|
+
fg_manager: FineGrainedBuildManager,
|
|
198
|
+
*,
|
|
199
|
+
verbosity: int = 0,
|
|
200
|
+
limit: int = 0,
|
|
201
|
+
include_span: bool = False,
|
|
202
|
+
include_kind: bool = False,
|
|
203
|
+
include_object_attrs: bool = False,
|
|
204
|
+
union_attrs: bool = False,
|
|
205
|
+
force_reload: bool = False,
|
|
206
|
+
) -> None:
|
|
207
|
+
self.fg_manager = fg_manager
|
|
208
|
+
self.verbosity = verbosity
|
|
209
|
+
self.limit = limit
|
|
210
|
+
self.include_span = include_span
|
|
211
|
+
self.include_kind = include_kind
|
|
212
|
+
self.include_object_attrs = include_object_attrs
|
|
213
|
+
self.union_attrs = union_attrs
|
|
214
|
+
self.force_reload = force_reload
|
|
215
|
+
# Module for which inspection was requested.
|
|
216
|
+
self.module: State | None = None
|
|
217
|
+
|
|
218
|
+
def reload_module(self, state: State) -> None:
|
|
219
|
+
"""Reload given module while temporary exporting types."""
|
|
220
|
+
old = self.fg_manager.manager.options.export_types
|
|
221
|
+
self.fg_manager.manager.options.export_types = True
|
|
222
|
+
try:
|
|
223
|
+
self.fg_manager.flush_cache()
|
|
224
|
+
assert state.path is not None
|
|
225
|
+
self.fg_manager.update([(state.id, state.path)], [])
|
|
226
|
+
finally:
|
|
227
|
+
self.fg_manager.manager.options.export_types = old
|
|
228
|
+
|
|
229
|
+
def expr_type(self, expression: Expression) -> tuple[str, bool]:
|
|
230
|
+
"""Format type for an expression using current options.
|
|
231
|
+
|
|
232
|
+
If type is known, second item returned is True. If type is not known, an error
|
|
233
|
+
message is returned instead, and second item returned is False.
|
|
234
|
+
"""
|
|
235
|
+
expr_type = self.fg_manager.manager.all_types.get(expression)
|
|
236
|
+
if expr_type is None:
|
|
237
|
+
return self.missing_type(expression), False
|
|
238
|
+
|
|
239
|
+
type_str = format_type(
|
|
240
|
+
expr_type, self.fg_manager.manager.options, verbosity=self.verbosity
|
|
241
|
+
)
|
|
242
|
+
return self.add_prefixes(type_str, expression), True
|
|
243
|
+
|
|
244
|
+
def object_type(self) -> Instance:
|
|
245
|
+
builtins = self.fg_manager.graph["builtins"].tree
|
|
246
|
+
assert builtins is not None
|
|
247
|
+
object_node = builtins.names["object"].node
|
|
248
|
+
assert isinstance(object_node, TypeInfo)
|
|
249
|
+
return Instance(object_node, [])
|
|
250
|
+
|
|
251
|
+
def collect_attrs(self, instances: list[Instance]) -> dict[TypeInfo, list[str]]:
|
|
252
|
+
"""Collect attributes from all union/typevar variants."""
|
|
253
|
+
|
|
254
|
+
def item_attrs(attr_dict: dict[TypeInfo, list[str]]) -> set[str]:
|
|
255
|
+
attrs = set()
|
|
256
|
+
for base in attr_dict:
|
|
257
|
+
attrs |= set(attr_dict[base])
|
|
258
|
+
return attrs
|
|
259
|
+
|
|
260
|
+
def cmp_types(x: TypeInfo, y: TypeInfo) -> int:
|
|
261
|
+
if x in y.mro:
|
|
262
|
+
return 1
|
|
263
|
+
if y in x.mro:
|
|
264
|
+
return -1
|
|
265
|
+
return 0
|
|
266
|
+
|
|
267
|
+
# First gather all attributes for every union variant.
|
|
268
|
+
assert instances
|
|
269
|
+
all_attrs = []
|
|
270
|
+
for instance in instances:
|
|
271
|
+
attrs = {}
|
|
272
|
+
mro = instance.type.mro
|
|
273
|
+
if not self.include_object_attrs:
|
|
274
|
+
mro = mro[:-1]
|
|
275
|
+
for base in mro:
|
|
276
|
+
attrs[base] = sorted(base.names)
|
|
277
|
+
all_attrs.append(attrs)
|
|
278
|
+
|
|
279
|
+
# Find attributes valid for all variants in a union or type variable.
|
|
280
|
+
intersection = item_attrs(all_attrs[0])
|
|
281
|
+
for item in all_attrs[1:]:
|
|
282
|
+
intersection &= item_attrs(item)
|
|
283
|
+
|
|
284
|
+
# Combine attributes from all variants into a single dict while
|
|
285
|
+
# also removing invalid attributes (unless using --union-attrs).
|
|
286
|
+
combined_attrs = defaultdict(list)
|
|
287
|
+
for item in all_attrs:
|
|
288
|
+
for base in item:
|
|
289
|
+
if base in combined_attrs:
|
|
290
|
+
continue
|
|
291
|
+
for name in item[base]:
|
|
292
|
+
if self.union_attrs or name in intersection:
|
|
293
|
+
combined_attrs[base].append(name)
|
|
294
|
+
|
|
295
|
+
# Sort bases by MRO, unrelated will appear in the order they appeared as union variants.
|
|
296
|
+
sorted_bases = sorted(combined_attrs.keys(), key=cmp_to_key(cmp_types))
|
|
297
|
+
result = {}
|
|
298
|
+
for base in sorted_bases:
|
|
299
|
+
if not combined_attrs[base]:
|
|
300
|
+
# Skip bases where everytihng was filtered out.
|
|
301
|
+
continue
|
|
302
|
+
result[base] = combined_attrs[base]
|
|
303
|
+
return result
|
|
304
|
+
|
|
305
|
+
def _fill_from_dict(
|
|
306
|
+
self, attrs_strs: list[str], attrs_dict: dict[TypeInfo, list[str]]
|
|
307
|
+
) -> None:
|
|
308
|
+
for base in attrs_dict:
|
|
309
|
+
cls_name = base.name if self.verbosity < 1 else base.fullname
|
|
310
|
+
attrs = [f'"{attr}"' for attr in attrs_dict[base]]
|
|
311
|
+
attrs_strs.append(f'"{cls_name}": [{", ".join(attrs)}]')
|
|
312
|
+
|
|
313
|
+
def expr_attrs(self, expression: Expression) -> tuple[str, bool]:
|
|
314
|
+
"""Format attributes that are valid for a given expression.
|
|
315
|
+
|
|
316
|
+
If expression type is not an Instance, try using fallback. Attributes are
|
|
317
|
+
returned as a JSON (ordered by MRO) that maps base class name to list of
|
|
318
|
+
attributes. Attributes may appear in multiple bases if overridden (we simply
|
|
319
|
+
follow usual mypy logic for creating new Vars etc).
|
|
320
|
+
"""
|
|
321
|
+
expr_type = self.fg_manager.manager.all_types.get(expression)
|
|
322
|
+
if expr_type is None:
|
|
323
|
+
return self.missing_type(expression), False
|
|
324
|
+
|
|
325
|
+
expr_type = get_proper_type(expr_type)
|
|
326
|
+
instances = get_instance_fallback(expr_type)
|
|
327
|
+
if not instances:
|
|
328
|
+
# Everything is an object in Python.
|
|
329
|
+
instances = [self.object_type()]
|
|
330
|
+
|
|
331
|
+
attrs_dict = self.collect_attrs(instances)
|
|
332
|
+
|
|
333
|
+
# Special case: modules have names apart from those from ModuleType.
|
|
334
|
+
if isinstance(expression, RefExpr) and isinstance(expression.node, MypyFile):
|
|
335
|
+
node = expression.node
|
|
336
|
+
names = sorted(node.names)
|
|
337
|
+
if "__builtins__" in names:
|
|
338
|
+
# This is just to make tests stable. No one will really need ths name.
|
|
339
|
+
names.remove("__builtins__")
|
|
340
|
+
mod_dict = {f'"<{node.fullname}>"': [f'"{name}"' for name in names]}
|
|
341
|
+
else:
|
|
342
|
+
mod_dict = {}
|
|
343
|
+
|
|
344
|
+
# Special case: for class callables, prepend with the class attributes.
|
|
345
|
+
# TODO: also handle cases when such callable appears in a union.
|
|
346
|
+
if isinstance(expr_type, FunctionLike) and expr_type.is_type_obj():
|
|
347
|
+
template = fill_typevars_with_any(expr_type.type_object())
|
|
348
|
+
class_dict = self.collect_attrs(get_instance_fallback(template))
|
|
349
|
+
else:
|
|
350
|
+
class_dict = {}
|
|
351
|
+
|
|
352
|
+
# We don't use JSON dump to be sure keys order is always preserved.
|
|
353
|
+
base_attrs = []
|
|
354
|
+
if mod_dict:
|
|
355
|
+
for mod in mod_dict:
|
|
356
|
+
base_attrs.append(f'{mod}: [{", ".join(mod_dict[mod])}]')
|
|
357
|
+
self._fill_from_dict(base_attrs, class_dict)
|
|
358
|
+
self._fill_from_dict(base_attrs, attrs_dict)
|
|
359
|
+
return self.add_prefixes(f'{{{", ".join(base_attrs)}}}', expression), True
|
|
360
|
+
|
|
361
|
+
def format_node(self, module: State, node: FuncBase | SymbolNode) -> str:
|
|
362
|
+
return f"{module.path}:{node.line}:{node.column + 1}:{node.name}"
|
|
363
|
+
|
|
364
|
+
def collect_nodes(self, expression: RefExpr) -> list[FuncBase | SymbolNode]:
|
|
365
|
+
"""Collect nodes that can be referred to by an expression.
|
|
366
|
+
|
|
367
|
+
Note: it can be more than one for example in case of a union attribute.
|
|
368
|
+
"""
|
|
369
|
+
node: FuncBase | SymbolNode | None = expression.node
|
|
370
|
+
nodes: list[FuncBase | SymbolNode]
|
|
371
|
+
if node is None:
|
|
372
|
+
# Tricky case: instance attribute
|
|
373
|
+
if isinstance(expression, MemberExpr) and expression.kind is None:
|
|
374
|
+
base_type = self.fg_manager.manager.all_types.get(expression.expr)
|
|
375
|
+
if base_type is None:
|
|
376
|
+
return []
|
|
377
|
+
|
|
378
|
+
# Now we use the base type to figure out where the attribute is defined.
|
|
379
|
+
base_type = get_proper_type(base_type)
|
|
380
|
+
instances = get_instance_fallback(base_type)
|
|
381
|
+
nodes = []
|
|
382
|
+
for instance in instances:
|
|
383
|
+
node = find_node(expression.name, instance.type)
|
|
384
|
+
if node:
|
|
385
|
+
nodes.append(node)
|
|
386
|
+
if not nodes:
|
|
387
|
+
# Try checking class namespace if attribute is on a class object.
|
|
388
|
+
if isinstance(base_type, FunctionLike) and base_type.is_type_obj():
|
|
389
|
+
instances = get_instance_fallback(
|
|
390
|
+
fill_typevars_with_any(base_type.type_object())
|
|
391
|
+
)
|
|
392
|
+
for instance in instances:
|
|
393
|
+
node = find_node(expression.name, instance.type)
|
|
394
|
+
if node:
|
|
395
|
+
nodes.append(node)
|
|
396
|
+
else:
|
|
397
|
+
# Still no luck, give up.
|
|
398
|
+
return []
|
|
399
|
+
else:
|
|
400
|
+
return []
|
|
401
|
+
else:
|
|
402
|
+
# Easy case: a module-level definition
|
|
403
|
+
nodes = [node]
|
|
404
|
+
return nodes
|
|
405
|
+
|
|
406
|
+
def modules_for_nodes(
|
|
407
|
+
self, nodes: list[FuncBase | SymbolNode], expression: RefExpr
|
|
408
|
+
) -> tuple[dict[FuncBase | SymbolNode, State], bool]:
|
|
409
|
+
"""Gather modules where given nodes where defined.
|
|
410
|
+
|
|
411
|
+
Also check if they need to be refreshed (cached nodes may have
|
|
412
|
+
lines/columns missing).
|
|
413
|
+
"""
|
|
414
|
+
modules = {}
|
|
415
|
+
reload_needed = False
|
|
416
|
+
for node in nodes:
|
|
417
|
+
module = find_module_by_fullname(node.fullname, self.fg_manager.graph)
|
|
418
|
+
if not module:
|
|
419
|
+
if expression.kind == LDEF and self.module:
|
|
420
|
+
module = self.module
|
|
421
|
+
else:
|
|
422
|
+
continue
|
|
423
|
+
modules[node] = module
|
|
424
|
+
if not module.tree or module.tree.is_cache_skeleton or self.force_reload:
|
|
425
|
+
reload_needed |= not module.tree or module.tree.is_cache_skeleton
|
|
426
|
+
self.reload_module(module)
|
|
427
|
+
return modules, reload_needed
|
|
428
|
+
|
|
429
|
+
def expression_def(self, expression: Expression) -> tuple[str, bool]:
|
|
430
|
+
"""Find and format definition location for an expression.
|
|
431
|
+
|
|
432
|
+
If it is not a RefExpr, it is effectively skipped by returning an
|
|
433
|
+
empty result.
|
|
434
|
+
"""
|
|
435
|
+
if not isinstance(expression, RefExpr):
|
|
436
|
+
# If there are no suitable matches at all, we return error later.
|
|
437
|
+
return "", True
|
|
438
|
+
|
|
439
|
+
nodes = self.collect_nodes(expression)
|
|
440
|
+
|
|
441
|
+
if not nodes:
|
|
442
|
+
return self.missing_node(expression), False
|
|
443
|
+
|
|
444
|
+
modules, reload_needed = self.modules_for_nodes(nodes, expression)
|
|
445
|
+
if reload_needed:
|
|
446
|
+
# TODO: line/column are not stored in cache for vast majority of symbol nodes.
|
|
447
|
+
# Adding them will make thing faster, but will have visible memory impact.
|
|
448
|
+
nodes = self.collect_nodes(expression)
|
|
449
|
+
modules, reload_needed = self.modules_for_nodes(nodes, expression)
|
|
450
|
+
assert not reload_needed
|
|
451
|
+
|
|
452
|
+
result = []
|
|
453
|
+
for node in modules:
|
|
454
|
+
result.append(self.format_node(modules[node], node))
|
|
455
|
+
|
|
456
|
+
if not result:
|
|
457
|
+
return self.missing_node(expression), False
|
|
458
|
+
|
|
459
|
+
return self.add_prefixes(", ".join(result), expression), True
|
|
460
|
+
|
|
461
|
+
def missing_type(self, expression: Expression) -> str:
|
|
462
|
+
alt_suggestion = ""
|
|
463
|
+
if not self.force_reload:
|
|
464
|
+
alt_suggestion = " or try --force-reload"
|
|
465
|
+
return (
|
|
466
|
+
f'No known type available for "{type(expression).__name__}"'
|
|
467
|
+
f" (maybe unreachable{alt_suggestion})"
|
|
468
|
+
)
|
|
469
|
+
|
|
470
|
+
def missing_node(self, expression: Expression) -> str:
|
|
471
|
+
return (
|
|
472
|
+
f'Cannot find definition for "{type(expression).__name__}"'
|
|
473
|
+
f" at {expr_span(expression)}"
|
|
474
|
+
)
|
|
475
|
+
|
|
476
|
+
def add_prefixes(self, result: str, expression: Expression) -> str:
|
|
477
|
+
prefixes = []
|
|
478
|
+
if self.include_kind:
|
|
479
|
+
prefixes.append(f"{type(expression).__name__}")
|
|
480
|
+
if self.include_span:
|
|
481
|
+
prefixes.append(expr_span(expression))
|
|
482
|
+
if prefixes:
|
|
483
|
+
prefix = ":".join(prefixes) + " -> "
|
|
484
|
+
else:
|
|
485
|
+
prefix = ""
|
|
486
|
+
return prefix + result
|
|
487
|
+
|
|
488
|
+
def run_inspection_by_exact_location(
|
|
489
|
+
self,
|
|
490
|
+
tree: MypyFile,
|
|
491
|
+
line: int,
|
|
492
|
+
column: int,
|
|
493
|
+
end_line: int,
|
|
494
|
+
end_column: int,
|
|
495
|
+
method: Callable[[Expression], tuple[str, bool]],
|
|
496
|
+
) -> dict[str, object]:
|
|
497
|
+
"""Get type of an expression matching a span.
|
|
498
|
+
|
|
499
|
+
Type or error is returned as a standard daemon response dict.
|
|
500
|
+
"""
|
|
501
|
+
try:
|
|
502
|
+
expression = find_by_location(tree, line, column - 1, end_line, end_column)
|
|
503
|
+
except ValueError as err:
|
|
504
|
+
return {"error": str(err)}
|
|
505
|
+
|
|
506
|
+
if expression is None:
|
|
507
|
+
span = f"{line}:{column}:{end_line}:{end_column}"
|
|
508
|
+
return {"out": f"Can't find expression at span {span}", "err": "", "status": 1}
|
|
509
|
+
|
|
510
|
+
inspection_str, success = method(expression)
|
|
511
|
+
return {"out": inspection_str, "err": "", "status": 0 if success else 1}
|
|
512
|
+
|
|
513
|
+
def run_inspection_by_position(
|
|
514
|
+
self,
|
|
515
|
+
tree: MypyFile,
|
|
516
|
+
line: int,
|
|
517
|
+
column: int,
|
|
518
|
+
method: Callable[[Expression], tuple[str, bool]],
|
|
519
|
+
) -> dict[str, object]:
|
|
520
|
+
"""Get types of all expressions enclosing a position.
|
|
521
|
+
|
|
522
|
+
Types and/or errors are returned as a standard daemon response dict.
|
|
523
|
+
"""
|
|
524
|
+
expressions = find_all_by_location(tree, line, column - 1)
|
|
525
|
+
if not expressions:
|
|
526
|
+
position = f"{line}:{column}"
|
|
527
|
+
return {
|
|
528
|
+
"out": f"Can't find any expressions at position {position}",
|
|
529
|
+
"err": "",
|
|
530
|
+
"status": 1,
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
inspection_strs = []
|
|
534
|
+
status = 0
|
|
535
|
+
for expression in expressions:
|
|
536
|
+
inspection_str, success = method(expression)
|
|
537
|
+
if not success:
|
|
538
|
+
status = 1
|
|
539
|
+
if inspection_str:
|
|
540
|
+
inspection_strs.append(inspection_str)
|
|
541
|
+
if self.limit:
|
|
542
|
+
inspection_strs = inspection_strs[: self.limit]
|
|
543
|
+
return {"out": "\n".join(inspection_strs), "err": "", "status": status}
|
|
544
|
+
|
|
545
|
+
def find_module(self, file: str) -> tuple[State | None, dict[str, object]]:
|
|
546
|
+
"""Find module by path, or return a suitable error message.
|
|
547
|
+
|
|
548
|
+
Note we don't use exceptions to simplify handling 1 vs 2 statuses.
|
|
549
|
+
"""
|
|
550
|
+
if not any(file.endswith(ext) for ext in PYTHON_EXTENSIONS):
|
|
551
|
+
return None, {"error": "Source file is not a Python file"}
|
|
552
|
+
|
|
553
|
+
# We are using a bit slower but robust way to find a module by path,
|
|
554
|
+
# to be sure that namespace packages are handled properly.
|
|
555
|
+
abs_path = os.path.abspath(file)
|
|
556
|
+
state = next((s for s in self.fg_manager.graph.values() if s.abspath == abs_path), None)
|
|
557
|
+
self.module = state
|
|
558
|
+
return (
|
|
559
|
+
state,
|
|
560
|
+
{"out": f"Unknown module: {file}", "err": "", "status": 1} if state is None else {},
|
|
561
|
+
)
|
|
562
|
+
|
|
563
|
+
def run_inspection(
|
|
564
|
+
self, location: str, method: Callable[[Expression], tuple[str, bool]]
|
|
565
|
+
) -> dict[str, object]:
|
|
566
|
+
"""Top-level logic to inspect expression(s) at a location.
|
|
567
|
+
|
|
568
|
+
This can be re-used by various simple inspections.
|
|
569
|
+
"""
|
|
570
|
+
try:
|
|
571
|
+
file, pos = parse_location(location)
|
|
572
|
+
except ValueError as err:
|
|
573
|
+
return {"error": str(err)}
|
|
574
|
+
|
|
575
|
+
state, err_dict = self.find_module(file)
|
|
576
|
+
if state is None:
|
|
577
|
+
assert err_dict
|
|
578
|
+
return err_dict
|
|
579
|
+
|
|
580
|
+
# Force reloading to load from cache, account for any edits, etc.
|
|
581
|
+
if not state.tree or state.tree.is_cache_skeleton or self.force_reload:
|
|
582
|
+
self.reload_module(state)
|
|
583
|
+
assert state.tree is not None
|
|
584
|
+
|
|
585
|
+
if len(pos) == 4:
|
|
586
|
+
# Full span, return an exact match only.
|
|
587
|
+
line, column, end_line, end_column = pos
|
|
588
|
+
return self.run_inspection_by_exact_location(
|
|
589
|
+
state.tree, line, column, end_line, end_column, method
|
|
590
|
+
)
|
|
591
|
+
assert len(pos) == 2
|
|
592
|
+
# Inexact location, return all expressions.
|
|
593
|
+
line, column = pos
|
|
594
|
+
return self.run_inspection_by_position(state.tree, line, column, method)
|
|
595
|
+
|
|
596
|
+
def get_type(self, location: str) -> dict[str, object]:
|
|
597
|
+
"""Get types of expression(s) at a location."""
|
|
598
|
+
return self.run_inspection(location, self.expr_type)
|
|
599
|
+
|
|
600
|
+
def get_attrs(self, location: str) -> dict[str, object]:
|
|
601
|
+
"""Get attributes of expression(s) at a location."""
|
|
602
|
+
return self.run_inspection(location, self.expr_attrs)
|
|
603
|
+
|
|
604
|
+
def get_definition(self, location: str) -> dict[str, object]:
|
|
605
|
+
"""Get symbol definitions of expression(s) at a location."""
|
|
606
|
+
result = self.run_inspection(location, self.expression_def)
|
|
607
|
+
if "out" in result and not result["out"]:
|
|
608
|
+
# None of the expressions found turns out to be a RefExpr.
|
|
609
|
+
_, location = location.split(":", maxsplit=1)
|
|
610
|
+
result["out"] = f"No name or member expressions at {location}"
|
|
611
|
+
result["status"] = 1
|
|
612
|
+
return result
|
|
613
|
+
|
|
614
|
+
|
|
615
|
+
def parse_location(location: str) -> tuple[str, list[int]]:
|
|
616
|
+
if location.count(":") < 2:
|
|
617
|
+
raise ValueError("Format should be file:line:column[:end_line:end_column]")
|
|
618
|
+
parts = location.rsplit(":", maxsplit=2)
|
|
619
|
+
start, *rest = parts
|
|
620
|
+
# Note: we must allow drive prefix like `C:` on Windows.
|
|
621
|
+
if start.count(":") < 2:
|
|
622
|
+
return start, [int(p) for p in rest]
|
|
623
|
+
parts = start.rsplit(":", maxsplit=2)
|
|
624
|
+
start, *start_rest = parts
|
|
625
|
+
if start.count(":") < 2:
|
|
626
|
+
return start, [int(p) for p in start_rest + rest]
|
|
627
|
+
raise ValueError("Format should be file:line:column[:end_line:end_column]")
|