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,347 @@
|
|
|
1
|
+
"""Method expansion sema pass.
|
|
2
|
+
|
|
3
|
+
Runs between `parse.resolve_refs` and `register_enum` on the
|
|
4
|
+
module, and owns four transformations for record methods (free functions
|
|
5
|
+
are not expanded here):
|
|
6
|
+
|
|
7
|
+
1. Self-flag derivation -- walks `method.self_annotation` to set
|
|
8
|
+
`is_consuming` (`Own[Self]`), `auto_own` (`AutoOwnType(Self)`),
|
|
9
|
+
`auto_readonly` (`AutoReadonlyType(Self)`).
|
|
10
|
+
2. Self-annotation validation -- raises `SemanticError` for
|
|
11
|
+
`Own[Self]` / `auto_own[Self]` / `auto_readonly[Self]` on
|
|
12
|
+
`__init__` / `__del__`, plus the `@readonly` / `@auto_readonly`
|
|
13
|
+
combinability checks.
|
|
14
|
+
3. Wrapping -- applies `AutoReadonlyType` to eligible params when the
|
|
15
|
+
method carries `@auto_readonly`, detects per-param
|
|
16
|
+
`auto_readonly[T]` to set the flag, and wraps the first non-self
|
|
17
|
+
param of a `@property` setter with `Own[T]` when non-value.
|
|
18
|
+
4. Cloning -- expands `auto_readonly` methods into mutable + const
|
|
19
|
+
overload pairs (`strip_auto_readonly` / `apply_auto_readonly`) and
|
|
20
|
+
`auto_own` methods into borrowing + consuming pairs (`strip_auto_own`
|
|
21
|
+
/ `apply_auto_own`). Clones replace the original entry in
|
|
22
|
+
`record.methods` so registration sees the expanded list.
|
|
23
|
+
|
|
24
|
+
Parser state consumed here:
|
|
25
|
+
- `TpyFunction.self_annotation`: resolved self type.
|
|
26
|
+
- `TpyFunction.has_auto_readonly_decorator`: true iff `@auto_readonly`
|
|
27
|
+
was attached. Cleared on every clone once expanded.
|
|
28
|
+
- `TpyFunction.auto_readonly`: pre-set to True for `@property` getters
|
|
29
|
+
by `_parse_class` so cloning covers getters uniformly.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
import copy
|
|
35
|
+
import dataclasses
|
|
36
|
+
from typing import Iterator
|
|
37
|
+
|
|
38
|
+
from ..parse import TpyFunction, TpyRecord
|
|
39
|
+
from ..typesys import (
|
|
40
|
+
AutoOwnType,
|
|
41
|
+
AutoReadonlyType,
|
|
42
|
+
IMPLICIT_AUTO_READONLY_METHODS,
|
|
43
|
+
OwnType,
|
|
44
|
+
ReadonlyType,
|
|
45
|
+
SelfType,
|
|
46
|
+
apply_auto_own,
|
|
47
|
+
apply_auto_readonly,
|
|
48
|
+
has_auto_readonly,
|
|
49
|
+
strip_auto_own,
|
|
50
|
+
strip_auto_readonly,
|
|
51
|
+
)
|
|
52
|
+
from ..diagnostics import SemanticError
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
_SELF_BARRED_METHODS = ("__init__", "__del__")
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def expand_methods_for_record(record: TpyRecord) -> None:
|
|
59
|
+
"""Expand methods on a single record in place.
|
|
60
|
+
|
|
61
|
+
Safe to call after macros have added methods: `_expand_one` is
|
|
62
|
+
idempotent on already-expanded clones (their `self_annotation` is
|
|
63
|
+
cleared and the transient `auto_readonly` / `auto_own` flags are
|
|
64
|
+
already False), so methods added by the module-level run are left
|
|
65
|
+
untouched when the per-record run visits them again.
|
|
66
|
+
"""
|
|
67
|
+
record.methods = list(_expand_record_methods(record))
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _expand_record_methods(record: TpyRecord) -> Iterator[TpyFunction]:
|
|
71
|
+
for method in record.methods:
|
|
72
|
+
yield from _expand_one(method)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _expand_one(method: TpyFunction) -> list[TpyFunction]:
|
|
76
|
+
"""Expand a single method into one or more TpyFunction entries.
|
|
77
|
+
|
|
78
|
+
Order matters:
|
|
79
|
+
1. Self-flag derivation -- populates `is_consuming` / `auto_own` /
|
|
80
|
+
`auto_readonly` from `self_annotation` before validation reads
|
|
81
|
+
the combined state.
|
|
82
|
+
2. Validation -- runs against freshly-derived flags.
|
|
83
|
+
3. Wrapping -- applies AutoReadonlyType / Own[T] mutations to
|
|
84
|
+
params. Must run before cloning because the cloner walks the
|
|
85
|
+
AutoReadonlyType markers to produce mutable / const halves.
|
|
86
|
+
4. Cloning -- replaces the single method with its expansion.
|
|
87
|
+
"""
|
|
88
|
+
if method.is_staticmethod or not method.is_method:
|
|
89
|
+
# Not a regular method -- nothing to expand.
|
|
90
|
+
return [method]
|
|
91
|
+
|
|
92
|
+
_derive_self_flags(method)
|
|
93
|
+
_validate_self_annotation(method)
|
|
94
|
+
_apply_implicit_auto_readonly(method)
|
|
95
|
+
_apply_auto_readonly_decorator_wrapping(method)
|
|
96
|
+
_detect_per_param_auto_readonly(method)
|
|
97
|
+
_check_auto_readonly_generic_method(method)
|
|
98
|
+
_apply_property_setter_wrapping(method)
|
|
99
|
+
|
|
100
|
+
if method.auto_readonly:
|
|
101
|
+
return _clone_auto_readonly(method)
|
|
102
|
+
if method.auto_own:
|
|
103
|
+
return _clone_auto_own(method)
|
|
104
|
+
# Consuming method (Own[Self]) isn't cloned, but clear self_annotation
|
|
105
|
+
# for symmetry with the cloned paths: a second `_expand_one` pass
|
|
106
|
+
# shouldn't re-derive flags. Idempotent today either way, but keeps
|
|
107
|
+
# the "expansion done -> self_annotation is None" invariant uniform.
|
|
108
|
+
method.self_annotation = None
|
|
109
|
+
return [method]
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _derive_self_flags(method: TpyFunction) -> None:
|
|
113
|
+
stype = method.self_annotation
|
|
114
|
+
if stype is None:
|
|
115
|
+
return
|
|
116
|
+
if isinstance(stype, OwnType) and isinstance(stype.wrapped, SelfType):
|
|
117
|
+
method.is_consuming = True
|
|
118
|
+
elif isinstance(stype, AutoOwnType) and isinstance(stype.wrapped, SelfType):
|
|
119
|
+
method.auto_own = True
|
|
120
|
+
elif isinstance(stype, AutoReadonlyType) and isinstance(stype.wrapped, SelfType):
|
|
121
|
+
method.auto_readonly = True
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _validate_self_annotation(method: TpyFunction) -> None:
|
|
125
|
+
"""Raise SemanticError for invalid self annotations.
|
|
126
|
+
|
|
127
|
+
Includes the catch-all shape check that used to live in the parser:
|
|
128
|
+
only `Own[Self]`, `auto_own[Self]`, and `auto_readonly[Self]` are
|
|
129
|
+
accepted on `self`.
|
|
130
|
+
"""
|
|
131
|
+
stype = method.self_annotation
|
|
132
|
+
if stype is None:
|
|
133
|
+
return
|
|
134
|
+
|
|
135
|
+
shape_ok = (
|
|
136
|
+
isinstance(stype, (OwnType, AutoOwnType, AutoReadonlyType))
|
|
137
|
+
and isinstance(stype.wrapped, SelfType)
|
|
138
|
+
)
|
|
139
|
+
if not shape_ok:
|
|
140
|
+
raise SemanticError(
|
|
141
|
+
f"Only 'Own[Self]', 'auto_own[Self]', or 'auto_readonly[Self]' "
|
|
142
|
+
f"is allowed as a type annotation for 'self', got '{stype}'",
|
|
143
|
+
loc=method.loc,
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
if isinstance(stype, OwnType) and isinstance(stype.wrapped, SelfType):
|
|
147
|
+
if method.name in _SELF_BARRED_METHODS:
|
|
148
|
+
raise SemanticError(
|
|
149
|
+
f"Own[Self] is not allowed on '{method.name}'",
|
|
150
|
+
loc=method.loc,
|
|
151
|
+
)
|
|
152
|
+
if method.is_readonly:
|
|
153
|
+
raise SemanticError(
|
|
154
|
+
f"Own[Self] cannot be combined with @readonly on method "
|
|
155
|
+
f"'{method.name}'",
|
|
156
|
+
loc=method.loc,
|
|
157
|
+
)
|
|
158
|
+
return
|
|
159
|
+
|
|
160
|
+
if isinstance(stype, AutoOwnType) and isinstance(stype.wrapped, SelfType):
|
|
161
|
+
if method.name in _SELF_BARRED_METHODS:
|
|
162
|
+
raise SemanticError(
|
|
163
|
+
f"auto_own[Self] is not allowed on '{method.name}'",
|
|
164
|
+
loc=method.loc,
|
|
165
|
+
)
|
|
166
|
+
if method.is_readonly:
|
|
167
|
+
raise SemanticError(
|
|
168
|
+
f"auto_own[Self] cannot be combined with @readonly on method "
|
|
169
|
+
f"'{method.name}'",
|
|
170
|
+
loc=method.loc,
|
|
171
|
+
)
|
|
172
|
+
return
|
|
173
|
+
|
|
174
|
+
if (isinstance(stype, AutoReadonlyType)
|
|
175
|
+
and isinstance(stype.wrapped, SelfType)):
|
|
176
|
+
if method.name in _SELF_BARRED_METHODS:
|
|
177
|
+
raise SemanticError(
|
|
178
|
+
f"auto_readonly[Self] is not allowed on '{method.name}'",
|
|
179
|
+
loc=method.loc,
|
|
180
|
+
)
|
|
181
|
+
if method.is_readonly:
|
|
182
|
+
raise SemanticError(
|
|
183
|
+
f"auto_readonly[Self] cannot be combined with @readonly on "
|
|
184
|
+
f"method '{method.name}'",
|
|
185
|
+
loc=method.loc,
|
|
186
|
+
)
|
|
187
|
+
if method.has_auto_readonly_decorator:
|
|
188
|
+
raise SemanticError(
|
|
189
|
+
f"'self: auto_readonly[Self]' cannot be combined with the "
|
|
190
|
+
f"@auto_readonly decorator on method '{method.name}'",
|
|
191
|
+
loc=method.loc,
|
|
192
|
+
)
|
|
193
|
+
return
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def _apply_implicit_auto_readonly(method: TpyFunction) -> None:
|
|
197
|
+
"""Reference-returning dunders (`__deref__`, `__getitem__`, `__span__`)
|
|
198
|
+
with a *reference-typed* return implicitly get dual mutable/const
|
|
199
|
+
overloads. Wrapping the return type with `AutoReadonlyType` reuses the
|
|
200
|
+
existing decorator path: the cloner produces the mutable + const pair.
|
|
201
|
+
|
|
202
|
+
Value-typed returns (Int32, etc.) skip this -- they stay on the
|
|
203
|
+
IMPLICIT_READONLY_METHODS path (single const overload is correct because
|
|
204
|
+
there's no aliasing to mutate). Without this dual-overload synthesis, a
|
|
205
|
+
class with `def __deref__(self) -> SomeRecord:` would be const-only,
|
|
206
|
+
and mutation through the wrapper would silently miscompile at C++
|
|
207
|
+
("assignment of member in read-only object"). Explicit `@readonly` opts
|
|
208
|
+
back out.
|
|
209
|
+
"""
|
|
210
|
+
if method.name not in IMPLICIT_AUTO_READONLY_METHODS:
|
|
211
|
+
return
|
|
212
|
+
# Idempotency: a mutable clone of a prior auto_readonly expansion already
|
|
213
|
+
# has the return type stripped to T; a second pass would re-wrap and
|
|
214
|
+
# re-clone, multiplying the overload count.
|
|
215
|
+
if method.is_auto_readonly_mutable_clone:
|
|
216
|
+
return
|
|
217
|
+
if method.is_readonly or method.readonly_opt_out:
|
|
218
|
+
return
|
|
219
|
+
if method.has_auto_readonly_decorator or method.auto_readonly:
|
|
220
|
+
return
|
|
221
|
+
rtype = method.return_type
|
|
222
|
+
if rtype is None or isinstance(rtype, (AutoReadonlyType, ReadonlyType)):
|
|
223
|
+
return
|
|
224
|
+
# Value-typed returns don't carry aliasing risk; let the IMPLICIT_READONLY
|
|
225
|
+
# path handle them (single const overload).
|
|
226
|
+
if rtype.is_value_type():
|
|
227
|
+
return
|
|
228
|
+
method.return_type = AutoReadonlyType(rtype)
|
|
229
|
+
method.has_auto_readonly_decorator = True
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def _apply_auto_readonly_decorator_wrapping(method: TpyFunction) -> None:
|
|
233
|
+
"""Sugar for @auto_readonly: wrap all eligible params with AutoReadonlyType.
|
|
234
|
+
|
|
235
|
+
The decorator also implies `method.auto_readonly`, so cloning picks it
|
|
236
|
+
up even when the method takes no non-self params to wrap.
|
|
237
|
+
"""
|
|
238
|
+
if not method.has_auto_readonly_decorator:
|
|
239
|
+
return
|
|
240
|
+
method.auto_readonly = True
|
|
241
|
+
method.params = [
|
|
242
|
+
(n,
|
|
243
|
+
AutoReadonlyType(t)
|
|
244
|
+
if (not t.is_value_type()
|
|
245
|
+
and not isinstance(t, (AutoReadonlyType, ReadonlyType)))
|
|
246
|
+
else t)
|
|
247
|
+
for n, t in method.params
|
|
248
|
+
]
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def _detect_per_param_auto_readonly(method: TpyFunction) -> None:
|
|
252
|
+
"""Per-param `auto_readonly[T]` annotations imply the auto_readonly flag."""
|
|
253
|
+
if method.auto_readonly:
|
|
254
|
+
return
|
|
255
|
+
for _, ptype in method.params:
|
|
256
|
+
if has_auto_readonly(ptype):
|
|
257
|
+
method.auto_readonly = True
|
|
258
|
+
return
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def _check_auto_readonly_generic_method(method: TpyFunction) -> None:
|
|
262
|
+
if method.auto_readonly and method.type_params:
|
|
263
|
+
raise SemanticError(
|
|
264
|
+
f"auto_readonly on methods with method-level type parameters "
|
|
265
|
+
f"is not yet supported ('{method.name}')",
|
|
266
|
+
loc=method.loc,
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def _apply_property_setter_wrapping(method: TpyFunction) -> None:
|
|
271
|
+
"""@property setter: first non-self param is an ownership transfer."""
|
|
272
|
+
if not method.is_property_setter or not method.params:
|
|
273
|
+
return
|
|
274
|
+
pname, ptype = method.params[0]
|
|
275
|
+
if not isinstance(ptype, OwnType) and not ptype.is_value_type():
|
|
276
|
+
method.params[0] = (pname, OwnType(ptype))
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
def _clone_auto_readonly(method: TpyFunction) -> list[TpyFunction]:
|
|
280
|
+
"""Expand an auto_readonly method into mutable + const overloads.
|
|
281
|
+
|
|
282
|
+
- Mutable: params/return stripped of AutoReadonlyType, is_readonly=False.
|
|
283
|
+
- Const: params/return with AutoReadonlyType -> ReadonlyType, is_readonly=True.
|
|
284
|
+
|
|
285
|
+
AutoReadonlyType nodes mark where readonly is applied in the const
|
|
286
|
+
overload. The @auto_readonly decorator path wraps all eligible params
|
|
287
|
+
first, so both decorator-driven and per-param annotations converge
|
|
288
|
+
on the same cloning logic.
|
|
289
|
+
"""
|
|
290
|
+
mutable_params = [(n, strip_auto_readonly(t)) for n, t in method.params]
|
|
291
|
+
const_params = [(n, apply_auto_readonly(t)) for n, t in method.params]
|
|
292
|
+
mutable_return = strip_auto_readonly(method.return_type)
|
|
293
|
+
const_return = apply_auto_readonly(method.return_type)
|
|
294
|
+
mutable = dataclasses.replace(
|
|
295
|
+
method,
|
|
296
|
+
params=mutable_params,
|
|
297
|
+
return_type=mutable_return,
|
|
298
|
+
is_readonly=False,
|
|
299
|
+
auto_readonly=False,
|
|
300
|
+
has_auto_readonly_decorator=False,
|
|
301
|
+
auto_readonly_params_resolved=True,
|
|
302
|
+
is_auto_readonly_mutable_clone=True,
|
|
303
|
+
# Clear the derivation source so a second expand pass (per-record
|
|
304
|
+
# run after macros) doesn't re-derive auto_readonly and re-clone.
|
|
305
|
+
self_annotation=None,
|
|
306
|
+
)
|
|
307
|
+
const = dataclasses.replace(
|
|
308
|
+
method,
|
|
309
|
+
params=const_params,
|
|
310
|
+
return_type=const_return,
|
|
311
|
+
body=copy.deepcopy(method.body),
|
|
312
|
+
is_readonly=True,
|
|
313
|
+
auto_readonly=False,
|
|
314
|
+
has_auto_readonly_decorator=False,
|
|
315
|
+
auto_readonly_params_resolved=True,
|
|
316
|
+
defaults=copy.deepcopy(method.defaults),
|
|
317
|
+
self_annotation=None,
|
|
318
|
+
)
|
|
319
|
+
return [mutable, const]
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
def _clone_auto_own(method: TpyFunction) -> list[TpyFunction]:
|
|
323
|
+
"""Expand a `self: auto_own[Self]` method into borrowing + consuming overloads.
|
|
324
|
+
|
|
325
|
+
- Borrowing: is_consuming=False, return stripped of AutoOwnType.
|
|
326
|
+
- Consuming: is_consuming=True, return with AutoOwnType -> OwnType.
|
|
327
|
+
"""
|
|
328
|
+
borrowing_return = strip_auto_own(method.return_type)
|
|
329
|
+
consuming_return = apply_auto_own(method.return_type)
|
|
330
|
+
borrowing = dataclasses.replace(
|
|
331
|
+
method,
|
|
332
|
+
return_type=borrowing_return,
|
|
333
|
+
is_consuming=False,
|
|
334
|
+
auto_own=False,
|
|
335
|
+
is_auto_own_borrowing_clone=True,
|
|
336
|
+
self_annotation=None,
|
|
337
|
+
)
|
|
338
|
+
consuming = dataclasses.replace(
|
|
339
|
+
method,
|
|
340
|
+
return_type=consuming_return,
|
|
341
|
+
body=copy.deepcopy(method.body),
|
|
342
|
+
is_consuming=True,
|
|
343
|
+
auto_own=False,
|
|
344
|
+
defaults=copy.deepcopy(method.defaults),
|
|
345
|
+
self_annotation=None,
|
|
346
|
+
)
|
|
347
|
+
return [borrowing, consuming]
|