Skip to content

Commit b7697b5

Browse files
Merge pull request #1717 from AxiomCodeAI/loop/ja-is1706
javascript: a wrapper that writes its parameter answers with the written function
2 parents e130ebc + 954e21a commit b7697b5

9 files changed

Lines changed: 332 additions & 1 deletion

File tree

‎graph/javascript/engine/projections/blocks.dl‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ block_condition("lib", k, c, h) :- lib_js_block(k, _, _, _, _, _, _, c, _, _, _,
3030
block_child("client", p, k, idx, h) :- js_block(k, _, p, _, idx, _, _, _, _, _, _, _, _, _, _, _, h), p != "".
3131
block_child("lib", p, k, idx, h) :- lib_js_block(k, _, p, _, idx, _, _, _, _, _, _, _, _, _, _, _, h), p != "".
3232

33+
// ── block_owner(Kind, OwnerMethod, BlockHash) ──────────────────────────────
34+
// The callable whose body holds the block: a write is conditional when a branching
35+
// block of its OWN callable contains it (#1706).
36+
block_owner(k, m, h) :- js_block(k, _, _, _, _, _, _, _, m, _, _, _, _, _, _, _, h), m != "".
37+
3338
// ── block_span(Prov, OwnerModule, StartLine, StartCol, EndLine, EndCol, BlockHash) ──
3439
// A block opens no scope of its own unless it declares something, so the span is
3540
// the one handle on "the expressions inside this block" (#701).

‎graph/javascript/engine/resolution/value-flow.dl‎

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,12 +415,57 @@ wrapper_forwards(h, c, pos) :- wrapper_closure(h, c), param_decl(_, _, ppos, h,
415415
pos = to_number(ppos), expr_root(_, "RETURN", e), expr_owner(_, c, _, e), carries_param_call(e, p).
416416
wrapped_result_return(e) :- wrapper_closure(h, c), param_decl(_, _, _, h, p),
417417
expr_root(_, "RETURN", e), expr_owner(_, c, _, e), carries_param_call(e, p).
418+
// ── the wrapper WRITES that parameter before the closure calls it (#1706) ──
419+
// `fn = () => x`, `if (!fn) fn = dflt`, `fn = fn || dflt`, `fn ??= dflt` in the
420+
// wrapper's own body: the closure calls what was written, so a call through the site
421+
// also returns what each written function returns. The site's argument still counts
422+
// unless the write REPLACES it: a plain `=` statement of the wrapper's body, outside
423+
// every branch, whose value does not read the parameter. A write inside the closure
424+
// (a memoizer's `fn = undefined` after the call) or in a nested function is not the
425+
// wrapper's and changes nothing here.
426+
wrapper_param_write(h, pos, p, a) :- wrapper_forwards(h, _, pos), param_decl(_, _, ppos, h, p), to_number(ppos) = pos,
427+
expr_kind(_, "ASSIGNMENT", _, a), expr_owner(_, h, _, a), expr_operator(_, op, a), assignment_op_writes_value(op),
428+
expr_child(_, a, "ASSIGNMENT_TARGET", _, tgt), expr_param(_, p, tgt).
429+
// The written value's operands, through the same transparent forms as the carry.
430+
param_write_operand(a, v) :- wrapper_param_write(_, _, _, a), expr_child(_, a, "ASSIGNMENT_VALUE", _, v).
431+
param_write_operand(a, o) :- param_write_operand(a, e), expr_kind(_, "CONDITIONAL", _, e), expr_child(_, e, r, _, o), r != "CONDITION".
432+
param_write_operand(a, o) :- param_write_operand(a, e), value_passing_binary(e), expr_child(_, e, _, _, o).
433+
param_write_operand(a, o) :- param_write_operand(a, e), expr_kind(_, "SEQUENCE", _, e), sequence_last(e, o).
434+
param_write_operand(a, o) :- param_write_operand(a, e), expr_kind(_, "ASSIGNMENT", _, e), expr_child(_, e, "ASSIGNMENT_VALUE", _, o).
435+
value_passing_binary(e) :- expr_kind(_, "BINARY", _, e), expr_operator(_, op, e), binary_op_passes_value(op).
436+
param_write_leaf(a, o) :- param_write_operand(a, o), !expr_kind(_, "CONDITIONAL", _, o), !value_passing_binary(o),
437+
!expr_kind(_, "SEQUENCE", _, o), !expr_kind(_, "ASSIGNMENT", _, o).
438+
// A write that may leave the argument in place.
439+
param_write_keeps_arg(a) :- wrapper_param_write(_, _, p, a), param_write_leaf(a, o), expr_param(_, p, o).
440+
param_write_keeps_arg(a) :- wrapper_param_write(_, _, _, a), expr_operator(_, op, a), op != "=".
441+
param_write_keeps_arg(a) :- wrapper_param_write(_, _, _, a), !expr_root(_, "EXPRESSION_STATEMENT", a).
442+
param_write_keeps_arg(a) :- wrapper_param_write(h, _, _, a), expr_owner(_, h, mod, a), expr_span(_, l, c, _, _, a),
443+
block_owner(k, h, b), block_kind_branches(k), block_span(_, mod, l1, c1, l2, c2, b),
444+
(to_number(l) > to_number(l1) ; to_number(l) = to_number(l1), to_number(c) >= to_number(c1)),
445+
(to_number(l) < to_number(l2) ; to_number(l) = to_number(l2), to_number(c) <= to_number(c2)).
446+
block_kind_branches("IF").
447+
block_kind_branches("ELSE").
448+
block_kind_branches("FOR").
449+
block_kind_branches("FOR_IN").
450+
block_kind_branches("FOR_OF").
451+
block_kind_branches("WHILE").
452+
block_kind_branches("DO").
453+
block_kind_branches("SWITCH").
454+
block_kind_branches("SWITCH_CASE").
455+
block_kind_branches("TRY").
456+
block_kind_branches("CATCH").
457+
wrapper_param_replaced(h, pos) :- wrapper_param_write(h, pos, _, a), !param_write_keeps_arg(a).
458+
wrapper_param_written(h, pos, o) :- wrapper_param_write(h, pos, p, a), param_write_leaf(a, o), !expr_param(_, p, o).
418459
// The site's own value, and a call through it.
419460
expr_value(s, "wrap", s) :- expr_kind(_, "CALL", _, s), expr_resolves_to_method(s, h), wrapper_forwards(h, _, _).
420461
expr_value(ce, k, i) :- expr_kind(_, "CALL", _, ce), callee_value(ce, "wrap", s),
421462
!call_site(_, "FUNCTION_CALL_BIND", _, _, _, _, ce, _, _),
422-
expr_resolves_to_method(s, h), wrapper_forwards(h, _, pos), call_arg(s, pos, arg),
463+
expr_resolves_to_method(s, h), wrapper_forwards(h, _, pos), !wrapper_param_replaced(h, pos), call_arg(s, pos, arg),
423464
expr_value(arg, "func", g), return_value(g, k, i).
465+
expr_value(ce, k, i) :- expr_kind(_, "CALL", _, ce), callee_value(ce, "wrap", s),
466+
!call_site(_, "FUNCTION_CALL_BIND", _, _, _, _, ce, _, _),
467+
expr_resolves_to_method(s, h), wrapper_forwards(h, _, pos), wrapper_param_written(h, pos, o),
468+
expr_value(o, "func", g), return_value(g, k, i).
424469
// `return this` is POLYMORPHIC: a fluent `add()` declared on Node and called on an
425470
// AbstractBlock returns the AbstractBlock. So a `this`-return is not a value of the
426471
// method — it is the RECEIVER of each call, substituted at the site (below). A

‎graph/javascript/souffle/decls_all.dl‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@
300300
.decl instanceof_test(c0:symbol, c1:symbol)
301301
.decl block_child(c0:symbol, c1:symbol, c2:symbol, c3:symbol, c4:symbol)
302302
.decl block_span(c0:symbol, c1:symbol, c2:symbol, c3:symbol, c4:symbol, c5:symbol, c6:symbol)
303+
.decl block_owner(c0:symbol, c1:symbol, c2:symbol)
303304
.decl typeof_guard(c0:symbol, c1:symbol)
304305
.decl typeof_eq_op(c0:symbol)
305306
.decl typeof_primitive(c0:symbol)
@@ -323,6 +324,14 @@
323324
.decl var_carries_param_call(c0:symbol, c1:symbol)
324325
.decl wrapper_forwards(c0:symbol, c1:symbol, c2:number)
325326
.decl wrapped_result_return(c0:symbol)
327+
.decl wrapper_param_write(c0:symbol, c1:number, c2:symbol, c3:symbol)
328+
.decl param_write_operand(c0:symbol, c1:symbol)
329+
.decl value_passing_binary(c0:symbol)
330+
.decl param_write_leaf(c0:symbol, c1:symbol)
331+
.decl param_write_keeps_arg(c0:symbol)
332+
.decl block_kind_branches(c0:symbol)
333+
.decl wrapper_param_replaced(c0:symbol, c1:number)
334+
.decl wrapper_param_written(c0:symbol, c1:number, c2:symbol)
326335
.decl prop_value(c0:symbol, c1:symbol, c2:symbol, c3:symbol, c4:symbol)
327336
.decl member_write(c0:symbol, c1:symbol, c2:symbol, c3:symbol, c4:symbol)
328337
.decl prototype_object(c0:symbol, c1:symbol)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const { A, swapped, lazyGuard, lazyOrDefault, lazyNullish, plain, otherWritten } = require("./wrap");
2+
3+
function replaced() {
4+
const sw = swapped(() => new A());
5+
sw().replacedOnly();
6+
sw().aOnly();
7+
lazyGuard(undefined)().replacedOnly();
8+
lazyGuard(() => new A())().aOnly();
9+
lazyOrDefault()().dfltOnly();
10+
lazyOrDefault(() => new A())().aOnly();
11+
lazyNullish()().dfltOnly();
12+
}
13+
14+
function controls() {
15+
plain(() => new A())().aOnly();
16+
plain(() => new A())().replacedOnly();
17+
otherWritten(() => new A(), null)().aOnly();
18+
otherWritten(() => new A(), null)().replacedOnly();
19+
}
20+
21+
module.exports = { replaced, controls };
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Enough callers to put `swapped` over the parameter fan cap.
2+
const { A, swapped } = require("./wrap");
3+
const s01 = swapped(() => new A()); const s02 = swapped(() => new A()); const s03 = swapped(() => new A());
4+
const s04 = swapped(() => new A()); const s05 = swapped(() => new A()); const s06 = swapped(() => new A());
5+
const s07 = swapped(() => new A()); const s08 = swapped(() => new A()); const s09 = swapped(() => new A());
6+
const s10 = swapped(() => new A()); const s11 = swapped(() => new A()); const s12 = swapped(() => new A());
7+
const s13 = swapped(() => new A()); const s14 = swapped(() => new A()); const s15 = swapped(() => new A());
8+
const s16 = swapped(() => new A()); const s17 = swapped(() => new A()); const s18 = swapped(() => new A());
9+
const s19 = swapped(() => new A()); const s20 = swapped(() => new A()); const s21 = swapped(() => new A());
10+
function capped() {
11+
s21().replacedOnly();
12+
s21().aOnly();
13+
}
14+
module.exports = { capped, all: [s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20] };
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Wrappers that WRITE their parameter before the returned closure calls it.
2+
class A { aOnly() { return 1; } }
3+
class Replaced { replacedOnly() { return 2; } }
4+
class Dflt { dfltOnly() { return 3; } }
5+
6+
// Unconditional replacement: the site's argument never reaches the closure.
7+
function swapped(fn) {
8+
fn = () => new Replaced();
9+
return () => fn();
10+
}
11+
// Conditional replacement: the site's argument, or the replacement.
12+
function lazyGuard(fn) {
13+
if (typeof fn !== "function") fn = () => new Replaced();
14+
return () => fn();
15+
}
16+
// A default through `||`: the site's argument, or the default.
17+
function lazyOrDefault(fn) {
18+
fn = fn || (() => new Dflt());
19+
return () => fn();
20+
}
21+
// A default through `??=`.
22+
function lazyNullish(fn) {
23+
fn ??= () => new Dflt();
24+
return () => fn();
25+
}
26+
// CONTROL: no write at all — the site's argument alone.
27+
function plain(fn) {
28+
return () => fn();
29+
}
30+
// CONTROL: another parameter is written, not the one the closure calls.
31+
function otherWritten(fn, alt) {
32+
alt = () => new Replaced();
33+
return () => fn();
34+
}
35+
module.exports = { A, Replaced, Dflt, swapped, lazyGuard, lazyOrDefault, lazyNullish, plain, otherWritten };
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package_entry @axiomcode/code-graph . [] MAIN dist/reason.js NOT_STAGED -> -
2+
unresolved app.js:16:3 METHOD_CALL replacedOnly member_absent
3+
unresolved app.js:18:3 METHOD_CALL replacedOnly member_absent
4+
unresolved app.js:6:3 METHOD_CALL aOnly member_absent
5+
unresolved many.js:12:3 METHOD_CALL aOnly member_absent
6+
unresolved wrap.js:24:16 FUNCTION_CALL fn callee_untyped
7+
unresolved wrap.js:9:16 FUNCTION_CALL fn callee_untyped
8+
unresolved wrap.js:9:16 FUNCTION_CALL fn param_fan_capped
9+
value_callee wrap.js:24:16 fn parameter
10+
value_callee wrap.js:9:16 fn parameter
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
app.js:10:23 CONSTRUCTOR_CALL A -> implicit_constructor -
2+
app.js:10:3 FUNCTION_CALL lazyOrDefault -> callback_registered app.js:10:17 <arrow>
3+
app.js:10:3 FUNCTION_CALL lazyOrDefault -> known_edge wrap.js:17:1 lazyOrDefault
4+
app.js:10:3 FUNCTION_CALL lazyOrDefault(() => new A()) -> known_edge wrap.js:19:10 <arrow>
5+
app.js:10:3 METHOD_CALL lazyOrDefault(() => new A())().aOnly -> known_edge wrap.js:2:11 aOnly
6+
app.js:11:3 FUNCTION_CALL lazyNullish -> known_edge wrap.js:22:1 lazyNullish
7+
app.js:11:3 FUNCTION_CALL lazyNullish() -> known_edge wrap.js:24:10 <arrow>
8+
app.js:11:3 METHOD_CALL lazyNullish()().dfltOnly -> known_edge wrap.js:4:14 dfltOnly
9+
app.js:15:15 CONSTRUCTOR_CALL A -> implicit_constructor -
10+
app.js:15:3 FUNCTION_CALL plain -> callback_registered app.js:15:9 <arrow>
11+
app.js:15:3 FUNCTION_CALL plain -> known_edge wrap.js:27:1 plain
12+
app.js:15:3 FUNCTION_CALL plain(() => new A()) -> known_edge wrap.js:28:10 <arrow>
13+
app.js:15:3 METHOD_CALL plain(() => new A())().aOnly -> known_edge wrap.js:2:11 aOnly
14+
app.js:16:15 CONSTRUCTOR_CALL A -> implicit_constructor -
15+
app.js:16:3 FUNCTION_CALL plain -> callback_registered app.js:16:9 <arrow>
16+
app.js:16:3 FUNCTION_CALL plain -> known_edge wrap.js:27:1 plain
17+
app.js:16:3 FUNCTION_CALL plain(() => new A()) -> known_edge wrap.js:28:10 <arrow>
18+
app.js:16:3 METHOD_CALL plain(() => new A())().replacedOnly -> ambiguous_unknown -
19+
app.js:17:22 CONSTRUCTOR_CALL A -> implicit_constructor -
20+
app.js:17:3 FUNCTION_CALL otherWritten -> callback_registered app.js:17:16 <arrow>
21+
app.js:17:3 FUNCTION_CALL otherWritten -> known_edge wrap.js:31:1 otherWritten
22+
app.js:17:3 FUNCTION_CALL otherWritten(() => new A(), null) -> known_edge wrap.js:33:10 <arrow>
23+
app.js:17:3 METHOD_CALL otherWritten(() => new A(), null)().aOnly -> known_edge wrap.js:2:11 aOnly
24+
app.js:18:22 CONSTRUCTOR_CALL A -> implicit_constructor -
25+
app.js:18:3 FUNCTION_CALL otherWritten -> callback_registered app.js:18:16 <arrow>
26+
app.js:18:3 FUNCTION_CALL otherWritten -> known_edge wrap.js:31:1 otherWritten
27+
app.js:18:3 FUNCTION_CALL otherWritten(() => new A(), null) -> known_edge wrap.js:33:10 <arrow>
28+
app.js:18:3 METHOD_CALL otherWritten(() => new A(), null)().replacedOnly -> ambiguous_unknown -
29+
app.js:4:14 FUNCTION_CALL swapped -> callback_registered app.js:4:22 <arrow>
30+
app.js:4:14 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
31+
app.js:4:28 CONSTRUCTOR_CALL A -> implicit_constructor -
32+
app.js:5:3 FUNCTION_CALL sw -> known_edge wrap.js:9:10 <arrow>
33+
app.js:5:3 METHOD_CALL sw().replacedOnly -> known_edge wrap.js:3:18 replacedOnly
34+
app.js:6:3 FUNCTION_CALL sw -> known_edge wrap.js:9:10 <arrow>
35+
app.js:6:3 METHOD_CALL sw().aOnly -> ambiguous_unknown -
36+
app.js:7:3 FUNCTION_CALL lazyGuard -> known_edge wrap.js:12:1 lazyGuard
37+
app.js:7:3 FUNCTION_CALL lazyGuard(undefined) -> known_edge wrap.js:14:10 <arrow>
38+
app.js:7:3 METHOD_CALL lazyGuard(undefined)().replacedOnly -> known_edge wrap.js:3:18 replacedOnly
39+
app.js:8:19 CONSTRUCTOR_CALL A -> implicit_constructor -
40+
app.js:8:3 FUNCTION_CALL lazyGuard -> callback_registered app.js:8:13 <arrow>
41+
app.js:8:3 FUNCTION_CALL lazyGuard -> known_edge wrap.js:12:1 lazyGuard
42+
app.js:8:3 FUNCTION_CALL lazyGuard(() => new A()) -> known_edge wrap.js:14:10 <arrow>
43+
app.js:8:3 METHOD_CALL lazyGuard(() => new A())().aOnly -> known_edge wrap.js:2:11 aOnly
44+
app.js:9:3 FUNCTION_CALL lazyOrDefault -> known_edge wrap.js:17:1 lazyOrDefault
45+
app.js:9:3 FUNCTION_CALL lazyOrDefault() -> known_edge wrap.js:19:10 <arrow>
46+
app.js:9:3 METHOD_CALL lazyOrDefault()().dfltOnly -> known_edge wrap.js:4:14 dfltOnly
47+
many.js:11:3 FUNCTION_CALL s21 -> known_edge wrap.js:9:10 <arrow>
48+
many.js:11:3 METHOD_CALL s21().replacedOnly -> known_edge wrap.js:3:18 replacedOnly
49+
many.js:12:3 FUNCTION_CALL s21 -> known_edge wrap.js:9:10 <arrow>
50+
many.js:12:3 METHOD_CALL s21().aOnly -> ambiguous_unknown -
51+
many.js:3:13 FUNCTION_CALL swapped -> callback_registered many.js:3:21 <arrow>
52+
many.js:3:13 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
53+
many.js:3:27 CONSTRUCTOR_CALL A -> implicit_constructor -
54+
many.js:3:49 FUNCTION_CALL swapped -> callback_registered many.js:3:57 <arrow>
55+
many.js:3:49 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
56+
many.js:3:63 CONSTRUCTOR_CALL A -> implicit_constructor -
57+
many.js:3:85 FUNCTION_CALL swapped -> callback_registered many.js:3:93 <arrow>
58+
many.js:3:85 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
59+
many.js:3:99 CONSTRUCTOR_CALL A -> implicit_constructor -
60+
many.js:4:13 FUNCTION_CALL swapped -> callback_registered many.js:4:21 <arrow>
61+
many.js:4:13 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
62+
many.js:4:27 CONSTRUCTOR_CALL A -> implicit_constructor -
63+
many.js:4:49 FUNCTION_CALL swapped -> callback_registered many.js:4:57 <arrow>
64+
many.js:4:49 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
65+
many.js:4:63 CONSTRUCTOR_CALL A -> implicit_constructor -
66+
many.js:4:85 FUNCTION_CALL swapped -> callback_registered many.js:4:93 <arrow>
67+
many.js:4:85 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
68+
many.js:4:99 CONSTRUCTOR_CALL A -> implicit_constructor -
69+
many.js:5:13 FUNCTION_CALL swapped -> callback_registered many.js:5:21 <arrow>
70+
many.js:5:13 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
71+
many.js:5:27 CONSTRUCTOR_CALL A -> implicit_constructor -
72+
many.js:5:49 FUNCTION_CALL swapped -> callback_registered many.js:5:57 <arrow>
73+
many.js:5:49 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
74+
many.js:5:63 CONSTRUCTOR_CALL A -> implicit_constructor -
75+
many.js:5:85 FUNCTION_CALL swapped -> callback_registered many.js:5:93 <arrow>
76+
many.js:5:85 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
77+
many.js:5:99 CONSTRUCTOR_CALL A -> implicit_constructor -
78+
many.js:6:13 FUNCTION_CALL swapped -> callback_registered many.js:6:21 <arrow>
79+
many.js:6:13 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
80+
many.js:6:27 CONSTRUCTOR_CALL A -> implicit_constructor -
81+
many.js:6:49 FUNCTION_CALL swapped -> callback_registered many.js:6:57 <arrow>
82+
many.js:6:49 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
83+
many.js:6:63 CONSTRUCTOR_CALL A -> implicit_constructor -
84+
many.js:6:85 FUNCTION_CALL swapped -> callback_registered many.js:6:93 <arrow>
85+
many.js:6:85 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
86+
many.js:6:99 CONSTRUCTOR_CALL A -> implicit_constructor -
87+
many.js:7:13 FUNCTION_CALL swapped -> callback_registered many.js:7:21 <arrow>
88+
many.js:7:13 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
89+
many.js:7:27 CONSTRUCTOR_CALL A -> implicit_constructor -
90+
many.js:7:49 FUNCTION_CALL swapped -> callback_registered many.js:7:57 <arrow>
91+
many.js:7:49 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
92+
many.js:7:63 CONSTRUCTOR_CALL A -> implicit_constructor -
93+
many.js:7:85 FUNCTION_CALL swapped -> callback_registered many.js:7:93 <arrow>
94+
many.js:7:85 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
95+
many.js:7:99 CONSTRUCTOR_CALL A -> implicit_constructor -
96+
many.js:8:13 FUNCTION_CALL swapped -> callback_registered many.js:8:21 <arrow>
97+
many.js:8:13 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
98+
many.js:8:27 CONSTRUCTOR_CALL A -> implicit_constructor -
99+
many.js:8:49 FUNCTION_CALL swapped -> callback_registered many.js:8:57 <arrow>
100+
many.js:8:49 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
101+
many.js:8:63 CONSTRUCTOR_CALL A -> implicit_constructor -
102+
many.js:8:85 FUNCTION_CALL swapped -> callback_registered many.js:8:93 <arrow>
103+
many.js:8:85 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
104+
many.js:8:99 CONSTRUCTOR_CALL A -> implicit_constructor -
105+
many.js:9:13 FUNCTION_CALL swapped -> callback_registered many.js:9:21 <arrow>
106+
many.js:9:13 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
107+
many.js:9:27 CONSTRUCTOR_CALL A -> implicit_constructor -
108+
many.js:9:49 FUNCTION_CALL swapped -> callback_registered many.js:9:57 <arrow>
109+
many.js:9:49 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
110+
many.js:9:63 CONSTRUCTOR_CALL A -> implicit_constructor -
111+
many.js:9:85 FUNCTION_CALL swapped -> callback_registered many.js:9:93 <arrow>
112+
many.js:9:85 FUNCTION_CALL swapped -> known_edge wrap.js:7:1 swapped
113+
many.js:9:99 CONSTRUCTOR_CALL A -> implicit_constructor -
114+
wrap.js:13:44 CONSTRUCTOR_CALL Replaced -> implicit_constructor -
115+
wrap.js:14:16 FUNCTION_CALL fn -> ambient_terminal -
116+
wrap.js:14:16 FUNCTION_CALL fn -> multi_inferred app.js:8:13 <arrow>
117+
wrap.js:18:21 CONSTRUCTOR_CALL Dflt -> implicit_constructor -
118+
wrap.js:19:16 FUNCTION_CALL fn -> known_edge app.js:10:17 <arrow>
119+
wrap.js:23:16 CONSTRUCTOR_CALL Dflt -> implicit_constructor -
120+
wrap.js:24:16 FUNCTION_CALL fn -> ambiguous_unknown -
121+
wrap.js:28:16 FUNCTION_CALL fn -> multi_inferred app.js:15:9 <arrow>
122+
wrap.js:28:16 FUNCTION_CALL fn -> multi_inferred app.js:16:9 <arrow>
123+
wrap.js:32:15 CONSTRUCTOR_CALL Replaced -> implicit_constructor -
124+
wrap.js:33:16 FUNCTION_CALL fn -> multi_inferred app.js:17:16 <arrow>
125+
wrap.js:33:16 FUNCTION_CALL fn -> multi_inferred app.js:18:16 <arrow>
126+
wrap.js:8:14 CONSTRUCTOR_CALL Replaced -> implicit_constructor -
127+
wrap.js:9:16 FUNCTION_CALL fn -> ambiguous_unknown -

0 commit comments

Comments
 (0)