semantifold 0.1.1 → 0.3.0
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.
- package/README.md +42 -10
- package/build/index.d.ts +32 -3
- package/build/index.d.ts.map +1 -1
- package/build/index.js +99 -4
- package/build/src/acceptance.d.ts +32 -0
- package/build/src/acceptance.d.ts.map +1 -0
- package/build/src/acceptance.js +358 -0
- package/build/src/array.d.ts +7 -0
- package/build/src/array.d.ts.map +1 -0
- package/build/src/array.js +18 -0
- package/build/src/artifact-path.d.ts +13 -0
- package/build/src/artifact-path.d.ts.map +1 -0
- package/build/src/artifact-path.js +30 -0
- package/build/src/artifacts.d.ts +7 -0
- package/build/src/artifacts.d.ts.map +1 -0
- package/build/src/artifacts.js +389 -0
- package/build/src/backends/c-runtime.d.ts +3 -0
- package/build/src/backends/c-runtime.d.ts.map +1 -0
- package/build/src/backends/c-runtime.js +151 -0
- package/build/src/backends/c-validation.d.ts +12 -0
- package/build/src/backends/c-validation.d.ts.map +1 -0
- package/build/src/backends/c-validation.js +85 -0
- package/build/src/backends/c.d.ts +31 -0
- package/build/src/backends/c.d.ts.map +1 -0
- package/build/src/backends/c.js +308 -0
- package/build/src/backends/cpp-runtime.d.ts +3 -0
- package/build/src/backends/cpp-runtime.d.ts.map +1 -0
- package/build/src/backends/cpp-runtime.js +99 -0
- package/build/src/backends/cpp-validation.d.ts +9 -0
- package/build/src/backends/cpp-validation.d.ts.map +1 -0
- package/build/src/backends/cpp-validation.js +74 -0
- package/build/src/backends/cpp.d.ts +16 -0
- package/build/src/backends/cpp.d.ts.map +1 -0
- package/build/src/backends/cpp.js +285 -0
- package/build/src/backends/csharp.d.ts +20 -0
- package/build/src/backends/csharp.d.ts.map +1 -0
- package/build/src/backends/csharp.js +259 -0
- package/build/src/backends/go.d.ts +20 -0
- package/build/src/backends/go.d.ts.map +1 -0
- package/build/src/backends/go.js +374 -0
- package/build/src/backends/identifiers.d.ts +12 -0
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +79 -2
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +27 -37
- package/build/src/backends/native-validation.d.ts +9 -0
- package/build/src/backends/native-validation.d.ts.map +1 -0
- package/build/src/backends/native-validation.js +59 -0
- package/build/src/backends/ordered-expressions.d.ts +74 -0
- package/build/src/backends/ordered-expressions.d.ts.map +1 -0
- package/build/src/backends/ordered-expressions.js +159 -0
- package/build/src/backends/python.d.ts +8 -0
- package/build/src/backends/python.d.ts.map +1 -0
- package/build/src/backends/python.js +162 -0
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +8 -2
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +67 -19
- package/build/src/binary-mapping.d.ts +32 -0
- package/build/src/binary-mapping.d.ts.map +1 -0
- package/build/src/binary-mapping.js +285 -0
- package/build/src/diagnostic.d.ts +36 -4
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +42 -3
- package/build/src/frontends/c-parser.d.ts +20 -0
- package/build/src/frontends/c-parser.d.ts.map +1 -0
- package/build/src/frontends/c-parser.js +14 -0
- package/build/src/frontends/c.d.ts +220 -0
- package/build/src/frontends/c.d.ts.map +1 -0
- package/build/src/frontends/c.js +750 -0
- package/build/src/frontends/cpp-parser.d.ts +11 -0
- package/build/src/frontends/cpp-parser.d.ts.map +1 -0
- package/build/src/frontends/cpp-parser.js +15 -0
- package/build/src/frontends/cpp.d.ts +227 -0
- package/build/src/frontends/cpp.d.ts.map +1 -0
- package/build/src/frontends/cpp.js +784 -0
- package/build/src/frontends/csharp.d.ts +14 -0
- package/build/src/frontends/csharp.d.ts.map +1 -0
- package/build/src/frontends/csharp.js +708 -0
- package/build/src/frontends/go.d.ts +15 -0
- package/build/src/frontends/go.d.ts.map +1 -0
- package/build/src/frontends/go.js +712 -0
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +5 -23
- package/build/src/frontends/python.d.ts +14 -0
- package/build/src/frontends/python.d.ts.map +1 -0
- package/build/src/frontends/python.js +615 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +21 -1
- package/build/src/language-registry.d.ts +113 -0
- package/build/src/language-registry.d.ts.map +1 -0
- package/build/src/language-registry.js +421 -0
- package/build/src/mapping.js +3 -2
- package/build/src/semantic/location.d.ts +7 -0
- package/build/src/semantic/location.d.ts.map +1 -1
- package/build/src/semantic/location.js +10 -1
- package/build/src/semantic/provenance.js +3 -3
- package/build/src/semantic/types.d.ts +399 -2
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +110 -2
- package/build/src/subprocess.d.ts +38 -0
- package/build/src/subprocess.d.ts.map +1 -0
- package/build/src/subprocess.js +233 -0
- package/build/src/timeout.d.ts +8 -0
- package/build/src/timeout.d.ts.map +1 -0
- package/build/src/timeout.js +11 -0
- package/build/src/toolchains.d.ts +107 -0
- package/build/src/toolchains.d.ts.map +1 -0
- package/build/src/toolchains.js +417 -0
- package/docs/architecture.md +23 -5
- package/docs/c.md +60 -0
- package/docs/cpp.md +61 -0
- package/docs/goals.md +4 -2
- package/docs/language-support.md +46 -6
- package/docs/parser-qualification.md +219 -0
- package/docs/plans/2026-09-05-standard-library-portability.md +46 -0
- package/docs/source-maps.md +38 -5
- package/docs/standard-library-portability.md +190 -0
- package/docs/testing.md +131 -3
- package/index.js +109 -4
- package/node_modules/node-addon-api/LICENSE.md +9 -0
- package/node_modules/node-addon-api/README.md +95 -0
- package/node_modules/node-addon-api/common.gypi +21 -0
- package/node_modules/node-addon-api/except.gypi +25 -0
- package/node_modules/node-addon-api/index.js +14 -0
- package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
- package/node_modules/node-addon-api/napi-inl.h +7250 -0
- package/node_modules/node-addon-api/napi.h +3463 -0
- package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
- package/node_modules/node-addon-api/node_api.gyp +9 -0
- package/node_modules/node-addon-api/noexcept.gypi +26 -0
- package/node_modules/node-addon-api/nothing.c +0 -0
- package/node_modules/node-addon-api/package-support.json +21 -0
- package/node_modules/node-addon-api/package.json +481 -0
- package/node_modules/node-addon-api/tools/README.md +73 -0
- package/node_modules/node-addon-api/tools/check-napi.js +99 -0
- package/node_modules/node-addon-api/tools/clang-format.js +71 -0
- package/node_modules/node-addon-api/tools/conversion.js +301 -0
- package/node_modules/node-gyp-build/LICENSE +21 -0
- package/node_modules/node-gyp-build/README.md +58 -0
- package/node_modules/node-gyp-build/SECURITY.md +5 -0
- package/node_modules/node-gyp-build/bin.js +84 -0
- package/node_modules/node-gyp-build/build-test.js +19 -0
- package/node_modules/node-gyp-build/index.js +6 -0
- package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
- package/node_modules/node-gyp-build/optional.js +7 -0
- package/node_modules/node-gyp-build/package.json +43 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/LICENSE +15 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +7 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/README.md +90 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/binding.gyp +79 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/index.js +895 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/package.json +62 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.cc +106 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.cc +1056 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.cc +298 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.cc +383 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.h +39 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.cc +307 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/tree-sitter.d.ts +211 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +221 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +299 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +419 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +14 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +774 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2151 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +230 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4134 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1060 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +382 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +165 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +714 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +50 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +23 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1294 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1823 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/README.md +18 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/binding.gyp +29 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/grammar.js +1470 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/package.json +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/highlights.scm +81 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/tags.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/grammar.json +9735 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/node-types.json +4614 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/parser.c +119615 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter-c.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter.json +43 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/README.md +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/grammar.js +1436 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/package.json +61 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/highlights.scm +70 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/injections.scm +3 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/tags.scm +15 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/grammar.json +17084 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/node-types.json +7997 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/parser.c +530368 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/scanner.c +148 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter-cpp.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter.json +55 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +152 -0
- package/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/tree-sitter/README.md +128 -0
- package/node_modules/tree-sitter/binding.gyp +88 -0
- package/node_modules/tree-sitter/index.js +950 -0
- package/node_modules/tree-sitter/package.json +76 -0
- package/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/tree-sitter/src/language.cc +105 -0
- package/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/tree-sitter/src/node.cc +1088 -0
- package/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/tree-sitter/src/parser.cc +332 -0
- package/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/tree-sitter/src/query.cc +425 -0
- package/node_modules/tree-sitter/src/query.h +40 -0
- package/node_modules/tree-sitter/src/tree.cc +316 -0
- package/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/tree-sitter/tree-sitter.d.ts +1083 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1478 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +523 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +483 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +54 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +875 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2297 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +286 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +241 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4347 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +912 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1034 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +716 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +75 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +137 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1314 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1937 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/package.json +24 -6
- package/src/acceptance.js +380 -0
- package/src/array.js +19 -0
- package/src/artifact-path.js +34 -0
- package/src/artifacts.js +420 -0
- package/src/backends/c-runtime.js +151 -0
- package/src/backends/c-validation.js +83 -0
- package/src/backends/c.js +308 -0
- package/src/backends/cpp-runtime.js +99 -0
- package/src/backends/cpp-validation.js +70 -0
- package/src/backends/cpp.js +285 -0
- package/src/backends/csharp.js +270 -0
- package/src/backends/go.js +383 -0
- package/src/backends/identifiers.js +80 -1
- package/src/backends/index.js +23 -32
- package/src/backends/native-validation.js +64 -0
- package/src/backends/ordered-expressions.js +161 -0
- package/src/backends/python.js +175 -0
- package/src/backends/scalars.js +8 -1
- package/src/backends/shared.js +64 -17
- package/src/binary-mapping.js +305 -0
- package/src/diagnostic.js +34 -2
- package/src/frontends/c-parser.js +17 -0
- package/src/frontends/c.js +780 -0
- package/src/frontends/cpp-parser.js +18 -0
- package/src/frontends/cpp.js +816 -0
- package/src/frontends/csharp.js +759 -0
- package/src/frontends/go.js +770 -0
- package/src/frontends/index.js +5 -20
- package/src/frontends/python.js +689 -0
- package/src/frontends/scalars.js +20 -0
- package/src/language-registry.js +454 -0
- package/src/mapping.js +2 -1
- package/src/semantic/location.js +10 -0
- package/src/semantic/provenance.js +2 -2
- package/src/semantic/types.js +124 -1
- package/src/subprocess.js +232 -0
- package/src/timeout.js +12 -0
- package/src/toolchains.js +448 -0
- package/tsconfig.json +1 -0
package/src/artifacts.js
ADDED
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import {decodedMappings, encodedMappings, presortedDecodedMap, TraceMap} from "@jridgewell/trace-mapping"
|
|
4
|
+
import {isDenseArray} from "./array.js"
|
|
5
|
+
import {isSafeArtifactPath, isValidFilenameMetadata} from "./artifact-path.js"
|
|
6
|
+
import {finalizeByteMapping} from "./binary-mapping.js"
|
|
7
|
+
import {SemantifoldDiagnostic} from "./diagnostic.js"
|
|
8
|
+
import {finalizeMapping, toSourceMapV3} from "./mapping.js"
|
|
9
|
+
import {isSourceRangeOrdered} from "./semantic/location.js"
|
|
10
|
+
import {hasOnlyUnicodeScalars} from "./semantic/scalars.js"
|
|
11
|
+
|
|
12
|
+
const artifactRoles = new Set(["entry", "source", "manifest", "support", "mapping", "resource", "loader"])
|
|
13
|
+
const mediaTypePattern = /^[A-Za-z0-9!#$&^_.+-]+\/[A-Za-z0-9!#$&^_.+-]+(?:;[\u0020-\u007e]+)?$/u
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Transactionally validates and constructs one deterministic generated artifact set.
|
|
17
|
+
* @param {unknown} candidate - Artifact-set fields.
|
|
18
|
+
* @returns {import("./semantic/types.js").GeneratedArtifactSet} Detached immutable set.
|
|
19
|
+
*/
|
|
20
|
+
export function createGeneratedArtifactSet(candidate) {
|
|
21
|
+
try {
|
|
22
|
+
if (!isPlainObject(candidate) || typeof candidate.target != "string" || candidate.target.length == 0 ||
|
|
23
|
+
!/^[a-z][a-z0-9-]*$/u.test(candidate.target)) {
|
|
24
|
+
invalidArtifactSet("Artifact set requires a stable lowercase target ID.", targetOf(candidate))
|
|
25
|
+
}
|
|
26
|
+
if (!isDenseArray(candidate.artifacts) || candidate.artifacts.length == 0) {
|
|
27
|
+
invalidArtifactSet("Artifact set requires a non-empty ordered artifact array.", candidate.target)
|
|
28
|
+
}
|
|
29
|
+
const target = candidate.target
|
|
30
|
+
|
|
31
|
+
const paths = new Set()
|
|
32
|
+
const directoryPaths = new Set()
|
|
33
|
+
/** @type {string[]} */
|
|
34
|
+
const entryPaths = []
|
|
35
|
+
/** @type {import("./semantic/types.js").GeneratedSetArtifact[]} */
|
|
36
|
+
const artifacts = []
|
|
37
|
+
|
|
38
|
+
for (let index = 0; index < candidate.artifacts.length; index += 1) {
|
|
39
|
+
const artifact = candidate.artifacts[index]
|
|
40
|
+
|
|
41
|
+
if (!isPlainObject(artifact)) invalidArtifactSet(`Artifact ${index} must be a plain object.`, target)
|
|
42
|
+
const artifactPath = artifact.path
|
|
43
|
+
const mediaType = artifact.mediaType
|
|
44
|
+
const role = artifact.role
|
|
45
|
+
const contentKind = artifact.contentKind
|
|
46
|
+
|
|
47
|
+
if (!isSafeArtifactPath(artifactPath)) invalidArtifactSet(`Artifact ${index} has an unsafe path.`, target)
|
|
48
|
+
if (paths.has(artifactPath)) invalidArtifactSet(`Duplicate artifact path '${artifactPath}'.`, target)
|
|
49
|
+
if (directoryPaths.has(artifactPath)) {
|
|
50
|
+
invalidArtifactSet(`Artifact path '${artifactPath}' collides with a required directory.`, target)
|
|
51
|
+
}
|
|
52
|
+
const parentPaths = artifactDirectoryPaths(artifactPath)
|
|
53
|
+
|
|
54
|
+
for (const parentPath of parentPaths) {
|
|
55
|
+
if (paths.has(parentPath)) {
|
|
56
|
+
invalidArtifactSet(`Artifact path '${artifactPath}' descends from artifact file '${parentPath}'.`, target)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
paths.add(artifactPath)
|
|
60
|
+
for (const parentPath of parentPaths) directoryPaths.add(parentPath)
|
|
61
|
+
if (typeof mediaType != "string" || !mediaTypePattern.test(mediaType) || /[\r\n]/u.test(mediaType)) {
|
|
62
|
+
invalidArtifactSet(`Artifact '${artifactPath}' has an invalid media type.`, target)
|
|
63
|
+
}
|
|
64
|
+
if (typeof role != "string" || !artifactRoles.has(role)) invalidArtifactSet(`Artifact '${artifactPath}' has an invalid role.`, target)
|
|
65
|
+
if (artifact.ownership != "generated") invalidArtifactSet(`Artifact '${artifactPath}' must have generated ownership.`, target)
|
|
66
|
+
if (role == "entry") {
|
|
67
|
+
if (entryPaths.length > 0) invalidArtifactSet("Artifact set must declare exactly one entry artifact.", target)
|
|
68
|
+
entryPaths.push(artifactPath)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const contentValue = artifact.content
|
|
72
|
+
/** @type {string | Uint8Array} */
|
|
73
|
+
let content
|
|
74
|
+
|
|
75
|
+
if (contentKind == "text") {
|
|
76
|
+
if (typeof contentValue != "string" || contentValue.length == 0 || !hasOnlyUnicodeScalars(contentValue)) {
|
|
77
|
+
invalidArtifactSet(`Text artifact '${artifactPath}' requires non-empty string content.`, target)
|
|
78
|
+
}
|
|
79
|
+
content = contentValue
|
|
80
|
+
} else if (contentKind == "binary") {
|
|
81
|
+
if (!(contentValue instanceof Uint8Array) || contentValue.byteLength == 0) {
|
|
82
|
+
invalidArtifactSet(`Binary artifact '${artifactPath}' requires non-empty bytes.`, target)
|
|
83
|
+
}
|
|
84
|
+
content = new Uint8Array(contentValue)
|
|
85
|
+
} else invalidArtifactSet(`Artifact '${artifactPath}' has an invalid content kind.`, target)
|
|
86
|
+
|
|
87
|
+
const provenance = validateArtifactProvenance(artifact.provenance, contentKind, artifactPath, content, target)
|
|
88
|
+
|
|
89
|
+
artifacts.push(/** @type {import("./semantic/types.js").GeneratedSetArtifact} */ (freezeArtifact({
|
|
90
|
+
content,
|
|
91
|
+
contentKind,
|
|
92
|
+
mediaType,
|
|
93
|
+
ownership: /** @type {const} */ ("generated"),
|
|
94
|
+
path: artifactPath,
|
|
95
|
+
provenance,
|
|
96
|
+
role
|
|
97
|
+
})))
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (entryPaths.length != 1) invalidArtifactSet("Artifact set must declare exactly one entry artifact.", candidate.target)
|
|
101
|
+
|
|
102
|
+
return Object.freeze({
|
|
103
|
+
artifacts: Object.freeze(artifacts),
|
|
104
|
+
entry: entryPaths[0],
|
|
105
|
+
schema: /** @type {const} */ ("GeneratedArtifactSet"),
|
|
106
|
+
target,
|
|
107
|
+
version: /** @type {const} */ (1)
|
|
108
|
+
})
|
|
109
|
+
} catch (error) {
|
|
110
|
+
if (error instanceof SemantifoldDiagnostic && error.code == "INVALID_ARTIFACT_SET") throw error
|
|
111
|
+
|
|
112
|
+
return invalidArtifactSet("Artifact-set validation failed.", targetOf(candidate), error)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Validates artifact-level text, byte, or synthetic provenance.
|
|
118
|
+
* @param {unknown} value - Provenance candidate.
|
|
119
|
+
* @param {unknown} contentKind - Validated artifact content kind.
|
|
120
|
+
* @param {string} artifactPath - Validated artifact path.
|
|
121
|
+
* @param {string | Uint8Array} content - Detached artifact content.
|
|
122
|
+
* @param {string} target - Artifact target.
|
|
123
|
+
* @returns {import("./semantic/types.js").ArtifactProvenance} Validated provenance.
|
|
124
|
+
*/
|
|
125
|
+
function validateArtifactProvenance(value, contentKind, artifactPath, content, target) {
|
|
126
|
+
if (!isPlainObject(value)) invalidArtifactSet(`Artifact '${artifactPath}' requires provenance.`, target)
|
|
127
|
+
|
|
128
|
+
if (value.kind == "synthetic") {
|
|
129
|
+
if (typeof value.reason != "string" || value.reason.length == 0 || !isDenseArray(value.relatedOrigins)) {
|
|
130
|
+
invalidArtifactSet(`Synthetic artifact '${artifactPath}' requires an explicit reason and related origins.`, target)
|
|
131
|
+
}
|
|
132
|
+
if (contentKind == "binary") {
|
|
133
|
+
invalidArtifactSet(`Binary artifact '${artifactPath}' requires byte-range provenance.`, target)
|
|
134
|
+
}
|
|
135
|
+
/** @type {import("./semantic/types.js").RelatedOrigin[]} */
|
|
136
|
+
const relatedOrigins = []
|
|
137
|
+
|
|
138
|
+
for (let index = 0; index < value.relatedOrigins.length; index += 1) {
|
|
139
|
+
relatedOrigins.push(validateRelatedOrigin(value.relatedOrigins[index], artifactPath, index, target))
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return Object.freeze({kind: /** @type {const} */ ("synthetic"), reason: value.reason, relatedOrigins: Object.freeze(relatedOrigins)})
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (value.kind == "text") {
|
|
146
|
+
const mappingCandidate = value.mapping
|
|
147
|
+
|
|
148
|
+
if (contentKind != "text" || !isPlainObject(mappingCandidate) || mappingCandidate.schema != "SemantifoldMapping" ||
|
|
149
|
+
!isPlainObject(mappingCandidate.generated) || mappingCandidate.generated.filename != artifactPath ||
|
|
150
|
+
mappingCandidate.generated.content != content || !isPlainObject(value.sourceMap)) {
|
|
151
|
+
invalidArtifactSet(`Text artifact '${artifactPath}' has mismatched rich or Source Map provenance.`, target)
|
|
152
|
+
}
|
|
153
|
+
if (value.sourceMapFilename !== undefined && !isValidFilenameMetadata(value.sourceMapFilename)) {
|
|
154
|
+
invalidArtifactSet(`Text artifact '${artifactPath}' has invalid Source Map filename metadata.`, target)
|
|
155
|
+
}
|
|
156
|
+
const mapping = finalizeMapping(mappingCandidate)
|
|
157
|
+
const sourceMap = validateSourceMap(value.sourceMap, artifactPath, target)
|
|
158
|
+
const projectedSourceMap = toSourceMapV3(mapping)
|
|
159
|
+
|
|
160
|
+
if (!sameJsonValue(sourceMap, projectedSourceMap)) {
|
|
161
|
+
invalidArtifactSet(`Text artifact '${artifactPath}' has Source Map provenance that contradicts its rich mapping.`, target)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return Object.freeze({
|
|
165
|
+
kind: /** @type {const} */ ("text"),
|
|
166
|
+
mapping,
|
|
167
|
+
sourceMap,
|
|
168
|
+
sourceMapFilename: value.sourceMapFilename
|
|
169
|
+
})
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (value.kind == "bytes") {
|
|
173
|
+
if (contentKind != "binary") invalidArtifactSet(`Byte provenance requires binary content for '${artifactPath}'.`, target)
|
|
174
|
+
const mapping = finalizeByteMapping(value.mapping)
|
|
175
|
+
|
|
176
|
+
if (mapping.generated.path != artifactPath || mapping.generated.byteLength != /** @type {Uint8Array} */ (content).byteLength) {
|
|
177
|
+
invalidArtifactSet(`Byte provenance does not match artifact '${artifactPath}'.`, target)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return Object.freeze({kind: /** @type {const} */ ("bytes"), mapping})
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return invalidArtifactSet(`Artifact '${artifactPath}' has an unknown provenance kind.`, target)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Freezes one validated artifact record.
|
|
188
|
+
* @param {Record<string, unknown>} artifact - Validated fields.
|
|
189
|
+
* @returns {Readonly<Record<string, unknown>>} Frozen record.
|
|
190
|
+
*/
|
|
191
|
+
function freezeArtifact(artifact) {
|
|
192
|
+
if (artifact.contentKind == "binary" && artifact.content instanceof Uint8Array) {
|
|
193
|
+
const content = artifact.content
|
|
194
|
+
|
|
195
|
+
Object.defineProperty(artifact, "content", {
|
|
196
|
+
configurable: false,
|
|
197
|
+
enumerable: true,
|
|
198
|
+
get() {
|
|
199
|
+
return new Uint8Array(content)
|
|
200
|
+
}
|
|
201
|
+
})
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return Object.freeze(artifact)
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Lists every directory a safe relative POSIX artifact path requires.
|
|
209
|
+
* @param {string} artifactPath - Validated artifact path.
|
|
210
|
+
* @returns {string[]} Ordered parent directory paths.
|
|
211
|
+
*/
|
|
212
|
+
function artifactDirectoryPaths(artifactPath) {
|
|
213
|
+
const parts = artifactPath.split("/")
|
|
214
|
+
/** @type {string[]} */
|
|
215
|
+
const directories = []
|
|
216
|
+
|
|
217
|
+
for (let index = 1; index < parts.length; index += 1) directories.push(parts.slice(0, index).join("/"))
|
|
218
|
+
|
|
219
|
+
return directories
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Throws a normalized artifact-set diagnostic.
|
|
224
|
+
* @param {string} message - Failure detail.
|
|
225
|
+
* @param {string} target - Artifact target.
|
|
226
|
+
* @param {unknown} [error] - Preserved validation cause.
|
|
227
|
+
* @returns {never} Always throws.
|
|
228
|
+
*/
|
|
229
|
+
function invalidArtifactSet(message, target, error) {
|
|
230
|
+
throw new SemantifoldDiagnostic({
|
|
231
|
+
cause: error instanceof Error ? error : undefined,
|
|
232
|
+
code: "INVALID_ARTIFACT_SET",
|
|
233
|
+
language: target,
|
|
234
|
+
message
|
|
235
|
+
})
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Derives a safe diagnostic identity from an unknown request.
|
|
240
|
+
* @param {unknown} value - Candidate set.
|
|
241
|
+
* @returns {string} Diagnostic identity.
|
|
242
|
+
*/
|
|
243
|
+
function targetOf(value) {
|
|
244
|
+
return isPlainObject(value) && typeof value.target == "string" && value.target.length > 0 ? value.target : "artifact"
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Checks for an ordinary string-keyed object.
|
|
249
|
+
* @param {unknown} value - Candidate value.
|
|
250
|
+
* @returns {value is Record<string, unknown>} Whether the value is a plain object.
|
|
251
|
+
*/
|
|
252
|
+
function isPlainObject(value) {
|
|
253
|
+
return typeof value == "object" && value != null && !Array.isArray(value) && Object.getPrototypeOf(value) == Object.prototype
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Validates an artifact-level related origin without interpreting source offsets as generated bytes.
|
|
258
|
+
* @param {unknown} value - Related-origin candidate.
|
|
259
|
+
* @param {string} artifactPath - Owning artifact path.
|
|
260
|
+
* @param {number} index - Origin index.
|
|
261
|
+
* @param {string} target - Artifact target.
|
|
262
|
+
* @returns {import("./semantic/types.js").RelatedOrigin} Detached related origin.
|
|
263
|
+
*/
|
|
264
|
+
function validateRelatedOrigin(value, artifactPath, index, target) {
|
|
265
|
+
if (!isPlainObject(value) || typeof value.sourceId != "string" || value.sourceId.length == 0 ||
|
|
266
|
+
!isPlainObject(value.location) || typeof value.location.filename != "string" || value.location.filename.length == 0 ||
|
|
267
|
+
!validSourcePoint(value.location.start) || !validSourcePoint(value.location.end) ||
|
|
268
|
+
value.location.end.offset < value.location.start.offset || !isSourceRangeOrdered(value.location.start, value.location.end)) {
|
|
269
|
+
invalidArtifactSet(`Artifact '${artifactPath}' has malformed related origin ${index}.`, target)
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
return deepFreeze({
|
|
273
|
+
location: {
|
|
274
|
+
end: {...value.location.end},
|
|
275
|
+
filename: value.location.filename,
|
|
276
|
+
start: {...value.location.start}
|
|
277
|
+
},
|
|
278
|
+
sourceId: value.sourceId,
|
|
279
|
+
...(optionalString(value.nodeId, "nodeId", artifactPath, index, target)),
|
|
280
|
+
...(optionalString(value.symbolId, "symbolId", artifactPath, index, target)),
|
|
281
|
+
...(optionalString(value.role, "role", artifactPath, index, target))
|
|
282
|
+
})
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Validates one optional related-origin string field.
|
|
287
|
+
* @param {unknown} value - Candidate value.
|
|
288
|
+
* @param {string} property - Property name.
|
|
289
|
+
* @param {string} artifactPath - Owning artifact path.
|
|
290
|
+
* @param {number} index - Origin index.
|
|
291
|
+
* @param {string} target - Artifact target.
|
|
292
|
+
* @returns {Record<string, string>} Present validated property or an empty record.
|
|
293
|
+
*/
|
|
294
|
+
function optionalString(value, property, artifactPath, index, target) {
|
|
295
|
+
if (value === undefined) return {}
|
|
296
|
+
if (typeof value != "string" || value.length == 0) {
|
|
297
|
+
invalidArtifactSet(`Artifact '${artifactPath}' has invalid ${property} in related origin ${index}.`, target)
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
return {[property]: value}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Checks one UTF-16 source point.
|
|
305
|
+
* @param {unknown} value - Candidate point.
|
|
306
|
+
* @returns {value is import("./semantic/types.js").SourcePoint} Whether the point is structurally valid.
|
|
307
|
+
*/
|
|
308
|
+
function validSourcePoint(value) {
|
|
309
|
+
return isPlainObject(value) && typeof value.line == "number" && Number.isSafeInteger(value.line) && value.line > 0 &&
|
|
310
|
+
typeof value.column == "number" && Number.isSafeInteger(value.column) && value.column > 0 &&
|
|
311
|
+
typeof value.offset == "number" && Number.isSafeInteger(value.offset) && value.offset >= 0
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Validates and detaches the Source Map v3 projection carried by a text artifact.
|
|
316
|
+
* @param {unknown} value - Source Map candidate.
|
|
317
|
+
* @param {string} artifactPath - Owning artifact path.
|
|
318
|
+
* @param {string} target - Artifact target.
|
|
319
|
+
* @returns {import("@jridgewell/gen-mapping").EncodedSourceMap} Detached Source Map.
|
|
320
|
+
*/
|
|
321
|
+
function validateSourceMap(value, artifactPath, target) {
|
|
322
|
+
if (!isPlainObject(value) || value.version != 3 || value.file != artifactPath || typeof value.mappings != "string" ||
|
|
323
|
+
!isDenseArray(value.names) || !value.names.every((name) => typeof name == "string") ||
|
|
324
|
+
!isDenseArray(value.sources) || !value.sources.every((source) => typeof source == "string") ||
|
|
325
|
+
(value.sourcesContent !== undefined && (!isDenseArray(value.sourcesContent) ||
|
|
326
|
+
!value.sourcesContent.every((source) => source == null || typeof source == "string")))) {
|
|
327
|
+
invalidArtifactSet(`Text artifact '${artifactPath}' has malformed Source Map v3 provenance.`, target)
|
|
328
|
+
}
|
|
329
|
+
validateEncodedSourceMapMappings(
|
|
330
|
+
/** @type {import("@jridgewell/trace-mapping").EncodedSourceMap} */ (/** @type {unknown} */ (value)),
|
|
331
|
+
artifactPath,
|
|
332
|
+
target
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
const detached = /** @type {unknown} */ (structuredClone(value))
|
|
336
|
+
|
|
337
|
+
return deepFreeze(/** @type {import("@jridgewell/gen-mapping").EncodedSourceMap} */ (detached))
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Decodes and validates the Source Map payload with the installed mapping implementation.
|
|
342
|
+
* @param {import("@jridgewell/trace-mapping").EncodedSourceMap} sourceMap - Structurally validated map.
|
|
343
|
+
* @param {string} artifactPath - Owning artifact path.
|
|
344
|
+
* @param {string} target - Artifact target.
|
|
345
|
+
* @returns {void}
|
|
346
|
+
*/
|
|
347
|
+
function validateEncodedSourceMapMappings(sourceMap, artifactPath, target) {
|
|
348
|
+
/** @type {Readonly<import("@jridgewell/trace-mapping").SourceMapSegment[][]>} */
|
|
349
|
+
let decoded
|
|
350
|
+
let canonicalMappings
|
|
351
|
+
|
|
352
|
+
try {
|
|
353
|
+
decoded = decodedMappings(new TraceMap(sourceMap))
|
|
354
|
+
const decodedMap = /** @type {import("@jridgewell/trace-mapping").DecodedSourceMap} */ ({
|
|
355
|
+
...sourceMap,
|
|
356
|
+
mappings: structuredClone(decoded)
|
|
357
|
+
})
|
|
358
|
+
|
|
359
|
+
canonicalMappings = encodedMappings(presortedDecodedMap(decodedMap))
|
|
360
|
+
} catch (error) {
|
|
361
|
+
invalidArtifactSet(`Text artifact '${artifactPath}' has invalid encoded Source Map mappings.`, target, error)
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
if (canonicalMappings != sourceMap.mappings ||
|
|
365
|
+
!validDecodedSourceMapMappings(decoded, sourceMap.sources.length, sourceMap.names.length)) {
|
|
366
|
+
invalidArtifactSet(`Text artifact '${artifactPath}' has invalid encoded Source Map mappings.`, target)
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Validates decoded Source Map segment shape and referenced indices.
|
|
372
|
+
* @param {Readonly<import("@jridgewell/trace-mapping").SourceMapSegment[][]>} lines - Decoded mapping lines.
|
|
373
|
+
* @param {number} sourceCount - Declared source count.
|
|
374
|
+
* @param {number} nameCount - Declared name count.
|
|
375
|
+
* @returns {boolean} Whether every segment is semantically valid.
|
|
376
|
+
*/
|
|
377
|
+
function validDecodedSourceMapMappings(lines, sourceCount, nameCount) {
|
|
378
|
+
return lines.every((line) => line.every((segment) => {
|
|
379
|
+
if (segment.length != 1 && segment.length != 4 && segment.length != 5) return false
|
|
380
|
+
if (!segment.every((field) => Number.isSafeInteger(field) && field >= 0)) return false
|
|
381
|
+
if (segment.length == 1) return true
|
|
382
|
+
if (segment[1] >= sourceCount) return false
|
|
383
|
+
|
|
384
|
+
return segment.length == 4 || segment[4] < nameCount
|
|
385
|
+
}))
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Compares detached JSON values without depending on caller object-key order.
|
|
390
|
+
* @param {unknown} left - First JSON value.
|
|
391
|
+
* @param {unknown} right - Second JSON value.
|
|
392
|
+
* @returns {boolean} Whether both values are structurally identical.
|
|
393
|
+
*/
|
|
394
|
+
function sameJsonValue(left, right) {
|
|
395
|
+
if (left === right) return true
|
|
396
|
+
if (Array.isArray(left) || Array.isArray(right)) {
|
|
397
|
+
return Array.isArray(left) && Array.isArray(right) && left.length == right.length &&
|
|
398
|
+
left.every((entry, index) => sameJsonValue(entry, right[index]))
|
|
399
|
+
}
|
|
400
|
+
if (!isPlainObject(left) || !isPlainObject(right)) return false
|
|
401
|
+
const leftKeys = Object.keys(left)
|
|
402
|
+
const rightKeys = Object.keys(right)
|
|
403
|
+
|
|
404
|
+
return leftKeys.length == rightKeys.length &&
|
|
405
|
+
leftKeys.every((key) => Object.hasOwn(right, key) && sameJsonValue(left[key], right[key]))
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Deeply freezes a detached JSON value.
|
|
410
|
+
* @template T
|
|
411
|
+
* @param {T} value - Detached value.
|
|
412
|
+
* @returns {T} Frozen value.
|
|
413
|
+
*/
|
|
414
|
+
function deepFreeze(value) {
|
|
415
|
+
if (!value || typeof value != "object" || Object.isFrozen(value)) return value
|
|
416
|
+
|
|
417
|
+
for (const nested of Object.values(value)) deepFreeze(nested)
|
|
418
|
+
|
|
419
|
+
return Object.freeze(value)
|
|
420
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/** Canonical C17 support header; native ownership never enters semantic IR. */
|
|
4
|
+
export const cRuntimeHeader = `#ifndef SEMANTIFOLD_RUNTIME_H
|
|
5
|
+
#define SEMANTIFOLD_RUNTIME_H
|
|
6
|
+
|
|
7
|
+
#include <stdbool.h>
|
|
8
|
+
#include <stddef.h>
|
|
9
|
+
#include <stdint.h>
|
|
10
|
+
#include <limits.h>
|
|
11
|
+
#include <stdio.h>
|
|
12
|
+
#include <stdlib.h>
|
|
13
|
+
#include <string.h>
|
|
14
|
+
|
|
15
|
+
_Static_assert(CHAR_BIT == 8, "Semantifold requires eight-bit bytes");
|
|
16
|
+
_Static_assert(sizeof(int64_t) == 8, "Semantifold requires exact int64_t");
|
|
17
|
+
_Static_assert(sizeof(size_t) == 8 && PTRDIFF_MAX == INT64_MAX, "Semantifold requires the qualified 64-bit ABI");
|
|
18
|
+
|
|
19
|
+
typedef struct {
|
|
20
|
+
const unsigned char *data;
|
|
21
|
+
size_t length;
|
|
22
|
+
} SemantifoldString;
|
|
23
|
+
|
|
24
|
+
#define SEMANTIFOLD_STRING(literal) ((SemantifoldString){(const unsigned char *)(literal), sizeof(literal) - 1})
|
|
25
|
+
|
|
26
|
+
typedef struct SemantifoldAllocation {
|
|
27
|
+
struct SemantifoldAllocation *next;
|
|
28
|
+
unsigned char data[];
|
|
29
|
+
} SemantifoldAllocation;
|
|
30
|
+
|
|
31
|
+
_Static_assert(sizeof(SemantifoldAllocation) == 8, "Semantifold requires the qualified arena metadata size");
|
|
32
|
+
|
|
33
|
+
static SemantifoldAllocation *semantifold_arena = NULL;
|
|
34
|
+
static size_t semantifold_arena_bytes = 0;
|
|
35
|
+
|
|
36
|
+
static inline void semantifold_cleanup(void) {
|
|
37
|
+
while (semantifold_arena != NULL) {
|
|
38
|
+
SemantifoldAllocation *allocation = semantifold_arena;
|
|
39
|
+
semantifold_arena = allocation->next;
|
|
40
|
+
free(allocation);
|
|
41
|
+
}
|
|
42
|
+
semantifold_arena_bytes = 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
_Noreturn static inline void semantifold_fatal(const char *message, size_t length) {
|
|
46
|
+
semantifold_cleanup();
|
|
47
|
+
(void)fwrite(message, 1, length, stderr);
|
|
48
|
+
exit(70);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
static inline int64_t semantifold_integer_add(int64_t left, int64_t right) {
|
|
52
|
+
int64_t result;
|
|
53
|
+
if (__builtin_add_overflow(left, right, &result)) {
|
|
54
|
+
semantifold_fatal("semantifold: integer overflow\\n", sizeof("semantifold: integer overflow\\n") - 1);
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
static inline int64_t semantifold_integer_subtract(int64_t left, int64_t right) {
|
|
60
|
+
int64_t result;
|
|
61
|
+
if (__builtin_sub_overflow(left, right, &result)) {
|
|
62
|
+
semantifold_fatal("semantifold: integer overflow\\n", sizeof("semantifold: integer overflow\\n") - 1);
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static inline int64_t semantifold_integer_multiply(int64_t left, int64_t right) {
|
|
68
|
+
int64_t result;
|
|
69
|
+
if (__builtin_mul_overflow(left, right, &result)) {
|
|
70
|
+
semantifold_fatal("semantifold: integer overflow\\n", sizeof("semantifold: integer overflow\\n") - 1);
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
static inline int64_t semantifold_integer_negate(int64_t value) {
|
|
76
|
+
return semantifold_integer_subtract(INT64_C(0), value);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
static inline size_t semantifold_allocation_size(size_t left, size_t right) {
|
|
80
|
+
const size_t maximum = (size_t)PTRDIFF_MAX;
|
|
81
|
+
if (left > maximum || right > maximum - left ||
|
|
82
|
+
left + right > maximum - sizeof(SemantifoldAllocation)) {
|
|
83
|
+
semantifold_fatal("semantifold: allocation size\\n", sizeof("semantifold: allocation size\\n") - 1);
|
|
84
|
+
}
|
|
85
|
+
const size_t size = sizeof(SemantifoldAllocation) + left + right;
|
|
86
|
+
if (semantifold_arena_bytes > maximum - size) {
|
|
87
|
+
semantifold_fatal("semantifold: allocation size\\n", sizeof("semantifold: allocation size\\n") - 1);
|
|
88
|
+
}
|
|
89
|
+
return size;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
static inline SemantifoldString semantifold_string_concat(SemantifoldString left, SemantifoldString right) {
|
|
93
|
+
const size_t size = semantifold_allocation_size(left.length, right.length);
|
|
94
|
+
SemantifoldAllocation *allocation = malloc(size);
|
|
95
|
+
if (allocation == NULL) {
|
|
96
|
+
semantifold_fatal("semantifold: allocation failure\\n", sizeof("semantifold: allocation failure\\n") - 1);
|
|
97
|
+
}
|
|
98
|
+
allocation->next = semantifold_arena;
|
|
99
|
+
semantifold_arena = allocation;
|
|
100
|
+
semantifold_arena_bytes += size;
|
|
101
|
+
if (left.length != 0) (void)memcpy(allocation->data, left.data, left.length);
|
|
102
|
+
if (right.length != 0) (void)memcpy(allocation->data + left.length, right.data, right.length);
|
|
103
|
+
return (SemantifoldString){allocation->data, left.length + right.length};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
static inline bool semantifold_string_equal(SemantifoldString left, SemantifoldString right) {
|
|
107
|
+
return left.length == right.length && (left.length == 0 || memcmp(left.data, right.data, left.length) == 0);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
static inline bool semantifold_string_not_equal(SemantifoldString left, SemantifoldString right) {
|
|
111
|
+
return !semantifold_string_equal(left, right);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
static inline void semantifold_write(const unsigned char *data, size_t length) {
|
|
115
|
+
if (length != 0 && fwrite(data, 1, length, stdout) != length) {
|
|
116
|
+
semantifold_fatal("semantifold: output failure\\n", sizeof("semantifold: output failure\\n") - 1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
static inline void semantifold_newline(void) {
|
|
121
|
+
semantifold_write((const unsigned char *)"\\n", 1);
|
|
122
|
+
if (fflush(stdout) != 0) semantifold_fatal("semantifold: output failure\\n", sizeof("semantifold: output failure\\n") - 1);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
static inline void semantifold_print_string(SemantifoldString value) {
|
|
126
|
+
semantifold_write(value.data, value.length);
|
|
127
|
+
semantifold_newline();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
static inline void semantifold_print_boolean(bool value) {
|
|
131
|
+
if (value) semantifold_write((const unsigned char *)"true", 4);
|
|
132
|
+
else semantifold_write((const unsigned char *)"false", 5);
|
|
133
|
+
semantifold_newline();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
static inline void semantifold_print_integer(int64_t value) {
|
|
137
|
+
unsigned char digits[20];
|
|
138
|
+
size_t position = sizeof(digits);
|
|
139
|
+
uint64_t magnitude = (uint64_t)value;
|
|
140
|
+
if (value < 0) magnitude = UINT64_C(0) - magnitude;
|
|
141
|
+
do {
|
|
142
|
+
digits[--position] = (unsigned char)(UINT64_C(48) + magnitude % UINT64_C(10));
|
|
143
|
+
magnitude /= UINT64_C(10);
|
|
144
|
+
} while (magnitude != 0);
|
|
145
|
+
if (value < 0) digits[--position] = (unsigned char)45;
|
|
146
|
+
semantifold_write(digits + position, sizeof(digits) - position);
|
|
147
|
+
semantifold_newline();
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
#endif
|
|
151
|
+
`
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import {unsupportedCapability} from "../diagnostic.js"
|
|
4
|
+
|
|
5
|
+
/** @typedef {import("../semantic/types.js").SemanticModule} SemanticModule */
|
|
6
|
+
/** @typedef {import("../semantic/types.js").Expression} Expression */
|
|
7
|
+
/** @typedef {import("../semantic/types.js").SourceLocation} SourceLocation */
|
|
8
|
+
|
|
9
|
+
const maximumObjectBytes = 9223372036854775807n
|
|
10
|
+
/** Maximum UTF-16 input accepted by the unchanged qualified legacy parser. */
|
|
11
|
+
export const maximumCSourceLength = 32767
|
|
12
|
+
const allocationMetadataBytes = 8n
|
|
13
|
+
/**
|
|
14
|
+
* Rejects compile-time-known object and arena sizes; unknown runtime lengths remain checked in C.
|
|
15
|
+
* @param {SemanticModule} module - Shape/type-validated module.
|
|
16
|
+
* @returns {void}
|
|
17
|
+
*/
|
|
18
|
+
export function validateCMemory(module) {
|
|
19
|
+
/**
|
|
20
|
+
* Checks one expression and its known byte lengths without folding the IR.
|
|
21
|
+
* @param {Expression} expression - Semantic expression.
|
|
22
|
+
* @param {Map<string, bigint | undefined>} lengths - Visible immutable or assigned lengths.
|
|
23
|
+
* @param {{bytes: bigint}} arena - Known minimum allocations in this lexical path.
|
|
24
|
+
* @returns {bigint | undefined} Known UTF-8 byte length.
|
|
25
|
+
*/
|
|
26
|
+
function size(expression, lengths, arena) {
|
|
27
|
+
if (expression.kind == "StringLiteral") {
|
|
28
|
+
const bytes = BigInt(Buffer.byteLength(expression.value, "utf8"))
|
|
29
|
+
|
|
30
|
+
if (bytes > 4095n) unsupportedCapability("c", "UTF-8 literal exceeds the strict C17 4095-byte translation limit", expression.location)
|
|
31
|
+
return bytes
|
|
32
|
+
}
|
|
33
|
+
if (expression.kind == "IdentifierExpression") return lengths.get(expression.name)
|
|
34
|
+
if (expression.kind == "CallExpression") {
|
|
35
|
+
for (const argument of expression.arguments) size(argument, lengths, arena)
|
|
36
|
+
} else if (expression.kind == "UnaryExpression") size(expression.operand, lengths, arena)
|
|
37
|
+
else if (expression.kind == "BinaryExpression") {
|
|
38
|
+
const left = size(expression.left, lengths, arena)
|
|
39
|
+
const right = size(expression.right, lengths, arena)
|
|
40
|
+
|
|
41
|
+
if (expression.operation == "StringConcat") {
|
|
42
|
+
const minimum = (left ?? 0n) + (right ?? 0n)
|
|
43
|
+
|
|
44
|
+
arena.bytes += allocationMetadataBytes + minimum
|
|
45
|
+
if (minimum > maximumObjectBytes - allocationMetadataBytes || arena.bytes > maximumObjectBytes) {
|
|
46
|
+
unsupportedCapability("c", "known immutable slice or module arena size exceeds PTRDIFF_MAX", expression.location)
|
|
47
|
+
}
|
|
48
|
+
return left === undefined || right === undefined ? undefined : left + right
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return undefined
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Propagates known local descriptor sizes through straight-line code and both branch paths.
|
|
56
|
+
* @param {import("../semantic/types.js").Block} block - Semantic block.
|
|
57
|
+
* @param {Map<string, bigint | undefined>} inherited - Visible known lengths.
|
|
58
|
+
* @param {{bytes: bigint}} arena - Known path allocation size.
|
|
59
|
+
* @returns {Map<string, bigint | undefined>} Outgoing known lengths.
|
|
60
|
+
*/
|
|
61
|
+
function visit(block, inherited, arena) {
|
|
62
|
+
const lengths = new Map(inherited)
|
|
63
|
+
|
|
64
|
+
for (const statement of block.statements) {
|
|
65
|
+
if (statement.kind == "LocalDeclaration") lengths.set(statement.name, size(statement.initializer, lengths, arena))
|
|
66
|
+
else if (statement.kind == "AssignmentStatement") lengths.set(statement.target.name, size(statement.expression, lengths, arena))
|
|
67
|
+
else if (statement.kind == "IfStatement") {
|
|
68
|
+
size(statement.condition, lengths, arena)
|
|
69
|
+
const leftArena = {bytes: arena.bytes}
|
|
70
|
+
const rightArena = {bytes: arena.bytes}
|
|
71
|
+
const left = visit(statement.consequent, lengths, leftArena)
|
|
72
|
+
const right = statement.alternate ? visit(statement.alternate, lengths, rightArena) : lengths
|
|
73
|
+
|
|
74
|
+
for (const name of lengths.keys()) lengths.set(name, left.get(name) === right.get(name) ? left.get(name) : undefined)
|
|
75
|
+
arena.bytes = leftArena.bytes < rightArena.bytes ? leftArena.bytes : rightArena.bytes
|
|
76
|
+
} else size(statement.expression, lengths, arena)
|
|
77
|
+
}
|
|
78
|
+
return lengths
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
for (const declaration of module.functions) visit(declaration.body, new Map(), {bytes: 0n})
|
|
82
|
+
visit(module.entryPoint.body, new Map(), {bytes: 0n})
|
|
83
|
+
}
|