semantifold 0.5.0 → 0.7.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 +15 -9
- package/build/index.d.ts +8 -8
- package/build/index.d.ts.map +1 -1
- package/build/index.js +6 -6
- package/build/src/backends/android.js +8 -4
- package/build/src/backends/dart.d.ts +19 -0
- package/build/src/backends/dart.d.ts.map +1 -1
- package/build/src/backends/dart.js +28 -16
- package/build/src/backends/flutter.d.ts +51 -0
- package/build/src/backends/flutter.d.ts.map +1 -0
- package/build/src/backends/flutter.js +1362 -0
- package/build/src/backends/identifiers.d.ts +6 -0
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +28 -5
- package/build/src/backends/ios.js +2 -2
- package/build/src/backends/native-validation.d.ts +2 -2
- package/build/src/backends/native-validation.d.ts.map +1 -1
- package/build/src/backends/native-validation.js +2 -2
- package/build/src/backends/program.d.ts +4 -4
- package/build/src/backends/program.d.ts.map +1 -1
- package/build/src/backends/program.js +4 -4
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +2 -1
- package/build/src/backends/shared.d.ts +7 -0
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +14 -9
- package/build/src/backends/zig-runtime.d.ts +5 -0
- package/build/src/backends/zig-runtime.d.ts.map +1 -0
- package/build/src/backends/zig-runtime.js +92 -0
- package/build/src/backends/zig-validation.d.ts +9 -0
- package/build/src/backends/zig-validation.d.ts.map +1 -0
- package/build/src/backends/zig-validation.js +73 -0
- package/build/src/backends/zig.d.ts +42 -0
- package/build/src/backends/zig.d.ts.map +1 -0
- package/build/src/backends/zig.js +584 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +2 -1
- package/build/src/frontends/zig-parser.d.ts +31 -0
- package/build/src/frontends/zig-parser.d.ts.map +1 -0
- package/build/src/frontends/zig-parser.js +17 -0
- package/build/src/frontends/zig.d.ts +14 -0
- package/build/src/frontends/zig.d.ts.map +1 -0
- package/build/src/frontends/zig.js +970 -0
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +40 -1
- package/build/src/mapping.js +2 -2
- package/build/src/semantic/provenance.js +3 -3
- package/build/src/semantic/types.d.ts +154 -4
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +39 -3
- package/build/src/semantic/validate.js +2 -2
- package/build/src/toolchains.d.ts +6 -0
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +2 -1
- package/build/src/zig-bindings.d.ts +10 -0
- package/build/src/zig-bindings.d.ts.map +1 -0
- package/build/src/zig-bindings.js +54 -0
- package/docs/android.md +7 -3
- package/docs/architecture.md +13 -5
- package/docs/flutter.md +47 -0
- package/docs/goals.md +1 -1
- package/docs/language-support.md +16 -5
- package/docs/parser-qualification.md +31 -1
- package/docs/source-maps.md +7 -3
- package/docs/testing.md +47 -4
- package/docs/zig.md +33 -0
- package/index.js +5 -5
- package/node_modules/semantifold-tree-sitter-zig-internal/LICENSE +15 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/README.md +5 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/README.md +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/binding.gyp +29 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/grammar.js +900 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/package.json +57 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/darwin-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/darwin-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/linux-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/linux-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/win32-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/win32-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/folds.scm +23 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/highlights.scm +291 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/indents.scm +22 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/injections.scm +10 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/grammar.json +6570 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/node-types.json +3178 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/parser.c +169829 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/array.h +291 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/tree-sitter-zig.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/tree-sitter.json +38 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/README.md +128 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/binding.gyp +80 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/index.js +916 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/package.json +76 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/language.cc +106 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/node.cc +1088 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/parser.cc +306 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/query.cc +397 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/query.h +40 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree.cc +316 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/tree-sitter.d.ts +1042 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1318 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +223 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +297 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +435 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +920 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2165 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +206 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4187 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +130 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1066 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +712 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +83 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1302 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1859 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/package.json +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/src/zig.js +134 -0
- package/package.json +11 -6
- package/src/backends/android.js +7 -3
- package/src/backends/dart.js +28 -15
- package/src/backends/flutter.js +1465 -0
- package/src/backends/identifiers.js +28 -4
- package/src/backends/ios.js +1 -1
- package/src/backends/native-validation.js +1 -1
- package/src/backends/program.js +3 -3
- package/src/backends/scalars.js +1 -0
- package/src/backends/shared.js +15 -11
- package/src/backends/zig-runtime.js +93 -0
- package/src/backends/zig-validation.js +68 -0
- package/src/backends/zig.js +579 -0
- package/src/frontends/scalars.js +1 -0
- package/src/frontends/zig-parser.js +20 -0
- package/src/frontends/zig.js +994 -0
- package/src/language-registry.js +40 -0
- package/src/mapping.js +1 -1
- package/src/semantic/provenance.js +2 -2
- package/src/semantic/types.js +41 -2
- package/src/semantic/validate.js +1 -1
- package/src/toolchains.js +1 -0
- package/src/zig-bindings.js +46 -0
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
import {unsupportedCapability} from "../diagnostic.js"
|
|
4
4
|
|
|
5
|
-
/** @type {Record<Exclude<import("../semantic/types.js").BackendLanguage, "ios">, RegExp>} */
|
|
5
|
+
/** @type {Record<Exclude<import("../semantic/types.js").BackendLanguage, "ios" | "flutter">, RegExp>} */
|
|
6
6
|
const identifierPatterns = {
|
|
7
7
|
android: /^(?:_|\p{L})(?:_|\p{L}|\p{Nd})*$/u,
|
|
8
8
|
dart: /^(?:_|\p{L})(?:_|\p{L}|\p{Nd})*$/u,
|
|
9
9
|
kotlin: /^(?:_|\p{L})(?:_|\p{L}|\p{Nd})*$/u,
|
|
10
10
|
swift: /^(?:_|\p{XID_Start})(?:_|\p{XID_Continue})*$/u,
|
|
11
11
|
rust: /^[A-Za-z_][A-Za-z0-9_]*$/u,
|
|
12
|
+
zig: /^[A-Za-z_][A-Za-z0-9_]*$/u,
|
|
12
13
|
cpp: /^[A-Za-z][A-Za-z0-9_]*$/u,
|
|
13
14
|
c: /^[A-Za-z][A-Za-z0-9_]*$/u,
|
|
14
15
|
csharp: /^[A-Za-z_][A-Za-z0-9_]*$/u,
|
|
@@ -22,7 +23,7 @@ const identifierPatterns = {
|
|
|
22
23
|
wasm: /^(?:[$_]|\p{XID_Start})(?:[$_]|\p{XID_Continue})*$/u
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
/** @type {Record<Exclude<import("../semantic/types.js").BackendLanguage, "ios">, Set<string>>} */
|
|
26
|
+
/** @type {Record<Exclude<import("../semantic/types.js").BackendLanguage, "ios" | "flutter">, Set<string>>} */
|
|
26
27
|
const reservedWords = {
|
|
27
28
|
android: new Set([
|
|
28
29
|
"as", "break", "class", "continue", "do", "else", "false", "for", "fun", "if", "in", "interface", "is", "null",
|
|
@@ -60,6 +61,18 @@ const reservedWords = {
|
|
|
60
61
|
"unsafe", "use", "where", "while", "abstract", "become", "box", "do", "final", "macro", "override", "priv", "typeof", "unsized", "virtual",
|
|
61
62
|
"yield", "try", "union", "_", "main", "String", "std", "i64", "bool"
|
|
62
63
|
]),
|
|
64
|
+
zig: new Set([
|
|
65
|
+
"addrspace", "align", "allowzero", "and", "anyerror", "anyframe", "anyopaque", "anytype", "asm", "async", "await", "break", "callconv",
|
|
66
|
+
"catch", "comptime", "const", "continue", "defer", "else", "enum", "errdefer", "error", "export", "extern", "false",
|
|
67
|
+
"fn", "for", "if", "inline", "linksection", "noalias", "noinline", "nosuspend", "null", "opaque", "or", "orelse",
|
|
68
|
+
"packed", "pub", "resume", "return", "struct", "suspend", "switch", "test", "threadlocal", "true", "try", "union",
|
|
69
|
+
"unreachable", "usingnamespace", "var", "volatile", "while", "_", "main", "std", "bool", "c_char", "c_int", "c_long",
|
|
70
|
+
"c_longdouble", "c_longlong", "c_short", "c_uint", "c_ulong", "c_ulonglong", "c_ushort", "comptime_float",
|
|
71
|
+
"comptime_int", "f16", "f32", "f64", "f80", "f128", "isize", "noreturn", "type", "undefined", "usize", "void",
|
|
72
|
+
"semantifold_arena", "semantifold_fail", "semantifold_integer_add", "semantifold_integer_subtract",
|
|
73
|
+
"semantifold_integer_multiply", "semantifold_integer_negate", "semantifold_string_concat", "semantifold_string_equal",
|
|
74
|
+
"semantifold_string_not_equal", "semantifold_print_integer", "semantifold_print_boolean", "semantifold_print_string"
|
|
75
|
+
]),
|
|
63
76
|
cpp: new Set([
|
|
64
77
|
"alignas", "alignof", "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", "char8_t", "char16_t", "char32_t", "class", "compl", "concept", "const", "consteval", "constexpr", "constinit", "const_cast", "continue", "co_await", "co_return", "co_yield", "decltype", "default", "delete", "do", "double", "dynamic_cast", "else", "enum", "explicit", "export", "extern", "false", "float", "for", "friend", "goto", "if", "inline", "int", "long", "mutable", "namespace", "new", "noexcept", "not", "not_eq", "nullptr", "operator", "or", "or_eq", "private", "protected", "public", "register", "reinterpret_cast", "requires", "return", "short", "signed", "sizeof", "static", "static_assert", "static_cast", "struct", "switch", "template", "this", "thread_local", "throw", "true", "try", "typedef", "typeid", "typename", "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq", "std", "string", "numeric_limits",
|
|
65
78
|
// The qualified libstdc++ <string> include chain also exposes these global names.
|
|
@@ -223,12 +236,13 @@ export function validateTargetIdentifier(language, name, role, location) {
|
|
|
223
236
|
if (typeof name != "string") unsupportedCapability(language, `${role} identifier`, location)
|
|
224
237
|
|
|
225
238
|
const reservedName = language == "php" ? name.toLowerCase() : name
|
|
226
|
-
const syntaxLanguage = language == "ios" ? "swift" : language
|
|
239
|
+
const syntaxLanguage = language == "ios" ? "swift" : language == "flutter" ? "dart" : language
|
|
227
240
|
|
|
228
241
|
if (!identifierPatterns[syntaxLanguage].test(name) || reservedWords[syntaxLanguage].has(reservedName) ||
|
|
229
242
|
language == "python" && name.normalize("NFKC") != name ||
|
|
230
243
|
language == "c" && !isCIdentifier(name) ||
|
|
231
244
|
language == "rust" && !isRustIdentifier(name) ||
|
|
245
|
+
language == "zig" && !isZigIdentifier(name) ||
|
|
232
246
|
language == "cpp" && !isCppIdentifier(name) ||
|
|
233
247
|
language == "dart" && !isDartIdentifier(name) ||
|
|
234
248
|
language == "swift" && (!isSwiftIdentifier(name) || name.normalize("NFC") != name) ||
|
|
@@ -282,7 +296,7 @@ export function validateTargetTypeIdentifier(language, name, location) {
|
|
|
282
296
|
unsupportedCapability(language, `record type identifier '${String(name)}'`, location)
|
|
283
297
|
}
|
|
284
298
|
const reservedName = language == "php" ? name.toLowerCase() : name
|
|
285
|
-
const syntaxLanguage = language == "ios" ? "swift" : language
|
|
299
|
+
const syntaxLanguage = language == "ios" ? "swift" : language == "flutter" ? "dart" : language
|
|
286
300
|
|
|
287
301
|
if (reservedWords[syntaxLanguage].has(reservedName) || reservedTypeNames[language]?.has(reservedName)) {
|
|
288
302
|
unsupportedCapability(language, `record type identifier '${name}'`, location)
|
|
@@ -307,6 +321,16 @@ export function isRustIdentifier(name) {
|
|
|
307
321
|
return identifierPatterns.rust.test(name) && !reservedWords.rust.has(name) && !name.startsWith("semantifold_")
|
|
308
322
|
}
|
|
309
323
|
|
|
324
|
+
/**
|
|
325
|
+
* Protects Zig keywords, scalar names, entry plumbing, builtins, and the support namespace.
|
|
326
|
+
* @param {string} name - Caller-owned function or binding name.
|
|
327
|
+
* @returns {boolean} Whether ordinary unquoted Zig syntax can preserve the name.
|
|
328
|
+
*/
|
|
329
|
+
export function isZigIdentifier(name) {
|
|
330
|
+
return identifierPatterns.zig.test(name) && !reservedWords.zig.has(name) && !/^[iu][0-9]+$/u.test(name) &&
|
|
331
|
+
!name.startsWith("semantifold_")
|
|
332
|
+
}
|
|
333
|
+
|
|
310
334
|
/**
|
|
311
335
|
* Protects Swift keywords, scalar names, entry plumbing, and target-only helper names.
|
|
312
336
|
* @param {string} name - Caller-owned function or binding name.
|
package/src/backends/ios.js
CHANGED
|
@@ -13,7 +13,7 @@ import {SourceWriter} from "./writer.js"
|
|
|
13
13
|
|
|
14
14
|
/** @type {Readonly<Set<import("../semantic/types.js").SemanticLanguage>>} */
|
|
15
15
|
const iosSourceLanguages = new Set([
|
|
16
|
-
"php", "ruby", "javascript", "typescript", "java", "kotlin", "python", "csharp", "go", "c", "cpp", "rust", "swift", "dart"
|
|
16
|
+
"php", "ruby", "javascript", "typescript", "java", "kotlin", "python", "csharp", "go", "c", "cpp", "rust", "swift", "dart", "zig"
|
|
17
17
|
])
|
|
18
18
|
const configurationFields = new Set([
|
|
19
19
|
"bundleIdentifier", "capabilities", "deploymentTarget", "displayName", "entitlements", "infoPlist", "lifecycle",
|
|
@@ -10,7 +10,7 @@ const semanticEdges = new Set(["functions", "entryPoint", "body", "parameters",
|
|
|
10
10
|
/**
|
|
11
11
|
* Bounds a native occurrence plan and rejects cycles before recursive shared validation.
|
|
12
12
|
* @param {unknown} module - Untrusted backend request.
|
|
13
|
-
* @param {"c" | "cpp" | "kotlin" | "rust" | "swift" | "wasm"} [language] - Backend diagnostic language.
|
|
13
|
+
* @param {"c" | "cpp" | "kotlin" | "rust" | "swift" | "wasm" | "zig"} [language] - Backend diagnostic language.
|
|
14
14
|
* @returns {void}
|
|
15
15
|
*/
|
|
16
16
|
export function validateNativeGraph(module, language = "c") {
|
package/src/backends/program.js
CHANGED
|
@@ -23,7 +23,7 @@ import {programImportName, SourceWriter} from "./writer.js"
|
|
|
23
23
|
/** @type {Readonly<Set<import("../semantic/types.js").SemanticLanguage>>} */
|
|
24
24
|
const programTargets = new Set(["php", "ruby", "javascript", "typescript", "java"])
|
|
25
25
|
/** @type {Readonly<Set<import("../semantic/types.js").BackendLanguage>>} */
|
|
26
|
-
const programApplicationTargets = new Set(["android", "ios"])
|
|
26
|
+
const programApplicationTargets = new Set(["android", "ios", "flutter"])
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* Validates and prepares a complete semantic program for a non-text backend without allocating a writer.
|
|
@@ -68,8 +68,8 @@ export function preflightSemanticProgram({backendLanguage, diagnosticLanguage, p
|
|
|
68
68
|
* @param {import("../semantic/types.js").BackendLanguage} input.language - Registered program target.
|
|
69
69
|
* @param {import("../semantic/types.js").SemanticProgram} input.program - Complete semantic program.
|
|
70
70
|
* @param {"text" | "application"} [input.role] - Explicit artifact role; omitted preserves text generation.
|
|
71
|
-
* @param {import("../semantic/types.js").IosApplicationConfigurationInput | import("../semantic/types.js").AndroidApplicationConfigurationInput} [input.configuration] - Application configuration.
|
|
72
|
-
* @param {import("../semantic/types.js").IosApplicationAssetInput[] | import("../semantic/types.js").AndroidApplicationInputFile[]} [input.assets] - Exact caller assets.
|
|
71
|
+
* @param {import("../semantic/types.js").IosApplicationConfigurationInput | import("../semantic/types.js").AndroidApplicationConfigurationInput | import("../semantic/types.js").FlutterApplicationConfigurationInput} [input.configuration] - Application configuration.
|
|
72
|
+
* @param {import("../semantic/types.js").IosApplicationAssetInput[] | import("../semantic/types.js").AndroidApplicationInputFile[] | import("../semantic/types.js").FlutterApplicationAssetInput[]} [input.assets] - Exact caller assets.
|
|
73
73
|
* @param {import("../semantic/types.js").AndroidApplicationInputFile[]} [input.resources] - Exact Android caller resources.
|
|
74
74
|
* @returns {import("../semantic/types.js").GeneratedArtifactSet} Transactionally validated artifact set.
|
|
75
75
|
*/
|
package/src/backends/scalars.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/** @type {Readonly<Record<import("../semantic/types.js").TextBackendLanguage, Readonly<Record<import("../semantic/types.js").FunctionReturnTypeName, string>>>>} */
|
|
4
4
|
const targetScalarTypes = Object.freeze({
|
|
5
|
+
zig: Object.freeze({boolean: "bool", integer: "i64", string: "[]const u8", void: "void"}),
|
|
5
6
|
dart: Object.freeze({boolean: "bool", integer: "int", string: "String", void: "void"}),
|
|
6
7
|
swift: Object.freeze({boolean: "Bool", integer: "Int64", string: "String", void: "Void"}),
|
|
7
8
|
rust: Object.freeze({boolean: "bool", integer: "i64", string: "String", void: "()"}),
|
package/src/backends/shared.js
CHANGED
|
@@ -27,7 +27,7 @@ const binaryOperationSyntax = Object.freeze({
|
|
|
27
27
|
StringEqual: Object.freeze({default: "==", strict: "==="}),
|
|
28
28
|
StringNotEqual: Object.freeze({default: "!=", strict: "!=="})
|
|
29
29
|
})
|
|
30
|
-
const task005Languages = new Set(["php", "ruby", "javascript", "typescript", "java", "dart"])
|
|
30
|
+
const task005Languages = new Set(["php", "ruby", "javascript", "typescript", "java", "dart", "zig"])
|
|
31
31
|
const task006Languages = new Set(["php", "ruby", "javascript", "typescript", "java"])
|
|
32
32
|
const task007Languages = new Set(["php", "ruby", "javascript", "typescript", "java"])
|
|
33
33
|
const task008Languages = new Set(["php", "ruby", "javascript", "typescript", "java"])
|
|
@@ -1952,9 +1952,9 @@ function validateKnownTargetInteger(expression, language, location) {
|
|
|
1952
1952
|
if (language == "java" && value !== undefined && (value < -2147483648n || value > 2147483647n)) {
|
|
1953
1953
|
unsupportedCapability(language, "compile-time-known integer operation outside signed 32-bit int range", location)
|
|
1954
1954
|
}
|
|
1955
|
-
if ((language == "csharp" || language == "go" || language == "c" || language == "cpp" || language == "rust" || language == "swift" || language == "wasm") && value !== undefined &&
|
|
1955
|
+
if ((language == "csharp" || language == "go" || language == "c" || language == "cpp" || language == "rust" || language == "swift" || language == "wasm" || language == "zig") && value !== undefined &&
|
|
1956
1956
|
(value < -9223372036854775808n || value > 9223372036854775807n)) {
|
|
1957
|
-
const scalar = language == "wasm" ? "i64" : language == "swift" ? "Int64" : "long"
|
|
1957
|
+
const scalar = language == "wasm" || language == "zig" ? "i64" : language == "swift" ? "Int64" : "long"
|
|
1958
1958
|
|
|
1959
1959
|
unsupportedCapability(language, `compile-time-known integer operation outside signed 64-bit ${scalar} range`, location)
|
|
1960
1960
|
}
|
|
@@ -2241,7 +2241,8 @@ export function emitExpression(writer, expression, path, language, emitIdentifie
|
|
|
2241
2241
|
return
|
|
2242
2242
|
}
|
|
2243
2243
|
if (expression.kind == "CallExpression") {
|
|
2244
|
-
const
|
|
2244
|
+
const callArgumentSuffix = writer.callArgumentSuffixFor(expression)
|
|
2245
|
+
const dartMultiline = language == "dart" && (expression.arguments.length > 0 || Boolean(callArgumentSuffix)) &&
|
|
2245
2246
|
dartExpressionExceedsPageWidth(writer, expression)
|
|
2246
2247
|
const dartIndent = dartMultiline ? currentLineIndent(writer) : ""
|
|
2247
2248
|
|
|
@@ -2255,11 +2256,10 @@ export function emitExpression(writer, expression, path, language, emitIdentifie
|
|
|
2255
2256
|
emitExpression(writer, argument, `${path}/arguments/${index}`, language, emitIdentifier)
|
|
2256
2257
|
if (dartMultiline) writer.synthetic(",\n", "Dart formatter argument separator", [expression], [path])
|
|
2257
2258
|
})
|
|
2258
|
-
const callArgumentSuffix = writer.callArgumentSuffixFor(expression)
|
|
2259
|
-
|
|
2260
2259
|
if (callArgumentSuffix) {
|
|
2261
|
-
writer.synthetic(`${expression.arguments.length ? "
|
|
2262
|
-
|
|
2260
|
+
writer.synthetic(dartMultiline ? `${expression.arguments.length ? "" : "\n"}${dartIndent} ${callArgumentSuffix},\n` :
|
|
2261
|
+
`${expression.arguments.length ? ", " : ""}${callArgumentSuffix}`,
|
|
2262
|
+
"target-container semantic call argument", [expression], [path])
|
|
2263
2263
|
}
|
|
2264
2264
|
if (dartMultiline) writer.synthetic(dartIndent, "Dart call closing indentation", [expression], [path])
|
|
2265
2265
|
writer.mapped(")", {mappingKind: "anchor", node: expression, path})
|
|
@@ -2558,14 +2558,18 @@ function currentLineIndent(writer) {
|
|
|
2558
2558
|
* @param {import("../semantic/types.js").Expression} expression Semantic expression.
|
|
2559
2559
|
* @returns {string} Flat canonical spelling.
|
|
2560
2560
|
*/
|
|
2561
|
-
function flatDartExpression(writer, expression) {
|
|
2561
|
+
export function flatDartExpression(writer, expression) {
|
|
2562
2562
|
if (expression.kind == "IdentifierExpression") return expression.name
|
|
2563
2563
|
if (expression.kind == "IntegerLiteral") return String(expression.value)
|
|
2564
2564
|
if (expression.kind == "BooleanLiteral") return `_semantifoldBoolean(${expression.value ? "true" : "false"})`
|
|
2565
2565
|
if (expression.kind == "StringLiteral") return emitStringLiteral("dart", expression.value)
|
|
2566
2566
|
if (expression.kind == "CallExpression") {
|
|
2567
|
-
|
|
2568
|
-
|
|
2567
|
+
const arguments_ = expression.arguments.map((argument) => flatDartExpression(writer, argument))
|
|
2568
|
+
const callArgumentSuffix = writer.callArgumentSuffixFor(expression)
|
|
2569
|
+
|
|
2570
|
+
if (callArgumentSuffix) arguments_.push(callArgumentSuffix)
|
|
2571
|
+
|
|
2572
|
+
return `${writer.callNameFor(expression)}(${arguments_.join(", ")})`
|
|
2569
2573
|
}
|
|
2570
2574
|
if (expression.kind == "UnaryExpression") {
|
|
2571
2575
|
const operand = flatDartExpression(writer, expression.operand)
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/** Exact Zig 0.15.2 standard-library-only support; the frontend checks every token before collapse. */
|
|
4
|
+
export const zigRuntime = `const std = @import("std");
|
|
5
|
+
|
|
6
|
+
var semantifold_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
7
|
+
|
|
8
|
+
fn semantifold_fail(message: []const u8) noreturn {
|
|
9
|
+
std.fs.File.stderr().writeAll(message) catch {};
|
|
10
|
+
std.process.exit(70);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
fn semantifold_integer_add(left: i64, right: i64) i64 {
|
|
14
|
+
const result = @addWithOverflow(left, right);
|
|
15
|
+
if (result[1] != 0) semantifold_fail("semantifold: integer overflow\\n");
|
|
16
|
+
return result[0];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
fn semantifold_integer_subtract(left: i64, right: i64) i64 {
|
|
20
|
+
const result = @subWithOverflow(left, right);
|
|
21
|
+
if (result[1] != 0) semantifold_fail("semantifold: integer overflow\\n");
|
|
22
|
+
return result[0];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
fn semantifold_integer_multiply(left: i64, right: i64) i64 {
|
|
26
|
+
const result = @mulWithOverflow(left, right);
|
|
27
|
+
if (result[1] != 0) semantifold_fail("semantifold: integer overflow\\n");
|
|
28
|
+
return result[0];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
fn semantifold_integer_negate(value: i64) i64 {
|
|
32
|
+
return semantifold_integer_subtract(0, value);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
fn semantifold_string_concat(left: []const u8, right: []const u8) []const u8 {
|
|
36
|
+
const size = @addWithOverflow(left.len, right.len);
|
|
37
|
+
if (size[1] != 0) semantifold_fail("semantifold: allocation failure\\n");
|
|
38
|
+
const bytes = semantifold_arena.allocator().alloc(u8, size[0]) catch semantifold_fail("semantifold: allocation failure\\n");
|
|
39
|
+
@memcpy(bytes[0..left.len], left);
|
|
40
|
+
@memcpy(bytes[left.len..], right);
|
|
41
|
+
return bytes;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
fn semantifold_string_equal(left: []const u8, right: []const u8) bool {
|
|
45
|
+
return std.mem.eql(u8, left, right);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
fn semantifold_string_not_equal(left: []const u8, right: []const u8) bool {
|
|
49
|
+
return !std.mem.eql(u8, left, right);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
fn semantifold_write(value: []const u8) void {
|
|
53
|
+
const stdout = std.fs.File.stdout();
|
|
54
|
+
stdout.writeAll(value) catch semantifold_fail("semantifold: output failure\\n");
|
|
55
|
+
stdout.writeAll("\\n") catch semantifold_fail("semantifold: output failure\\n");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
fn semantifold_print_integer(value: i64) void {
|
|
59
|
+
var buffer: [20]u8 = undefined;
|
|
60
|
+
const bytes = std.fmt.bufPrint(&buffer, "{d}", .{value}) catch semantifold_fail("semantifold: output failure\\n");
|
|
61
|
+
semantifold_write(bytes);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
fn semantifold_print_boolean(value: bool) void {
|
|
65
|
+
semantifold_write(if (value) "true" else "false");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
fn semantifold_print_string(value: []const u8) void {
|
|
69
|
+
semantifold_write(value);
|
|
70
|
+
}
|
|
71
|
+
`
|
|
72
|
+
|
|
73
|
+
/** Fixed native-host Zig build with only the selected optimization option and no package resolution. */
|
|
74
|
+
export const zigBuild = `const std = @import("std");
|
|
75
|
+
|
|
76
|
+
pub fn build(b: *std.Build) void {
|
|
77
|
+
const optimize = b.standardOptimizeOption(.{});
|
|
78
|
+
const executable = b.addExecutable(.{
|
|
79
|
+
.name = "semantifold-generated",
|
|
80
|
+
.root_module = b.createModule(.{
|
|
81
|
+
.root_source_file = b.path("src/main.zig"),
|
|
82
|
+
.target = b.graph.host,
|
|
83
|
+
.optimize = optimize,
|
|
84
|
+
}),
|
|
85
|
+
});
|
|
86
|
+
b.installArtifact(executable);
|
|
87
|
+
|
|
88
|
+
const tests = b.addTest(.{ .root_module = executable.root_module });
|
|
89
|
+
const run_tests = b.addRunArtifact(tests);
|
|
90
|
+
const test_step = b.step("test", "Compile and run tests");
|
|
91
|
+
test_step.dependOn(&run_tests.step);
|
|
92
|
+
}
|
|
93
|
+
`
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import {unsupportedCapability} from "../diagnostic.js"
|
|
4
|
+
|
|
5
|
+
/** Repository-owned bound for frozen CST traversal and deterministic project generation. */
|
|
6
|
+
export const maximumZigSourceLength = 1_000_000
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Rejects statically impossible UTF-8 arena sizes without changing the semantic graph.
|
|
10
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Fully validated module.
|
|
11
|
+
* @returns {void}
|
|
12
|
+
*/
|
|
13
|
+
export function validateZigValues(module) {
|
|
14
|
+
/**
|
|
15
|
+
* Infers a known UTF-8 byte size while validating literal shape.
|
|
16
|
+
* @param {import("../semantic/types.js").Expression} expression - Expression to inspect.
|
|
17
|
+
* @param {Map<string, bigint | undefined>} sizes - Known binding sizes.
|
|
18
|
+
* @returns {bigint | undefined} Known byte size when statically available.
|
|
19
|
+
*/
|
|
20
|
+
const size = (expression, sizes) => {
|
|
21
|
+
if (expression.kind == "IntegerLiteral" && (!Number.isSafeInteger(expression.value) || expression.value < 0 || Object.is(expression.value, -0))) {
|
|
22
|
+
unsupportedCapability("zig", "non-safe or noncanonical i64 literal", expression.location)
|
|
23
|
+
}
|
|
24
|
+
if (expression.kind == "StringLiteral") return BigInt(Buffer.byteLength(expression.value, "utf8"))
|
|
25
|
+
if (expression.kind == "IdentifierExpression") return sizes.get(expression.name)
|
|
26
|
+
if (expression.kind == "CallExpression") expression.arguments.forEach(argument => size(argument, sizes))
|
|
27
|
+
else if (expression.kind == "UnaryExpression") size(expression.operand, sizes)
|
|
28
|
+
else if (expression.kind == "BinaryExpression") {
|
|
29
|
+
const left = size(expression.left, sizes)
|
|
30
|
+
const right = size(expression.right, sizes)
|
|
31
|
+
|
|
32
|
+
if (expression.operation == "StringConcat") {
|
|
33
|
+
if ((left ?? 0n) + (right ?? 0n) > 9223372036854775807n) {
|
|
34
|
+
unsupportedCapability("zig", "known immutable UTF-8 slice exceeds the qualified native allocation limit", expression.location)
|
|
35
|
+
}
|
|
36
|
+
if (left !== undefined && right !== undefined) return left + right
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return undefined
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Propagates conservative known string sizes through one block.
|
|
43
|
+
* @param {import("../semantic/types.js").Block} block - Block to inspect.
|
|
44
|
+
* @param {Map<string, bigint | undefined>} inherited - Sizes visible on entry.
|
|
45
|
+
* @returns {Map<string, bigint | undefined>} Sizes known after the block.
|
|
46
|
+
*/
|
|
47
|
+
const visit = (block, inherited) => {
|
|
48
|
+
const sizes = new Map(inherited)
|
|
49
|
+
|
|
50
|
+
for (const statement of block.statements) {
|
|
51
|
+
if (statement.kind == "LocalDeclaration") sizes.set(statement.name, size(statement.initializer, sizes))
|
|
52
|
+
else if (statement.kind == "AssignmentStatement") sizes.set(statement.target.name, size(statement.expression, sizes))
|
|
53
|
+
else if (statement.kind == "IfStatement") {
|
|
54
|
+
size(statement.condition, sizes)
|
|
55
|
+
const left = visit(statement.consequent, sizes)
|
|
56
|
+
const right = statement.alternate ? visit(statement.alternate, sizes) : sizes
|
|
57
|
+
|
|
58
|
+
for (const name of sizes.keys()) sizes.set(name, left.get(name) === right.get(name) ? left.get(name) : undefined)
|
|
59
|
+
} else if (statement.kind == "ExpressionStatement" || statement.kind == "PrintStatement" || statement.kind == "ReturnStatement") {
|
|
60
|
+
if (statement.expression) size(statement.expression, sizes)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return sizes
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
for (const declaration of module.functions) visit(declaration.body, new Map())
|
|
67
|
+
visit(module.entryPoint.body, new Map())
|
|
68
|
+
}
|