@scriptc/compiler 0.2.0 → 0.2.2
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/ambient/scriptc-node-fallback.d.ts +84 -19
- package/dist/backend/cycle-analysis.js +1 -0
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/llvm/classes.js +21 -5
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +8 -0
- package/dist/backend/llvm/dyn.js +247 -108
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +6 -3
- package/dist/backend/llvm/emitter.js +99 -25
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +9 -1
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +1 -1
- package/dist/backend/llvm/expr-bytes.js +28 -17
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +5 -0
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +1 -1
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +47 -13
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +11 -1
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-records.js +11 -3
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +187 -18
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +7 -57
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +41 -3
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +12 -9
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +23 -3
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +80 -3
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/shapes.js +8 -2
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/may-throw.js +4 -0
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +1 -1
- package/dist/backend/native-codegen.js +4 -3
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +11 -0
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +3 -6
- package/dist/backend/native-toolchain.js +53 -23
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +72 -0
- package/dist/backend/native-toolchain.test.js.map +1 -1
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-native.js +4 -1
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack.test.js +1 -1
- package/dist/backend/target-diagnostics.d.ts +5 -0
- package/dist/backend/target-diagnostics.js +72 -1
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/target-diagnostics.test.d.ts +1 -0
- package/dist/backend/target-diagnostics.test.js +68 -0
- package/dist/backend/target-diagnostics.test.js.map +1 -0
- package/dist/backend/targets.js +10 -6
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +7 -0
- package/dist/backend/targets.test.js.map +1 -1
- package/dist/compat/fetch-profile.js +34 -4
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/coverage/surface-manifest.js +5 -3
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.js +2 -7
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +7 -3
- package/dist/executable/executable-cache.js +47 -11
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +109 -2
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +2 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/builtin-modules.d.ts +1 -1
- package/dist/frontend/builtin-modules.js +1 -1
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/function-completion.d.ts +6 -0
- package/dist/frontend/function-completion.js +50 -0
- package/dist/frontend/function-completion.js.map +1 -0
- package/dist/frontend/lowering/abstract-equality.js +5 -1
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/checked-iterable-spread.d.ts +4 -0
- package/dist/frontend/lowering/checked-iterable-spread.js +30 -0
- package/dist/frontend/lowering/checked-iterable-spread.js.map +1 -0
- package/dist/frontend/lowering/checked-promise-all.d.ts +5 -0
- package/dist/frontend/lowering/checked-promise-all.js +31 -0
- package/dist/frontend/lowering/checked-promise-all.js.map +1 -0
- package/dist/frontend/lowering/class-callbacks.d.ts +4 -4
- package/dist/frontend/lowering/class-callbacks.js +29 -17
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +14 -0
- package/dist/frontend/lowering/class-construction.js +185 -0
- package/dist/frontend/lowering/class-construction.js.map +1 -0
- package/dist/frontend/lowering/class-descriptors.d.ts +2 -1
- package/dist/frontend/lowering/class-descriptors.js +58 -10
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +36 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.js +965 -91
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +66 -3
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-instance-constructor.d.ts +1 -1
- package/dist/frontend/lowering/class-instance-constructor.js +15 -42
- package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.d.ts +20 -1
- package/dist/frontend/lowering/class-method-values.js +120 -24
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +10 -3
- package/dist/frontend/lowering/class-prototypes.js +188 -21
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
- package/dist/frontend/lowering/class-runtime-statics.js +84 -0
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -0
- package/dist/frontend/lowering/class-static-data.d.ts +1 -0
- package/dist/frontend/lowering/class-static-data.js +6 -4
- package/dist/frontend/lowering/class-static-data.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +66 -17
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +24 -47
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.d.ts +13 -0
- package/dist/frontend/lowering/deferred-module-initializers.js +410 -0
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.d.ts +1 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js +92 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -0
- package/dist/frontend/lowering/error-methods.d.ts +4 -1
- package/dist/frontend/lowering/error-methods.js +100 -1
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/native-proxy.js +3 -1
- package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +19 -11
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +68 -7
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +3 -4
- package/dist/frontend/lowering/expressions/optional-chains.js +72 -20
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/function-context.d.ts +11 -3
- package/dist/frontend/lowering/function-context.js +11 -5
- package/dist/frontend/lowering/function-context.js.map +1 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +1 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +39 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.d.ts +2 -0
- package/dist/frontend/lowering/lib-boundary.js +54 -1
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.d.ts +7 -1
- package/dist/frontend/lowering/lower-builtin-values.js +113 -3
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-builtins.d.ts +10 -14
- package/dist/frontend/lowering/lower-builtins.js +443 -88
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +8 -5
- package/dist/frontend/lowering/lower-calls.js +717 -142
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +18 -13
- package/dist/frontend/lowering/lower-classes.js +1076 -188
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.d.ts +9 -0
- package/dist/frontend/lowering/lower-containers.js +172 -51
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +3 -2
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +12 -8
- package/dist/frontend/lowering/lower-exprs.js +802 -232
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +17 -2
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +15 -1
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +2 -0
- package/dist/frontend/lowering/lower-island.js +36 -10
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-island.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-island.test.js +51 -0
- package/dist/frontend/lowering/lower-island.test.js.map +1 -0
- package/dist/frontend/lowering/lower-modules.d.ts +1 -3
- package/dist/frontend/lowering/lower-modules.js +380 -73
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-modules.test.js +107 -0
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -0
- package/dist/frontend/lowering/lower-stmts.d.ts +7 -3
- package/dist/frontend/lowering/lower-stmts.js +221 -47
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-stmts.test.js +77 -0
- package/dist/frontend/lowering/lower-stmts.test.js.map +1 -0
- package/dist/frontend/lowering/lower-stream.js +3 -1
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-url.d.ts +2 -1
- package/dist/frontend/lowering/lower-url.js +32 -9
- package/dist/frontend/lowering/lower-url.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +53 -10
- package/dist/frontend/lowering/lowerer.js +390 -77
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +187 -3
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +7 -0
- package/dist/frontend/lowering/module-namespace-elements.js +54 -0
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -0
- package/dist/frontend/lowering/object-factory-new.d.ts +4 -3
- package/dist/frontend/lowering/object-factory-new.js +27 -14
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +48 -19
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/text-decoder-encoding.d.ts +2 -0
- package/dist/frontend/lowering/text-decoder-encoding.js +8 -0
- package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -1
- package/dist/frontend/lowering/text-decoder-encoding.test.js +2 -1
- package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -1
- package/dist/frontend/lowering/unregistered-class-types.test.js +3 -3
- package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -1
- package/dist/frontend/npm-static-prune.js +116 -34
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-prune.test.js +8 -0
- package/dist/frontend/npm-static-prune.test.js.map +1 -1
- package/dist/frontend/program.d.ts +1 -1
- package/dist/frontend/program.js +57 -26
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +18 -0
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/ts7/ast.js +4 -3
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.js +5 -10
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +9 -1
- package/dist/frontend/type-mapper.js +169 -23
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +23 -0
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend/union-discriminants.d.ts +1 -1
- package/dist/frontend/union-discriminants.js +24 -9
- package/dist/frontend/union-discriminants.js.map +1 -1
- package/dist/index.js +16 -10
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +2 -0
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/ir.d.ts +74 -41
- package/dist/ir/ir.js +167 -43
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +35 -0
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/serialize.js +35 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +26 -1
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/traverse.d.ts +0 -3
- package/dist/ir/traverse.js +33 -20
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +136 -16
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +77 -1
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/compiler-self-identity.js +1 -1
- package/dist/library/compiler-self-identity.test.js +2 -2
- package/dist/library/compiler-self-identity.test.js.map +1 -1
- package/dist/library/int-infer.d.ts +2 -2
- package/dist/library/int-infer.js +10 -7
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/int-infer.test.js +44 -0
- package/dist/library/int-infer.test.js.map +1 -1
- package/dist/library/prepare.js +2 -1
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/sanitizer.js +3 -1
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/toolchain.d.ts +1 -1
- package/dist/native/toolchain.js +26 -6
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +53 -1
- package/dist/native/toolchain.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +170 -93
|
@@ -5,6 +5,24 @@ import { expect, test, vi } from "vitest";
|
|
|
5
5
|
import { checkPreflight, isNodeEsmFile, loadProgram, makeCycleAdmission } from "./program-node.js";
|
|
6
6
|
import * as ts from "./ts7/ast.js";
|
|
7
7
|
import { AstNode } from "./ts7/ast-node.js";
|
|
8
|
+
import { SemanticChecker } from "./ts7/semantic-checker.js";
|
|
9
|
+
test("program-root discovery does not fetch types for unrelated string calls", () => {
|
|
10
|
+
const dir = mkdtempSync(join(tmpdir(), "scriptc-root-queries-"));
|
|
11
|
+
const entry = join(dir, "main.ts");
|
|
12
|
+
writeFileSync(join(dir, "package.json"), '{"type":"module"}');
|
|
13
|
+
writeFileSync(entry, 'function label(text: string) { return text; } console.log(label("ready"));\n');
|
|
14
|
+
const types = vi.spyOn(SemanticChecker.prototype, "getTypeOfSymbol");
|
|
15
|
+
const load = loadProgram(entry);
|
|
16
|
+
try {
|
|
17
|
+
expect(types).not.toHaveBeenCalled();
|
|
18
|
+
expect(checkPreflight(load)).toEqual([]);
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
types.mockRestore();
|
|
22
|
+
load.dispose();
|
|
23
|
+
rmSync(dir, { recursive: true, force: true });
|
|
24
|
+
}
|
|
25
|
+
});
|
|
8
26
|
test("ambiguous module classification bounds ancestor work on deep expressions", () => {
|
|
9
27
|
const directory = mkdtempSync(join(process.platform === "win32" ? tmpdir() : "/tmp", "scriptc-module-depth-"));
|
|
10
28
|
const entry = join(directory, "main.js");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.test.js","sourceRoot":"","sources":["../../src/frontend/program.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAkB,MAAM,mBAAmB,CAAC;AACnH,OAAO,KAAK,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"program.test.js","sourceRoot":"","sources":["../../src/frontend/program.test.ts"],"names":[],"mappings":"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"}
|
package/dist/frontend/ts7/ast.js
CHANGED
|
@@ -62,6 +62,9 @@ export function walkPreorder(root, cb) {
|
|
|
62
62
|
const stack = [root];
|
|
63
63
|
const depths = [0];
|
|
64
64
|
const children = [];
|
|
65
|
+
// The buffer belongs to this walk. Reuse its visitor too: constructing a
|
|
66
|
+
// closure per node adds allocation and cycle-collection work natively.
|
|
67
|
+
const appendChild = (child) => { children.push(child); };
|
|
65
68
|
while (stack.length > 0) {
|
|
66
69
|
const n = stack.pop();
|
|
67
70
|
const depth = depths.pop();
|
|
@@ -71,9 +74,7 @@ export function walkPreorder(root, cb) {
|
|
|
71
74
|
if (verdict === "skip")
|
|
72
75
|
continue;
|
|
73
76
|
children.length = 0;
|
|
74
|
-
n.forEachChild(
|
|
75
|
-
children.push(c);
|
|
76
|
-
});
|
|
77
|
+
n.forEachChild(appendChild);
|
|
77
78
|
for (let i = children.length - 1; i >= 0; i--) {
|
|
78
79
|
stack.push(children[i]);
|
|
79
80
|
depths.push(depth + 1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../../src/frontend/ts7/ast.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;+CAkB+C;AAe/C,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,8BAA8B,EAC9B,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvD,qDAAqD;AAErD,2EAA2E;AAC3E,6EAA6E;AAC7E,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,iEAAiE;AAEjE,MAAM,CAAC,MAAM,WAAW,GAA6D,sBAAsB,CAAC;AAC5G,MAAM,CAAC,MAAM,mBAAmB,GAC9B,8BAA8B,CAAC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAA8D,uBAAuB,CAAC;AACtH,MAAM,CAAC,MAAM,aAAa,GAA+D,wBAAwB,CAAC;AAClH,MAAM,CAAC,MAAM,aAAa,GAA+D,wBAAwB,CAAC;AAClH,MAAM,CAAC,MAAM,UAAU,GAA4D,qBAAqB,CAAC;AAOzG;;;;+DAI+D;AAC/D,MAAM,UAAU,cAAc,CAAC,IAAsB;IACnD,OAAO,sBAAsB,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,OAAO,IAAI,CAAC,uBAAuB,KAAK,SAAS,CAAC;AACpD,CAAC;AAED,0DAA0D;AAE1D,MAAM,UAAU,YAAY,CAC1B,IAAU,EACV,MAAqC,EACrC,OAAmD;IAEnD,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;;4CAS4C;AAC5C,MAAM,UAAU,YAAY,CAC1B,IAAU,EACV,EAAyD;IAEzD,MAAM,KAAK,GAAW,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAa,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,EAAG,CAAC;QAC5B,MAAM,OAAO,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,OAAO,KAAK,MAAM;YAAE,OAAO;QAC/B,IAAI,OAAO,KAAK,MAAM;YAAE,SAAS;QACjC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACpB,CAAC,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../../src/frontend/ts7/ast.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,17 +2,12 @@
|
|
|
2
2
|
* JSON.parse itself validates grammar. A valid surrogate pair is preserved;
|
|
3
3
|
* a lone escape must not silently change a type literal or symbol name. */
|
|
4
4
|
export function checkSemanticJsonStrings(json, preservesSurrogates) {
|
|
5
|
-
|
|
5
|
+
// Most checker responses contain no Unicode escapes. Inspect only escape
|
|
6
|
+
// sequences instead of mapping every native string index to UTF-16. Valid
|
|
7
|
+
// JSON has no backslashes outside strings; JSON.parse checks the grammar.
|
|
8
|
+
if (preservesSurrogates || !json.includes("\\u"))
|
|
6
9
|
return;
|
|
7
|
-
let
|
|
8
|
-
for (let index = 0; index < json.length; index++) {
|
|
9
|
-
const code = json.charCodeAt(index);
|
|
10
|
-
if (code === 34) {
|
|
11
|
-
inString = !inString;
|
|
12
|
-
continue;
|
|
13
|
-
}
|
|
14
|
-
if (!inString || code !== 92)
|
|
15
|
-
continue;
|
|
10
|
+
for (let index = json.indexOf("\\"); index >= 0; index = json.indexOf("\\", index + 1)) {
|
|
16
11
|
if (json.charCodeAt(++index) !== 117)
|
|
17
12
|
continue;
|
|
18
13
|
const unit = jsonHexUnit(json, index + 1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-json.js","sourceRoot":"","sources":["../../../src/frontend/ts7/semantic-json.ts"],"names":[],"mappings":"AAAA;;2EAE2E;AAC3E,MAAM,UAAU,wBAAwB,CAAC,IAAY,EAAE,mBAA4B;IACjF,
|
|
1
|
+
{"version":3,"file":"semantic-json.js","sourceRoot":"","sources":["../../../src/frontend/ts7/semantic-json.ts"],"names":[],"mappings":"AAAA;;2EAE2E;AAC3E,MAAM,UAAU,wBAAwB,CAAC,IAAY,EAAE,mBAA4B;IACjF,yEAAyE;IACzE,0EAA0E;IAC1E,0EAA0E;IAC1E,IAAI,mBAAmB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO;IACzD,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;QACvF,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG;YAAE,SAAS;QAC/C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC1C,KAAK,IAAI,CAAC,CAAC;QACX,IAAI,IAAI,GAAG,MAAM,IAAI,IAAI,GAAG,MAAM;YAAE,SAAS;QAC7C,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC9F,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC1C,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;gBAAC,KAAK,IAAI,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;QACjE,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAClG,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,MAAc;IAC/C,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC,CAAC;IACxC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,KAAK,GAAG,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvI,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QACzB,KAAK,GAAG,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wEAAwE;AACxE,4EAA4E;AAC5E,MAAM,uBAAuB,GAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAY,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;AAE7F,MAAM,UAAU,iBAAiB,CAAI,IAAY;IAC/C,wBAAwB,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;AAC/B,CAAC"}
|
|
@@ -13,7 +13,7 @@ export declare function jsOpenObjectType(decl: ts.Node | undefined, type: IrType
|
|
|
13
13
|
* dynamic-only even though response.headers is native.
|
|
14
14
|
* Declaration provenance is checked in mapType so user types with the
|
|
15
15
|
* same names keep their ordinary structural representation. */
|
|
16
|
-
export declare const ISLAND_AMBIENT_TYPES: readonly ["Response", "ResponseInit", "RequestInit", "Event", "EventTarget", "AbortController", "AbortSignal", "Headers", "ReadableStream", "ReadableStreamDefaultReader", "ReadableStreamDefaultController", "ReadableStreamReadResult", "ReadableStreamReadValueResult", "ReadableStreamReadDoneResult"];
|
|
16
|
+
export declare const ISLAND_AMBIENT_TYPES: readonly ["Response", "Request", "ResponseInit", "RequestInit", "Event", "EventTarget", "AbortController", "AbortSignal", "Headers", "ReadableStream", "ReadableStreamDefaultReader", "ReadableStreamDefaultController", "ReadableStreamReadResult", "ReadableStreamReadValueResult", "ReadableStreamReadDoneResult"];
|
|
17
17
|
/** True for the parseArgs type family that deliberately rides dyn. Exported
|
|
18
18
|
* for the property-read bridge after TypeScript narrows a token union arm. */
|
|
19
19
|
export declare function isParseArgsDynTypeName(name: string): boolean;
|
|
@@ -27,6 +27,8 @@ export type DeclaredOrderPriority = readonly number[] | DeclaredOrderPriorityRef
|
|
|
27
27
|
* struct). Owned by the Lowerer; `mapType` needs it to intern the object
|
|
28
28
|
* types it encounters, which is why it is threaded through as a parameter. */
|
|
29
29
|
export declare class ShapeRegistry {
|
|
30
|
+
/** Existing layouts change only when a recursive placeholder closes. */
|
|
31
|
+
revision: number;
|
|
30
32
|
private readonly byKey;
|
|
31
33
|
private readonly byId;
|
|
32
34
|
/** Historical emit-order rank of the declaration-order metadata each
|
|
@@ -122,8 +124,11 @@ export declare class ShapeRegistry {
|
|
|
122
124
|
* discriminator contract. An arm's index in that list IS its runtime tag.
|
|
123
125
|
* Owned by the Lowerer; threaded through mapType like ShapeRegistry. */
|
|
124
126
|
export declare class UnionRegistry {
|
|
127
|
+
/** Existing arm/discriminator contracts change when a placeholder closes. */
|
|
128
|
+
revision: number;
|
|
125
129
|
private readonly byKey;
|
|
126
130
|
private readonly byId;
|
|
131
|
+
private readonly armTags;
|
|
127
132
|
/** All interned unions in first-seen (`u0`, `u1`, ...) order. */
|
|
128
133
|
readonly unions: IrUnionDef[];
|
|
129
134
|
/** ts.Types currently being mapped — a back-reference to one is the
|
|
@@ -155,6 +160,9 @@ export declare class UnionRegistry {
|
|
|
155
160
|
/** An exact arm transformation keeps the source's semantic variants. */
|
|
156
161
|
transform(source: IrUnionDef, arms: IrType[]): string;
|
|
157
162
|
get(unionId: string): IrUnionDef | undefined;
|
|
163
|
+
/** Index large arm lists once. Exact equality still resolves type-key
|
|
164
|
+
* collisions, including optional function ABI flags. */
|
|
165
|
+
armTag(unionId: string, arm: IrType): number;
|
|
158
166
|
}
|
|
159
167
|
/** Human-readable rendering of an IrType for diagnostics (records expand to
|
|
160
168
|
* their canonical field list, unions to their arms; `checker.typeToString`
|
|
@@ -6,6 +6,7 @@ import { BIGINT_T } from "../ir/ir.js";
|
|
|
6
6
|
import { literalValues } from "./literal-values.js";
|
|
7
7
|
import { remapUnionDiscriminant } from "./union-discriminants.js";
|
|
8
8
|
import { isJsSourceFile, isNodeTypesPath } from "./program.js";
|
|
9
|
+
import { functionCanReturnUndefined } from "./function-completion.js";
|
|
9
10
|
import { accessorSlotProp, recordTextCodecClass } from "../ir/ir.js";
|
|
10
11
|
// typeKey moved to ir/ir.ts (the backend needs it too, for per-type
|
|
11
12
|
// helper interning); re-exported here so frontend call sites keep their
|
|
@@ -18,10 +19,32 @@ export function jsOpenObjectType(decl, type, shapes, unions) {
|
|
|
18
19
|
return type;
|
|
19
20
|
const arms = type.kind === "union" ? unions.get(type.unionId)?.arms : [type];
|
|
20
21
|
const present = arms?.filter((arm) => arm.kind !== "undefinedT");
|
|
22
|
+
const parameter = ts.isParameter(decl) ? decl : decl.parent && ts.isParameter(decl.parent) ? decl.parent : null;
|
|
23
|
+
// Array parameters in JavaScript also accept typed arrays. Keep
|
|
24
|
+
// their runtime storage at the boundary, including default [] parameters.
|
|
25
|
+
if (parameter && !parameter.dotDotDotToken && present?.length === 1 &&
|
|
26
|
+
present[0].kind === "array")
|
|
27
|
+
return DYN;
|
|
28
|
+
if (parameter && !parameter.dotDotDotToken && present?.length === 1 && present[0].kind === "bytes")
|
|
29
|
+
return DYN;
|
|
30
|
+
// An unannotated JavaScript parameter's object default is a fallback,
|
|
31
|
+
// not a closed class contract. Published code routinely passes another
|
|
32
|
+
// implementation of the same protocol through a boxed callable.
|
|
33
|
+
if (parameter?.initializer && !parameter.type &&
|
|
34
|
+
present?.some((arm) => arm.kind === "object") &&
|
|
35
|
+
arms?.every((arm) => canConvertToDyn(arm, (id) => shapes.get(id), (id) => unions.get(id))))
|
|
36
|
+
return DYN;
|
|
21
37
|
if (present?.length !== 1 || present[0].kind !== "record")
|
|
22
38
|
return type;
|
|
23
39
|
const shape = shapes.get(present[0].shapeId);
|
|
24
|
-
|
|
40
|
+
// JavaScript dictionaries allow missing keys and inherited properties.
|
|
41
|
+
// A typed index slot cannot represent either of those reads faithfully.
|
|
42
|
+
if (shape?.indexValue && !shape.tuple)
|
|
43
|
+
return DYN;
|
|
44
|
+
const unitOnly = (field) => isUnitType(field) || field.kind === "void" ||
|
|
45
|
+
field.kind === "union" && unions.get(field.unionId)?.arms.every(isUnitType) === true;
|
|
46
|
+
return shape && !shape.tuple && !shape.indexValue &&
|
|
47
|
+
(shape.fields.length === 0 || shape.fields.some((field) => unitOnly(field.type))) ? DYN : type;
|
|
25
48
|
}
|
|
26
49
|
/** The ambient TYPE names of the fetch slice. Under --dynamic their
|
|
27
50
|
* values live in the embedded engine and map to island handles (jsval).
|
|
@@ -33,6 +56,7 @@ export function jsOpenObjectType(decl, type, shapes, unions) {
|
|
|
33
56
|
* same names keep their ordinary structural representation. */
|
|
34
57
|
export const ISLAND_AMBIENT_TYPES = [
|
|
35
58
|
"Response",
|
|
59
|
+
"Request",
|
|
36
60
|
"ResponseInit",
|
|
37
61
|
"RequestInit",
|
|
38
62
|
"Event",
|
|
@@ -100,6 +124,8 @@ function comparePriority(left, right) {
|
|
|
100
124
|
* struct). Owned by the Lowerer; `mapType` needs it to intern the object
|
|
101
125
|
* types it encounters, which is why it is threaded through as a parameter. */
|
|
102
126
|
export class ShapeRegistry {
|
|
127
|
+
/** Existing layouts change only when a recursive placeholder closes. */
|
|
128
|
+
revision = 0;
|
|
103
129
|
byKey = new Map();
|
|
104
130
|
byId = new Map();
|
|
105
131
|
/** Historical emit-order rank of the declaration-order metadata each
|
|
@@ -259,6 +285,7 @@ export class ShapeRegistry {
|
|
|
259
285
|
shape.indexValue = indexValue;
|
|
260
286
|
this.adoptDeclaredOrder(shape, declaredOrder);
|
|
261
287
|
this.pendingRec.delete(id);
|
|
288
|
+
this.revision++;
|
|
262
289
|
const key = this.keyOf(fields, false, indexValue);
|
|
263
290
|
if (!this.byKey.has(key))
|
|
264
291
|
this.byKey.set(key, id);
|
|
@@ -312,8 +339,11 @@ export class ShapeRegistry {
|
|
|
312
339
|
* discriminator contract. An arm's index in that list IS its runtime tag.
|
|
313
340
|
* Owned by the Lowerer; threaded through mapType like ShapeRegistry. */
|
|
314
341
|
export class UnionRegistry {
|
|
342
|
+
/** Existing arm/discriminator contracts change when a placeholder closes. */
|
|
343
|
+
revision = 0;
|
|
315
344
|
byKey = new Map();
|
|
316
345
|
byId = new Map();
|
|
346
|
+
armTags = new Map();
|
|
317
347
|
/** All interned unions in first-seen (`u0`, `u1`, ...) order. */
|
|
318
348
|
unions = [];
|
|
319
349
|
/** ts.Types currently being mapped — a back-reference to one is the
|
|
@@ -366,6 +396,8 @@ export class UnionRegistry {
|
|
|
366
396
|
if (discriminant)
|
|
367
397
|
def.discriminant = discriminant;
|
|
368
398
|
this.pendingRec.delete(id);
|
|
399
|
+
this.armTags.delete(id);
|
|
400
|
+
this.revision++;
|
|
369
401
|
const key = JSON.stringify([arms.map(typeKey), discriminant]);
|
|
370
402
|
if (!this.byKey.has(key))
|
|
371
403
|
this.byKey.set(key, id);
|
|
@@ -392,6 +424,29 @@ export class UnionRegistry {
|
|
|
392
424
|
get(unionId) {
|
|
393
425
|
return this.byId.get(unionId);
|
|
394
426
|
}
|
|
427
|
+
/** Index large arm lists once. Exact equality still resolves type-key
|
|
428
|
+
* collisions, including optional function ABI flags. */
|
|
429
|
+
armTag(unionId, arm) {
|
|
430
|
+
const def = this.byId.get(unionId);
|
|
431
|
+
if (!def)
|
|
432
|
+
return -1;
|
|
433
|
+
if (def.arms.length < 8)
|
|
434
|
+
return def.arms.findIndex((candidate) => typeEquals(candidate, arm));
|
|
435
|
+
let tags = this.armTags.get(unionId);
|
|
436
|
+
if (!tags) {
|
|
437
|
+
tags = new Map();
|
|
438
|
+
def.arms.forEach((candidate, tag) => {
|
|
439
|
+
const key = typeKey(candidate);
|
|
440
|
+
const previous = tags.get(key);
|
|
441
|
+
if (previous)
|
|
442
|
+
previous.push(tag);
|
|
443
|
+
else
|
|
444
|
+
tags.set(key, [tag]);
|
|
445
|
+
});
|
|
446
|
+
this.armTags.set(unionId, tags);
|
|
447
|
+
}
|
|
448
|
+
return tags.get(typeKey(arm))?.find((tag) => typeEquals(def.arms[tag], arm)) ?? -1;
|
|
449
|
+
}
|
|
395
450
|
}
|
|
396
451
|
/** Human-readable rendering of an IrType for diagnostics (records expand to
|
|
397
452
|
* their canonical field list, unions to their arms; `checker.typeToString`
|
|
@@ -717,11 +772,8 @@ export function containsUnion(t) {
|
|
|
717
772
|
* sentinel; any/unknown ride dyn; undefined-only yields have no C value
|
|
718
773
|
* form (null); else the mapped type.
|
|
719
774
|
* - return: void/undefined/never carry no value (VOID — the done-value is
|
|
720
|
-
* the undefined arm); any/unknown
|
|
721
|
-
*
|
|
722
|
-
* "no modeled return value" — VOID, not dyn (a dyn return channel would
|
|
723
|
-
* force the yield channel dyn too; bodies that `return v` under a
|
|
724
|
-
* defaulted TReturn keep their fence at the return site).
|
|
775
|
+
* the undefined arm); any/unknown carry checked values. A defaulted or
|
|
776
|
+
* inferred return channel can still return a value and must preserve it.
|
|
725
777
|
* - next: void/undefined/never mean valueless resumes (the undefined
|
|
726
778
|
* unit); any/unknown ride dyn; else the mapped type (`.next(v)` then
|
|
727
779
|
* requires its argument — fenced at the call site).
|
|
@@ -744,9 +796,9 @@ function genChannels(yieldTs, retTs, nextTs, ctx) {
|
|
|
744
796
|
}
|
|
745
797
|
if (!yieldT)
|
|
746
798
|
return null;
|
|
747
|
-
const retT = retTs === undefined || retTs.flags &
|
|
799
|
+
const retT = retTs === undefined || retTs.flags & UNITISH
|
|
748
800
|
? VOID
|
|
749
|
-
: mapType(retTs, ctx);
|
|
801
|
+
: retTs.flags & ANYISH ? DYN : mapType(retTs, ctx);
|
|
750
802
|
if (!retT || (retT.kind !== "void" && isUnitType(retT)))
|
|
751
803
|
return null;
|
|
752
804
|
const nextT = nextTs === undefined || nextTs.flags & UNITISH
|
|
@@ -1201,7 +1253,7 @@ function mapTypeInner(type, ctx) {
|
|
|
1201
1253
|
}
|
|
1202
1254
|
const fields = [];
|
|
1203
1255
|
for (let i = 0; i < args.length; i++) {
|
|
1204
|
-
let et = mapType(args[i], ctx);
|
|
1256
|
+
let et = !ctx.dynamic && (args[i].flags & ts.TypeFlags.Any) !== 0 ? DYN : mapType(args[i], ctx);
|
|
1205
1257
|
// A unit-only element (`[number, undefined]`) rides the unit-only
|
|
1206
1258
|
// union, the record-field rule.
|
|
1207
1259
|
if (et?.kind === "void" && isUnitOnlyTsType(args[i], ctx.resolveTypeParam))
|
|
@@ -1489,13 +1541,26 @@ function mapTypeInner(type, ctx) {
|
|
|
1489
1541
|
isDeclaredInAmbientModule(d, "diagnostics_channel"))) {
|
|
1490
1542
|
return F64;
|
|
1491
1543
|
}
|
|
1544
|
+
// Node names this result; the ambient WHATWG declaration uses a type literal.
|
|
1545
|
+
const encodeResult = psym && checker.declarationsOf(psym).some((decl) => {
|
|
1546
|
+
if (!ctx.isStdlibFile(decl.getSourceFile()))
|
|
1547
|
+
return false;
|
|
1548
|
+
if (ts.isInterfaceDeclaration(decl) && decl.name.text === "EncodeIntoResult")
|
|
1549
|
+
return true;
|
|
1550
|
+
const parent = decl.parent;
|
|
1551
|
+
return ts.isTypeLiteralNode(decl) && parent?.kind === ts.SyntaxKind.MethodSignature &&
|
|
1552
|
+
parent.name && ts.isIdentifier(parent.name) && parent.name.text === "encodeInto" &&
|
|
1553
|
+
parent.parent && ts.isInterfaceDeclaration(parent.parent) && parent.parent.name.text === "TextEncoder";
|
|
1554
|
+
});
|
|
1555
|
+
if (encodeResult)
|
|
1556
|
+
return { kind: "record", shapeId: ctx.shapes.intern([{ name: "read", type: F64 }, { name: "written", type: F64 }]) };
|
|
1492
1557
|
// WHATWG codec instances have ordinary reference identity and ownership.
|
|
1493
1558
|
// Their private encoding slot is omitted from enumeration and JSON.
|
|
1494
1559
|
if ((psym?.name === "TextEncoder" || psym?.name === "TextDecoder") &&
|
|
1495
1560
|
checker.declarationsOf(psym).some((d) => (ts.isInterfaceDeclaration(d) || ts.isClassDeclaration(d)) && ctx.isStdlibFile(d.getSourceFile()))) {
|
|
1496
1561
|
return {
|
|
1497
1562
|
kind: "record",
|
|
1498
|
-
shapeId: ctx.shapes.intern([{ name: `%${psym.name}`, type: F64 }], false, undefined, []),
|
|
1563
|
+
shapeId: ctx.shapes.intern([{ name: `%${psym.name}`, type: F64 }, ...(psym.name === "TextDecoder" ? [{ name: "%fatal", type: BOOL }, { name: "%ignoreBOM", type: BOOL }, { name: "%state", type: DYN }] : [])], false, undefined, []),
|
|
1499
1564
|
};
|
|
1500
1565
|
}
|
|
1501
1566
|
// string_decoder.StringDecoder: the decoder value is a two-field record
|
|
@@ -1562,6 +1627,10 @@ function mapTypeInner(type, ctx) {
|
|
|
1562
1627
|
// read has its own lowering (errno/syscall/path stay per-member fences).
|
|
1563
1628
|
if (isStdlibInterface("ErrnoException"))
|
|
1564
1629
|
return { kind: "object", className: "%Error" };
|
|
1630
|
+
// spawn consumes a presence-sensitive option bag, including optional
|
|
1631
|
+
// stdio and env values. Keep it checked-dynamic for native normalization.
|
|
1632
|
+
if (isStdlibInterface("SpawnOptions"))
|
|
1633
|
+
return DYN;
|
|
1565
1634
|
// The fetch ambient slice: under --dynamic these are island handles
|
|
1566
1635
|
// exactly like npm-declared types. Static fetch has one deliberately
|
|
1567
1636
|
// narrower native representation: Response is an opaque checked-
|
|
@@ -1671,9 +1740,8 @@ function mapTypeInner(type, ctx) {
|
|
|
1671
1740
|
// ArrayBuffer value exists. The other TypedArray flavors stay
|
|
1672
1741
|
// unmapped (the record path's index-signature check rejects them).
|
|
1673
1742
|
// RegExpMatchArray (s.match's result) IS a string[] here — the honest
|
|
1674
|
-
// slice: [whole match, ...captures]
|
|
1675
|
-
//
|
|
1676
|
-
// member like any other unlowered array property.
|
|
1743
|
+
// slice: [whole match, ...captures]. Nonparticipating captures use the
|
|
1744
|
+
// array's undefined element state; numeric access preserves that state.
|
|
1677
1745
|
if (isStdlibInterface("RegExpMatchArray"))
|
|
1678
1746
|
return arrayOf(STRING);
|
|
1679
1747
|
// TemplateStringsArray (a tag function's first parameter): a string[] —
|
|
@@ -1705,6 +1773,8 @@ function mapTypeInner(type, ctx) {
|
|
|
1705
1773
|
return F64;
|
|
1706
1774
|
if (isStdlibInterface("ArrayBuffer") || isStdlibInterface("PropertyDescriptor") || isStdlibInterface("ProcessVersions"))
|
|
1707
1775
|
return DYN;
|
|
1776
|
+
if (Object.values(BYTES_ELEMENT_NAME).some((name) => isStdlibInterface(`${name}Constructor`)))
|
|
1777
|
+
return DYN;
|
|
1708
1778
|
if (isStdlibInterface("Uint8Array"))
|
|
1709
1779
|
return bytesOf("u8");
|
|
1710
1780
|
if (isStdlibInterface("Uint32Array"))
|
|
@@ -1831,6 +1901,10 @@ function mapTypeInner(type, ctx) {
|
|
|
1831
1901
|
isDeclaredInAmbientModule(d, "tls"))) {
|
|
1832
1902
|
return { kind: "secureCtx" };
|
|
1833
1903
|
}
|
|
1904
|
+
// Scrypt's runtime options retain property accessors and aliases. Use
|
|
1905
|
+
// checked values so presence probes and repeated getter reads match Node.
|
|
1906
|
+
if (psym?.name === "ScryptOptions" && checker.declarationsOf(psym).some((d) => ts.isInterfaceDeclaration(d) && ctx.isStdlibFile(d.getSourceFile()) && isDeclaredInAmbientModule(d, "crypto")))
|
|
1907
|
+
return DYN;
|
|
1834
1908
|
// crypto.Hash / crypto.Hmac: native incremental digest handles. Keep
|
|
1835
1909
|
// provenance module-qualified so user classes with these common names
|
|
1836
1910
|
// retain their ordinary structural/class representation.
|
|
@@ -2053,6 +2127,9 @@ function mapTypeInner(type, ctx) {
|
|
|
2053
2127
|
return null;
|
|
2054
2128
|
return { kind: "promise", inner };
|
|
2055
2129
|
}
|
|
2130
|
+
// Native collection iterators use checked runtime iterator objects.
|
|
2131
|
+
if (isStdlibInterface("MapIterator") || isStdlibInterface("SetIterator"))
|
|
2132
|
+
return DYN;
|
|
2056
2133
|
// Generator<T, TReturn, TNext>, AsyncGenerator<T, TReturn, TNext> (and
|
|
2057
2134
|
// the lib's IterableIterator<T, ...>, the older sync annotation spelling):
|
|
2058
2135
|
// the generator kind. Channel normalization keeps the runtime honest:
|
|
@@ -2160,28 +2237,53 @@ function mapTypeInner(type, ctx) {
|
|
|
2160
2237
|
], false, undefined, ["address", "family", "port"]),
|
|
2161
2238
|
};
|
|
2162
2239
|
}
|
|
2240
|
+
// Filesystem options are data records. Keep their declared optional fields
|
|
2241
|
+
// instead of allowing arbitrary standard-library interfaces into records.
|
|
2242
|
+
if ((psym?.name === "FileReadOptions" || psym?.name === "ReadOptions" || psym?.name === "ReadOptionsWithBuffer" || psym?.name === "WriteOptions") &&
|
|
2243
|
+
checker.declarationsOf(psym).some((d) => ts.isInterfaceDeclaration(d) && ctx.isStdlibFile(d.getSourceFile()) &&
|
|
2244
|
+
(isDeclaredInAmbientModule(d, "fs/promises") || isDeclaredInAmbientModule(d, "fs")))) {
|
|
2245
|
+
const fields = [];
|
|
2246
|
+
for (const property of checker.getPropertiesOfType(widened)) {
|
|
2247
|
+
if (!["buffer", "offset", "length", "position"].includes(property.name))
|
|
2248
|
+
return null;
|
|
2249
|
+
const type = mapType(checker.getTypeOfSymbol(property), ctx);
|
|
2250
|
+
if (!type)
|
|
2251
|
+
return null;
|
|
2252
|
+
fields.push({ name: property.name, type });
|
|
2253
|
+
}
|
|
2254
|
+
const order = fields.map((field) => field.name);
|
|
2255
|
+
fields.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
|
|
2256
|
+
return { kind: "record", shapeId: ctx.shapes.intern(fields, false, undefined, order) };
|
|
2257
|
+
}
|
|
2163
2258
|
// fs/promises FileReadResult<T> / FileWriteResult<T>: the two-field
|
|
2164
2259
|
// null-prototype objects returned by FileHandle.read/write. The native
|
|
2165
2260
|
// record does not model the prototype (unobservable through the lowered
|
|
2166
2261
|
// surface); it preserves the caller buffer/string by reference.
|
|
2167
|
-
if ((psym?.name === "FileReadResult" || psym?.name === "FileWriteResult") &&
|
|
2262
|
+
if ((psym?.name === "FileReadResult" || psym?.name === "FileWriteResult" || psym?.name === "FileReadvResult" || psym?.name === "FileWritevResult" || psym?.name === "ReadVResult" || psym?.name === "WriteVResult") &&
|
|
2168
2263
|
checker.declarationsOf(psym).some((d) => ts.isInterfaceDeclaration(d) &&
|
|
2169
2264
|
ctx.isStdlibFile(d.getSourceFile()) &&
|
|
2170
|
-
isDeclaredInAmbientModule(d, "fs/promises")
|
|
2265
|
+
(isDeclaredInAmbientModule(d, "fs/promises") ||
|
|
2266
|
+
((psym.name === "ReadVResult" || psym.name === "WriteVResult") && isDeclaredInAmbientModule(d, "fs"))))) {
|
|
2171
2267
|
const args = checker.getTypeArguments(widened);
|
|
2172
2268
|
if (args.length !== 1)
|
|
2173
2269
|
return null;
|
|
2174
|
-
const
|
|
2175
|
-
|
|
2270
|
+
const vector = psym.name === "FileReadvResult" || psym.name === "FileWritevResult" || psym.name === "ReadVResult" || psym.name === "WriteVResult";
|
|
2271
|
+
const emptyVector = vector && checker.isArrayType(args[0]) &&
|
|
2272
|
+
(checker.getTypeArguments(args[0])[0].flags & ts.TypeFlags.Never) !== 0;
|
|
2273
|
+
const payload = emptyVector ? arrayOf(bytesOf("u8")) : mapType(args[0], ctx);
|
|
2274
|
+
if (!payload || (vector
|
|
2275
|
+
? !(payload.kind === "array" && payload.elem.kind === "bytes" && payload.elem.elem === "u8")
|
|
2276
|
+
: !(payload.kind === "string" || (payload.kind === "bytes" && payload.elem === "u8")))) {
|
|
2176
2277
|
return null;
|
|
2177
2278
|
}
|
|
2178
|
-
const count = psym.name === "FileReadResult" ? "bytesRead" : "bytesWritten";
|
|
2279
|
+
const count = psym.name === "FileReadResult" || psym.name === "FileReadvResult" || psym.name === "ReadVResult" ? "bytesRead" : "bytesWritten";
|
|
2280
|
+
const payloadName = vector ? "buffers" : "buffer";
|
|
2179
2281
|
return {
|
|
2180
2282
|
kind: "record",
|
|
2181
2283
|
shapeId: ctx.shapes.intern([
|
|
2182
|
-
{ name:
|
|
2284
|
+
{ name: payloadName, type: payload },
|
|
2183
2285
|
{ name: count, type: F64 },
|
|
2184
|
-
], false, undefined, [count,
|
|
2286
|
+
], false, undefined, [count, payloadName]),
|
|
2185
2287
|
};
|
|
2186
2288
|
}
|
|
2187
2289
|
// fs.Dirent (readdirSync's withFileTypes rows): interned explicitly on
|
|
@@ -2370,6 +2472,11 @@ function mapTypeInner(type, ctx) {
|
|
|
2370
2472
|
const hybrid = mapHybridCallableIntersection(widened, ctx);
|
|
2371
2473
|
if (hybrid)
|
|
2372
2474
|
return hybrid;
|
|
2475
|
+
// Recursive and Symbol-keyed callable objects need their complete live
|
|
2476
|
+
// property table; dropping those members into a plain closure loses data.
|
|
2477
|
+
if (!ctx.dynamic && checker.getCallSignatures(widened).length > 0 &&
|
|
2478
|
+
checker.getPropertiesOfType(widened).length > 0)
|
|
2479
|
+
return DYN;
|
|
2373
2480
|
}
|
|
2374
2481
|
const callSigs = checker.getCallSignatures(widened);
|
|
2375
2482
|
if (callSigs.length === 1) {
|
|
@@ -2410,6 +2517,22 @@ function mapTypeInner(type, ctx) {
|
|
|
2410
2517
|
ts.isParameter(decl) &&
|
|
2411
2518
|
(decl.questionToken !== undefined || decl.initializer !== undefined);
|
|
2412
2519
|
let pt = mapType(checker.getTypeOfSymbol(p), ctx);
|
|
2520
|
+
if (decl && ts.isParameter(decl) && ts.isSetAccessorDeclaration(decl.parent) && isJsSourceFile(decl.getSourceFile()))
|
|
2521
|
+
pt = DYN;
|
|
2522
|
+
// An inferred JavaScript binding pattern consumes an iterable; it
|
|
2523
|
+
// does not require the caller's array to have exactly this length.
|
|
2524
|
+
const executor = decl && ts.isParameter(decl) ? decl.parent : null;
|
|
2525
|
+
const construction = executor?.parent;
|
|
2526
|
+
const constructorSymbol = construction && ts.isNewExpression(construction)
|
|
2527
|
+
? checker.getSymbolAtLocation(construction.expression) : undefined;
|
|
2528
|
+
const nativeExecutor = executor && (ts.isArrowFunction(executor) || ts.isFunctionExpression(executor)) &&
|
|
2529
|
+
construction && ts.isNewExpression(construction) && construction.arguments?.[0] === executor &&
|
|
2530
|
+
ts.isIdentifier(construction.expression) && construction.expression.text === "Promise" &&
|
|
2531
|
+
constructorSymbol && checker.declarationsOf(constructorSymbol).some((site) => ctx.isStdlibFile(site.getSourceFile()));
|
|
2532
|
+
if (!nativeExecutor && decl && ts.isParameter(decl) && !decl.dotDotDotToken && !ts.isSetAccessorDeclaration(decl.parent) &&
|
|
2533
|
+
isJsSourceFile(decl.getSourceFile()) && !decl.type &&
|
|
2534
|
+
!/@(?:param|type)\b/.test(decl.getSourceFile().text.slice(decl.parent?.pos ?? decl.pos, decl.getStart())))
|
|
2535
|
+
pt = DYN;
|
|
2413
2536
|
if (pt)
|
|
2414
2537
|
pt = jsOpenObjectType(decl, pt, ctx.shapes, ctx.unions);
|
|
2415
2538
|
// Belt and braces for non-strict type worlds: an optional param's
|
|
@@ -2443,7 +2566,21 @@ function mapTypeInner(type, ctx) {
|
|
|
2443
2566
|
const sigDecl = checker.signatureDeclaration(sig);
|
|
2444
2567
|
const jsUnitReturn = sigDecl !== undefined && isJsSourceFile(sigDecl.getSourceFile()) &&
|
|
2445
2568
|
(retT.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)) !== 0;
|
|
2446
|
-
|
|
2569
|
+
let ret = jsUnitReturn || (!ctx.dynamic && (retT.flags & ts.TypeFlags.Any) !== 0)
|
|
2570
|
+
? DYN : retT.flags & ts.TypeFlags.Never ? VOID : mapType(retT, ctx);
|
|
2571
|
+
if (sigDecl && ts.isGetAccessorDeclaration(sigDecl) && isJsSourceFile(sigDecl.getSourceFile()))
|
|
2572
|
+
ret = DYN;
|
|
2573
|
+
if (sigDecl && isJsSourceFile(sigDecl.getSourceFile()) && ret?.kind === "array")
|
|
2574
|
+
ret = DYN;
|
|
2575
|
+
if (sigDecl && ts.isFunctionLike(sigDecl) && isJsSourceFile(sigDecl.getSourceFile()) && !sigDecl.type &&
|
|
2576
|
+
!/@returns?\b/.test(sigDecl.getSourceFile().text.slice(sigDecl.pos, sigDecl.getStart())) && ret?.kind === "record")
|
|
2577
|
+
ret = DYN;
|
|
2578
|
+
if (sigDecl && ts.isFunctionLike(sigDecl) && isJsSourceFile(sigDecl.getSourceFile()) && !sigDecl.type &&
|
|
2579
|
+
!/@returns?\b/.test(sigDecl.getSourceFile().text.slice(sigDecl.pos, sigDecl.getStart())) &&
|
|
2580
|
+
(ret?.kind === "date" || ret?.kind === "union" && ctx.unions.get(ret.unionId)?.arms.some((arm) => arm.kind === "func")))
|
|
2581
|
+
ret = DYN;
|
|
2582
|
+
if (ret && sigDecl && isJsSourceFile(sigDecl.getSourceFile()) && functionCanReturnUndefined(sigDecl))
|
|
2583
|
+
ret = withUndefinedArm(ret, ctx.unions) ?? ret;
|
|
2447
2584
|
if (!ret)
|
|
2448
2585
|
return null;
|
|
2449
2586
|
return typedRest
|
|
@@ -3465,8 +3602,11 @@ function recordProvenanceOk(t, ctx) {
|
|
|
3465
3602
|
return true;
|
|
3466
3603
|
const tSym = t.getSymbol();
|
|
3467
3604
|
const decls = tSym ? checker.declarationsOf(tSym) : undefined;
|
|
3468
|
-
if (!decls || decls.length === 0)
|
|
3469
|
-
|
|
3605
|
+
if (!decls || decls.length === 0) {
|
|
3606
|
+
// Inferred destructuring parameters can have a synthesized anonymous
|
|
3607
|
+
// shape with no declaration or member symbols to trace to a source.
|
|
3608
|
+
return checker.getPropertiesOfType(t).every((property) => checker.declarationsOf(property).every((decl) => !decl.getSourceFile().isDeclarationFile || ctx.isExternalTypeFile(decl.getSourceFile())));
|
|
3609
|
+
}
|
|
3470
3610
|
return !decls.some((d) => {
|
|
3471
3611
|
const sf = d.getSourceFile();
|
|
3472
3612
|
return sf.isDeclarationFile && !ctx.isExternalTypeFile(sf);
|
|
@@ -3687,6 +3827,10 @@ function mapRecordTypeInner(widened, ctx) {
|
|
|
3687
3827
|
const computed = widened.isIntersectionType() || isMappedShape(widened);
|
|
3688
3828
|
{
|
|
3689
3829
|
const props = checker.getPropertiesOfType(widened);
|
|
3830
|
+
// Symbol-keyed records use the checked object's descriptor table. A
|
|
3831
|
+
// checker-internal __@ name is not a string field in a native struct.
|
|
3832
|
+
if (props.some((property) => property.name.startsWith("__@")))
|
|
3833
|
+
return DYN;
|
|
3690
3834
|
// A computed shape with NO members is not a real empty record: inside a
|
|
3691
3835
|
// generic body `Partial<T>` resolves to no members at all (keyof T is
|
|
3692
3836
|
// still unknown there) — interning `{}` would be silently wrong. The
|
|
@@ -3807,6 +3951,8 @@ function mapRecordTypeInner(widened, ctx) {
|
|
|
3807
3951
|
if ((pt === null || pt.kind === "jsval") && (fieldTs.flags & ts.TypeFlags.Any) !== 0 && constAssertedEmptyArrayProp(p, ctx)) {
|
|
3808
3952
|
pt = arrayOf(unitOnlyUnion(ctx.unions));
|
|
3809
3953
|
}
|
|
3954
|
+
if (pt === null && !ctx.dynamic && (fieldTs.flags & ts.TypeFlags.Any) !== 0)
|
|
3955
|
+
pt = DYN;
|
|
3810
3956
|
// Unit-only FIELDS (`{ msg?: undefined }` — the discriminated-union
|
|
3811
3957
|
// absent-field idiom — and `{ p: undefined }` spellings): the
|
|
3812
3958
|
// unit-only union. The runtime value is the interned unit, JSON
|