@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.
Files changed (232) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +73 -29
  2. package/dist/backend/llvm/bytes-loop-versions.js +6 -0
  3. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  4. package/dist/backend/llvm/bytes-loop-versions.test.js +7 -2
  5. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  6. package/dist/backend/llvm/debug-info.js +2 -5
  7. package/dist/backend/llvm/debug-info.js.map +1 -1
  8. package/dist/backend/llvm/dyn.d.ts +4 -0
  9. package/dist/backend/llvm/dyn.js +21 -9
  10. package/dist/backend/llvm/dyn.js.map +1 -1
  11. package/dist/backend/llvm/emit-function.js +2 -8
  12. package/dist/backend/llvm/emit-function.js.map +1 -1
  13. package/dist/backend/llvm/emit-module.js +16 -6
  14. package/dist/backend/llvm/emit-module.js.map +1 -1
  15. package/dist/backend/llvm/emitter.d.ts +10 -0
  16. package/dist/backend/llvm/emitter.js +9 -5
  17. package/dist/backend/llvm/emitter.js.map +1 -1
  18. package/dist/backend/llvm/emitter.test.js +11 -2
  19. package/dist/backend/llvm/emitter.test.js.map +1 -1
  20. package/dist/backend/llvm/expr-async.js +11 -13
  21. package/dist/backend/llvm/expr-async.js.map +1 -1
  22. package/dist/backend/llvm/expr-bytes.js +14 -8
  23. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  24. package/dist/backend/llvm/expr-containers.js +14 -0
  25. package/dist/backend/llvm/expr-containers.js.map +1 -1
  26. package/dist/backend/llvm/expr-primitives.js +20 -11
  27. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  28. package/dist/backend/llvm/expr-stream-bridges.js +16 -4
  29. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  30. package/dist/backend/llvm/integer-values.d.ts +5 -0
  31. package/dist/backend/llvm/integer-values.js +27 -3
  32. package/dist/backend/llvm/integer-values.js.map +1 -1
  33. package/dist/backend/llvm/lib-dispatch.js +133 -3
  34. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  35. package/dist/backend/llvm/lib-process.js +37 -1
  36. package/dist/backend/llvm/lib-process.js.map +1 -1
  37. package/dist/backend/llvm/lib-shared.js +21 -0
  38. package/dist/backend/llvm/lib-shared.js.map +1 -1
  39. package/dist/backend/llvm/publish.js +3 -3
  40. package/dist/backend/llvm/publish.js.map +1 -1
  41. package/dist/backend/llvm/reference-effects.js +3 -0
  42. package/dist/backend/llvm/reference-effects.js.map +1 -1
  43. package/dist/backend/llvm/shapes.js +2 -7
  44. package/dist/backend/llvm/shapes.js.map +1 -1
  45. package/dist/backend/llvm/stack-captures.js +1 -5
  46. package/dist/backend/llvm/stack-captures.js.map +1 -1
  47. package/dist/backend/llvm/union-repr.d.ts +4 -3
  48. package/dist/backend/llvm/union-repr.js +6 -5
  49. package/dist/backend/llvm/union-repr.js.map +1 -1
  50. package/dist/backend/llvm/walkers.js +13 -0
  51. package/dist/backend/llvm/walkers.js.map +1 -1
  52. package/dist/backend/native-codegen-core.d.ts +5 -3
  53. package/dist/backend/native-codegen-core.js +13 -6
  54. package/dist/backend/native-codegen-core.js.map +1 -1
  55. package/dist/backend/native-codegen.test.js +6 -4
  56. package/dist/backend/native-codegen.test.js.map +1 -1
  57. package/dist/backend/target-cpu.d.ts +26 -0
  58. package/dist/backend/target-cpu.js +98 -0
  59. package/dist/backend/target-cpu.js.map +1 -0
  60. package/dist/backend/target-cpu.test.d.ts +1 -0
  61. package/dist/backend/target-cpu.test.js +38 -0
  62. package/dist/backend/target-cpu.test.js.map +1 -0
  63. package/dist/cli/command.js +20 -1
  64. package/dist/cli/command.js.map +1 -1
  65. package/dist/cli/usage.d.ts +4 -1
  66. package/dist/cli/usage.js +7 -0
  67. package/dist/cli/usage.js.map +1 -1
  68. package/dist/compile-types.d.ts +7 -0
  69. package/dist/diagnostics/diagnostic.js +1 -1
  70. package/dist/diagnostics/diagnostic.js.map +1 -1
  71. package/dist/executable/executable-cache.d.ts +3 -0
  72. package/dist/executable/executable-cache.js +4 -0
  73. package/dist/executable/executable-cache.js.map +1 -1
  74. package/dist/executable/executable-cache.test.js +2 -0
  75. package/dist/executable/executable-cache.test.js.map +1 -1
  76. package/dist/frontend/decl-projection.js +105 -10
  77. package/dist/frontend/decl-projection.js.map +1 -1
  78. package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
  79. package/dist/frontend/lowering/builtins/async-context.js +62 -3
  80. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  81. package/dist/frontend/lowering/builtins/crypto.js +3 -1
  82. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  83. package/dist/frontend/lowering/builtins/dates.js +4 -1
  84. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  85. package/dist/frontend/lowering/builtins/filesystem-calls.js +3 -3
  86. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  87. package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
  88. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  89. package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
  90. package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
  91. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
  92. package/dist/frontend/lowering/builtins/module-calls.js +6 -3
  93. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  94. package/dist/frontend/lowering/builtins/promises.d.ts +1 -1
  95. package/dist/frontend/lowering/builtins/promises.js +149 -138
  96. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  97. package/dist/frontend/lowering/call-signatures.js +0 -1
  98. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  99. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  100. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  101. package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
  102. package/dist/frontend/lowering/cjs-inline-require.js +307 -4
  103. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  104. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +10 -0
  105. package/dist/frontend/lowering/class-dynamic-dispatch.js +114 -0
  106. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  107. package/dist/frontend/lowering/class-method-mutations.js +54 -18
  108. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  109. package/dist/frontend/lowering/class-protocols.d.ts +25 -0
  110. package/dist/frontend/lowering/class-protocols.js +183 -1
  111. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  112. package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
  113. package/dist/frontend/lowering/completion-callbacks.js +146 -0
  114. package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
  115. package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
  116. package/dist/frontend/lowering/containers/array-callbacks.js +7 -6
  117. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  118. package/dist/frontend/lowering/containers/array-construction.js +5 -0
  119. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  120. package/dist/frontend/lowering/containers/array-methods.js +11 -3
  121. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  122. package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
  123. package/dist/frontend/lowering/containers/bytes.js +453 -45
  124. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  125. package/dist/frontend/lowering/date-values.d.ts +11 -0
  126. package/dist/frontend/lowering/date-values.js +207 -0
  127. package/dist/frontend/lowering/date-values.js.map +1 -0
  128. package/dist/frontend/lowering/expressions/array-literals.js +6 -0
  129. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  130. package/dist/frontend/lowering/expressions/binary.js +64 -26
  131. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  132. package/dist/frontend/lowering/expressions/element-access.js +79 -0
  133. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  134. package/dist/frontend/lowering/expressions/identifiers.js +31 -1
  135. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  136. package/dist/frontend/lowering/expressions/property-access.js +56 -0
  137. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  138. package/dist/frontend/lowering/expressions/typeof.js +6 -0
  139. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  140. package/dist/frontend/lowering/expressions/updates.js +17 -0
  141. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  142. package/dist/frontend/lowering/function-returns.js +15 -0
  143. package/dist/frontend/lowering/function-returns.js.map +1 -1
  144. package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
  145. package/dist/frontend/lowering/indexed-unions.js +401 -0
  146. package/dist/frontend/lowering/indexed-unions.js.map +1 -0
  147. package/dist/frontend/lowering/key-order-witness.js +210 -32
  148. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  149. package/dist/frontend/lowering/key-order-witness.test.js +104 -4
  150. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  151. package/dist/frontend/lowering/lower-assert.js +15 -3
  152. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  153. package/dist/frontend/lowering/lower-calls.js +19 -3
  154. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  155. package/dist/frontend/lowering/lower-classes.js +22 -47
  156. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  157. package/dist/frontend/lowering/lower-exprs.js +205 -1
  158. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  159. package/dist/frontend/lowering/lower-generators.js +1 -1
  160. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  161. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  162. package/dist/frontend/lowering/lower-inspect.js +35 -11
  163. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  164. package/dist/frontend/lowering/lower-modules.js +21 -5
  165. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  166. package/dist/frontend/lowering/lower-stmts.js +100 -34
  167. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  168. package/dist/frontend/lowering/lowerer.d.ts +30 -2
  169. package/dist/frontend/lowering/lowerer.js +68 -7
  170. package/dist/frontend/lowering/lowerer.js.map +1 -1
  171. package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
  172. package/dist/frontend/lowering/object-factory-new.js +20 -6
  173. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  174. package/dist/frontend/lowering/overload-choice.d.ts +33 -0
  175. package/dist/frontend/lowering/overload-choice.js +190 -0
  176. package/dist/frontend/lowering/overload-choice.js.map +1 -0
  177. package/dist/frontend/lowering/surfaces.js +55 -2
  178. package/dist/frontend/lowering/surfaces.js.map +1 -1
  179. package/dist/frontend/pipeline.js +1 -1
  180. package/dist/frontend/pipeline.js.map +1 -1
  181. package/dist/frontend/program-analysis.d.ts +5 -1
  182. package/dist/frontend/program-analysis.js +5 -0
  183. package/dist/frontend/program-analysis.js.map +1 -1
  184. package/dist/frontend/program.d.ts +13 -5
  185. package/dist/frontend/program.js +197 -14
  186. package/dist/frontend/program.js.map +1 -1
  187. package/dist/frontend/ts7/semantic-model.d.ts +3 -0
  188. package/dist/frontend/ts7/semantic-model.js +5 -0
  189. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  190. package/dist/frontend/ts7/semantic-model.test.js +6 -1
  191. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  192. package/dist/frontend/ts7/semantic-types.d.ts +1 -1
  193. package/dist/frontend/ts7/semantic-types.js +1 -1
  194. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  195. package/dist/frontend/type-mapper.js +45 -16
  196. package/dist/frontend/type-mapper.js.map +1 -1
  197. package/dist/index.js +12 -0
  198. package/dist/index.js.map +1 -1
  199. package/dist/ir/builtin-effects.js +8 -0
  200. package/dist/ir/builtin-effects.js.map +1 -1
  201. package/dist/ir/builtin-signatures.d.ts +1 -1
  202. package/dist/ir/builtin-signatures.js +56 -0
  203. package/dist/ir/builtin-signatures.js.map +1 -1
  204. package/dist/ir/int32-slots.js +7 -0
  205. package/dist/ir/int32-slots.js.map +1 -1
  206. package/dist/ir/int32-slots.test.js +33 -0
  207. package/dist/ir/int32-slots.test.js.map +1 -1
  208. package/dist/ir/integer-loops.js +14 -4
  209. package/dist/ir/integer-loops.js.map +1 -1
  210. package/dist/ir/ir.d.ts +13 -3
  211. package/dist/ir/ir.js +19 -5
  212. package/dist/ir/ir.js.map +1 -1
  213. package/dist/ir/ir.test.js +2 -1
  214. package/dist/ir/ir.test.js.map +1 -1
  215. package/dist/ir/js-ic.d.ts +2 -15
  216. package/dist/ir/js-ic.js +11 -79
  217. package/dist/ir/js-ic.js.map +1 -1
  218. package/dist/ir/js-ic.test.js +0 -142
  219. package/dist/ir/js-ic.test.js.map +1 -1
  220. package/dist/ir/runtime-features.js +25 -1
  221. package/dist/ir/runtime-features.js.map +1 -1
  222. package/dist/ir/validate.js +46 -5
  223. package/dist/ir/validate.js.map +1 -1
  224. package/dist/library/ir-policy.js +1 -0
  225. package/dist/library/ir-policy.js.map +1 -1
  226. package/dist/native/prepare.d.ts +1 -1
  227. package/dist/native/prepare.js +11 -1
  228. package/dist/native/prepare.js.map +1 -1
  229. package/dist/native/prepare.test.js +18 -2
  230. package/dist/native/prepare.test.js.map +1 -1
  231. package/package.json +20 -20
  232. 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
- /** An ordinary constructor's explicit object return replaces its receiver.
8
- * Without observing this or new.target, it can use the function's call ABI. */
9
- function isObjectFactoryNew(lowerer, expr) {
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 false;
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 false;
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 isObjectFactoryNew(lowerer, expr) ? DYN : null;
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;+EAC+E;AAC/E,SAAS,kBAAkB,CAAC,OAAgB,EAAE,IAAsB;IAClE,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1F,wEAAwE;IACxE,mEAAmE;IACnE,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IACzC,IAAI,MAAM,GAAqB,IAAI,CAAC;IACpC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,UAAU,GAAG,aAAa,CAAC;IACrC,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CACpC,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;QAC3D,CAAC,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;YAC7B,IAAI,CAAC,WAAW;YAChB,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAC/C,CAAC;IACF,MAAM,WAAW,GACf,KAAK;QACL,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC;QAC/B,KAAK,CAAC,WAAW;QACjB,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC;QACxC,CAAC,CAAC,KAAK,CAAC,WAAW;QACnB,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC;YACxC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,CAAC;IACb,IACE,CAAC,KAAK;QACN,CAAC,WAAW,EAAE,IAAI;QAClB,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;QAC/C,CAAC,cAAc,CAAC,EAAE,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACpD,WAAW,CAAC,aAAa;QACzB,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAE/E,OAAO,KAAK,CAAC;IACf,MAAM,YAAY,GAAG,CAAC,UAAyB,EAAW,EAAE,CAC1D,EAAE,CAAC,yBAAyB,CAAC,UAAU,CAAC;QACxC,EAAE,CAAC,wBAAwB,CAAC,UAAU,CAAC;QACvC,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC;QAC9B,EAAE,CAAC,oBAAoB,CAAC,UAAU,CAAC;QACnC,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QAC5F,OAAO,KAAK,CAAC;IACf,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,MAAM,KAAK,GAAG,CAAC,IAAa,EAAE,WAAW,GAAG,KAAK,EAAQ,EAAE;QACzD,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,IAAI,GAAG,KAAK,CAAC;YACb,OAAO;QACT,CAAC;QACD,IAAI,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;gBAAE,OAAO;YACtC,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,KAAK,CAAC;QACrF,IACE,CAAC,WAAW;YACZ,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEpD,IAAI,GAAG,KAAK,CAAC;QACf,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,UAAU,CAAC,KAAK;QAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACvE,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;0EAC0E;AAC1E,MAAM,UAAU,uBAAuB,CAAC,OAAgB,EAAE,IAAsB;IAC9E,OAAO,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB,EAAE,IAAsB;IAC7E,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzF,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,OAAO,EAAE,cAAc;QACvC,CAAC,CAAC,uBAAuB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC;QACjD,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,OAAO,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB,EAAE,IAAsB;IAC5E,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,SAAS,CAAC,IAAI;QACtB,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;QACpF,IAAI,EAAE,SAAS,CAAC,UAAU;QAC1B,GAAG;KACJ,CAAC;AACJ,CAAC"}
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