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
tpyc/test_parse.py
ADDED
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
"""Tests for parser utilities."""
|
|
2
|
+
|
|
3
|
+
import ast
|
|
4
|
+
import pytest
|
|
5
|
+
from .parse import RelativeImportKey, Parser, ParseError
|
|
6
|
+
from .parse.imports import (
|
|
7
|
+
get_tpy_exports, scan_star_exports, NonLiteralAllError, read_module_all,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class TestRelativeImportKey:
|
|
12
|
+
def test_roundtrip_simple(self):
|
|
13
|
+
key = RelativeImportKey(level=1, line=10, col=0, partial="")
|
|
14
|
+
assert RelativeImportKey.decode(key.encode()) == key
|
|
15
|
+
|
|
16
|
+
def test_roundtrip_with_partial(self):
|
|
17
|
+
key = RelativeImportKey(level=2, line=5, col=4, partial="utils")
|
|
18
|
+
assert RelativeImportKey.decode(key.encode()) == key
|
|
19
|
+
|
|
20
|
+
def test_roundtrip_dotted_partial(self):
|
|
21
|
+
key = RelativeImportKey(level=1, line=99, col=12, partial="pkg.sub")
|
|
22
|
+
assert RelativeImportKey.decode(key.encode()) == key
|
|
23
|
+
|
|
24
|
+
def test_is_placeholder_positive(self):
|
|
25
|
+
key = RelativeImportKey(level=1, line=1, col=0, partial="mod")
|
|
26
|
+
assert RelativeImportKey.is_placeholder(key.encode())
|
|
27
|
+
|
|
28
|
+
def test_is_placeholder_negative(self):
|
|
29
|
+
assert not RelativeImportKey.is_placeholder("mymodule")
|
|
30
|
+
assert not RelativeImportKey.is_placeholder("__init__")
|
|
31
|
+
assert not RelativeImportKey.is_placeholder("")
|
|
32
|
+
|
|
33
|
+
def test_prefix_cannot_collide_with_identifiers(self):
|
|
34
|
+
encoded = RelativeImportKey(level=1, line=1, col=0, partial="").encode()
|
|
35
|
+
assert "\x00" in encoded
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class TestTpyExports:
|
|
39
|
+
"""Tests for get_tpy_exports() reading __all__ from tpy/__init__.py."""
|
|
40
|
+
|
|
41
|
+
def test_returns_nonempty_frozenset(self):
|
|
42
|
+
exports = get_tpy_exports()
|
|
43
|
+
assert isinstance(exports, frozenset)
|
|
44
|
+
assert len(exports) > 0
|
|
45
|
+
|
|
46
|
+
def test_contains_core_types(self):
|
|
47
|
+
exports = get_tpy_exports()
|
|
48
|
+
for name in ["Int32", "Float32", "Span", "Array", "Ptr", "Own"]:
|
|
49
|
+
assert name in exports, f"{name} missing from tpy exports"
|
|
50
|
+
|
|
51
|
+
def test_contains_decorators(self):
|
|
52
|
+
exports = get_tpy_exports()
|
|
53
|
+
for name in ["readonly", "noalloc", "nocopy", "pure"]:
|
|
54
|
+
assert name in exports, f"{name} missing from tpy exports"
|
|
55
|
+
|
|
56
|
+
def test_contains_parser_keywords(self):
|
|
57
|
+
exports = get_tpy_exports()
|
|
58
|
+
assert "auto_readonly" in exports
|
|
59
|
+
assert "auto_own" in exports
|
|
60
|
+
|
|
61
|
+
def test_no_python_builtins(self):
|
|
62
|
+
"""__all__ should not include Python builtins like int, str, float."""
|
|
63
|
+
exports = get_tpy_exports()
|
|
64
|
+
for name in ["int", "float", "str", "bool", "None"]:
|
|
65
|
+
assert name not in exports, f"Python builtin {name} should not be in tpy exports"
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class TestStarImportResolution:
|
|
69
|
+
"""Tests for 'from tpy import *' name resolution."""
|
|
70
|
+
|
|
71
|
+
def test_star_import_resolves_types(self):
|
|
72
|
+
p = Parser()
|
|
73
|
+
# All core tpy types should resolve with star import
|
|
74
|
+
module = p.parse("from tpy import *\ndef f(x: Span[Int32]) -> Int32:\n return x[0]\n")
|
|
75
|
+
assert module.tpy_star_import is True
|
|
76
|
+
|
|
77
|
+
def test_star_import_resolves_decorators(self):
|
|
78
|
+
p = Parser()
|
|
79
|
+
module = p.parse("from tpy import *\n@readonly\ndef f(x: Int32) -> Int32:\n return x\n")
|
|
80
|
+
assert module.tpy_star_import is True
|
|
81
|
+
|
|
82
|
+
def test_star_import_does_not_resolve_unknown(self):
|
|
83
|
+
"""Names not in __all__ should not resolve as tpy imports."""
|
|
84
|
+
p = Parser()
|
|
85
|
+
module = p.parse("from tpy import *\ndef f(x: Int32) -> Int32:\n return x\n")
|
|
86
|
+
# Int32 should resolve, but a name not in exports should not
|
|
87
|
+
source = module.imports.get("tpy")
|
|
88
|
+
assert source is not None
|
|
89
|
+
exported_locals = {local for _, local in source}
|
|
90
|
+
assert "Int32" in exported_locals
|
|
91
|
+
assert "not_a_tpy_name" not in exported_locals
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class TestParserStateIsolation:
|
|
95
|
+
"""Verify that `Parser.parse()` resets import-related state between calls.
|
|
96
|
+
|
|
97
|
+
Scope of these tests (narrowed in Phase F.3b.5): we verify that the
|
|
98
|
+
second parse's `module.imports` does not include the first parse's
|
|
99
|
+
imports, AND that invoking the attached `module.resolver` on the
|
|
100
|
+
second parse's AST refs raises (because the required import is
|
|
101
|
+
absent from the parser's current state). They do NOT verify that
|
|
102
|
+
modules produced by separate `parse()` calls hold independent
|
|
103
|
+
resolvers -- in this codebase `resolver` is the same bound method
|
|
104
|
+
across parses on the same Parser instance, so calling the first
|
|
105
|
+
module's resolver AFTER the second parse will see the second
|
|
106
|
+
parse's state. That sharing is safe in production (each module
|
|
107
|
+
gets a fresh Parser) and out of scope for these tests.
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
def test_module_alias_does_not_leak(self):
|
|
111
|
+
p = Parser()
|
|
112
|
+
# First parse has 'import typing as t'
|
|
113
|
+
p.parse("import typing as t\nfrom tpy import Int32\ndef f(x: t.Optional[Int32]) -> Int32:\n return Int32(0)\n")
|
|
114
|
+
# Second parse has no typing import -- t.Optional must fail to resolve
|
|
115
|
+
m = p.parse("from tpy import Int32\ndef f(x: t.Optional[Int32]) -> Int32:\n return Int32(0)\n")
|
|
116
|
+
assert "typing" not in m.imports
|
|
117
|
+
func = next(f for f in m.functions if f.name == "f")
|
|
118
|
+
with pytest.raises(ParseError):
|
|
119
|
+
m.resolver.resolve(func.params[0][1])
|
|
120
|
+
|
|
121
|
+
def test_tpy_star_import_does_not_leak(self):
|
|
122
|
+
p = Parser()
|
|
123
|
+
# First parse has 'from tpy import *'
|
|
124
|
+
p.parse("from tpy import *\ndef f(x: Int32) -> Int32:\n return x\n")
|
|
125
|
+
# Second parse has no tpy import -- Int32 must fail to resolve
|
|
126
|
+
m = p.parse("def f(x: Int32) -> Int32:\n return x\n")
|
|
127
|
+
assert not m.tpy_star_import
|
|
128
|
+
func = next(f for f in m.functions if f.name == "f")
|
|
129
|
+
with pytest.raises(ParseError):
|
|
130
|
+
m.resolver.resolve(func.params[0][1])
|
|
131
|
+
|
|
132
|
+
def test_typing_import_does_not_leak(self):
|
|
133
|
+
p = Parser()
|
|
134
|
+
# First parse has 'from typing import Optional'
|
|
135
|
+
p.parse("from typing import Optional\nfrom tpy import Int32\ndef f(x: Optional[Int32]) -> Int32:\n return Int32(0)\n")
|
|
136
|
+
# Second parse has no typing import -- Optional must fail to resolve
|
|
137
|
+
m = p.parse("from tpy import Int32\ndef f(x: Optional[Int32]) -> Int32:\n return Int32(0)\n")
|
|
138
|
+
typing_source = m.imports.get("typing")
|
|
139
|
+
assert typing_source is None or "Optional" not in {orig for orig, _ in (typing_source or set())}
|
|
140
|
+
func = next(f for f in m.functions if f.name == "f")
|
|
141
|
+
with pytest.raises(ParseError):
|
|
142
|
+
m.resolver.resolve(func.params[0][1])
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class TestScanStarExports:
|
|
146
|
+
"""Tests for scan_star_exports()."""
|
|
147
|
+
|
|
148
|
+
def test_with_all(self):
|
|
149
|
+
source = '__all__ = ["foo", "bar"]\ndef foo(): pass\ndef bar(): pass\ndef baz(): pass\n'
|
|
150
|
+
assert scan_star_exports(source) == frozenset({"foo", "bar"})
|
|
151
|
+
|
|
152
|
+
def test_without_all_functions(self):
|
|
153
|
+
source = "def foo(): pass\ndef bar(): pass\n"
|
|
154
|
+
assert scan_star_exports(source) == frozenset({"foo", "bar"})
|
|
155
|
+
|
|
156
|
+
def test_without_all_classes(self):
|
|
157
|
+
source = "class Foo: pass\nclass Bar: pass\n"
|
|
158
|
+
assert scan_star_exports(source) == frozenset({"Foo", "Bar"})
|
|
159
|
+
|
|
160
|
+
def test_without_all_assignments(self):
|
|
161
|
+
source = "X = 1\nY = 2\n"
|
|
162
|
+
assert scan_star_exports(source) == frozenset({"X", "Y"})
|
|
163
|
+
|
|
164
|
+
def test_without_all_annotated_assignments(self):
|
|
165
|
+
source = "x: int = 1\n"
|
|
166
|
+
assert scan_star_exports(source) == frozenset({"x"})
|
|
167
|
+
|
|
168
|
+
def test_underscore_filtered(self):
|
|
169
|
+
source = "def _private(): pass\ndef public(): pass\nclass _Internal: pass\n_x = 1\n"
|
|
170
|
+
assert scan_star_exports(source) == frozenset({"public"})
|
|
171
|
+
|
|
172
|
+
def test_imports_included_without_all(self):
|
|
173
|
+
source = "from foo import bar\ndef baz(): pass\n"
|
|
174
|
+
assert scan_star_exports(source) == frozenset({"bar", "baz"})
|
|
175
|
+
|
|
176
|
+
def test_all_overrides_definitions(self):
|
|
177
|
+
source = '__all__ = ["x"]\ndef x(): pass\ndef y(): pass\n'
|
|
178
|
+
assert scan_star_exports(source) == frozenset({"x"})
|
|
179
|
+
|
|
180
|
+
def test_empty_module(self):
|
|
181
|
+
assert scan_star_exports("") == frozenset()
|
|
182
|
+
|
|
183
|
+
def test_mixed_definitions(self):
|
|
184
|
+
source = "def add(): pass\nclass Point: pass\nShape = None\n"
|
|
185
|
+
assert scan_star_exports(source) == frozenset({"add", "Point", "Shape"})
|
|
186
|
+
|
|
187
|
+
def test_non_literal_all_raises(self):
|
|
188
|
+
source = '__all__ = _base + ["extra"]\ndef foo(): pass\ndef bar(): pass\n'
|
|
189
|
+
with pytest.raises(NonLiteralAllError):
|
|
190
|
+
scan_star_exports(source)
|
|
191
|
+
|
|
192
|
+
def test_annotated_all(self):
|
|
193
|
+
source = '__all__: list[str] = ["foo"]\ndef foo(): pass\ndef bar(): pass\n'
|
|
194
|
+
assert scan_star_exports(source) == frozenset({"foo"})
|
|
195
|
+
|
|
196
|
+
def test_last_all_wins(self):
|
|
197
|
+
source = '__all__ = ["a"]\n__all__ = ["b"]\ndef a(): pass\ndef b(): pass\n'
|
|
198
|
+
assert scan_star_exports(source) == frozenset({"b"})
|
|
199
|
+
|
|
200
|
+
def test_underscore_import_filtered(self):
|
|
201
|
+
source = "from foo import _private, public\n"
|
|
202
|
+
assert scan_star_exports(source) == frozenset({"public"})
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
class TestReadModuleAll:
|
|
206
|
+
"""Tests for read_module_all()."""
|
|
207
|
+
|
|
208
|
+
def _parse(self, source: str) -> ast.Module:
|
|
209
|
+
return ast.parse(source)
|
|
210
|
+
|
|
211
|
+
def test_no_all_returns_none(self):
|
|
212
|
+
assert read_module_all(self._parse("x = 1\ndef foo(): pass\n")) is None
|
|
213
|
+
|
|
214
|
+
def test_empty_module_returns_none(self):
|
|
215
|
+
assert read_module_all(self._parse("")) is None
|
|
216
|
+
|
|
217
|
+
def test_literal_list(self):
|
|
218
|
+
result = read_module_all(self._parse('__all__ = ["foo", "bar"]\n'))
|
|
219
|
+
assert result is not None
|
|
220
|
+
assert result[0] == frozenset({"foo", "bar"})
|
|
221
|
+
assert result[1].line == 1
|
|
222
|
+
|
|
223
|
+
def test_empty_literal_list(self):
|
|
224
|
+
# `__all__ = []` is the Python idiom for "export nothing"; the
|
|
225
|
+
# empty frozenset must come through cleanly here so the
|
|
226
|
+
# downstream variable-deduction shortcut in
|
|
227
|
+
# `sema/local_deduction.py` (which infers `list[str]` for this
|
|
228
|
+
# exact shape) has the right metadata to work with.
|
|
229
|
+
result = read_module_all(self._parse('__all__ = []\n'))
|
|
230
|
+
assert result is not None
|
|
231
|
+
assert result[0] == frozenset()
|
|
232
|
+
assert result[1].line == 1
|
|
233
|
+
|
|
234
|
+
def test_literal_tuple(self):
|
|
235
|
+
result = read_module_all(self._parse('__all__ = ("foo",)\n'))
|
|
236
|
+
assert result is not None
|
|
237
|
+
assert result[0] == frozenset({"foo"})
|
|
238
|
+
|
|
239
|
+
def test_literal_set(self):
|
|
240
|
+
result = read_module_all(self._parse('__all__ = {"foo", "bar"}\n'))
|
|
241
|
+
assert result is not None
|
|
242
|
+
assert result[0] == frozenset({"foo", "bar"})
|
|
243
|
+
|
|
244
|
+
def test_annotated_all(self):
|
|
245
|
+
result = read_module_all(self._parse('__all__: list[str] = ["foo"]\n'))
|
|
246
|
+
assert result is not None
|
|
247
|
+
assert result[0] == frozenset({"foo"})
|
|
248
|
+
|
|
249
|
+
def test_last_assignment_wins(self):
|
|
250
|
+
result = read_module_all(
|
|
251
|
+
self._parse('__all__ = ["a"]\n__all__ = ["b"]\n'))
|
|
252
|
+
assert result is not None
|
|
253
|
+
assert result[0] == frozenset({"b"})
|
|
254
|
+
# Line should be the line of the *winning* assignment's RHS.
|
|
255
|
+
assert result[1].line == 2
|
|
256
|
+
|
|
257
|
+
def test_non_literal_raises(self):
|
|
258
|
+
with pytest.raises(NonLiteralAllError):
|
|
259
|
+
read_module_all(self._parse('__all__ = _base + ["x"]\n'))
|
|
260
|
+
|
|
261
|
+
def test_annotated_then_plain(self):
|
|
262
|
+
# Mix of AnnAssign followed by plain Assign -- last wins.
|
|
263
|
+
source = '__all__: list[str] = ["a"]\n__all__ = ["b"]\n'
|
|
264
|
+
result = read_module_all(self._parse(source))
|
|
265
|
+
assert result is not None
|
|
266
|
+
assert result[0] == frozenset({"b"})
|
|
267
|
+
|
|
268
|
+
def test_conditional_all_ignored(self):
|
|
269
|
+
# read_module_all walks only top-level children, so `__all__`
|
|
270
|
+
# nested inside an `if` / `try` / function body is invisible.
|
|
271
|
+
# Pins this boundary; CPython evaluates it at import time.
|
|
272
|
+
source = 'if True:\n __all__ = ["x"]\n'
|
|
273
|
+
assert read_module_all(self._parse(source)) is None
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
class TestUserModuleStarImport:
|
|
277
|
+
"""Star imports from user modules are deferred: parser records a
|
|
278
|
+
placeholder, Compiler._expand_star_imports_for_module fills the
|
|
279
|
+
actual name set against the source module's per-attribute table at
|
|
280
|
+
compile time. The unit tests below pin the parser side of that
|
|
281
|
+
contract -- end-to-end expansion is covered by the
|
|
282
|
+
`tests/cases/imports/star_import_*` snippets."""
|
|
283
|
+
|
|
284
|
+
def test_user_star_import_records_placeholder(self):
|
|
285
|
+
p = Parser()
|
|
286
|
+
module = p.parse("from mymod import *\ndef f() -> None:\n pass\n")
|
|
287
|
+
# Parser leaves a placeholder set; expansion happens at compile time.
|
|
288
|
+
assert "mymod" in module.star_imports
|
|
289
|
+
assert module.imports.get("mymod") == set()
|
|
290
|
+
|
|
291
|
+
def test_user_star_import_unknown_module_defers_to_compile(self):
|
|
292
|
+
# Parser no longer errors on unknown user modules in star imports
|
|
293
|
+
# (Compiler._process_user_import handles the not-found check
|
|
294
|
+
# downstream). The parser path is purely syntactic.
|
|
295
|
+
p = Parser()
|
|
296
|
+
module = p.parse("from unknown import *\n")
|
|
297
|
+
assert "unknown" in module.star_imports
|
|
298
|
+
|
|
299
|
+
def test_tpy_star_import_still_tracked(self):
|
|
300
|
+
p = Parser()
|
|
301
|
+
module = p.parse("from tpy import *\ndef f(x: Int32) -> Int32:\n return x\n")
|
|
302
|
+
assert module.tpy_star_import is True
|
|
303
|
+
assert "tpy" in module.star_imports
|