@scriptc/compiler 0.4.3 → 0.4.4
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 +73 -29
- package/dist/backend/llvm/bytes-loop-versions.js +6 -0
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +7 -2
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/debug-info.js +2 -5
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +4 -0
- package/dist/backend/llvm/dyn.js +21 -9
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +2 -8
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-module.js +16 -6
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +10 -0
- package/dist/backend/llvm/emitter.js +9 -5
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +11 -2
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +11 -13
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js +14 -8
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +14 -0
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +20 -11
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +16 -4
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/integer-values.d.ts +5 -0
- package/dist/backend/llvm/integer-values.js +27 -3
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +133 -3
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +37 -1
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +21 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/publish.js +3 -3
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/reference-effects.js +3 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/shapes.js +2 -7
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/stack-captures.js +1 -5
- package/dist/backend/llvm/stack-captures.js.map +1 -1
- package/dist/backend/llvm/union-repr.d.ts +4 -3
- package/dist/backend/llvm/union-repr.js +6 -5
- package/dist/backend/llvm/union-repr.js.map +1 -1
- package/dist/backend/llvm/walkers.js +13 -0
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +5 -3
- package/dist/backend/native-codegen-core.js +13 -6
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.test.js +6 -4
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/target-cpu.d.ts +26 -0
- package/dist/backend/target-cpu.js +98 -0
- package/dist/backend/target-cpu.js.map +1 -0
- package/dist/backend/target-cpu.test.d.ts +1 -0
- package/dist/backend/target-cpu.test.js +38 -0
- package/dist/backend/target-cpu.test.js.map +1 -0
- package/dist/cli/command.js +20 -1
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +4 -1
- package/dist/cli/usage.js +7 -0
- package/dist/cli/usage.js.map +1 -1
- package/dist/compile-types.d.ts +7 -0
- package/dist/diagnostics/diagnostic.js +1 -1
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +3 -0
- package/dist/executable/executable-cache.js +4 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +2 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/decl-projection.js +105 -10
- package/dist/frontend/decl-projection.js.map +1 -1
- package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
- package/dist/frontend/lowering/builtins/async-context.js +62 -3
- package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.js +3 -1
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.js +4 -1
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +3 -3
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
- package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
- package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
- package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +6 -3
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +1 -1
- package/dist/frontend/lowering/builtins/promises.js +149 -138
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +0 -1
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
- package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
- package/dist/frontend/lowering/cjs-inline-require.js +307 -4
- package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +10 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +114 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +54 -18
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +25 -0
- package/dist/frontend/lowering/class-protocols.js +183 -1
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
- package/dist/frontend/lowering/completion-callbacks.js +146 -0
- package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
- package/dist/frontend/lowering/containers/array-callbacks.js +7 -6
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +5 -0
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +11 -3
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
- package/dist/frontend/lowering/containers/bytes.js +453 -45
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/date-values.d.ts +11 -0
- package/dist/frontend/lowering/date-values.js +207 -0
- package/dist/frontend/lowering/date-values.js.map +1 -0
- package/dist/frontend/lowering/expressions/array-literals.js +6 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +64 -26
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +79 -0
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +31 -1
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.js +56 -0
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +6 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +17 -0
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/function-returns.js +15 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
- package/dist/frontend/lowering/indexed-unions.js +401 -0
- package/dist/frontend/lowering/indexed-unions.js.map +1 -0
- package/dist/frontend/lowering/key-order-witness.js +210 -32
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +104 -4
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +15 -3
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +19 -3
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.js +22 -47
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +205 -1
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +1 -1
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
- package/dist/frontend/lowering/lower-inspect.js +35 -11
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +21 -5
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +100 -34
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +30 -2
- package/dist/frontend/lowering/lowerer.js +68 -7
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
- package/dist/frontend/lowering/object-factory-new.js +20 -6
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/overload-choice.d.ts +33 -0
- package/dist/frontend/lowering/overload-choice.js +190 -0
- package/dist/frontend/lowering/overload-choice.js.map +1 -0
- package/dist/frontend/lowering/surfaces.js +55 -2
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/pipeline.js +1 -1
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +5 -1
- package/dist/frontend/program-analysis.js +5 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +13 -5
- package/dist/frontend/program.js +197 -14
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +3 -0
- package/dist/frontend/ts7/semantic-model.js +5 -0
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +6 -1
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-types.d.ts +1 -1
- package/dist/frontend/ts7/semantic-types.js +1 -1
- package/dist/frontend/ts7/semantic-types.js.map +1 -1
- package/dist/frontend/type-mapper.js +45 -16
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/ir/builtin-effects.js +8 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +56 -0
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/int32-slots.js +7 -0
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +33 -0
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loops.js +14 -4
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/ir.d.ts +13 -3
- package/dist/ir/ir.js +19 -5
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +2 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +2 -15
- package/dist/ir/js-ic.js +11 -79
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +0 -142
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/runtime-features.js +25 -1
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/validate.js +46 -5
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +1 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/prepare.d.ts +1 -1
- package/dist/native/prepare.js +11 -1
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +18 -2
- package/dist/native/prepare.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +2 -4
|
@@ -4,6 +4,11 @@ import type { Lowerer } from "./lowerer.js";
|
|
|
4
4
|
import { type FnSig } from "./call-signatures.js";
|
|
5
5
|
/** Collection must register the shared result before reaching factory
|
|
6
6
|
* bodies: those bodies can reference later globals in the same module. */
|
|
7
|
+
/** The storage of a JavaScript module binding initialized with `new` of an
|
|
8
|
+
* ordinary function: a factory's result and a constructor function's
|
|
9
|
+
* receiver (`const head = new Segment()`) are both checked-dynamic
|
|
10
|
+
* values, which functions declared elsewhere in the module read through
|
|
11
|
+
* the global. */
|
|
7
12
|
export declare function objectFactoryGlobalType(lowerer: Lowerer, expr: ts.NewExpression): IrType | null;
|
|
8
13
|
export declare function objectFactorySignature(lowerer: Lowerer, expr: ts.NewExpression): FnSig | null;
|
|
9
14
|
export declare function lowerObjectFactoryNew(lowerer: Lowerer, expr: ts.NewExpression): IrExpr | null;
|
|
@@ -4,11 +4,12 @@ import { isJsSourceFile, locOf } from "../program.js";
|
|
|
4
4
|
import { bindingNeverReassigned } from "./binding-analysis.js";
|
|
5
5
|
import { implicitDefaultInstance } from "./generic-functions.js";
|
|
6
6
|
import {} from "./call-signatures.js";
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
|
|
7
|
+
/** The JavaScript function declaration (or never-reassigned function
|
|
8
|
+
* expression binding) `new` calls, when it is an ordinary constructor: not
|
|
9
|
+
* a generator or async function. */
|
|
10
|
+
function jsConstructorFunctionOf(lowerer, expr) {
|
|
10
11
|
if (!ts.isIdentifier(expr.expression) || lowerer.peekLocal(expr.expression))
|
|
11
|
-
return
|
|
12
|
+
return null;
|
|
12
13
|
// This probe also sees ordinary classes during global collection. Leave
|
|
13
14
|
// their deferred diagnostics for the class declaration's lowering.
|
|
14
15
|
const wasCollecting = lowerer.collecting;
|
|
@@ -21,7 +22,7 @@ function isObjectFactoryNew(lowerer, expr) {
|
|
|
21
22
|
lowerer.collecting = wasCollecting;
|
|
22
23
|
}
|
|
23
24
|
if (!symbol)
|
|
24
|
-
return
|
|
25
|
+
return null;
|
|
25
26
|
const owner = symbol.declarations.find((node) => (ts.isFunctionDeclaration(node) && node.body !== undefined) ||
|
|
26
27
|
(ts.isVariableDeclaration(node) &&
|
|
27
28
|
node.initializer &&
|
|
@@ -40,6 +41,14 @@ function isObjectFactoryNew(lowerer, expr) {
|
|
|
40
41
|
!isJsSourceFile(ts.getSourceFileOfNode(declaration)) ||
|
|
41
42
|
declaration.asteriskToken ||
|
|
42
43
|
declaration.modifiers?.nodes.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword))
|
|
44
|
+
return null;
|
|
45
|
+
return declaration;
|
|
46
|
+
}
|
|
47
|
+
/** An ordinary constructor's explicit object return replaces its receiver.
|
|
48
|
+
* Without observing this or new.target, it can use the function's call ABI. */
|
|
49
|
+
function isObjectFactoryNew(lowerer, expr) {
|
|
50
|
+
const declaration = jsConstructorFunctionOf(lowerer, expr);
|
|
51
|
+
if (!declaration?.body)
|
|
43
52
|
return false;
|
|
44
53
|
const objectReturn = (expression) => ts.isObjectLiteralExpression(expression) ||
|
|
45
54
|
ts.isArrayLiteralExpression(expression) ||
|
|
@@ -75,8 +84,13 @@ function isObjectFactoryNew(lowerer, expr) {
|
|
|
75
84
|
}
|
|
76
85
|
/** Collection must register the shared result before reaching factory
|
|
77
86
|
* bodies: those bodies can reference later globals in the same module. */
|
|
87
|
+
/** The storage of a JavaScript module binding initialized with `new` of an
|
|
88
|
+
* ordinary function: a factory's result and a constructor function's
|
|
89
|
+
* receiver (`const head = new Segment()`) are both checked-dynamic
|
|
90
|
+
* values, which functions declared elsewhere in the module read through
|
|
91
|
+
* the global. */
|
|
78
92
|
export function objectFactoryGlobalType(lowerer, expr) {
|
|
79
|
-
return
|
|
93
|
+
return jsConstructorFunctionOf(lowerer, expr) !== null ? DYN : null;
|
|
80
94
|
}
|
|
81
95
|
export function objectFactorySignature(lowerer, expr) {
|
|
82
96
|
if (!ts.isIdentifier(expr.expression) || !isObjectFactoryNew(lowerer, expr))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-factory-new.js","sourceRoot":"","sources":["../../../src/frontend/lowering/object-factory-new.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,GAAG,EAA4B,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAc,MAAM,sBAAsB,CAAC;AAElD
|
|
1
|
+
{"version":3,"file":"object-factory-new.js","sourceRoot":"","sources":["../../../src/frontend/lowering/object-factory-new.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as ts from "../ts7/adapter.js";
|
|
2
|
+
import type { Lowerer } from "./lowerer.js";
|
|
3
|
+
/** Whether a checked-dynamic argument leaves a JS call's overload
|
|
4
|
+
* undecided.
|
|
5
|
+
*
|
|
6
|
+
* The checker resolves an overloaded call whose argument is `any` (an
|
|
7
|
+
* untyped parameter, a value read from one) to the FIRST overload that
|
|
8
|
+
* argument satisfies, but the value can match any overload at run time:
|
|
9
|
+
* `generateKeyPairSync("ec", options)` answers KeyObjects or encoded
|
|
10
|
+
* strings by the options' contents, `digest(encoding)` a Buffer when the
|
|
11
|
+
* encoding is undefined. When another overload the call could take at
|
|
12
|
+
* run time returns a different type, the resolved overload's return is a
|
|
13
|
+
* guess, and the result is checked-dynamic instead.
|
|
14
|
+
*
|
|
15
|
+
* An overload is reachable when the arguments fit its arity (trailing
|
|
16
|
+
* checked-dynamic or `undefined` arguments may be absent) and every
|
|
17
|
+
* statically typed argument is assignable to its parameter. Generic
|
|
18
|
+
* overloads whose return cannot be mapped without instantiation do not
|
|
19
|
+
* count, so the resolved instantiation stands for them. */
|
|
20
|
+
export declare function dynamicOverloadChoice(lowerer: Lowerer, expr: ts.CallExpression | ts.NewExpression): boolean;
|
|
21
|
+
/** Whether a JavaScript value's checker type rests on an undecided
|
|
22
|
+
* overload (dynamicOverloadChoice): the call itself, an awaited one, a
|
|
23
|
+
* call to an unannotated JS function returning such a value, or a read of
|
|
24
|
+
* an unannotated JS binding initialized with one (destructured or not).
|
|
25
|
+
* Such a value is checked-dynamic wherever the checker's inference would
|
|
26
|
+
* otherwise carry the guess into a binding or a return. */
|
|
27
|
+
export declare function guessedOverloadValue(lowerer: Lowerer, expr: ts.Expression): boolean;
|
|
28
|
+
/** Whether a JS identifier, as a binding's declared name or as a read,
|
|
29
|
+
* names a guessedOverloadBinding. */
|
|
30
|
+
export declare function guessedOverloadIdentifier(lowerer: Lowerer, node: ts.Identifier): boolean;
|
|
31
|
+
/** Whether a return of the unannotated JS function `decl` itself is a
|
|
32
|
+
* guessedOverloadValue. */
|
|
33
|
+
export declare function returnsGuessedOverloadValue(lowerer: Lowerer, decl: ts.SignatureDeclaration): boolean;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import * as ts from "../ts7/adapter.js";
|
|
2
|
+
import { typeEquals } from "../../ir/ir.js";
|
|
3
|
+
import { isJsSourceFile } from "../program.js";
|
|
4
|
+
import { isThisParameter } from "./call-signatures.js";
|
|
5
|
+
import { hasExplicitJsDocReturn } from "./function-returns.js";
|
|
6
|
+
import { hasJsTypeAnnotation } from "./lower-stmts.js";
|
|
7
|
+
/** Whether a checked-dynamic argument leaves a JS call's overload
|
|
8
|
+
* undecided.
|
|
9
|
+
*
|
|
10
|
+
* The checker resolves an overloaded call whose argument is `any` (an
|
|
11
|
+
* untyped parameter, a value read from one) to the FIRST overload that
|
|
12
|
+
* argument satisfies, but the value can match any overload at run time:
|
|
13
|
+
* `generateKeyPairSync("ec", options)` answers KeyObjects or encoded
|
|
14
|
+
* strings by the options' contents, `digest(encoding)` a Buffer when the
|
|
15
|
+
* encoding is undefined. When another overload the call could take at
|
|
16
|
+
* run time returns a different type, the resolved overload's return is a
|
|
17
|
+
* guess, and the result is checked-dynamic instead.
|
|
18
|
+
*
|
|
19
|
+
* An overload is reachable when the arguments fit its arity (trailing
|
|
20
|
+
* checked-dynamic or `undefined` arguments may be absent) and every
|
|
21
|
+
* statically typed argument is assignable to its parameter. Generic
|
|
22
|
+
* overloads whose return cannot be mapped without instantiation do not
|
|
23
|
+
* count, so the resolved instantiation stands for them. */
|
|
24
|
+
export function dynamicOverloadChoice(lowerer, expr) {
|
|
25
|
+
return cachedAnswer(lowerer, expr, () => computeDynamicOverloadChoice(lowerer, expr));
|
|
26
|
+
}
|
|
27
|
+
/** Whether a JavaScript value's checker type rests on an undecided
|
|
28
|
+
* overload (dynamicOverloadChoice): the call itself, an awaited one, a
|
|
29
|
+
* call to an unannotated JS function returning such a value, or a read of
|
|
30
|
+
* an unannotated JS binding initialized with one (destructured or not).
|
|
31
|
+
* Such a value is checked-dynamic wherever the checker's inference would
|
|
32
|
+
* otherwise carry the guess into a binding or a return. */
|
|
33
|
+
export function guessedOverloadValue(lowerer, expr) {
|
|
34
|
+
while (ts.isParenthesizedExpression(expr) || ts.isAwaitExpression(expr))
|
|
35
|
+
expr = expr.expression;
|
|
36
|
+
if (ts.isCallExpression(expr) || ts.isNewExpression(expr)) {
|
|
37
|
+
if (!isJsSourceFile(ts.getSourceFileOfNode(expr)))
|
|
38
|
+
return false;
|
|
39
|
+
if (dynamicOverloadChoice(lowerer, expr))
|
|
40
|
+
return true;
|
|
41
|
+
const decl = lowerer.checker.getResolvedSignature(expr)?.declaration;
|
|
42
|
+
return (decl !== undefined &&
|
|
43
|
+
(ts.isFunctionDeclaration(decl) ||
|
|
44
|
+
ts.isFunctionExpression(decl) ||
|
|
45
|
+
ts.isArrowFunction(decl)) &&
|
|
46
|
+
isJsSourceFile(ts.getSourceFileOfNode(decl)) &&
|
|
47
|
+
returnsGuessedOverloadValue(lowerer, decl));
|
|
48
|
+
}
|
|
49
|
+
return ts.isIdentifier(expr) && guessedOverloadIdentifier(lowerer, expr);
|
|
50
|
+
}
|
|
51
|
+
/** Whether a JS identifier, as a binding's declared name or as a read,
|
|
52
|
+
* names a guessedOverloadBinding. */
|
|
53
|
+
export function guessedOverloadIdentifier(lowerer, node) {
|
|
54
|
+
return cachedAnswer(lowerer, node, () => {
|
|
55
|
+
const parent = node.parent;
|
|
56
|
+
if (parent !== undefined &&
|
|
57
|
+
(ts.isVariableDeclaration(parent) || ts.isBindingElement(parent)) &&
|
|
58
|
+
parent.name === node)
|
|
59
|
+
return guessedOverloadBinding(lowerer, parent);
|
|
60
|
+
const decl = lowerer.checker.getSymbolAtLocation(node)?.valueDeclaration;
|
|
61
|
+
return decl !== undefined && guessedOverloadBinding(lowerer, decl);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/** Whether `decl` is an unannotated JS variable or destructured binding
|
|
65
|
+
* whose declaration's initializer is a guessedOverloadValue. */
|
|
66
|
+
function guessedOverloadBinding(lowerer, decl) {
|
|
67
|
+
let root = decl;
|
|
68
|
+
while (root && ts.isBindingElement(root) && root.parent && ts.isBindingPattern(root.parent)) {
|
|
69
|
+
root = root.parent.parent;
|
|
70
|
+
}
|
|
71
|
+
if (!root)
|
|
72
|
+
return false;
|
|
73
|
+
if (!ts.isVariableDeclaration(root) || !root.initializer || root.type)
|
|
74
|
+
return false;
|
|
75
|
+
if (!isJsSourceFile(ts.getSourceFileOfNode(root)) || hasJsTypeAnnotation(root))
|
|
76
|
+
return false;
|
|
77
|
+
const init = root.initializer;
|
|
78
|
+
return cachedAnswer(lowerer, root, () => guessedOverloadValue(lowerer, init));
|
|
79
|
+
}
|
|
80
|
+
/** Whether a return of the unannotated JS function `decl` itself is a
|
|
81
|
+
* guessedOverloadValue. */
|
|
82
|
+
export function returnsGuessedOverloadValue(lowerer, decl) {
|
|
83
|
+
if (decl.type || decl.asteriskToken || hasExplicitJsDocReturn(decl))
|
|
84
|
+
return false;
|
|
85
|
+
return cachedAnswer(lowerer, decl, () => {
|
|
86
|
+
if (ts.isArrowFunction(decl) && decl.body && !ts.isBlock(decl.body)) {
|
|
87
|
+
return guessedOverloadValue(lowerer, decl.body);
|
|
88
|
+
}
|
|
89
|
+
let found = false;
|
|
90
|
+
const scan = (node) => {
|
|
91
|
+
if (found || (node !== decl && ts.isFunctionLike(node)))
|
|
92
|
+
return;
|
|
93
|
+
if (ts.isReturnStatement(node) && node.expression) {
|
|
94
|
+
found = guessedOverloadValue(lowerer, node.expression);
|
|
95
|
+
}
|
|
96
|
+
ts.forEachChild(node, scan);
|
|
97
|
+
};
|
|
98
|
+
scan(decl);
|
|
99
|
+
return found;
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/** One answer per node; a node asked again while its answer is being
|
|
103
|
+
* computed (recursive functions, self-referencing bindings) answers
|
|
104
|
+
* false. */
|
|
105
|
+
function cachedAnswer(lowerer, node, compute) {
|
|
106
|
+
const cached = lowerer.dynamicOverloadAnswers.get(node);
|
|
107
|
+
if (cached !== undefined)
|
|
108
|
+
return cached;
|
|
109
|
+
lowerer.dynamicOverloadAnswers.set(node, false);
|
|
110
|
+
const answer = compute();
|
|
111
|
+
lowerer.dynamicOverloadAnswers.set(node, answer);
|
|
112
|
+
return answer;
|
|
113
|
+
}
|
|
114
|
+
function computeDynamicOverloadChoice(lowerer, expr) {
|
|
115
|
+
// TypeScript sources keep the resolved overload: their reads validate
|
|
116
|
+
// the value against it where it is used.
|
|
117
|
+
if (!isJsSourceFile(ts.getSourceFileOfNode(expr)))
|
|
118
|
+
return false;
|
|
119
|
+
const args = expr.arguments?.nodes ?? [];
|
|
120
|
+
if (args.length === 0 || args.some(ts.isSpreadElement))
|
|
121
|
+
return false;
|
|
122
|
+
const dynamic = args.map((arg) => checkedDynamicArgument(lowerer, arg));
|
|
123
|
+
if (!dynamic.includes(true))
|
|
124
|
+
return false;
|
|
125
|
+
const checker = lowerer.checker;
|
|
126
|
+
const calleeType = checker.getTypeAtLocation(expr.expression);
|
|
127
|
+
const signatures = ts.isNewExpression(expr)
|
|
128
|
+
? checker.getConstructSignatures(calleeType)
|
|
129
|
+
: checker.getCallSignatures(calleeType);
|
|
130
|
+
if (signatures.length < 2)
|
|
131
|
+
return false;
|
|
132
|
+
const resolved = checker.getResolvedSignature(expr);
|
|
133
|
+
if (!resolved)
|
|
134
|
+
return false;
|
|
135
|
+
const resolvedReturn = lowerer.mapTypeOf(checker.getReturnTypeOfSignature(resolved));
|
|
136
|
+
if (resolvedReturn === null)
|
|
137
|
+
return false;
|
|
138
|
+
// Arguments that may be absent at run time: the trailing run of
|
|
139
|
+
// checked-dynamic and `undefined` arguments.
|
|
140
|
+
let present = args.length;
|
|
141
|
+
while (present > 0 && (dynamic[present - 1] || isUndefinedArgument(args[present - 1]))) {
|
|
142
|
+
present--;
|
|
143
|
+
}
|
|
144
|
+
for (const signature of signatures) {
|
|
145
|
+
const decl = signature.declaration;
|
|
146
|
+
if (!decl || decl === resolved.declaration || !ts.isFunctionLike(decl))
|
|
147
|
+
continue;
|
|
148
|
+
const generic = signature.getTypeParameters().length > 0;
|
|
149
|
+
const params = decl.parameters.nodes.filter((param) => !isThisParameter(param));
|
|
150
|
+
const required = params.filter((param) => !param.questionToken && !param.initializer && !param.dotDotDotToken).length;
|
|
151
|
+
const maximum = params.some((param) => param.dotDotDotToken) ? Infinity : params.length;
|
|
152
|
+
if (required > args.length || present > maximum)
|
|
153
|
+
continue;
|
|
154
|
+
const symbols = signature.getParameters();
|
|
155
|
+
let fits = true;
|
|
156
|
+
for (let i = 0; i < args.length && i < params.length && fits; i++) {
|
|
157
|
+
if (dynamic[i] || generic || params[i].dotDotDotToken)
|
|
158
|
+
continue;
|
|
159
|
+
const symbol = symbols[i];
|
|
160
|
+
if (!symbol)
|
|
161
|
+
continue;
|
|
162
|
+
fits = checker.isTypeAssignableTo(checker.getTypeAtLocation(args[i]), checker.getTypeOfSymbol(symbol));
|
|
163
|
+
}
|
|
164
|
+
if (!fits)
|
|
165
|
+
continue;
|
|
166
|
+
const candidate = lowerer.mapTypeOf(checker.getReturnTypeOfSignature(signature));
|
|
167
|
+
if (candidate !== null && !holdsResult(resolvedReturn, candidate))
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
/** Whether a value of the resolved overload's mapped return also holds
|
|
173
|
+
* every value of `candidate`: the same type, or a checked-dynamic one (a
|
|
174
|
+
* promise of one fulfills with anything). */
|
|
175
|
+
function holdsResult(resolved, candidate) {
|
|
176
|
+
if (resolved.kind === "dyn" || typeEquals(resolved, candidate))
|
|
177
|
+
return true;
|
|
178
|
+
return (resolved.kind === "promise" &&
|
|
179
|
+
candidate.kind === "promise" &&
|
|
180
|
+
holdsResult(resolved.inner, candidate.inner));
|
|
181
|
+
}
|
|
182
|
+
function checkedDynamicArgument(lowerer, arg) {
|
|
183
|
+
if (lowerer.checker.getTypeAtLocation(arg).flags & ts.TypeFlags.Any)
|
|
184
|
+
return true;
|
|
185
|
+
return (lowerer.typeOf(arg).flags & ts.TypeFlags.Any) !== 0;
|
|
186
|
+
}
|
|
187
|
+
function isUndefinedArgument(arg) {
|
|
188
|
+
return (ts.isIdentifier(arg) && arg.text === "undefined") || ts.isVoidExpression(arg);
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=overload-choice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overload-choice.js","sourceRoot":"","sources":["../../../src/frontend/lowering/overload-choice.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,17 @@ function unparenthesized(e) {
|
|
|
5
5
|
e = e.expression;
|
|
6
6
|
return e;
|
|
7
7
|
}
|
|
8
|
+
/** `e` without parentheses and type-only wrappers (as, satisfies, type
|
|
9
|
+
* assertions, non-null assertions), which change no runtime value. */
|
|
10
|
+
function withoutTypeCasts(e) {
|
|
11
|
+
while (ts.isParenthesizedExpression(e) ||
|
|
12
|
+
ts.isAsExpression(e) ||
|
|
13
|
+
ts.isSatisfiesExpression(e) ||
|
|
14
|
+
ts.isTypeAssertion(e) ||
|
|
15
|
+
ts.isNonNullExpression(e))
|
|
16
|
+
e = e.expression;
|
|
17
|
+
return e;
|
|
18
|
+
}
|
|
8
19
|
import { UNSUPPORTED } from "../../diagnostics/diagnostic.js";
|
|
9
20
|
import { BOOL, BYTES_U8, CHILD_T, CRYPTOHASH_T, CRYPTOHMAC_T, DIR_T, DYN, F64, FILEHANDLE_T, SPAWNRES_T, STATS_T, STRING, URL_T, VOID, arrayOf, } from "../../ir/ir.js";
|
|
10
21
|
import { isJsSourceFile, isNodeTypesPath, requireSpecOf } from "../program.js";
|
|
@@ -1419,6 +1430,7 @@ export const BUILTIN_MODULE_FNS = {
|
|
|
1419
1430
|
generateKeyPair: { fn: "crypto.generateKeyPairCb", params: [], result: VOID },
|
|
1420
1431
|
sign: { fn: "crypto.signOneshot", params: [], result: DYN },
|
|
1421
1432
|
verify: { fn: "crypto.verifyOneshot", params: [], result: DYN },
|
|
1433
|
+
diffieHellman: { fn: "crypto.diffieHellman", params: [], result: DYN },
|
|
1422
1434
|
pbkdf2Sync: {
|
|
1423
1435
|
fn: "crypto.pbkdf2",
|
|
1424
1436
|
params: [BYTES_U8, BYTES_U8, F64, F64, STRING],
|
|
@@ -1916,7 +1928,16 @@ export const BUILTIN_MODULE_FN_ALIASES = {
|
|
|
1916
1928
|
"fs.readFdEncoded",
|
|
1917
1929
|
"fs.readFdSync",
|
|
1918
1930
|
"fs.readFdSyncBytes",
|
|
1931
|
+
// The runtime encoding's check before a URL path converts
|
|
1932
|
+
// (fs-paths.ts).
|
|
1933
|
+
"fs.checkReadEncoding",
|
|
1919
1934
|
],
|
|
1935
|
+
// The string source's check before a URL destination converts
|
|
1936
|
+
// (fs-paths.ts).
|
|
1937
|
+
copyFileSync: ["fs.checkPath"],
|
|
1938
|
+
renameSync: ["fs.checkPath"],
|
|
1939
|
+
copyFile: ["fs.checkPath"],
|
|
1940
|
+
rename: ["fs.checkPath"],
|
|
1920
1941
|
readlinkSync: ["fs.readlinkSyncStr", "fs.readlinkSyncBuffer"],
|
|
1921
1942
|
// The bytes-data form and the { mode } options form.
|
|
1922
1943
|
writeFileSync: ["fs.writeFileSyncBytes", "fs.writeFileModeSync"],
|
|
@@ -2886,8 +2907,6 @@ export const BUILTIN_MODULE_FENCE_HINTS = {
|
|
|
2886
2907
|
"RSA and EC KeyObjects (generateKeyPair, createPrivateKey, createPublicKey), sign, verify, " +
|
|
2887
2908
|
"createSign, createVerify, createECDH, and createDiffieHellman",
|
|
2888
2909
|
])),
|
|
2889
|
-
diffieHellman: "crypto.diffieHellman takes DH, EC or X25519 KeyObjects and has no lowering; " +
|
|
2890
|
-
"the objects of createDiffieHellman, getDiffieHellman and createECDH compute shared secrets",
|
|
2891
2910
|
setFips: "a compiled binary has no FIPS provider to enable, and Node itself throws on setFips(true) " +
|
|
2892
2911
|
"in a non-FIPS build — getFips() answers 0 here",
|
|
2893
2912
|
},
|
|
@@ -3214,6 +3233,22 @@ export function stdlibGlobalNameOf(lowerer, expr) {
|
|
|
3214
3233
|
return ts.symbolName(resolved) === "global" ? "globalThis" : ts.symbolName(resolved);
|
|
3215
3234
|
}
|
|
3216
3235
|
if (ts.isPropertyAccessExpression(expr) && !expr.questionDotToken) {
|
|
3236
|
+
// The buffer module's Buffer (`require("buffer").Buffer`, `buffer_1.Buffer`)
|
|
3237
|
+
// is the global constructor.
|
|
3238
|
+
if (bufferNamespaceMember(lowerer, expr))
|
|
3239
|
+
return "Buffer";
|
|
3240
|
+
// A cast of the global object (`(globalThis as { Buffer?: B }).Buffer`,
|
|
3241
|
+
// `(globalThis as any).Buffer`) changes only its static type: the
|
|
3242
|
+
// member is the global object's own.
|
|
3243
|
+
const uncast = withoutTypeCasts(expr.expression);
|
|
3244
|
+
if (uncast !== unparenthesized(expr.expression)) {
|
|
3245
|
+
if (!ts.isIdentifier(uncast) || stdlibGlobalNameOf(lowerer, uncast) !== "globalThis")
|
|
3246
|
+
return null;
|
|
3247
|
+
const member = lowerer.checker.getPropertyOfType(lowerer.typeOf(uncast), expr.name.text);
|
|
3248
|
+
if (!member || !lowerer.isStdlibSymbol(member))
|
|
3249
|
+
return null;
|
|
3250
|
+
return ts.symbolName(member) === "global" ? "globalThis" : ts.symbolName(member);
|
|
3251
|
+
}
|
|
3217
3252
|
if (stdlibGlobalNameOf(lowerer, expr.expression) !== "globalThis")
|
|
3218
3253
|
return null;
|
|
3219
3254
|
// Through a detection chain the checker types the receiver as the
|
|
@@ -3334,8 +3369,26 @@ export function stdlibGlobalAliasDecl(lowerer, nameNode, init) {
|
|
|
3334
3369
|
if (!symbol)
|
|
3335
3370
|
return false;
|
|
3336
3371
|
lowerer.stdlibGlobalAliases.set(symbol, name);
|
|
3372
|
+
if (init !== undefined && castGlobalAliasSource(lowerer, init))
|
|
3373
|
+
lowerer.castGlobalAliases.add(symbol);
|
|
3337
3374
|
return true;
|
|
3338
3375
|
}
|
|
3376
|
+
/** True when an alias initializer reads its global through a cast of the
|
|
3377
|
+
* global object (`(globalThis as { Buffer?: B }).Buffer`), directly or as
|
|
3378
|
+
* the left operand of `||` (stdlibGlobalAliasNameOf's guard), or copies an
|
|
3379
|
+
* alias made that way. Such an alias carries the cast's static type. */
|
|
3380
|
+
function castGlobalAliasSource(lowerer, init) {
|
|
3381
|
+
let source = unparenthesized(init);
|
|
3382
|
+
if (ts.isBinaryExpression(source) && source.operatorToken.kind === ts.SyntaxKind.BarBarToken)
|
|
3383
|
+
source = unparenthesized(source.left);
|
|
3384
|
+
if (ts.isPropertyAccessExpression(source))
|
|
3385
|
+
return withoutTypeCasts(source.expression) !== unparenthesized(source.expression);
|
|
3386
|
+
if (ts.isIdentifier(source)) {
|
|
3387
|
+
const symbol = lowerer.checker.getSymbolAtLocation(source);
|
|
3388
|
+
return symbol !== undefined && lowerer.castGlobalAliases.has(symbol);
|
|
3389
|
+
}
|
|
3390
|
+
return false;
|
|
3391
|
+
}
|
|
3339
3392
|
/** True iff the symbol is declared ONLY by the adopted @types/node
|
|
3340
3393
|
* surface (no es-lib or shipped-ambient declaration merges in) — chooses
|
|
3341
3394
|
* the SC2020 fence's wording: "typed by @types/node", not "standard
|