tpy-lang 0.3.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.
- tpy_lang-0.3.0.dev0.dist-info/METADATA +151 -0
- tpy_lang-0.3.0.dev0.dist-info/RECORD +333 -0
- tpy_lang-0.3.0.dev0.dist-info/WHEEL +4 -0
- tpy_lang-0.3.0.dev0.dist-info/entry_points.txt +3 -0
- tpyc/__init__.py +104 -0
- tpyc/__main__.py +6 -0
- tpyc/_buildinfo.py +1 -0
- tpyc/_data/docs/LANGUAGE_FEATURES.md +6278 -0
- tpyc/_data/docs/STDLIB_ROADMAP.md +1258 -0
- tpyc/_data/docs/TPY_FOR_AGENTS.md +556 -0
- tpyc/_data/lib/tpy/_bindings/__init__.py +6 -0
- tpyc/_data/lib/tpy/_bindings/pcre2.py +173 -0
- tpyc/_data/lib/tpy/_bindings/posix_socket.py +161 -0
- tpyc/_data/lib/tpy/_functools_macros.py +80 -0
- tpyc/_data/lib/tpy/_macro_helpers.py +161 -0
- tpyc/_data/lib/tpy/argparse.py +2062 -0
- tpyc/_data/lib/tpy/asyncio/__init__.py +744 -0
- tpyc/_data/lib/tpy/asyncio/_executor.py +515 -0
- tpyc/_data/lib/tpy/base64.py +410 -0
- tpyc/_data/lib/tpy/bisect.py +39 -0
- tpyc/_data/lib/tpy/builtins.py +38 -0
- tpyc/_data/lib/tpy/dataclasses.py +354 -0
- tpyc/_data/lib/tpy/enum.py +23 -0
- tpyc/_data/lib/tpy/functools.py +33 -0
- tpyc/_data/lib/tpy/hashlib.py +206 -0
- tpyc/_data/lib/tpy/heapq.py +118 -0
- tpyc/_data/lib/tpy/io.py +395 -0
- tpyc/_data/lib/tpy/json.py +221 -0
- tpyc/_data/lib/tpy/math.py +406 -0
- tpyc/_data/lib/tpy/random.py +597 -0
- tpyc/_data/lib/tpy/re.py +467 -0
- tpyc/_data/lib/tpy/socket.py +379 -0
- tpyc/_data/lib/tpy/struct.py +178 -0
- tpyc/_data/lib/tpy/sys.py +40 -0
- tpyc/_data/lib/tpy/time.py +39 -0
- tpyc/_data/lib/tpy/tpy/__init__.py +78 -0
- tpyc/_data/lib/tpy/tpy/_bootstrap/__init__.py +10 -0
- tpyc/_data/lib/tpy/tpy/_bootstrap/_decorators.py +37 -0
- tpyc/_data/lib/tpy/tpy/_bootstrap/_extern.py +64 -0
- tpyc/_data/lib/tpy/tpy/_builtins/__init__.py +11 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_bytes.py +378 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_dict.py +151 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_exceptions.py +125 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_funcs.py +681 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_io.py +97 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_list.py +127 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_range.py +52 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_set.py +139 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_super.py +11 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_types.py +661 -0
- tpyc/_data/lib/tpy/tpy/_core/__init__.py +23 -0
- tpyc/_data/lib/tpy/tpy/_core/_bytes_view.py +129 -0
- tpyc/_data/lib/tpy/tpy/_core/_containers.py +137 -0
- tpyc/_data/lib/tpy/tpy/_core/_functions.py +40 -0
- tpyc/_data/lib/tpy/tpy/_core/_types.py +2061 -0
- tpyc/_data/lib/tpy/tpy/_typing/__init__.py +77 -0
- tpyc/_data/lib/tpy/tpy/_version.py +29 -0
- tpyc/_data/lib/tpy/tpy/bits.py +28 -0
- tpyc/_data/lib/tpy/tpy/coro/__init__.py +127 -0
- tpyc/_data/lib/tpy/tpy/extern.py +8 -0
- tpyc/_data/lib/tpy/tpy/mem.py +49 -0
- tpyc/_data/lib/tpy/tpy/unsafe.py +195 -0
- tpyc/_data/lib/tpy/tpy/version.py +21 -0
- tpyc/_data/lib/tpy/typing.py +13 -0
- tpyc/_data/runtime/cpp/include/tpy/any.hpp +461 -0
- tpyc/_data/runtime/cpp/include/tpy/as_ostream.hpp +117 -0
- tpyc/_data/runtime/cpp/include/tpy/async.hpp +76 -0
- tpyc/_data/runtime/cpp/include/tpy/bigint.hpp +1343 -0
- tpyc/_data/runtime/cpp/include/tpy/builtins.hpp +400 -0
- tpyc/_data/runtime/cpp/include/tpy/bytes_ops.hpp +469 -0
- tpyc/_data/runtime/cpp/include/tpy/container_ops.hpp +487 -0
- tpyc/_data/runtime/cpp/include/tpy/copy_iter.hpp +82 -0
- tpyc/_data/runtime/cpp/include/tpy/core.hpp +558 -0
- tpyc/_data/runtime/cpp/include/tpy/dict_ops.hpp +289 -0
- tpyc/_data/runtime/cpp/include/tpy/dunder.hpp +750 -0
- tpyc/_data/runtime/cpp/include/tpy/dynamic.hpp +44 -0
- tpyc/_data/runtime/cpp/include/tpy/enum.hpp +40 -0
- tpyc/_data/runtime/cpp/include/tpy/file.hpp +245 -0
- tpyc/_data/runtime/cpp/include/tpy/fixed_int.hpp +317 -0
- tpyc/_data/runtime/cpp/include/tpy/format.hpp +954 -0
- tpyc/_data/runtime/cpp/include/tpy/frame_slot.hpp +120 -0
- tpyc/_data/runtime/cpp/include/tpy/generator.hpp +47 -0
- tpyc/_data/runtime/cpp/include/tpy/iterable_ops.hpp +122 -0
- tpyc/_data/runtime/cpp/include/tpy/itertools.hpp +749 -0
- tpyc/_data/runtime/cpp/include/tpy/next_iter.hpp +82 -0
- tpyc/_data/runtime/cpp/include/tpy/ordered_map.hpp +518 -0
- tpyc/_data/runtime/cpp/include/tpy/ordered_set.hpp +337 -0
- tpyc/_data/runtime/cpp/include/tpy/own_iter.hpp +54 -0
- tpyc/_data/runtime/cpp/include/tpy/pascal_graph_sdl.hpp +192 -0
- tpyc/_data/runtime/cpp/include/tpy/printing.hpp +302 -0
- tpyc/_data/runtime/cpp/include/tpy/protocols.hpp +61 -0
- tpyc/_data/runtime/cpp/include/tpy/range.hpp +115 -0
- tpyc/_data/runtime/cpp/include/tpy/ranges.hpp +212 -0
- tpyc/_data/runtime/cpp/include/tpy/set_ops.hpp +265 -0
- tpyc/_data/runtime/cpp/include/tpy/slice.hpp +47 -0
- tpyc/_data/runtime/cpp/include/tpy/span_iter.hpp +42 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/math.hpp +41 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/pcre2_h.hpp +96 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/random.hpp +25 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/socket_h.hpp +145 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/time.hpp +62 -0
- tpyc/_data/runtime/cpp/include/tpy/system.hpp +121 -0
- tpyc/_data/runtime/cpp/include/tpy/throwable.hpp +55 -0
- tpyc/_data/runtime/cpp/include/tpy/tpy.hpp +156 -0
- tpyc/_data/runtime/cpp/include/tpy/type_name.hpp +77 -0
- tpyc/_data/runtime/cpp/include/tpy/type_traits.hpp +240 -0
- tpyc/_data/runtime/cpp/include/tpy/uninit_array_storage.hpp +250 -0
- tpyc/_data/runtime/cpp/include/tpy/uninit_heap_storage.hpp +277 -0
- tpyc/_data/runtime/cpp/include/tpy/varargs.hpp +174 -0
- tpyc/_data/runtime/cpp/include/tpy/variant_ref.hpp +118 -0
- tpyc/_data/runtime/cpp/src/stdlib/socket_impl.cpp +104 -0
- tpyc/_data/runtime/cpp/third_party/README.md +58 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/AUTHORS +36 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/CMakeLists.txt +1233 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/COPYING +5 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/ChangeLog +3097 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/HACKING +853 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/INSTALL +368 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/LICENCE +94 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/NEWS +492 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/NON-AUTOTOOLS-BUILD +430 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/README +956 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/COPYING-CMAKE-SCRIPTS +22 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindEditline.cmake +16 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindPackageHandleStandardArgs.cmake +58 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindReadline.cmake +29 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/pcre2-config-version.cmake.in +15 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/pcre2-config.cmake.in +148 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/config-cmake.h.in +56 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-16.pc.in +13 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-32.pc.in +13 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-8.pc.in +13 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-posix.pc.in +13 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/pcre2-config.in +121 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h +483 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h.generic +483 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h.in +460 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h +1010 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h.generic +1010 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h.in +1010 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_auto_possess.c +1371 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chartables.c +196 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chartables.c.dist +196 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chkdint.c +96 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_compile.c +11001 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_config.c +252 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_context.c +510 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_convert.c +1189 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_dfa_match.c +4119 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_dftables.c +297 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_error.c +345 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_extuni.c +162 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_find_bracket.c +219 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_fuzzsupport.c +792 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_internal.h +2084 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_intmodedep.h +940 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_compile.c +14972 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_match.c +200 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_misc.c +234 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_neon_inc.h +354 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_simd_inc.h +2355 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_test.c +2528 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_maketables.c +165 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_match.c +7777 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_match_data.c +185 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_newline.c +243 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ord2utf.c +120 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_pattern_info.c +432 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_printint.c +886 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_script_run.c +344 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_serialize.c +286 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_string_utils.c +237 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_study.c +1915 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_substitute.c +1009 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_substring.c +550 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_tables.c +234 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucd.c +5460 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucp.h +396 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucptables.c +1533 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_valid_utf.c +398 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_xclass.c +308 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2demo.c +497 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2grep.c +4606 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix.c +425 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix.h +187 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix_test.c +209 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2test.c +9708 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorApple.c +137 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorCore.c +327 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorFreeBSD.c +89 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorPosix.c +62 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorWindows.c +40 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorNetBSD.c +72 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorPosix.c +172 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorPosix.c +141 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorWindows.c +102 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfig.h +142 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfigCPU.h +188 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfigInternal.h +907 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitLir.c +3561 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitLir.h +2466 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_32.c +4636 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_64.c +3491 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_T2_32.c +4302 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeLOONGARCH_64.c +3765 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_32.c +472 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_64.c +387 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_common.c +4259 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_32.c +485 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_64.c +719 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_common.c +3161 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_32.c +142 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_64.c +222 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_common.c +3121 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeS390X.c +4526 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_32.c +1685 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_64.c +1398 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_common.c +5001 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitSerialize.c +516 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitUtils.c +344 -0
- tpyc/_data/runtime/cpp/third_party/pcre2.sources.txt +54 -0
- tpyc/_data/runtime/cpp/third_party/pcre2.vendor.json +7 -0
- tpyc/build/__init__.py +7 -0
- tpyc/build/pcre2.py +122 -0
- tpyc/build/third_party.py +413 -0
- tpyc/cli.py +822 -0
- tpyc/codegen_cpp/__init__.py +18 -0
- tpyc/codegen_cpp/builtins.py +484 -0
- tpyc/codegen_cpp/context.py +2064 -0
- tpyc/codegen_cpp/expressions.py +5940 -0
- tpyc/codegen_cpp/functions.py +1913 -0
- tpyc/codegen_cpp/gen_async.py +3258 -0
- tpyc/codegen_cpp/gen_generators.py +657 -0
- tpyc/codegen_cpp/generator.py +2258 -0
- tpyc/codegen_cpp/match.py +1997 -0
- tpyc/codegen_cpp/param_const.py +172 -0
- tpyc/codegen_cpp/protocols.py +907 -0
- tpyc/codegen_cpp/records.py +1654 -0
- tpyc/codegen_cpp/resumable_cfg.py +1651 -0
- tpyc/codegen_cpp/statements.py +4963 -0
- tpyc/codegen_cpp/string_dispatch.py +76 -0
- tpyc/codegen_cpp/test_context.py +46 -0
- tpyc/codegen_cpp/test_param_const.py +113 -0
- tpyc/codegen_cpp/test_resumable_cfg.py +182 -0
- tpyc/codegen_cpp/type_resolution.py +53 -0
- tpyc/codegen_cpp/types.py +436 -0
- tpyc/codegen_cpp/variant_access.py +135 -0
- tpyc/coercions.py +749 -0
- tpyc/compilation_context.py +57 -0
- tpyc/compiler.py +3945 -0
- tpyc/cycle_detection.py +358 -0
- tpyc/diagnostics.py +135 -0
- tpyc/dump_types.py +353 -0
- tpyc/frontend_diagnostics.py +47 -0
- tpyc/frontend_ir/__init__.py +140 -0
- tpyc/frontend_ir/lower.py +1098 -0
- tpyc/frontend_ir/nodes.py +718 -0
- tpyc/frontend_ir/resolver_adapter.py +151 -0
- tpyc/frontend_plugin.py +209 -0
- tpyc/install_docs.py +81 -0
- tpyc/liveness.py +756 -0
- tpyc/macro_api.py +1724 -0
- tpyc/macro_loader.py +497 -0
- tpyc/module_names.py +64 -0
- tpyc/modules/__init__.py +31 -0
- tpyc/modules/defs.py +89 -0
- tpyc/modules/registry.py +36 -0
- tpyc/modules/resolver.py +192 -0
- tpyc/modules/type_resolution.py +629 -0
- tpyc/namespace.py +172 -0
- tpyc/parse/__init__.py +84 -0
- tpyc/parse/imports.py +490 -0
- tpyc/parse/nodes.py +1732 -0
- tpyc/parse/parser.py +4043 -0
- tpyc/parse/resolve_refs.py +466 -0
- tpyc/parse/type_resolver.py +1060 -0
- tpyc/prescan.py +254 -0
- tpyc/qnames.py +149 -0
- tpyc/repl.py +529 -0
- tpyc/repl_backends.py +848 -0
- tpyc/sema/__init__.py +21 -0
- tpyc/sema/analyzer.py +3625 -0
- tpyc/sema/bound_check.py +72 -0
- tpyc/sema/builder_trace.py +684 -0
- tpyc/sema/calls.py +5406 -0
- tpyc/sema/compatibility.py +2107 -0
- tpyc/sema/context.py +1243 -0
- tpyc/sema/expressions.py +3737 -0
- tpyc/sema/flow_facts.py +199 -0
- tpyc/sema/init_tracker.py +150 -0
- tpyc/sema/list_literals.py +69 -0
- tpyc/sema/literal_utils.py +27 -0
- tpyc/sema/local_deduction.py +1088 -0
- tpyc/sema/macros.py +179 -0
- tpyc/sema/match.py +1177 -0
- tpyc/sema/method_expansion.py +347 -0
- tpyc/sema/methods.py +2197 -0
- tpyc/sema/mutation_propagation.py +268 -0
- tpyc/sema/narrowing.py +857 -0
- tpyc/sema/numeric_lattice.py +160 -0
- tpyc/sema/operators.py +402 -0
- tpyc/sema/overloads.py +841 -0
- tpyc/sema/protocols.py +1209 -0
- tpyc/sema/reach_analysis.py +202 -0
- tpyc/sema/registration.py +3156 -0
- tpyc/sema/scope_tracker.py +193 -0
- tpyc/sema/statements.py +4426 -0
- tpyc/sema/type_ops.py +1879 -0
- tpyc/sema/value_range.py +181 -0
- tpyc/symbol_binding.py +259 -0
- tpyc/test_c3_mro.py +208 -0
- tpyc/test_cli_argv.py +52 -0
- tpyc/test_compiler.py +559 -0
- tpyc/test_contains_type_param.py +101 -0
- tpyc/test_cycle_detection.py +221 -0
- tpyc/test_dump_types.py +225 -0
- tpyc/test_install_docs.py +65 -0
- tpyc/test_local_cpp_form.py +135 -0
- tpyc/test_macro_loader.py +76 -0
- tpyc/test_method_expansion.py +254 -0
- tpyc/test_nominal_identity.py +182 -0
- tpyc/test_overloads.py +410 -0
- tpyc/test_parse.py +303 -0
- tpyc/test_parse_type_ref.py +506 -0
- tpyc/test_parse_version_info.py +58 -0
- tpyc/test_reach_analysis.py +72 -0
- tpyc/test_ref_type.py +216 -0
- tpyc/test_send_sync_substitution.py +276 -0
- tpyc/test_tuple_mutation_propagation.py +206 -0
- tpyc/test_type_def_registry.py +1729 -0
- tpyc/test_union_types.py +195 -0
- tpyc/type_def_registry.py +975 -0
- tpyc/typesys.py +5104 -0
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
"""Parser-output ref resolution walker.
|
|
2
|
+
|
|
3
|
+
Resolves every `TypeRefNode` the parser emitted at annotation sites to a
|
|
4
|
+
concrete `TpyType`, in place on the `TpyModule`. Runs once per module
|
|
5
|
+
(between import canonicalization and sema) and leaves the AST with
|
|
6
|
+
TpyType invariants (`map_inner_types`, `isinstance` against structural
|
|
7
|
+
classes, etc.) everywhere.
|
|
8
|
+
|
|
9
|
+
Covers every module-level annotation site: type aliases, top-level
|
|
10
|
+
`TpyVarDecl`, function / overload-group signatures, type-parameter
|
|
11
|
+
bounds, record fields / bases / methods / self, protocol fields and
|
|
12
|
+
method signatures, and expression-level type uses inside bodies.
|
|
13
|
+
Nested defs and macro-fragment functions are resolved eagerly at parse
|
|
14
|
+
time (`parser._finalize_function_refs` / `_parse_method`) and are not
|
|
15
|
+
re-walked here.
|
|
16
|
+
|
|
17
|
+
The walker uses `module.resolver` (a `TypeResolver` constructed by the
|
|
18
|
+
parser) as the only authority for name binding. Field-default
|
|
19
|
+
inference for class-body `name = expr` assignments reuses the resolver
|
|
20
|
+
for record lookups, so no sema context is needed.
|
|
21
|
+
"""
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
from typing import TYPE_CHECKING
|
|
25
|
+
|
|
26
|
+
from ..typesys import (
|
|
27
|
+
TpyType, NominalType, UnionType, VOID, TypeParamKind,
|
|
28
|
+
TypeAliasInfo,
|
|
29
|
+
BIGINT, FLOAT, STR,
|
|
30
|
+
)
|
|
31
|
+
from ..typesys import _contains_self_reference
|
|
32
|
+
from .nodes import (
|
|
33
|
+
TpyModule, TpyVarDecl, TpyCall, TpyMethodCall, TpyNestedDef,
|
|
34
|
+
TpyTypeRef, TpyUnionRef, TpyCallableRef, TpyLiteralRef,
|
|
35
|
+
TpyInferFromDefaultRef, ParseError, ResolutionFailure,
|
|
36
|
+
TpyIntLiteral, TpyFloatLiteral, TpyStrLiteral, TpyName,
|
|
37
|
+
SourceLocation,
|
|
38
|
+
)
|
|
39
|
+
from .type_resolver import _FIXED_INT_MAP
|
|
40
|
+
from ..diagnostics import SemanticError
|
|
41
|
+
|
|
42
|
+
if TYPE_CHECKING:
|
|
43
|
+
from .nodes import TpyExpr
|
|
44
|
+
from .type_resolver import TypeResolver
|
|
45
|
+
|
|
46
|
+
_REF_TYPES = (TpyTypeRef, TpyUnionRef, TpyCallableRef, TpyLiteralRef)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def promote_bare_nominals(typ: TpyType, registry) -> TpyType:
|
|
50
|
+
"""Return `typ` with every bare `NominalType` whose short name
|
|
51
|
+
resolves in `registry` replaced by its qname-bearing counterpart.
|
|
52
|
+
Recurses into structural wrappers. Closes the bridge from macro-
|
|
53
|
+
emitted `types.named("Foo")` placeholders to the strict-equality
|
|
54
|
+
NominalType identity sema/codegen downstream relies on.
|
|
55
|
+
"""
|
|
56
|
+
if isinstance(typ, NominalType) and typ._module_qname is None:
|
|
57
|
+
info = registry.get_record(typ.name)
|
|
58
|
+
if info is not None:
|
|
59
|
+
qname = info.qualified_name()
|
|
60
|
+
if qname:
|
|
61
|
+
typ = NominalType(
|
|
62
|
+
typ.name, typ.type_args, typ.is_protocol,
|
|
63
|
+
qname, typ.is_dynamic_protocol,
|
|
64
|
+
)
|
|
65
|
+
return typ.map_inner_types(lambda t: promote_bare_nominals(t, registry))
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _infer_field_type_from_default(
|
|
69
|
+
expr: 'TpyExpr | None', resolver: 'TypeResolver',
|
|
70
|
+
) -> TpyType | None:
|
|
71
|
+
"""Infer a field type from its default-value expression.
|
|
72
|
+
|
|
73
|
+
Handles:
|
|
74
|
+
- int / float / str literals -> BIGINT / FLOAT / STR.
|
|
75
|
+
- Fixed-int constructor calls (`Int32(...)`, ...) -> the matching
|
|
76
|
+
singleton.
|
|
77
|
+
- `int()` / `float()` -> BIGINT / FLOAT.
|
|
78
|
+
- Calls to a resolvable record / protocol / enum name (same-module
|
|
79
|
+
or imported via the canonicalized import table) -> qname-
|
|
80
|
+
bearing NominalType.
|
|
81
|
+
|
|
82
|
+
Returns None if the expression does not match any recognised form;
|
|
83
|
+
the caller raises "Cannot infer type for field 'X'".
|
|
84
|
+
"""
|
|
85
|
+
if expr is None:
|
|
86
|
+
return None
|
|
87
|
+
if isinstance(expr, TpyIntLiteral):
|
|
88
|
+
return BIGINT
|
|
89
|
+
if isinstance(expr, TpyFloatLiteral):
|
|
90
|
+
return FLOAT
|
|
91
|
+
if isinstance(expr, TpyStrLiteral):
|
|
92
|
+
return STR
|
|
93
|
+
if not (isinstance(expr, TpyCall) and isinstance(expr.func, TpyName)):
|
|
94
|
+
return None
|
|
95
|
+
type_name = expr.func_name
|
|
96
|
+
if (fixed_int := _FIXED_INT_MAP.get(type_name)) is not None:
|
|
97
|
+
return fixed_int
|
|
98
|
+
if type_name == "int":
|
|
99
|
+
return BIGINT
|
|
100
|
+
if type_name == "float":
|
|
101
|
+
return FLOAT
|
|
102
|
+
# Route through the resolver: it consults both the parser's
|
|
103
|
+
# registry (same-module records) and the canonicalized import
|
|
104
|
+
# table (cross-module records), minting `_module_qname` uniformly.
|
|
105
|
+
try:
|
|
106
|
+
resolved = resolver.resolve(TpyTypeRef(type_name))
|
|
107
|
+
except (ParseError, ResolutionFailure):
|
|
108
|
+
return None
|
|
109
|
+
if isinstance(resolved, NominalType):
|
|
110
|
+
return resolved
|
|
111
|
+
return None
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _func_scope(func):
|
|
115
|
+
"""Build a `{name: TypeParamKind}` scope dict for a TpyFunction or
|
|
116
|
+
`None` if it has no type params."""
|
|
117
|
+
if not func.type_params:
|
|
118
|
+
return None
|
|
119
|
+
kinds = func.type_param_kinds
|
|
120
|
+
return {
|
|
121
|
+
name: (kinds[i] if i < len(kinds) else TypeParamKind.TYPE)
|
|
122
|
+
for i, name in enumerate(func.type_params)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _record_scope(record):
|
|
127
|
+
if not record.type_params:
|
|
128
|
+
return None
|
|
129
|
+
kinds = record.type_param_kinds
|
|
130
|
+
return {
|
|
131
|
+
name: (kinds[i] if i < len(kinds) else TypeParamKind.TYPE)
|
|
132
|
+
for i, name in enumerate(record.type_params)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def _merged_method_scope(record_scope, method):
|
|
137
|
+
"""Record type params + method type params, method-level wins on collision."""
|
|
138
|
+
if not method.type_params:
|
|
139
|
+
return record_scope
|
|
140
|
+
merged = dict(record_scope) if record_scope else {}
|
|
141
|
+
method_kinds = method.type_param_kinds
|
|
142
|
+
for i, name in enumerate(method.type_params):
|
|
143
|
+
kind = method_kinds[i] if i < len(method_kinds) else TypeParamKind.TYPE
|
|
144
|
+
merged[name] = kind
|
|
145
|
+
return merged
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _protocol_scope(protocol):
|
|
149
|
+
"""Protocols only carry TYPE-kind type params (parser constraint)."""
|
|
150
|
+
if not protocol.type_params:
|
|
151
|
+
return None
|
|
152
|
+
return {name: TypeParamKind.TYPE for name in protocol.type_params}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def _resolve_value_position(resolver, t, scope=None, *, pending_alias=None):
|
|
156
|
+
"""Resolve a value-bearing annotation slot.
|
|
157
|
+
|
|
158
|
+
Every annotation slot except the function-return slot is a value
|
|
159
|
+
position, so bare `None` lowers to NoneType -> std::monostate.
|
|
160
|
+
Used at function params / varargs / kwargs / self / fields / bases /
|
|
161
|
+
bounds / local variables / type-alias bodies / call-site type args.
|
|
162
|
+
Non-ref inputs pass through unchanged.
|
|
163
|
+
"""
|
|
164
|
+
if isinstance(t, _REF_TYPES):
|
|
165
|
+
return resolver.resolve(t, scope, pending_alias=pending_alias, is_type_arg=True)
|
|
166
|
+
return t
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _resolve_return_slot(resolver, t, scope=None):
|
|
170
|
+
"""Resolve a function-return slot.
|
|
171
|
+
|
|
172
|
+
Bare `None` stays VoidType -> `void` (the function-returns-nothing
|
|
173
|
+
semantic) -- distinct from `None` at value-bearing slots (handled
|
|
174
|
+
by `_resolve_value_position`). The parser emits `None` for an
|
|
175
|
+
absent return annotation; substitute VOID so downstream readers
|
|
176
|
+
see a concrete TpyType.
|
|
177
|
+
"""
|
|
178
|
+
if t is None:
|
|
179
|
+
return VOID
|
|
180
|
+
if isinstance(t, _REF_TYPES):
|
|
181
|
+
return resolver.resolve(t, scope)
|
|
182
|
+
return t
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def resolve_method_body_refs(method, record, resolver, *, promote_registry=None) -> None:
|
|
186
|
+
"""Resolve all TypeRefNodes in a record method's body (TpyVarDecl
|
|
187
|
+
annotations, `TpyCall.call_type`, `TpyCall.type_args`,
|
|
188
|
+
`TpyMethodCall.type_args`).
|
|
189
|
+
|
|
190
|
+
Called by sema's `register_record` after `_apply_class_macros` so
|
|
191
|
+
macro-added methods get the same treatment source-defined methods
|
|
192
|
+
received during the module-level `resolve_refs` walk. Idempotent:
|
|
193
|
+
already-resolved sites fall through the walker's isinstance checks
|
|
194
|
+
unchanged.
|
|
195
|
+
|
|
196
|
+
`promote_registry` (optional) is consulted to promote bare
|
|
197
|
+
`NominalType` placeholders left behind by `types.named(...)` macro
|
|
198
|
+
calls. Callers from sema pass `ctx.registry` so imported records
|
|
199
|
+
are visible.
|
|
200
|
+
"""
|
|
201
|
+
scope = _merged_method_scope(_record_scope(record), method)
|
|
202
|
+
_walk_body(method.body, scope, resolver, promote_registry=promote_registry)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def _walk_body(stmts, call_scope, resolver, *, promote_registry=None):
|
|
206
|
+
"""Body walker extracted so both `resolve_refs` and
|
|
207
|
+
`resolve_method_body_refs` share the same traversal.
|
|
208
|
+
|
|
209
|
+
`promote_registry`, when provided, is used to upgrade bare
|
|
210
|
+
`NominalType("Foo")` placeholders (left behind by macro-emitted
|
|
211
|
+
`types.named("Foo")`) to their qname-bearing counterparts so
|
|
212
|
+
strict `NominalType` equality holds downstream.
|
|
213
|
+
"""
|
|
214
|
+
for stmt in stmts:
|
|
215
|
+
if isinstance(stmt, TpyVarDecl) and stmt.type is not None:
|
|
216
|
+
if isinstance(stmt.type, _REF_TYPES):
|
|
217
|
+
stmt.type = _resolve_value_position(resolver, stmt.type, call_scope)
|
|
218
|
+
elif promote_registry is not None:
|
|
219
|
+
# Only promote bare NominalTypes when sema explicitly
|
|
220
|
+
# asks (post-macro-deps pass). Parse-time walks use
|
|
221
|
+
# `promote_registry=None` so we don't traverse every
|
|
222
|
+
# already-resolved type on every module-level walk.
|
|
223
|
+
stmt.type = promote_bare_nominals(stmt.type, promote_registry)
|
|
224
|
+
for expr in stmt.exprs():
|
|
225
|
+
_walk_expr_calls(expr, call_scope, resolver)
|
|
226
|
+
for body in stmt.sub_bodies():
|
|
227
|
+
_walk_body(body, call_scope, resolver, promote_registry=promote_registry)
|
|
228
|
+
# TpyNestedDef inherits `sub_bodies() -> []` from TpyStmt, so the
|
|
229
|
+
# loop above is a no-op for nested defs -- the body must be
|
|
230
|
+
# walked here explicitly, under the nested function's own scope.
|
|
231
|
+
if isinstance(stmt, TpyNestedDef):
|
|
232
|
+
# Nested def signatures are resolved at parse time (before
|
|
233
|
+
# the compiler canonicalizes cross-module imports), so any
|
|
234
|
+
# imported-record param types land as bare NominalTypes.
|
|
235
|
+
# Promote them now that `promote_registry` has the full
|
|
236
|
+
# cross-module picture.
|
|
237
|
+
if promote_registry is not None:
|
|
238
|
+
stmt.func.params = [
|
|
239
|
+
(n, promote_bare_nominals(t, promote_registry))
|
|
240
|
+
for n, t in stmt.func.params
|
|
241
|
+
]
|
|
242
|
+
if stmt.func.return_type is not None:
|
|
243
|
+
stmt.func.return_type = promote_bare_nominals(
|
|
244
|
+
stmt.func.return_type, promote_registry)
|
|
245
|
+
if stmt.func.vararg_type is not None:
|
|
246
|
+
stmt.func.vararg_type = promote_bare_nominals(
|
|
247
|
+
stmt.func.vararg_type, promote_registry)
|
|
248
|
+
if stmt.func.kwarg_type is not None:
|
|
249
|
+
stmt.func.kwarg_type = promote_bare_nominals(
|
|
250
|
+
stmt.func.kwarg_type, promote_registry)
|
|
251
|
+
nested_scope = _func_scope(stmt.func) or call_scope
|
|
252
|
+
_walk_body(stmt.func.body, nested_scope, resolver, promote_registry=promote_registry)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def _walk_expr_calls(expr, call_scope, resolver):
|
|
256
|
+
if isinstance(expr, TpyCall):
|
|
257
|
+
if isinstance(expr.call_type, _REF_TYPES):
|
|
258
|
+
# Parser catches structural errors at parse time; here we
|
|
259
|
+
# catch name-resolution errors silently to match pre-flip
|
|
260
|
+
# behaviour (sema falls back to type_args / subscript_callee
|
|
261
|
+
# when the name isn't a type).
|
|
262
|
+
try:
|
|
263
|
+
expr.call_type = resolver.resolve(expr.call_type, call_scope)
|
|
264
|
+
except ParseError:
|
|
265
|
+
expr.call_type = None
|
|
266
|
+
_walk_type_args(expr, call_scope, resolver)
|
|
267
|
+
elif isinstance(expr, TpyMethodCall):
|
|
268
|
+
_walk_type_args(expr, call_scope, resolver)
|
|
269
|
+
for child in expr.children():
|
|
270
|
+
_walk_expr_calls(child, call_scope, resolver)
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def _walk_type_args(expr, call_scope, resolver):
|
|
274
|
+
"""Resolve TypeRefNode elements in expr.type_args. On any element
|
|
275
|
+
failure, drop the whole tuple and propagate the error message
|
|
276
|
+
through `type_args_parse_error` so sema's generic-call validator
|
|
277
|
+
reports it."""
|
|
278
|
+
if not expr.type_args:
|
|
279
|
+
return
|
|
280
|
+
new_args = []
|
|
281
|
+
for ta in expr.type_args:
|
|
282
|
+
if isinstance(ta, _REF_TYPES):
|
|
283
|
+
try:
|
|
284
|
+
new_args.append(_resolve_value_position(resolver, ta, call_scope))
|
|
285
|
+
except ParseError as e:
|
|
286
|
+
expr.type_args = ()
|
|
287
|
+
if expr.type_args_parse_error is None:
|
|
288
|
+
expr.type_args_parse_error = e.message
|
|
289
|
+
return
|
|
290
|
+
else:
|
|
291
|
+
new_args.append(ta)
|
|
292
|
+
expr.type_args = tuple(new_args)
|
|
293
|
+
|
|
294
|
+
def resolve_refs(module: TpyModule) -> None:
|
|
295
|
+
"""Resolve every TypeRefNode in `module` to TpyType in place.
|
|
296
|
+
|
|
297
|
+
`TpyInferFromDefaultRef` field markers (class-body `name = expr`
|
|
298
|
+
without a type annotation) are handled inline via
|
|
299
|
+
`_infer_field_type_from_default`; it returns a TpyType or None,
|
|
300
|
+
the latter triggering a "Cannot infer type" SemanticError at the
|
|
301
|
+
field's loc.
|
|
302
|
+
"""
|
|
303
|
+
resolver = module.resolver
|
|
304
|
+
if resolver is None:
|
|
305
|
+
raise SemanticError(
|
|
306
|
+
"TypeRefNode encountered but no parser resolver is attached "
|
|
307
|
+
"(module was not produced by the current-phase Parser)"
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
# Resolver-bound thin wrappers so the internal callsites below stay
|
|
311
|
+
# terse; the policy lives on the module-level helpers
|
|
312
|
+
# `_resolve_value_position` / `_resolve_return_slot`.
|
|
313
|
+
def _resolve(t, scope=None):
|
|
314
|
+
return _resolve_value_position(resolver, t, scope)
|
|
315
|
+
|
|
316
|
+
def _resolve_return_type(t, scope=None):
|
|
317
|
+
return _resolve_return_slot(resolver, t, scope)
|
|
318
|
+
|
|
319
|
+
# A bound may name a protocol (`T: Comparable`) or an enclosing/sibling
|
|
320
|
+
# type param (`U: T` -- a subtype bound for representational coercion).
|
|
321
|
+
# Resolve under the owner's type-param scope so the latter becomes a
|
|
322
|
+
# TypeParamRef rather than failing as an unknown type.
|
|
323
|
+
def _resolve_bounds(bounds, scope=None):
|
|
324
|
+
if not bounds:
|
|
325
|
+
return bounds
|
|
326
|
+
return {name: _resolve(t, scope) for name, t in bounds.items()}
|
|
327
|
+
|
|
328
|
+
# Type alias RHS: resolve in declaration order, passing
|
|
329
|
+
# `pending_alias=alias_name` to the resolver so same-body self-
|
|
330
|
+
# references produce a `NominalType(name)` placeholder. Register
|
|
331
|
+
# each resolved alias in the registry immediately so later alias
|
|
332
|
+
# bodies can find it by name. Recursive unions are detected post-
|
|
333
|
+
# resolution.
|
|
334
|
+
if module.type_aliases:
|
|
335
|
+
resolved_aliases: 'dict[str, tuple[TpyType, SourceLocation | None, list[str], list[TypeParamKind]]]' = {}
|
|
336
|
+
for alias_name, entry in module.type_aliases.items():
|
|
337
|
+
alias_ref, alias_loc, alias_type_params, alias_type_param_kinds = entry
|
|
338
|
+
# Generic-alias scope: bind `T` (etc.) so the body resolves
|
|
339
|
+
# `T` to a TypeParamRef instead of failing with "Unknown
|
|
340
|
+
# type: T". Empty scope for non-generic aliases.
|
|
341
|
+
alias_scope = (
|
|
342
|
+
dict(zip(alias_type_params, alias_type_param_kinds))
|
|
343
|
+
if alias_type_params else None
|
|
344
|
+
)
|
|
345
|
+
alias_type = _resolve_value_position(
|
|
346
|
+
resolver, alias_ref, alias_scope, pending_alias=alias_name)
|
|
347
|
+
# Tag self-referential aliases as recursive; the indirection
|
|
348
|
+
# check itself runs later in sema (`_validate_recursive_union_paths`)
|
|
349
|
+
# so it can see same-module RecordInfo / TypeDef entries that
|
|
350
|
+
# `register_records_and_protocols` hasn't attached yet.
|
|
351
|
+
#
|
|
352
|
+
# A self-referential alias (generic or not) must use a union form
|
|
353
|
+
# so the compiler can emit a variant-backed wrapper struct. Bare
|
|
354
|
+
# non-union self-recursion (`type Foo = list[Foo]`,
|
|
355
|
+
# `type Bag[T] = list[Bag[T]]`, or `type Outer = Pair[Outer]` where
|
|
356
|
+
# Pair's substitution reintroduces the self-reference) has no
|
|
357
|
+
# wrapper-struct path and would emit ill-formed C++
|
|
358
|
+
# (`using Foo = std::vector<Foo>;` with Foo incomplete). Reject it
|
|
359
|
+
# cleanly at parse-resolution.
|
|
360
|
+
if _contains_self_reference(alias_type, alias_name):
|
|
361
|
+
if isinstance(alias_type, UnionType):
|
|
362
|
+
module.recursive_union_names.add(alias_name)
|
|
363
|
+
else:
|
|
364
|
+
raise ParseError(
|
|
365
|
+
f"Recursive type alias '{alias_name}' must use a "
|
|
366
|
+
f"union form (e.g. `type {alias_name} = SomeBaseType "
|
|
367
|
+
f"| list[{alias_name}]`) so the compiler can emit a "
|
|
368
|
+
f"wrapper struct. Bare non-union self-recursion "
|
|
369
|
+
f"(`type {alias_name} = list[{alias_name}]`) is not "
|
|
370
|
+
f"supported.",
|
|
371
|
+
loc=alias_loc,
|
|
372
|
+
)
|
|
373
|
+
# Pass the full TypeAliasInfo so generic-alias use sites
|
|
374
|
+
# (which run after this loop) can detect type_params via
|
|
375
|
+
# `get_type_alias_info` and emit the v1 placeholder error.
|
|
376
|
+
alias_info = TypeAliasInfo(
|
|
377
|
+
body=alias_type,
|
|
378
|
+
type_params=list(alias_type_params),
|
|
379
|
+
type_param_kinds=list(alias_type_param_kinds),
|
|
380
|
+
loc=alias_loc,
|
|
381
|
+
is_recursive=alias_name in module.recursive_union_names,
|
|
382
|
+
)
|
|
383
|
+
resolver.registry.register_type_alias(
|
|
384
|
+
alias_name, alias_type, info=alias_info,
|
|
385
|
+
)
|
|
386
|
+
resolved_aliases[alias_name] = (alias_type, alias_loc, alias_type_params, alias_type_param_kinds)
|
|
387
|
+
module.type_aliases = resolved_aliases
|
|
388
|
+
|
|
389
|
+
# Top-level functions (methods are resolved in the record loop
|
|
390
|
+
# below; nested defs are eagerly resolved at parse time).
|
|
391
|
+
for func in module.functions:
|
|
392
|
+
scope = _func_scope(func)
|
|
393
|
+
func.params = [(n, _resolve(t, scope)) for (n, t) in func.params]
|
|
394
|
+
func.return_type = _resolve_return_type(func.return_type, scope)
|
|
395
|
+
if func.vararg_type is not None:
|
|
396
|
+
func.vararg_type = _resolve(func.vararg_type, scope)
|
|
397
|
+
if func.kwarg_type is not None:
|
|
398
|
+
func.kwarg_type = _resolve(func.kwarg_type, scope)
|
|
399
|
+
func.type_param_bounds = _resolve_bounds(func.type_param_bounds, scope)
|
|
400
|
+
|
|
401
|
+
# All records (including nested) -- fields, methods, bases. Record
|
|
402
|
+
# methods use a merged scope (record type params + method type
|
|
403
|
+
# params) when resolving param / return / vararg refs; self is also
|
|
404
|
+
# resolved here so `method_expansion` sees TpyType. Bases resolve
|
|
405
|
+
# here too, so sema's own class-body validation runs after any
|
|
406
|
+
# base-resolution error would surface.
|
|
407
|
+
for record in module.all_records():
|
|
408
|
+
scope = _record_scope(record)
|
|
409
|
+
record.type_param_bounds = _resolve_bounds(record.type_param_bounds, scope)
|
|
410
|
+
record.bases = [_resolve(b, scope) for b in record.bases]
|
|
411
|
+
for fld in record.fields:
|
|
412
|
+
if isinstance(fld.type, TpyInferFromDefaultRef):
|
|
413
|
+
# Parser emits this marker for bare `name = expr`
|
|
414
|
+
# class-body assignments; infer from the parsed default
|
|
415
|
+
# expression, raising only on genuine failure.
|
|
416
|
+
inferred = _infer_field_type_from_default(fld.default_expr, resolver)
|
|
417
|
+
if inferred is None:
|
|
418
|
+
raise SemanticError(
|
|
419
|
+
f"Cannot infer type for field '{fld.name}'",
|
|
420
|
+
loc=fld.type.loc,
|
|
421
|
+
)
|
|
422
|
+
fld.type = inferred
|
|
423
|
+
else:
|
|
424
|
+
fld.type = _resolve(fld.type, scope)
|
|
425
|
+
for method in record.methods:
|
|
426
|
+
method_scope = _merged_method_scope(scope, method)
|
|
427
|
+
method.params = [(n, _resolve(t, method_scope)) for (n, t) in method.params]
|
|
428
|
+
method.return_type = _resolve_return_type(method.return_type, method_scope)
|
|
429
|
+
if method.vararg_type is not None:
|
|
430
|
+
method.vararg_type = _resolve(method.vararg_type, method_scope)
|
|
431
|
+
if method.self_annotation is not None:
|
|
432
|
+
method.self_annotation = _resolve(method.self_annotation, method_scope)
|
|
433
|
+
if method.kwarg_type is not None:
|
|
434
|
+
method.kwarg_type = _resolve(method.kwarg_type, method_scope)
|
|
435
|
+
method.type_param_bounds = _resolve_bounds(method.type_param_bounds, method_scope)
|
|
436
|
+
|
|
437
|
+
# Protocol MethodSignatures + field types: resolve under the
|
|
438
|
+
# protocol's own type-param scope.
|
|
439
|
+
for protocol in module.protocols:
|
|
440
|
+
scope = _protocol_scope(protocol)
|
|
441
|
+
protocol.parent_protocols = [
|
|
442
|
+
_resolve(p, scope) for p in protocol.parent_protocols
|
|
443
|
+
]
|
|
444
|
+
protocol.fields = [
|
|
445
|
+
(fname, _resolve(ftype, scope)) for fname, ftype in protocol.fields
|
|
446
|
+
]
|
|
447
|
+
for msig in protocol.methods:
|
|
448
|
+
msig.params = [(n, _resolve(t, scope)) for (n, t) in msig.params]
|
|
449
|
+
msig.return_type = _resolve_return_type(msig.return_type, scope)
|
|
450
|
+
|
|
451
|
+
# Top-level TpyVarDecls
|
|
452
|
+
for stmt in module.top_level_stmts:
|
|
453
|
+
if isinstance(stmt, TpyVarDecl) and stmt.type is not None:
|
|
454
|
+
stmt.type = _resolve(stmt.type)
|
|
455
|
+
|
|
456
|
+
# Resolve body-level type refs: in-body `TpyVarDecl.type`
|
|
457
|
+
# annotations, `TpyCall.call_type`, `TpyCall.type_args`,
|
|
458
|
+
# `TpyMethodCall.type_args`. Shared walker with
|
|
459
|
+
# `resolve_method_body_refs` (used for macro-added methods).
|
|
460
|
+
for func in module.functions:
|
|
461
|
+
_walk_body(func.body, _func_scope(func), resolver)
|
|
462
|
+
for record in module.all_records():
|
|
463
|
+
rscope = _record_scope(record)
|
|
464
|
+
for method in record.methods:
|
|
465
|
+
_walk_body(method.body, _merged_method_scope(rscope, method), resolver)
|
|
466
|
+
_walk_body(module.top_level_stmts, None, resolver)
|