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,718 @@
|
|
|
1
|
+
"""Frontend IR node definitions.
|
|
2
|
+
|
|
3
|
+
Plain dataclasses with `kind` discriminators. No methods, no behavior --
|
|
4
|
+
the IR is structural data that lowering walks.
|
|
5
|
+
|
|
6
|
+
M1 set: the nodes needed for a Pascal hello-world program. Subsequent
|
|
7
|
+
milestones extend this set without changing existing shapes.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from dataclasses import dataclass, field
|
|
13
|
+
from enum import Enum
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Union
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
API_VERSION = 1
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass(frozen=True)
|
|
22
|
+
class Loc:
|
|
23
|
+
"""Source location in the original (non-Python) source file.
|
|
24
|
+
|
|
25
|
+
Line and column are 1-based; end_line/end_col are inclusive. `file`
|
|
26
|
+
is the path of the source file the plugin parsed. `source_language`
|
|
27
|
+
tags the plugin that produced this location.
|
|
28
|
+
"""
|
|
29
|
+
file: Path
|
|
30
|
+
line: int
|
|
31
|
+
col: int
|
|
32
|
+
end_line: int
|
|
33
|
+
end_col: int
|
|
34
|
+
source_language: str
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# --- Operator kinds -------------------------------------------------------
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class BinOpKind(Enum):
|
|
41
|
+
"""Binary operators recognised by the IR.
|
|
42
|
+
|
|
43
|
+
Names match `docs/FRONTEND_PLUGIN_DESIGN.md`. M2 only exercises the
|
|
44
|
+
arithmetic set; comparison and logical operators land with control
|
|
45
|
+
flow (M3) and onward, but are listed here so the enum is stable.
|
|
46
|
+
"""
|
|
47
|
+
ADD = "ADD"
|
|
48
|
+
SUB = "SUB"
|
|
49
|
+
MUL = "MUL"
|
|
50
|
+
TRUE_DIV = "TRUE_DIV"
|
|
51
|
+
FLOOR_DIV = "FLOOR_DIV"
|
|
52
|
+
MOD = "MOD"
|
|
53
|
+
POW = "POW"
|
|
54
|
+
BIT_OR = "BIT_OR"
|
|
55
|
+
BIT_XOR = "BIT_XOR"
|
|
56
|
+
BIT_AND = "BIT_AND"
|
|
57
|
+
LSHIFT = "LSHIFT"
|
|
58
|
+
RSHIFT = "RSHIFT"
|
|
59
|
+
LOGICAL_AND = "LOGICAL_AND"
|
|
60
|
+
LOGICAL_OR = "LOGICAL_OR"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class UnaryOpKind(Enum):
|
|
64
|
+
POS = "POS"
|
|
65
|
+
NEG = "NEG"
|
|
66
|
+
NOT = "NOT"
|
|
67
|
+
INVERT = "INVERT"
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class CmpOpKind(Enum):
|
|
71
|
+
"""Comparison operators recognised by the IR."""
|
|
72
|
+
EQ = "EQ"
|
|
73
|
+
NE = "NE"
|
|
74
|
+
LT = "LT"
|
|
75
|
+
LE = "LE"
|
|
76
|
+
GT = "GT"
|
|
77
|
+
GE = "GE"
|
|
78
|
+
IS = "IS"
|
|
79
|
+
IS_NOT = "IS_NOT"
|
|
80
|
+
IN = "IN"
|
|
81
|
+
NOT_IN = "NOT_IN"
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class RangeDir(Enum):
|
|
85
|
+
"""Direction of a `ForRange` loop. Mirrors Pascal's to/downto."""
|
|
86
|
+
ASC = "ASC"
|
|
87
|
+
DESC = "DESC"
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
# --- Type IR --------------------------------------------------------------
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@dataclass
|
|
94
|
+
class TypeTypeArg:
|
|
95
|
+
"""A type-valued generic argument, e.g. `list[T]`'s `T`."""
|
|
96
|
+
kind: str = field(default="TypeTypeArg", init=False)
|
|
97
|
+
value: "TypeExpr" = None # type: ignore[assignment]
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@dataclass
|
|
101
|
+
class IntTypeArg:
|
|
102
|
+
"""An integer-valued generic argument, e.g. `Array[T, N]`'s `N`."""
|
|
103
|
+
kind: str = field(default="IntTypeArg", init=False)
|
|
104
|
+
value: int = 0
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
TypeArg = Union[TypeTypeArg, IntTypeArg]
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@dataclass
|
|
111
|
+
class NamedType:
|
|
112
|
+
"""A type referenced by name, with optional generic args.
|
|
113
|
+
|
|
114
|
+
Mirrors the design's `NamedType("Int32")` shape. Wrapper types
|
|
115
|
+
(Optional, Readonly, Own, Union, Callable, Literal) land as
|
|
116
|
+
separate IR nodes in their respective milestones.
|
|
117
|
+
"""
|
|
118
|
+
kind: str = field(default="NamedType", init=False)
|
|
119
|
+
name: str = ""
|
|
120
|
+
args: tuple[TypeArg, ...] = ()
|
|
121
|
+
loc: Loc | None = None
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@dataclass
|
|
125
|
+
class PointerType:
|
|
126
|
+
"""`Ptr[T]` -- a pointer to a pointee type.
|
|
127
|
+
|
|
128
|
+
Used to model Pascal's `var` (by-reference) parameters: the
|
|
129
|
+
translator emits `PointerType(NamedType("Int32"))` for a `var x:
|
|
130
|
+
integer` parameter, wraps caller args in `take_ptr(...)`, and
|
|
131
|
+
rewrites in-body uses to `deref(...)` reads and `unsafe_store(...)`
|
|
132
|
+
writes. Records and other non-value types pass through TPy's own
|
|
133
|
+
reference conventions and do not need `PointerType`.
|
|
134
|
+
"""
|
|
135
|
+
kind: str = field(default="PointerType", init=False)
|
|
136
|
+
inner: "TypeExpr" = None # type: ignore[assignment]
|
|
137
|
+
loc: Loc | None = None
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@dataclass
|
|
141
|
+
class UnionType:
|
|
142
|
+
"""`A | B | C` -- a Python-style union annotation. Used by
|
|
143
|
+
plugins (e.g. Pascal variant records) to type a discriminated-
|
|
144
|
+
payload field as the union of its variant inner records. Lowers
|
|
145
|
+
to a `TpyUnionRef` so the resolver runs the same union-shape
|
|
146
|
+
pipeline as ordinary Python source."""
|
|
147
|
+
kind: str = field(default="UnionType", init=False)
|
|
148
|
+
members: tuple["TypeExpr", ...] = ()
|
|
149
|
+
loc: Loc | None = None
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
@dataclass
|
|
153
|
+
class CallableType:
|
|
154
|
+
"""`Callable[[P1, P2], R]` -- a function-pointer-style type
|
|
155
|
+
annotation. Used by plugins (e.g. Pascal `type Fn = procedure
|
|
156
|
+
(x: integer);`) to express a first-class callable value's type.
|
|
157
|
+
Lowers to a `TpyCallableRef`. The `params` slot carries TypeExpr
|
|
158
|
+
nodes per parameter (parameter names aren't part of the type
|
|
159
|
+
signature); `return_type=None` lowers to a `None`-returning
|
|
160
|
+
callable (Pascal `procedure`)."""
|
|
161
|
+
kind: str = field(default="CallableType", init=False)
|
|
162
|
+
params: tuple["TypeExpr", ...] = ()
|
|
163
|
+
return_type: "TypeExpr | None" = None
|
|
164
|
+
loc: Loc | None = None
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
# Plugin authors compose types out of the nodes above. Later milestones
|
|
168
|
+
# widen this union with OptionalType / OwnType / ReadonlyType / etc.
|
|
169
|
+
TypeExpr = Union[NamedType, PointerType, UnionType, CallableType]
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
# --- Expressions ----------------------------------------------------------
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
@dataclass
|
|
176
|
+
class StrLit:
|
|
177
|
+
"""String literal expression."""
|
|
178
|
+
kind: str = field(default="StrLit", init=False)
|
|
179
|
+
value: str = ""
|
|
180
|
+
loc: Loc | None = None
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
@dataclass
|
|
184
|
+
class BoolLit:
|
|
185
|
+
"""Boolean literal expression."""
|
|
186
|
+
kind: str = field(default="BoolLit", init=False)
|
|
187
|
+
value: bool = False
|
|
188
|
+
loc: Loc | None = None
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
@dataclass
|
|
192
|
+
class IntLit:
|
|
193
|
+
"""Integer literal expression."""
|
|
194
|
+
kind: str = field(default="IntLit", init=False)
|
|
195
|
+
value: int = 0
|
|
196
|
+
loc: Loc | None = None
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
@dataclass
|
|
200
|
+
class FloatLit:
|
|
201
|
+
"""Floating-point literal expression."""
|
|
202
|
+
kind: str = field(default="FloatLit", init=False)
|
|
203
|
+
value: float = 0.0
|
|
204
|
+
loc: Loc | None = None
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
@dataclass
|
|
208
|
+
class Name:
|
|
209
|
+
"""Identifier reference."""
|
|
210
|
+
kind: str = field(default="Name", init=False)
|
|
211
|
+
ident: str = ""
|
|
212
|
+
loc: Loc | None = None
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
@dataclass
|
|
216
|
+
class Call:
|
|
217
|
+
"""Function call.
|
|
218
|
+
|
|
219
|
+
`type_args` carries explicit type arguments at the call site --
|
|
220
|
+
Pascal needs them for generic-type constructor calls like
|
|
221
|
+
`Array[Int32, 8]()`. `kwargs` is a tuple of `(name, value)` pairs
|
|
222
|
+
-- needed for calls like Python's `print(x, end="")`. `star_args`
|
|
223
|
+
/ `double_star` from the design doc are not used yet; they land
|
|
224
|
+
with later milestones.
|
|
225
|
+
"""
|
|
226
|
+
kind: str = field(default="Call", init=False)
|
|
227
|
+
callee: "Expr" = None # type: ignore[assignment]
|
|
228
|
+
type_args: tuple[TypeArg, ...] = ()
|
|
229
|
+
args: tuple["Expr", ...] = ()
|
|
230
|
+
kwargs: tuple[tuple[str, "Expr"], ...] = ()
|
|
231
|
+
loc: Loc | None = None
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
@dataclass
|
|
235
|
+
class BinOp:
|
|
236
|
+
"""Binary operation."""
|
|
237
|
+
kind: str = field(default="BinOp", init=False)
|
|
238
|
+
op: BinOpKind = BinOpKind.ADD
|
|
239
|
+
lhs: "Expr" = None # type: ignore[assignment]
|
|
240
|
+
rhs: "Expr" = None # type: ignore[assignment]
|
|
241
|
+
loc: Loc | None = None
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
@dataclass
|
|
245
|
+
class UnaryOp:
|
|
246
|
+
"""Unary operation."""
|
|
247
|
+
kind: str = field(default="UnaryOp", init=False)
|
|
248
|
+
op: UnaryOpKind = UnaryOpKind.POS
|
|
249
|
+
operand: "Expr" = None # type: ignore[assignment]
|
|
250
|
+
loc: Loc | None = None
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
@dataclass
|
|
254
|
+
class Attr:
|
|
255
|
+
"""Field access: `target.ident`. The target is an arbitrary
|
|
256
|
+
expression; assignment-target shape (`p.x := v`) reuses this node
|
|
257
|
+
by appearing inside `Assign.targets`."""
|
|
258
|
+
kind: str = field(default="Attr", init=False)
|
|
259
|
+
target: "Expr" = None # type: ignore[assignment]
|
|
260
|
+
ident: str = ""
|
|
261
|
+
loc: Loc | None = None
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
@dataclass
|
|
265
|
+
class Subscript:
|
|
266
|
+
"""Indexed access: `target[index]`. Plugins targeting languages
|
|
267
|
+
with non-zero-based indexing (Pascal, Fortran) compute the offset
|
|
268
|
+
in `index` at translate time -- lowering passes the index through
|
|
269
|
+
unchanged."""
|
|
270
|
+
kind: str = field(default="Subscript", init=False)
|
|
271
|
+
target: "Expr" = None # type: ignore[assignment]
|
|
272
|
+
index: "Expr" = None # type: ignore[assignment]
|
|
273
|
+
loc: Loc | None = None
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
@dataclass
|
|
277
|
+
class Compare:
|
|
278
|
+
"""Comparison expression.
|
|
279
|
+
|
|
280
|
+
Supports Python-style chained form (`a < b < c`) via `ops` /
|
|
281
|
+
`comparators` of length > 1. Plugins from source languages without
|
|
282
|
+
comparison chaining (Pascal, most ALGOL-derived languages) always
|
|
283
|
+
emit length-1 op/comparator tuples.
|
|
284
|
+
"""
|
|
285
|
+
kind: str = field(default="Compare", init=False)
|
|
286
|
+
lhs: "Expr" = None # type: ignore[assignment]
|
|
287
|
+
ops: tuple[CmpOpKind, ...] = ()
|
|
288
|
+
comparators: tuple["Expr", ...] = ()
|
|
289
|
+
loc: Loc | None = None
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
@dataclass
|
|
293
|
+
class SetLit:
|
|
294
|
+
"""Set literal: `{a, b, c}`. Lowers to TpySetLiteral."""
|
|
295
|
+
kind: str = field(default="SetLit", init=False)
|
|
296
|
+
elements: tuple["Expr", ...] = ()
|
|
297
|
+
loc: Loc | None = None
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
@dataclass
|
|
301
|
+
class ListLit:
|
|
302
|
+
"""List literal: `[a, b, c]`. Lowers to TpyArrayLiteral (which
|
|
303
|
+
is TPy's spelling for a Python list literal at the AST level)."""
|
|
304
|
+
kind: str = field(default="ListLit", init=False)
|
|
305
|
+
elements: tuple["Expr", ...] = ()
|
|
306
|
+
loc: Loc | None = None
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
@dataclass
|
|
310
|
+
class NoneLit:
|
|
311
|
+
"""`None` literal -- the null/empty sentinel. Lowers to
|
|
312
|
+
TpyNoneLiteral. Used by plugins that translate a source-language
|
|
313
|
+
null (Pascal `nil`, etc.) to TPy's nullable form."""
|
|
314
|
+
kind: str = field(default="NoneLit", init=False)
|
|
315
|
+
loc: Loc | None = None
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
Expr = Union[StrLit, BoolLit, IntLit, FloatLit, Name, Call, BinOp, UnaryOp,
|
|
319
|
+
Compare, Attr, Subscript, SetLit, ListLit, NoneLit]
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
# --- Statements -----------------------------------------------------------
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
@dataclass
|
|
326
|
+
class ExprStmt:
|
|
327
|
+
"""Expression statement (the expression's value is discarded)."""
|
|
328
|
+
kind: str = field(default="ExprStmt", init=False)
|
|
329
|
+
value: Expr = None # type: ignore[assignment]
|
|
330
|
+
loc: Loc | None = None
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
@dataclass
|
|
334
|
+
class VarDecl:
|
|
335
|
+
"""Local or module-level variable declaration.
|
|
336
|
+
|
|
337
|
+
`mutable=False` marks a constant -- lowering folds those onto TPy's
|
|
338
|
+
`Final[...]` machinery (future milestones; M2 always emits
|
|
339
|
+
`mutable=True`).
|
|
340
|
+
"""
|
|
341
|
+
kind: str = field(default="VarDecl", init=False)
|
|
342
|
+
name: str = ""
|
|
343
|
+
type: TypeExpr | None = None
|
|
344
|
+
init: Expr | None = None
|
|
345
|
+
mutable: bool = True
|
|
346
|
+
loc: Loc | None = None
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
@dataclass
|
|
350
|
+
class Assign:
|
|
351
|
+
"""Assignment statement.
|
|
352
|
+
|
|
353
|
+
`targets` mirrors Python's chained-assignment shape (`a = b = ...`).
|
|
354
|
+
M2 only emits single-target assigns; chaining lands later.
|
|
355
|
+
"""
|
|
356
|
+
kind: str = field(default="Assign", init=False)
|
|
357
|
+
targets: tuple[Expr, ...] = ()
|
|
358
|
+
value: Expr = None # type: ignore[assignment]
|
|
359
|
+
loc: Loc | None = None
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
@dataclass
|
|
363
|
+
class If:
|
|
364
|
+
"""`if cond then-body else else-body`. `else_body` is `()` when
|
|
365
|
+
there is no else clause."""
|
|
366
|
+
kind: str = field(default="If", init=False)
|
|
367
|
+
cond: Expr = None # type: ignore[assignment]
|
|
368
|
+
then_body: tuple["Stmt", ...] = ()
|
|
369
|
+
else_body: tuple["Stmt", ...] = ()
|
|
370
|
+
loc: Loc | None = None
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
@dataclass
|
|
374
|
+
class While:
|
|
375
|
+
"""`while cond: body`."""
|
|
376
|
+
kind: str = field(default="While", init=False)
|
|
377
|
+
cond: Expr = None # type: ignore[assignment]
|
|
378
|
+
body: tuple["Stmt", ...] = ()
|
|
379
|
+
loc: Loc | None = None
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
@dataclass
|
|
383
|
+
class RepeatUntil:
|
|
384
|
+
"""`repeat body until cond`. Body runs once unconditionally; then
|
|
385
|
+
cond is evaluated and the loop continues while cond is *false*."""
|
|
386
|
+
kind: str = field(default="RepeatUntil", init=False)
|
|
387
|
+
body: tuple["Stmt", ...] = ()
|
|
388
|
+
cond: Expr = None # type: ignore[assignment]
|
|
389
|
+
loc: Loc | None = None
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
@dataclass
|
|
393
|
+
class ForRange:
|
|
394
|
+
"""Numeric for loop with explicit endpoints.
|
|
395
|
+
|
|
396
|
+
Mirrors Pascal `for i := lo to hi do` / `for i := hi downto lo do`.
|
|
397
|
+
`inclusive` is True when both endpoints are visited (the Pascal
|
|
398
|
+
convention); future plugins targeting C-style half-open ranges can
|
|
399
|
+
set it False without breaking lowering.
|
|
400
|
+
"""
|
|
401
|
+
kind: str = field(default="ForRange", init=False)
|
|
402
|
+
var: str = ""
|
|
403
|
+
start: Expr = None # type: ignore[assignment]
|
|
404
|
+
end: Expr = None # type: ignore[assignment]
|
|
405
|
+
direction: RangeDir = RangeDir.ASC
|
|
406
|
+
inclusive: bool = True
|
|
407
|
+
body: tuple["Stmt", ...] = ()
|
|
408
|
+
loc: Loc | None = None
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
@dataclass
|
|
412
|
+
class ForEach:
|
|
413
|
+
"""For-each loop over an iterable. Plugins that lower their language's
|
|
414
|
+
sequence iteration to TPy's for-in idiom use this directly; M3 only
|
|
415
|
+
emits `ForRange` (Pascal has no for-in), but `ForEach` lands here
|
|
416
|
+
so the IR is complete for later milestones (arrays/lists in M5+).
|
|
417
|
+
"""
|
|
418
|
+
kind: str = field(default="ForEach", init=False)
|
|
419
|
+
var: str = ""
|
|
420
|
+
iter: Expr = None # type: ignore[assignment]
|
|
421
|
+
body: tuple["Stmt", ...] = ()
|
|
422
|
+
loc: Loc | None = None
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
# --- Match patterns ------------------------------------------------------
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
@dataclass
|
|
429
|
+
class MatchValue:
|
|
430
|
+
"""Literal value pattern: `case 42:` / `case "x":`."""
|
|
431
|
+
kind: str = field(default="MatchValue", init=False)
|
|
432
|
+
value: Expr = None # type: ignore[assignment]
|
|
433
|
+
loc: Loc | None = None
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
@dataclass
|
|
437
|
+
class MatchWildcard:
|
|
438
|
+
"""Wildcard / `else` pattern: matches anything."""
|
|
439
|
+
kind: str = field(default="MatchWildcard", init=False)
|
|
440
|
+
loc: Loc | None = None
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
@dataclass
|
|
444
|
+
class MatchClass:
|
|
445
|
+
"""Class pattern: `case ClassName() [as bind]`. Used by plugins
|
|
446
|
+
(e.g. Pascal variant records) to narrow a union-typed subject to
|
|
447
|
+
one of its alternative classes. The bound name (if set) lets the
|
|
448
|
+
arm body reach the narrowed value's fields without an explicit
|
|
449
|
+
cast."""
|
|
450
|
+
kind: str = field(default="MatchClass", init=False)
|
|
451
|
+
class_name: str = ""
|
|
452
|
+
bind: str | None = None
|
|
453
|
+
loc: Loc | None = None
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
MatchPattern = Union[MatchValue, MatchWildcard, MatchClass]
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
@dataclass
|
|
460
|
+
class MatchCase:
|
|
461
|
+
"""A single case arm in a `Match`."""
|
|
462
|
+
pattern: MatchPattern = None # type: ignore[assignment]
|
|
463
|
+
guard: Expr | None = None
|
|
464
|
+
body: tuple["Stmt", ...] = ()
|
|
465
|
+
loc: Loc | None = None
|
|
466
|
+
|
|
467
|
+
|
|
468
|
+
@dataclass
|
|
469
|
+
class Return:
|
|
470
|
+
"""Return statement. `value=None` for procedure-style returns."""
|
|
471
|
+
kind: str = field(default="Return", init=False)
|
|
472
|
+
value: Expr | None = None
|
|
473
|
+
loc: Loc | None = None
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
@dataclass
|
|
477
|
+
class Raise:
|
|
478
|
+
"""`raise <expr>` -- throw an exception. `value=None` for the
|
|
479
|
+
bare-`raise` re-raise form. Plugins emitting accessor methods
|
|
480
|
+
that need a "this variant isn't live" panic use this with a
|
|
481
|
+
`RuntimeError(...)` constructor as the value."""
|
|
482
|
+
kind: str = field(default="Raise", init=False)
|
|
483
|
+
value: Expr | None = None
|
|
484
|
+
loc: Loc | None = None
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
@dataclass
|
|
488
|
+
class Match:
|
|
489
|
+
"""`match subject: case ...` -- the single switch construct.
|
|
490
|
+
|
|
491
|
+
Pascal `case x of v1: stmt; v2: stmt; else stmt end` lowers here
|
|
492
|
+
with one `MatchCase(MatchValue)` per arm plus an optional
|
|
493
|
+
`MatchCase(MatchWildcard)` for the `else` branch.
|
|
494
|
+
"""
|
|
495
|
+
kind: str = field(default="Match", init=False)
|
|
496
|
+
subject: Expr = None # type: ignore[assignment]
|
|
497
|
+
cases: tuple[MatchCase, ...] = ()
|
|
498
|
+
loc: Loc | None = None
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
@dataclass
|
|
502
|
+
class Break:
|
|
503
|
+
"""`break` -- exit the innermost enclosing loop. Loop nesting is
|
|
504
|
+
determined by the lowered TpyModule's structure, the same way
|
|
505
|
+
Python source `break` resolves."""
|
|
506
|
+
kind: str = field(default="Break", init=False)
|
|
507
|
+
loc: Loc | None = None
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
@dataclass
|
|
511
|
+
class Continue:
|
|
512
|
+
"""`continue` -- skip to the next iteration of the innermost
|
|
513
|
+
enclosing loop."""
|
|
514
|
+
kind: str = field(default="Continue", init=False)
|
|
515
|
+
loc: Loc | None = None
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
Stmt = Union[ExprStmt, VarDecl, Assign, If, While, RepeatUntil,
|
|
519
|
+
ForRange, ForEach, Match, Return, Raise, Break, Continue]
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
# --- Enum declarations ---------------------------------------------------
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
@dataclass
|
|
526
|
+
class EnumValue:
|
|
527
|
+
"""One member of an `Enum`. `value` is optional -- when absent, the
|
|
528
|
+
lowering pass assigns Pascal-style auto-numbered values starting
|
|
529
|
+
at 0."""
|
|
530
|
+
name: str = ""
|
|
531
|
+
value: "Expr | None" = None
|
|
532
|
+
decorators: tuple = ()
|
|
533
|
+
loc: Loc | None = None
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
@dataclass
|
|
537
|
+
class Enum:
|
|
538
|
+
"""Enumeration type declaration."""
|
|
539
|
+
kind: str = field(default="Enum", init=False)
|
|
540
|
+
name: str = ""
|
|
541
|
+
base_type: "NamedType | None" = None
|
|
542
|
+
values: tuple[EnumValue, ...] = ()
|
|
543
|
+
decorators: tuple = ()
|
|
544
|
+
loc: Loc | None = None
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
# --- Record declarations -------------------------------------------------
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
@dataclass
|
|
551
|
+
class Field:
|
|
552
|
+
"""One field on a `Record`. M5 only emits unsubscripted,
|
|
553
|
+
default-less fields; record methods / generic fields / decorators
|
|
554
|
+
are reserved for future milestones."""
|
|
555
|
+
name: str = ""
|
|
556
|
+
type: TypeExpr = None # type: ignore[assignment]
|
|
557
|
+
default: "Expr | None" = None
|
|
558
|
+
decorators: tuple = ()
|
|
559
|
+
loc: Loc | None = None
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
@dataclass
|
|
563
|
+
class Record:
|
|
564
|
+
"""Record (class) declaration.
|
|
565
|
+
|
|
566
|
+
M5 carries only `name` and `fields` -- single inheritance, methods,
|
|
567
|
+
nested records / enums / aliases, decorators, and generic type
|
|
568
|
+
params land in later milestones but the slots stay so plugins can
|
|
569
|
+
grow into them.
|
|
570
|
+
"""
|
|
571
|
+
kind: str = field(default="Record", init=False)
|
|
572
|
+
name: str = ""
|
|
573
|
+
type_params: tuple = ()
|
|
574
|
+
base: "NamedType | None" = None
|
|
575
|
+
fields: tuple[Field, ...] = ()
|
|
576
|
+
methods: tuple = ()
|
|
577
|
+
nested_records: tuple = ()
|
|
578
|
+
nested_enums: tuple = ()
|
|
579
|
+
nested_constants: tuple = ()
|
|
580
|
+
nested_aliases: tuple = ()
|
|
581
|
+
decorators: tuple = ()
|
|
582
|
+
loc: Loc | None = None
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
# --- Function declarations -----------------------------------------------
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
@dataclass
|
|
589
|
+
class Param:
|
|
590
|
+
"""A function parameter. M4 only emits unsubscripted, default-less
|
|
591
|
+
params; defaults / *args / **kwargs are reserved for future
|
|
592
|
+
milestones."""
|
|
593
|
+
name: str = ""
|
|
594
|
+
type: TypeExpr = None # type: ignore[assignment]
|
|
595
|
+
default: Expr | None = None
|
|
596
|
+
loc: Loc | None = None
|
|
597
|
+
|
|
598
|
+
|
|
599
|
+
@dataclass
|
|
600
|
+
class Function:
|
|
601
|
+
"""Top-level function declaration.
|
|
602
|
+
|
|
603
|
+
`is_method=False` for M4 -- methods on records land with M5. The
|
|
604
|
+
field is kept on the node so lowering can route correctly once
|
|
605
|
+
records exist. `type_params` and `decorators` are reserved for
|
|
606
|
+
future milestones.
|
|
607
|
+
|
|
608
|
+
Property accessors (`is_property_getter` / `is_property_setter`)
|
|
609
|
+
let a plugin emit `@property` getter/setter pairs without going
|
|
610
|
+
through decorator-string round-trip; the IR lowering threads
|
|
611
|
+
these directly onto the resulting `TpyFunction`. `property_name`
|
|
612
|
+
on a setter names the property the setter belongs to (e.g. for
|
|
613
|
+
`@foo.setter`, `property_name == 'foo'`).
|
|
614
|
+
"""
|
|
615
|
+
kind: str = field(default="Function", init=False)
|
|
616
|
+
name: str = ""
|
|
617
|
+
type_params: tuple = ()
|
|
618
|
+
params: tuple[Param, ...] = ()
|
|
619
|
+
return_type: TypeExpr | None = None
|
|
620
|
+
body: tuple[Stmt, ...] = ()
|
|
621
|
+
decorators: tuple = ()
|
|
622
|
+
is_method: bool = False
|
|
623
|
+
is_property_getter: bool = False
|
|
624
|
+
is_property_setter: bool = False
|
|
625
|
+
property_name: str | None = None
|
|
626
|
+
loc: Loc | None = None
|
|
627
|
+
|
|
628
|
+
|
|
629
|
+
# --- Imports --------------------------------------------------------------
|
|
630
|
+
|
|
631
|
+
|
|
632
|
+
@dataclass
|
|
633
|
+
class ImportName:
|
|
634
|
+
"""A name imported via `from X import Y as Z`. `local` equals
|
|
635
|
+
`original` when there is no `as` clause."""
|
|
636
|
+
original: str
|
|
637
|
+
local: str
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
@dataclass
|
|
641
|
+
class Import:
|
|
642
|
+
"""`import M [as A]`."""
|
|
643
|
+
kind: str = field(default="Import", init=False)
|
|
644
|
+
module: str = ""
|
|
645
|
+
alias: str | None = None
|
|
646
|
+
loc: Loc | None = None
|
|
647
|
+
|
|
648
|
+
|
|
649
|
+
@dataclass
|
|
650
|
+
class FromImport:
|
|
651
|
+
"""`from M import a [as b], c, ...`."""
|
|
652
|
+
kind: str = field(default="FromImport", init=False)
|
|
653
|
+
module: str = ""
|
|
654
|
+
names: tuple[ImportName, ...] = ()
|
|
655
|
+
loc: Loc | None = None
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
@dataclass
|
|
659
|
+
class StarImport:
|
|
660
|
+
"""`from M import *` -- bring every public name from `M` into the
|
|
661
|
+
importer's unqualified scope. Powers Pascal `uses A, B, C` and any
|
|
662
|
+
other source language with similar wildcard-import semantics. The
|
|
663
|
+
importer-side names list is resolved at compile time by TPy's
|
|
664
|
+
`_expand_star_imports_for_module`, which reads `M`'s public
|
|
665
|
+
surface from its module attribute table.
|
|
666
|
+
"""
|
|
667
|
+
kind: str = field(default="StarImport", init=False)
|
|
668
|
+
module: str = ""
|
|
669
|
+
loc: Loc | None = None
|
|
670
|
+
|
|
671
|
+
|
|
672
|
+
ImportDecl = Union[Import, FromImport, StarImport]
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
# --- Directives -----------------------------------------------------------
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
@dataclass
|
|
679
|
+
class FrontendDirectives:
|
|
680
|
+
"""Module-level directives.
|
|
681
|
+
|
|
682
|
+
Mirrors `tpyc.parse.nodes.ModuleDirectives`. M1 leaves everything at
|
|
683
|
+
its default; only relevant when a plugin emits native C++ includes,
|
|
684
|
+
link libs, or marks itself as a native binding module.
|
|
685
|
+
"""
|
|
686
|
+
cpp_includes: tuple[tuple[str, str | None], ...] = () # (header, platform_filter)
|
|
687
|
+
link_libs: tuple[tuple[str, str | None], ...] = ()
|
|
688
|
+
third_party_deps: tuple[tuple[str, str | None], ...] = ()
|
|
689
|
+
native_module: bool = False
|
|
690
|
+
cpp_namespace: str | None = None
|
|
691
|
+
|
|
692
|
+
|
|
693
|
+
# --- Module ---------------------------------------------------------------
|
|
694
|
+
|
|
695
|
+
|
|
696
|
+
@dataclass
|
|
697
|
+
class FrontendModule:
|
|
698
|
+
"""A frontend IR module.
|
|
699
|
+
|
|
700
|
+
The plugin's `parse()` returns one of these. Lowering converts it
|
|
701
|
+
into a `tpyc.parse.nodes.TpyModule`.
|
|
702
|
+
|
|
703
|
+
M1 carries only top-level statements + imports. Records, enums,
|
|
704
|
+
functions, type aliases, constants are typed as empty tuples now
|
|
705
|
+
and populated by later milestones.
|
|
706
|
+
"""
|
|
707
|
+
api_version: int = API_VERSION
|
|
708
|
+
qname: str = ""
|
|
709
|
+
source_language: str = ""
|
|
710
|
+
source_lines: tuple[str, ...] = ()
|
|
711
|
+
imports: tuple[ImportDecl, ...] = ()
|
|
712
|
+
type_aliases: tuple = ()
|
|
713
|
+
constants: tuple = ()
|
|
714
|
+
enums: tuple["Enum", ...] = ()
|
|
715
|
+
records: tuple["Record", ...] = ()
|
|
716
|
+
functions: tuple["Function", ...] = ()
|
|
717
|
+
top_level_stmts: tuple[Stmt, ...] = ()
|
|
718
|
+
directives: FrontendDirectives = field(default_factory=FrontendDirectives)
|