@suss/adapter-python 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,7 +6,7 @@ The Python language adapter for suss. It parses source with tree-sitter (WASM),
6
6
 
7
7
  `@suss/adapter-python` is the Python language adapter. It meets the Layer 1 contract in [`docs/internal/facts-and-rules.md`](../../../docs/internal/facts-and-rules.md): discover units, emit summaries in the shared IR, emit facts. It parses a file with `web-tree-sitter` and a vendored Python grammar (`grammar/tree-sitter-python.wasm`, so there is no native build step), builds module, class and function scopes over the tree (imports, assignments, `global`/`nonlocal`), works out which file in the repo an import points at, and finds routes on decorated functions and class methods whose decorator resolves to a module the pack was configured with. When a pack says the library mounts routers (FastAPI's `APIRouter` plus `include_router`), the adapter builds a route's path out of the two literal prefixes, one mount hop deep. When it cannot build the path, the route keeps its name, gets no path, and gets a gap explaining why. Each unit it finds becomes a `RawCodeStructure` object, which it hands to `assembleSummary` in `@suss/extractor`, the same assembly code the TypeScript adapter uses.
8
8
 
9
- v0 (this slice) does nothing with the path engine. A route either has no transitions at all, or one transition that describes the response the code declares (a FastAPI `response_model` / `status_code`, or a return annotation). It never breaks a route into branches. See [`docs/internal/proposals/language-adapters.md`](../../../docs/internal/proposals/language-adapters.md) for what a later slice adds.
9
+ v0 (this slice) does nothing with the path engine. A route either has no transitions at all, or one transition that describes the response the code declares (a FastAPI `response_model` / `status_code`, or a return annotation). It never breaks a route into branches. See [`design/proposals/language-adapters.md`](../../../design/proposals/language-adapters.md) for what a later slice adds.
10
10
 
11
11
  ## Where it fits in suss
12
12
 
package/dist/index.cjs CHANGED
@@ -15747,7 +15747,7 @@ function date4(params) {
15747
15747
  // ../../../node_modules/zod/v4/classic/external.js
15748
15748
  config(en_default());
15749
15749
 
15750
- // ../../ir-core/dist/chunk-HBAMPBAO.js
15750
+ // ../../ir-core/dist/chunk-AQYS5AC6.js
15751
15751
  function gqlIdentityKey(typeName, fieldName) {
15752
15752
  return `gql:${typeName}.${fieldName}`;
15753
15753
  }
@@ -16049,6 +16049,9 @@ function normalizePath(path4) {
16049
16049
  );
16050
16050
  return normalized;
16051
16051
  }
16052
+ function pathShape(path4) {
16053
+ return normalizePath(path4).replace(/\{[^}]*\}/g, "{}");
16054
+ }
16052
16055
  function methodsAgree(a, b) {
16053
16056
  if (a === null || b === null) {
16054
16057
  return false;
@@ -16100,12 +16103,17 @@ var restSemantics = defineBoundarySemantics({
16100
16103
  * settles it inside the bucket. The identity key stays what a reader
16101
16104
  * sees and a suppression targets ("GET /users", "* /users"), and
16102
16105
  * this key groups what a reader still tells apart.
16106
+ *
16107
+ * A parameter's name goes too. A spec written by hand says
16108
+ * `{userId}` where the Express route that serves it says `:id`, and
16109
+ * both match the same requests, so pairing on the name gave two
16110
+ * boundaries that never met and a run with nothing to report.
16103
16111
  */
16104
16112
  pairingKey(semantics) {
16105
16113
  if (semantics.method === null || semantics.path === null) {
16106
16114
  return null;
16107
16115
  }
16108
- return `rest ${normalizePath(semantics.path)}`;
16116
+ return `rest ${pathShape(semantics.path)}`;
16109
16117
  },
16110
16118
  sidesAgree(a, b) {
16111
16119
  return methodsAgree(a.method, b.method);
@@ -16481,285 +16489,311 @@ function statementIn(call) {
16481
16489
  }
16482
16490
 
16483
16491
  // src/facts/resolve.ts
16484
- var import_datalog2 = require("@suss/datalog");
16492
+ var import_datalog3 = require("@suss/datalog");
16485
16493
 
16486
16494
  // ../../resolution/dist/index.js
16487
16495
  var import_datalog = require("@suss/datalog");
16488
- var VALUE_STEP = (0, import_datalog.constant)("value");
16489
- var RESULT_STEP = (0, import_datalog.constant)("result");
16496
+ var import_datalog2 = require("@suss/datalog");
16497
+ var VALUE_STEP = (0, import_datalog2.constant)("value");
16498
+ var RESULT_STEP = (0, import_datalog2.constant)("result");
16490
16499
  var RESOLUTION_RULES = [
16491
16500
  // Aliasing: const x = y, or an identifier referencing a declaration.
16492
16501
  // A language with a hop of its own, like JavaScript's `.bind`, states
16493
16502
  // it as a step too, or every question but `comesTo` misses it.
16494
- (0, import_datalog.rule)("stepsTo", [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("y"), VALUE_STEP], [(0, import_datalog.lit)("binds", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("y"))]),
16503
+ (0, import_datalog2.rule)(
16504
+ "stepsTo",
16505
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), VALUE_STEP],
16506
+ [(0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"))],
16507
+ "alias"
16508
+ ),
16495
16509
  // A name written more than once has the value the last write left
16496
16510
  // there. The adapter works out which write that is and stays quiet
16497
16511
  // when control flow decides, so such a name steps nowhere at all.
16498
- (0, import_datalog.rule)(
16512
+ (0, import_datalog2.rule)(
16513
+ "stepsTo",
16514
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), VALUE_STEP],
16515
+ [(0, import_datalog2.lit)("endsHolding", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"))],
16516
+ "last write"
16517
+ ),
16518
+ // A fallback says the value is one of its branches, so each branch is
16519
+ // a step. A branch that resolves to nothing makes no claim, and two
16520
+ // branches resolving to different things fail the single-answer policy.
16521
+ (0, import_datalog2.rule)(
16499
16522
  "stepsTo",
16500
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("y"), VALUE_STEP],
16501
- [(0, import_datalog.lit)("endsHolding", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("y"))]
16523
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("b"), VALUE_STEP],
16524
+ [(0, import_datalog2.lit)("fallbackBranch", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("b"))],
16525
+ "fallback"
16502
16526
  ),
16503
16527
  // An import steps to what the module exports under that name.
16504
- (0, import_datalog.rule)(
16528
+ (0, import_datalog2.rule)(
16505
16529
  "stepsTo",
16506
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("value"), VALUE_STEP],
16530
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("value"), VALUE_STEP],
16507
16531
  [
16508
- (0, import_datalog.lit)("imports", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n")),
16509
- (0, import_datalog.lit)("moduleExport", (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("value"))
16510
- ]
16532
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")),
16533
+ (0, import_datalog2.lit)("moduleExport", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value"))
16534
+ ],
16535
+ "import"
16511
16536
  ),
16512
16537
  // A parameter steps to what a call passes it. A function called from
16513
16538
  // several places leaves its parameter with more than one value, and a
16514
16539
  // caller that needs those apart asks `paramAt`.
16515
- (0, import_datalog.rule)(
16540
+ (0, import_datalog2.rule)(
16516
16541
  "stepsTo",
16517
- [(0, import_datalog.variable)("p"), (0, import_datalog.variable)("a"), VALUE_STEP],
16518
- [(0, import_datalog.lit)("passesArgument", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("p"), (0, import_datalog.variable)("a"))]
16542
+ [(0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("a"), VALUE_STEP],
16543
+ [(0, import_datalog2.lit)("passesArgument", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("a"))],
16544
+ "argument"
16519
16545
  ),
16520
16546
  // Reading a property steps to what the object contains under that
16521
16547
  // name, whichever way the object arrived: `routes.list` off a name,
16522
16548
  // or `make(body).handle` off a call.
16523
- (0, import_datalog.rule)(
16549
+ (0, import_datalog2.rule)(
16524
16550
  "stepsTo",
16525
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("held"), VALUE_STEP],
16551
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("held"), VALUE_STEP],
16526
16552
  [
16527
- (0, import_datalog.lit)("readsProperty", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("o"), (0, import_datalog.variable)("n")),
16528
- (0, import_datalog.lit)("objectOf", (0, import_datalog.variable)("o"), (0, import_datalog.variable)("obj")),
16529
- (0, import_datalog.lit)("contains", (0, import_datalog.variable)("obj"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("held"))
16530
- ]
16553
+ (0, import_datalog2.lit)("readsProperty", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("n")),
16554
+ (0, import_datalog2.lit)("objectOf", (0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("obj")),
16555
+ (0, import_datalog2.lit)("contains", (0, import_datalog2.variable)("obj"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("held"))
16556
+ ],
16557
+ "property read"
16531
16558
  ),
16532
16559
  // Calling a class makes one of it, so the call steps to the class and
16533
16560
  // a method read off the result is the one the class declares. The
16534
16561
  // caveat below is about a factory function, and a class is not one.
16535
- (0, import_datalog.rule)(
16562
+ (0, import_datalog2.rule)(
16536
16563
  "stepsTo",
16537
- [(0, import_datalog.variable)("r"), (0, import_datalog.variable)("cls"), VALUE_STEP],
16564
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("cls"), VALUE_STEP],
16538
16565
  [
16539
- (0, import_datalog.lit)("call", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("c")),
16540
- (0, import_datalog.lit)("comesTo", (0, import_datalog.variable)("c"), (0, import_datalog.variable)("cls")),
16541
- (0, import_datalog.lit)("objectValue", (0, import_datalog.variable)("cls"))
16542
- ]
16566
+ (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c")),
16567
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("cls")),
16568
+ (0, import_datalog2.lit)("objectValue", (0, import_datalog2.variable)("cls"))
16569
+ ],
16570
+ "class instance"
16543
16571
  ),
16544
16572
  // Wrapper transparency, derived: calling a factory that returns a
16545
16573
  // function which calls its parameter k steps to argument k.
16546
- (0, import_datalog.rule)(
16574
+ (0, import_datalog2.rule)(
16547
16575
  "stepsTo",
16548
- [(0, import_datalog.variable)("r"), (0, import_datalog.variable)("a"), VALUE_STEP],
16576
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("a"), VALUE_STEP],
16549
16577
  [
16550
- (0, import_datalog.lit)("call", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("c")),
16551
- (0, import_datalog.lit)("comesTo", (0, import_datalog.variable)("c"), (0, import_datalog.variable)("f")),
16552
- (0, import_datalog.lit)("unwraps", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("k")),
16553
- (0, import_datalog.lit)("callArg", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("k"), (0, import_datalog.variable)("a"))
16554
- ]
16578
+ (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c")),
16579
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("f")),
16580
+ (0, import_datalog2.lit)("unwraps", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k")),
16581
+ (0, import_datalog2.lit)("callArg", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("a"))
16582
+ ],
16583
+ "factory unwrap"
16555
16584
  ),
16556
16585
  // Wrapper transparency, declared: a pack says this callee wraps
16557
16586
  // argument k. The callee has to come from the library the pack said,
16558
16587
  // so a local object spelled the same way is not mistaken for it.
16559
- (0, import_datalog.rule)(
16588
+ (0, import_datalog2.rule)(
16560
16589
  "stepsTo",
16561
- [(0, import_datalog.variable)("r"), (0, import_datalog.variable)("a"), VALUE_STEP],
16590
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("a"), VALUE_STEP],
16562
16591
  [
16563
- (0, import_datalog.lit)("calleeName", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("n")),
16564
- (0, import_datalog.lit)("unwrapsByName", (0, import_datalog.variable)("n"), (0, import_datalog.variable)("k")),
16565
- (0, import_datalog.lit)("wrapperModule", (0, import_datalog.variable)("n"), (0, import_datalog.variable)("m")),
16566
- (0, import_datalog.lit)("calleeOrigin", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("m")),
16567
- (0, import_datalog.lit)("callArg", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("k"), (0, import_datalog.variable)("a"))
16568
- ]
16592
+ (0, import_datalog2.lit)("calleeName", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("n")),
16593
+ (0, import_datalog2.lit)("unwrapsByName", (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("k")),
16594
+ (0, import_datalog2.lit)("wrapperModule", (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("m")),
16595
+ (0, import_datalog2.lit)("calleeOrigin", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("m")),
16596
+ (0, import_datalog2.lit)("callArg", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("a"))
16597
+ ],
16598
+ "declared wrapper"
16569
16599
  ),
16570
16600
  // The one step that runs a function forwards: a call steps to what
16571
16601
  // the function it invokes returns.
16572
- (0, import_datalog.rule)(
16602
+ (0, import_datalog2.rule)(
16573
16603
  "stepsTo",
16574
- [(0, import_datalog.variable)("r"), (0, import_datalog.variable)("ret"), RESULT_STEP],
16575
- [(0, import_datalog.lit)("invokes", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("f")), (0, import_datalog.lit)("returnsValue", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("ret"))]
16604
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("ret"), RESULT_STEP],
16605
+ [(0, import_datalog2.lit)("invokes", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")), (0, import_datalog2.lit)("returnsValue", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("ret"))],
16606
+ "call result"
16576
16607
  ),
16577
16608
  // Where a walk gets to, and whether it ran a call on the way. A value
16578
16609
  // step keeps whatever the rest of the walk was, and a result step
16579
16610
  // makes the whole walk one that ran a call.
16580
- (0, import_datalog.rule)(
16611
+ (0, import_datalog2.rule)(
16581
16612
  "reaches",
16582
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"), (0, import_datalog.variable)("kind")],
16583
- [(0, import_datalog.lit)("stepsTo", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"), (0, import_datalog.variable)("kind"))]
16613
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), (0, import_datalog2.variable)("kind")],
16614
+ [(0, import_datalog2.lit)("stepsTo", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), (0, import_datalog2.variable)("kind"))]
16584
16615
  ),
16585
- (0, import_datalog.rule)(
16616
+ (0, import_datalog2.rule)(
16586
16617
  "reaches",
16587
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"), (0, import_datalog.variable)("kind")],
16618
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), (0, import_datalog2.variable)("kind")],
16588
16619
  [
16589
- (0, import_datalog.lit)("stepsTo", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("y"), VALUE_STEP),
16590
- (0, import_datalog.lit)("reaches", (0, import_datalog.variable)("y"), (0, import_datalog.variable)("z"), (0, import_datalog.variable)("kind"))
16620
+ (0, import_datalog2.lit)("stepsTo", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), VALUE_STEP),
16621
+ (0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"), (0, import_datalog2.variable)("kind"))
16591
16622
  ]
16592
16623
  ),
16593
16624
  // Two rules rather than one leaving the rest of the walk's kind free.
16594
16625
  // A free kind is a second question about the same relation, and a
16595
16626
  // demand-driven run then derives both to answer either.
16596
- (0, import_datalog.rule)(
16627
+ (0, import_datalog2.rule)(
16597
16628
  "reaches",
16598
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"), RESULT_STEP],
16629
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), RESULT_STEP],
16599
16630
  [
16600
- (0, import_datalog.lit)("stepsTo", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("y"), RESULT_STEP),
16601
- (0, import_datalog.lit)("reaches", (0, import_datalog.variable)("y"), (0, import_datalog.variable)("z"), VALUE_STEP)
16631
+ (0, import_datalog2.lit)("stepsTo", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), RESULT_STEP),
16632
+ (0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"), VALUE_STEP)
16602
16633
  ]
16603
16634
  ),
16604
- (0, import_datalog.rule)(
16635
+ (0, import_datalog2.rule)(
16605
16636
  "reaches",
16606
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"), RESULT_STEP],
16637
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), RESULT_STEP],
16607
16638
  [
16608
- (0, import_datalog.lit)("stepsTo", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("y"), RESULT_STEP),
16609
- (0, import_datalog.lit)("reaches", (0, import_datalog.variable)("y"), (0, import_datalog.variable)("z"), RESULT_STEP)
16639
+ (0, import_datalog2.lit)("stepsTo", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), RESULT_STEP),
16640
+ (0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"), RESULT_STEP)
16610
16641
  ]
16611
16642
  ),
16612
16643
  // What a value comes down to: the walk that never ran a call, stopped
16613
16644
  // at a function or an object. Something already written out comes to
16614
16645
  // itself, and every other walk ends at one of those.
16615
- (0, import_datalog.rule)("comesTo", [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("x")], [(0, import_datalog.lit)("func", (0, import_datalog.variable)("x"))]),
16616
- (0, import_datalog.rule)("comesTo", [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("x")], [(0, import_datalog.lit)("objectValue", (0, import_datalog.variable)("x"))]),
16617
- (0, import_datalog.rule)(
16646
+ (0, import_datalog2.rule)("comesTo", [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("x")], [(0, import_datalog2.lit)("func", (0, import_datalog2.variable)("x"))]),
16647
+ (0, import_datalog2.rule)("comesTo", [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("x")], [(0, import_datalog2.lit)("objectValue", (0, import_datalog2.variable)("x"))]),
16648
+ (0, import_datalog2.rule)(
16618
16649
  "comesTo",
16619
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z")],
16620
- [(0, import_datalog.lit)("reaches", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"), VALUE_STEP), (0, import_datalog.lit)("func", (0, import_datalog.variable)("z"))]
16650
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16651
+ [(0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), VALUE_STEP), (0, import_datalog2.lit)("func", (0, import_datalog2.variable)("z"))]
16621
16652
  ),
16622
- (0, import_datalog.rule)(
16653
+ (0, import_datalog2.rule)(
16623
16654
  "comesTo",
16624
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z")],
16625
- [(0, import_datalog.lit)("reaches", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"), VALUE_STEP), (0, import_datalog.lit)("objectValue", (0, import_datalog.variable)("z"))]
16655
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16656
+ [(0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), VALUE_STEP), (0, import_datalog2.lit)("objectValue", (0, import_datalog2.variable)("z"))]
16626
16657
  ),
16627
16658
  // The same stopping condition, for the walk that ran a call. A call
16628
16659
  // gets no `comesTo` answer on purpose: coming back with what a
16629
16660
  // factory returned would fight the unwrapping answer.
16630
- (0, import_datalog.rule)(
16661
+ (0, import_datalog2.rule)(
16631
16662
  "givesBack",
16632
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z")],
16633
- [(0, import_datalog.lit)("reaches", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"), RESULT_STEP), (0, import_datalog.lit)("func", (0, import_datalog.variable)("z"))]
16663
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16664
+ [(0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), RESULT_STEP), (0, import_datalog2.lit)("func", (0, import_datalog2.variable)("z"))]
16634
16665
  ),
16635
- (0, import_datalog.rule)(
16666
+ (0, import_datalog2.rule)(
16636
16667
  "givesBack",
16637
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z")],
16638
- [(0, import_datalog.lit)("reaches", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"), RESULT_STEP), (0, import_datalog.lit)("objectValue", (0, import_datalog.variable)("z"))]
16668
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16669
+ [(0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), RESULT_STEP), (0, import_datalog2.lit)("objectValue", (0, import_datalog2.variable)("z"))]
16639
16670
  ),
16640
16671
  // Following a value to the expression it is written as, whatever kind
16641
16672
  // that is. A GraphQL document is neither a function nor an object, so
16642
16673
  // `comesTo` never reaches one.
16643
- (0, import_datalog.rule)("isWrittenAs", [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("x")], [(0, import_datalog.lit)("writtenValue", (0, import_datalog.variable)("x"))]),
16644
- (0, import_datalog.rule)("isWrittenAs", [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("x")], [(0, import_datalog.lit)("objectValue", (0, import_datalog.variable)("x"))]),
16645
- (0, import_datalog.rule)(
16674
+ (0, import_datalog2.rule)("isWrittenAs", [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("x")], [(0, import_datalog2.lit)("writtenValue", (0, import_datalog2.variable)("x"))]),
16675
+ (0, import_datalog2.rule)("isWrittenAs", [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("x")], [(0, import_datalog2.lit)("objectValue", (0, import_datalog2.variable)("x"))]),
16676
+ (0, import_datalog2.rule)(
16646
16677
  "isWrittenAs",
16647
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z")],
16648
- [(0, import_datalog.lit)("reaches", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"), VALUE_STEP), (0, import_datalog.lit)("writtenValue", (0, import_datalog.variable)("z"))]
16678
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16679
+ [(0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), VALUE_STEP), (0, import_datalog2.lit)("writtenValue", (0, import_datalog2.variable)("z"))]
16649
16680
  ),
16650
- (0, import_datalog.rule)(
16681
+ (0, import_datalog2.rule)(
16651
16682
  "isWrittenAs",
16652
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z")],
16653
- [(0, import_datalog.lit)("reaches", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"), VALUE_STEP), (0, import_datalog.lit)("objectValue", (0, import_datalog.variable)("z"))]
16683
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16684
+ [(0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), VALUE_STEP), (0, import_datalog2.lit)("objectValue", (0, import_datalog2.variable)("z"))]
16654
16685
  ),
16655
16686
  // What one call site put in a parameter, told apart from what the
16656
16687
  // other callers passed.
16657
- (0, import_datalog.rule)(
16688
+ (0, import_datalog2.rule)(
16658
16689
  "paramAt",
16659
- [(0, import_datalog.variable)("r"), (0, import_datalog.variable)("p"), (0, import_datalog.variable)("z")],
16690
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("z")],
16660
16691
  [
16661
- (0, import_datalog.lit)("passesArgument", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("p"), (0, import_datalog.variable)("a")),
16662
- (0, import_datalog.lit)("comesTo", (0, import_datalog.variable)("a"), (0, import_datalog.variable)("z"))
16692
+ (0, import_datalog2.lit)("passesArgument", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("a")),
16693
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("a"), (0, import_datalog2.variable)("z"))
16663
16694
  ]
16664
16695
  ),
16665
16696
  // An argument arriving at the parameter it is passed to, by position
16666
16697
  // or by the name the caller wrote, keeping the call it went through
16667
16698
  // so `paramAt` can tell two call sites apart.
16668
- (0, import_datalog.rule)(
16699
+ (0, import_datalog2.rule)(
16669
16700
  "passesArgument",
16670
- [(0, import_datalog.variable)("r"), (0, import_datalog.variable)("p"), (0, import_datalog.variable)("a")],
16701
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("a")],
16671
16702
  [
16672
- (0, import_datalog.lit)("paramOf", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("k"), (0, import_datalog.variable)("p")),
16673
- (0, import_datalog.lit)("callsFunction", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("f")),
16674
- (0, import_datalog.lit)("callArg", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("k"), (0, import_datalog.variable)("a"))
16703
+ (0, import_datalog2.lit)("paramOf", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("p")),
16704
+ (0, import_datalog2.lit)("callsFunction", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")),
16705
+ (0, import_datalog2.lit)("callArg", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("a"))
16675
16706
  ]
16676
16707
  ),
16677
- (0, import_datalog.rule)(
16708
+ (0, import_datalog2.rule)(
16678
16709
  "passesArgument",
16679
- [(0, import_datalog.variable)("r"), (0, import_datalog.variable)("p"), (0, import_datalog.variable)("a")],
16710
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("a")],
16680
16711
  [
16681
- (0, import_datalog.lit)("paramNamed", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("p")),
16682
- (0, import_datalog.lit)("callsFunction", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("f")),
16683
- (0, import_datalog.lit)("callKeywordArg", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("a"))
16712
+ (0, import_datalog2.lit)("paramNamed", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("p")),
16713
+ (0, import_datalog2.lit)("callsFunction", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")),
16714
+ (0, import_datalog2.lit)("callKeywordArg", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("a"))
16684
16715
  ]
16685
16716
  ),
16686
16717
  // What a module exports: directly, or through re-export chains.
16687
- (0, import_datalog.rule)(
16718
+ (0, import_datalog2.rule)(
16688
16719
  "moduleExport",
16689
- [(0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("value")],
16690
- [(0, import_datalog.lit)("exportsAs", (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("value"))]
16720
+ [(0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value")],
16721
+ [(0, import_datalog2.lit)("exportsAs", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value"))],
16722
+ "export"
16691
16723
  ),
16692
- (0, import_datalog.rule)(
16724
+ (0, import_datalog2.rule)(
16693
16725
  "moduleExport",
16694
- [(0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("value")],
16726
+ [(0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value")],
16695
16727
  [
16696
- (0, import_datalog.lit)("reExports", (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("m2"), (0, import_datalog.variable)("n2")),
16697
- (0, import_datalog.lit)("moduleExport", (0, import_datalog.variable)("m2"), (0, import_datalog.variable)("n2"), (0, import_datalog.variable)("value"))
16698
- ]
16728
+ (0, import_datalog2.lit)("reExports", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("m2"), (0, import_datalog2.variable)("n2")),
16729
+ (0, import_datalog2.lit)("moduleExport", (0, import_datalog2.variable)("m2"), (0, import_datalog2.variable)("n2"), (0, import_datalog2.variable)("value"))
16730
+ ],
16731
+ "re-export"
16699
16732
  ),
16700
- (0, import_datalog.rule)(
16733
+ (0, import_datalog2.rule)(
16701
16734
  "moduleExport",
16702
- [(0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("value")],
16735
+ [(0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value")],
16703
16736
  [
16704
- (0, import_datalog.lit)("reExportsAll", (0, import_datalog.variable)("m"), (0, import_datalog.variable)("m2")),
16705
- (0, import_datalog.lit)("moduleExport", (0, import_datalog.variable)("m2"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("value"))
16706
- ]
16737
+ (0, import_datalog2.lit)("reExportsAll", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("m2")),
16738
+ (0, import_datalog2.lit)("moduleExport", (0, import_datalog2.variable)("m2"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value"))
16739
+ ],
16740
+ "re-export all"
16707
16741
  ),
16708
16742
  // The function a call runs, written from the call's side because a
16709
16743
  // caller asking what a call gives back has the call in hand.
16710
- (0, import_datalog.rule)(
16744
+ (0, import_datalog2.rule)(
16711
16745
  "invokes",
16712
- [(0, import_datalog.variable)("r"), (0, import_datalog.variable)("f")],
16713
- [(0, import_datalog.lit)("call", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("c")), (0, import_datalog.lit)("comesTo", (0, import_datalog.variable)("c"), (0, import_datalog.variable)("f"))]
16746
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")],
16747
+ [(0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c")), (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("f"))]
16714
16748
  ),
16715
16749
  // The callee is itself a call: `daoBuilder()()`.
16716
- (0, import_datalog.rule)(
16750
+ (0, import_datalog2.rule)(
16717
16751
  "invokes",
16718
- [(0, import_datalog.variable)("r"), (0, import_datalog.variable)("f")],
16719
- [(0, import_datalog.lit)("call", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("c")), (0, import_datalog.lit)("givesBack", (0, import_datalog.variable)("c"), (0, import_datalog.variable)("f"))]
16752
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")],
16753
+ [(0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c")), (0, import_datalog2.lit)("givesBack", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("f"))]
16720
16754
  ),
16721
16755
  // The object an expression refers to: a name through `comesTo`, a
16722
16756
  // factory call through what it gives back. Naming the step is what
16723
16757
  // makes `routes.list` and `make(body).handle` one rule.
16724
- (0, import_datalog.rule)(
16758
+ (0, import_datalog2.rule)(
16725
16759
  "objectOf",
16726
- [(0, import_datalog.variable)("o"), (0, import_datalog.variable)("obj")],
16727
- [(0, import_datalog.lit)("comesTo", (0, import_datalog.variable)("o"), (0, import_datalog.variable)("obj")), (0, import_datalog.lit)("objectValue", (0, import_datalog.variable)("obj"))]
16760
+ [(0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("obj")],
16761
+ [(0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("obj")), (0, import_datalog2.lit)("objectValue", (0, import_datalog2.variable)("obj"))]
16728
16762
  ),
16729
- (0, import_datalog.rule)(
16763
+ (0, import_datalog2.rule)(
16730
16764
  "objectOf",
16731
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("obj")],
16732
- [(0, import_datalog.lit)("givesBack", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("obj")), (0, import_datalog.lit)("objectValue", (0, import_datalog.variable)("obj"))]
16765
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("obj")],
16766
+ [(0, import_datalog2.lit)("givesBack", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("obj")), (0, import_datalog2.lit)("objectValue", (0, import_datalog2.variable)("obj"))]
16733
16767
  ),
16734
16768
  // Which calls a function, found by the name the call is written as
16735
16769
  // rather than by resolving every callee in the project. A caller knows
16736
16770
  // the function and wants its call sites, so both of these start from
16737
16771
  // the function. Starting from `call` instead asks what every call in
16738
16772
  // the project imports, which was 72% of everything derived.
16739
- (0, import_datalog.rule)(
16773
+ (0, import_datalog2.rule)(
16740
16774
  "callsFunction",
16741
- [(0, import_datalog.variable)("r"), (0, import_datalog.variable)("f")],
16742
- [(0, import_datalog.lit)("binds", (0, import_datalog.variable)("c"), (0, import_datalog.variable)("f")), (0, import_datalog.lit)("call", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("c"))]
16775
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")],
16776
+ [(0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("f")), (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c"))]
16743
16777
  ),
16744
- (0, import_datalog.rule)(
16778
+ (0, import_datalog2.rule)(
16745
16779
  "callsFunction",
16746
- [(0, import_datalog.variable)("r"), (0, import_datalog.variable)("f")],
16780
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")],
16747
16781
  [
16748
- (0, import_datalog.lit)("moduleExport", (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("f")),
16749
- (0, import_datalog.lit)("imports", (0, import_datalog.variable)("c"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n")),
16750
- (0, import_datalog.lit)("call", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("c"))
16782
+ (0, import_datalog2.lit)("moduleExport", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("f")),
16783
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")),
16784
+ (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c"))
16751
16785
  ]
16752
16786
  ),
16753
16787
  // The same, for a language whose adapter writes the import down as a
16754
16788
  // declaration and the call's callee as the name referring to it.
16755
- (0, import_datalog.rule)(
16789
+ (0, import_datalog2.rule)(
16756
16790
  "callsFunction",
16757
- [(0, import_datalog.variable)("r"), (0, import_datalog.variable)("f")],
16791
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")],
16758
16792
  [
16759
- (0, import_datalog.lit)("moduleExport", (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("f")),
16760
- (0, import_datalog.lit)("imports", (0, import_datalog.variable)("d"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n")),
16761
- (0, import_datalog.lit)("binds", (0, import_datalog.variable)("c"), (0, import_datalog.variable)("d")),
16762
- (0, import_datalog.lit)("call", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("c"))
16793
+ (0, import_datalog2.lit)("moduleExport", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("f")),
16794
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("d"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")),
16795
+ (0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("d")),
16796
+ (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c"))
16763
16797
  ]
16764
16798
  ),
16765
16799
  // What an object contains, its base class included, so a method the base
@@ -16767,47 +16801,47 @@ var RESOLUTION_RULES = [
16767
16801
  // declare gives two, and the caller decides. This is its own relation
16768
16802
  // rather than more `holdsProperty`, which stays something an adapter
16769
16803
  // states and the rules only read.
16770
- (0, import_datalog.rule)(
16804
+ (0, import_datalog2.rule)(
16771
16805
  "contains",
16772
- [(0, import_datalog.variable)("o"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("held")],
16773
- [(0, import_datalog.lit)("holdsProperty", (0, import_datalog.variable)("o"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("held"))]
16806
+ [(0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("held")],
16807
+ [(0, import_datalog2.lit)("holdsProperty", (0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("held"))]
16774
16808
  ),
16775
- (0, import_datalog.rule)(
16809
+ (0, import_datalog2.rule)(
16776
16810
  "contains",
16777
- [(0, import_datalog.variable)("cls"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("held")],
16811
+ [(0, import_datalog2.variable)("cls"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("held")],
16778
16812
  [
16779
- (0, import_datalog.lit)("extends", (0, import_datalog.variable)("cls"), (0, import_datalog.variable)("base")),
16780
- (0, import_datalog.lit)("comesTo", (0, import_datalog.variable)("base"), (0, import_datalog.variable)("baseCls")),
16781
- (0, import_datalog.lit)("contains", (0, import_datalog.variable)("baseCls"), (0, import_datalog.variable)("n"), (0, import_datalog.variable)("held"))
16813
+ (0, import_datalog2.lit)("extends", (0, import_datalog2.variable)("cls"), (0, import_datalog2.variable)("base")),
16814
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("base"), (0, import_datalog2.variable)("baseCls")),
16815
+ (0, import_datalog2.lit)("contains", (0, import_datalog2.variable)("baseCls"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("held"))
16782
16816
  ]
16783
16817
  ),
16784
16818
  // Which function a factory returns, and which of its parameters that
16785
16819
  // function calls: together they are what makes it a wrapper.
16786
- (0, import_datalog.rule)(
16820
+ (0, import_datalog2.rule)(
16787
16821
  "returnsFunc",
16788
- [(0, import_datalog.variable)("f"), (0, import_datalog.variable)("g")],
16822
+ [(0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("g")],
16789
16823
  [
16790
- (0, import_datalog.lit)("returnsValue", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("value")),
16791
- (0, import_datalog.lit)("comesTo", (0, import_datalog.variable)("value"), (0, import_datalog.variable)("g")),
16792
- (0, import_datalog.lit)("func", (0, import_datalog.variable)("g"))
16824
+ (0, import_datalog2.lit)("returnsValue", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("value")),
16825
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("value"), (0, import_datalog2.variable)("g")),
16826
+ (0, import_datalog2.lit)("func", (0, import_datalog2.variable)("g"))
16793
16827
  ]
16794
16828
  ),
16795
16829
  // A call made by a nested closure counts as made by the function
16796
16830
  // that declares it; the closure runs as part of that function.
16797
- (0, import_datalog.rule)("bodyCallsDeep", [(0, import_datalog.variable)("f"), (0, import_datalog.variable)("c")], [(0, import_datalog.lit)("bodyCalls", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("c"))]),
16798
- (0, import_datalog.rule)(
16831
+ (0, import_datalog2.rule)("bodyCallsDeep", [(0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("c")], [(0, import_datalog2.lit)("bodyCalls", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("c"))]),
16832
+ (0, import_datalog2.rule)(
16799
16833
  "bodyCallsDeep",
16800
- [(0, import_datalog.variable)("f"), (0, import_datalog.variable)("c")],
16801
- [(0, import_datalog.lit)("containsFn", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("g")), (0, import_datalog.lit)("bodyCallsDeep", (0, import_datalog.variable)("g"), (0, import_datalog.variable)("c"))]
16834
+ [(0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("c")],
16835
+ [(0, import_datalog2.lit)("containsFn", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("g")), (0, import_datalog2.lit)("bodyCallsDeep", (0, import_datalog2.variable)("g"), (0, import_datalog2.variable)("c"))]
16802
16836
  ),
16803
- (0, import_datalog.rule)(
16837
+ (0, import_datalog2.rule)(
16804
16838
  "unwraps",
16805
- [(0, import_datalog.variable)("f"), (0, import_datalog.variable)("k")],
16839
+ [(0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k")],
16806
16840
  [
16807
- (0, import_datalog.lit)("returnsFunc", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("g")),
16808
- (0, import_datalog.lit)("bodyCallsDeep", (0, import_datalog.variable)("g"), (0, import_datalog.variable)("c")),
16809
- (0, import_datalog.lit)("binds", (0, import_datalog.variable)("c"), (0, import_datalog.variable)("p")),
16810
- (0, import_datalog.lit)("paramOf", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("k"), (0, import_datalog.variable)("p"))
16841
+ (0, import_datalog2.lit)("returnsFunc", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("g")),
16842
+ (0, import_datalog2.lit)("bodyCallsDeep", (0, import_datalog2.variable)("g"), (0, import_datalog2.variable)("c")),
16843
+ (0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("p")),
16844
+ (0, import_datalog2.lit)("paramOf", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("p"))
16811
16845
  ]
16812
16846
  ),
16813
16847
  // Argument flow: which parameter a value traces back to. Directly
@@ -16815,48 +16849,48 @@ var RESOLUTION_RULES = [
16815
16849
  // another unwrapping factory. This is what lets
16816
16850
  // `createProtected(h) { return service.withAuth(h); }` unwrap:
16817
16851
  // the returned call passes h through withAuth, which unwraps.
16818
- (0, import_datalog.rule)(
16852
+ (0, import_datalog2.rule)(
16819
16853
  "flowsToParam",
16820
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("p")],
16854
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("p")],
16821
16855
  [
16822
- (0, import_datalog.lit)("binds", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("p")),
16823
- (0, import_datalog.lit)("paramOf", (0, import_datalog.variable)("anyF"), (0, import_datalog.variable)("anyK"), (0, import_datalog.variable)("p"))
16856
+ (0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("p")),
16857
+ (0, import_datalog2.lit)("paramOf", (0, import_datalog2.variable)("anyF"), (0, import_datalog2.variable)("anyK"), (0, import_datalog2.variable)("p"))
16824
16858
  ]
16825
16859
  ),
16826
- (0, import_datalog.rule)(
16860
+ (0, import_datalog2.rule)(
16827
16861
  "flowsToParam",
16828
- [(0, import_datalog.variable)("r"), (0, import_datalog.variable)("p")],
16862
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("p")],
16829
16863
  [
16830
- (0, import_datalog.lit)("call", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("c")),
16831
- (0, import_datalog.lit)("comesTo", (0, import_datalog.variable)("c"), (0, import_datalog.variable)("f")),
16832
- (0, import_datalog.lit)("unwraps", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("k")),
16833
- (0, import_datalog.lit)("callArg", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("k"), (0, import_datalog.variable)("a")),
16834
- (0, import_datalog.lit)("flowsToParam", (0, import_datalog.variable)("a"), (0, import_datalog.variable)("p"))
16864
+ (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c")),
16865
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("f")),
16866
+ (0, import_datalog2.lit)("unwraps", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k")),
16867
+ (0, import_datalog2.lit)("callArg", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("a")),
16868
+ (0, import_datalog2.lit)("flowsToParam", (0, import_datalog2.variable)("a"), (0, import_datalog2.variable)("p"))
16835
16869
  ]
16836
16870
  ),
16837
- (0, import_datalog.rule)(
16871
+ (0, import_datalog2.rule)(
16838
16872
  "unwraps",
16839
- [(0, import_datalog.variable)("f"), (0, import_datalog.variable)("k")],
16873
+ [(0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k")],
16840
16874
  [
16841
- (0, import_datalog.lit)("returnsValue", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("value")),
16842
- (0, import_datalog.lit)("flowsToParam", (0, import_datalog.variable)("value"), (0, import_datalog.variable)("p")),
16843
- (0, import_datalog.lit)("paramOf", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("k"), (0, import_datalog.variable)("p"))
16875
+ (0, import_datalog2.lit)("returnsValue", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("value")),
16876
+ (0, import_datalog2.lit)("flowsToParam", (0, import_datalog2.variable)("value"), (0, import_datalog2.variable)("p")),
16877
+ (0, import_datalog2.lit)("paramOf", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("p"))
16844
16878
  ]
16845
16879
  ),
16846
16880
  // Where a name comes from, when what it refers to lives outside the
16847
16881
  // source being read. A walk ends at something written out in source,
16848
16882
  // so it never reaches a library's own function.
16849
- (0, import_datalog.rule)(
16883
+ (0, import_datalog2.rule)(
16850
16884
  "comesFrom",
16851
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n")],
16852
- [(0, import_datalog.lit)("imports", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"))]
16885
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16886
+ [(0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))]
16853
16887
  ),
16854
- (0, import_datalog.rule)(
16888
+ (0, import_datalog2.rule)(
16855
16889
  "comesFrom",
16856
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n")],
16890
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16857
16891
  [
16858
- (0, import_datalog.lit)("reaches", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("y"), VALUE_STEP),
16859
- (0, import_datalog.lit)("imports", (0, import_datalog.variable)("y"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"))
16892
+ (0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), VALUE_STEP),
16893
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))
16860
16894
  ]
16861
16895
  ),
16862
16896
  // Calling f ends up calling the name n that module m exports. One hop
@@ -16868,80 +16902,80 @@ var RESOLUTION_RULES = [
16868
16902
  // ambiguity: a project decorator that composes two library decorators
16869
16903
  // applies both. A caller asks whether a particular (m, n) is among
16870
16904
  // them.
16871
- (0, import_datalog.rule)(
16905
+ (0, import_datalog2.rule)(
16872
16906
  "callsInto",
16873
- [(0, import_datalog.variable)("f"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n")],
16907
+ [(0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16874
16908
  [
16875
- (0, import_datalog.lit)("bodyCallsDeep", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("c")),
16876
- (0, import_datalog.lit)("comesFrom", (0, import_datalog.variable)("c"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"))
16909
+ (0, import_datalog2.lit)("bodyCallsDeep", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("c")),
16910
+ (0, import_datalog2.lit)("comesFrom", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))
16877
16911
  ]
16878
16912
  ),
16879
- (0, import_datalog.rule)(
16913
+ (0, import_datalog2.rule)(
16880
16914
  "callsInto",
16881
- [(0, import_datalog.variable)("f"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n")],
16915
+ [(0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16882
16916
  [
16883
- (0, import_datalog.lit)("bodyCallsDeep", (0, import_datalog.variable)("f"), (0, import_datalog.variable)("c")),
16884
- (0, import_datalog.lit)("comesTo", (0, import_datalog.variable)("c"), (0, import_datalog.variable)("g")),
16885
- (0, import_datalog.lit)("callsInto", (0, import_datalog.variable)("g"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"))
16917
+ (0, import_datalog2.lit)("bodyCallsDeep", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("c")),
16918
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("g")),
16919
+ (0, import_datalog2.lit)("callsInto", (0, import_datalog2.variable)("g"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))
16886
16920
  ]
16887
16921
  ),
16888
16922
  // The question callers ask: what a value comes to, narrowed to the
16889
16923
  // functions. Objects appear in the middle of chains and never in an
16890
16924
  // answer.
16891
- (0, import_datalog.rule)(
16925
+ (0, import_datalog2.rule)(
16892
16926
  "resolves",
16893
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z")],
16894
- [(0, import_datalog.lit)("comesTo", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("z")), (0, import_datalog.lit)("func", (0, import_datalog.variable)("z"))]
16927
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16928
+ [(0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")), (0, import_datalog2.lit)("func", (0, import_datalog2.variable)("z"))]
16895
16929
  )
16896
16930
  ];
16897
16931
  var RESOLUTION_QUESTIONS = [
16898
- (0, import_datalog.rule)(
16932
+ (0, import_datalog2.rule)(
16899
16933
  "wantedResolves",
16900
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z")],
16901
- [(0, import_datalog.lit)("wanted", (0, import_datalog.variable)("x")), (0, import_datalog.lit)("resolves", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"))]
16934
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16935
+ [(0, import_datalog2.lit)("wanted", (0, import_datalog2.variable)("x")), (0, import_datalog2.lit)("resolves", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"))]
16902
16936
  ),
16903
- (0, import_datalog.rule)(
16937
+ (0, import_datalog2.rule)(
16904
16938
  "wantedComesTo",
16905
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z")],
16906
- [(0, import_datalog.lit)("wanted", (0, import_datalog.variable)("x")), (0, import_datalog.lit)("comesTo", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"))]
16939
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16940
+ [(0, import_datalog2.lit)("wanted", (0, import_datalog2.variable)("x")), (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"))]
16907
16941
  ),
16908
- (0, import_datalog.rule)(
16942
+ (0, import_datalog2.rule)(
16909
16943
  "wantedComesTo",
16910
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z")],
16911
- [(0, import_datalog.lit)("wantedOrigin", (0, import_datalog.variable)("x")), (0, import_datalog.lit)("comesTo", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"))]
16944
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16945
+ [(0, import_datalog2.lit)("wantedOrigin", (0, import_datalog2.variable)("x")), (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"))]
16912
16946
  ),
16913
- (0, import_datalog.rule)(
16947
+ (0, import_datalog2.rule)(
16914
16948
  "wantedIsWrittenAs",
16915
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z")],
16916
- [(0, import_datalog.lit)("wanted", (0, import_datalog.variable)("x")), (0, import_datalog.lit)("isWrittenAs", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"))]
16949
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16950
+ [(0, import_datalog2.lit)("wanted", (0, import_datalog2.variable)("x")), (0, import_datalog2.lit)("isWrittenAs", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"))]
16917
16951
  ),
16918
16952
  // A call is given no `comesTo`, so this is the only way to ask what
16919
16953
  // object one arrives at, and without it a demand-driven run derives
16920
16954
  // `objectOf` nowhere.
16921
- (0, import_datalog.rule)(
16955
+ (0, import_datalog2.rule)(
16922
16956
  "wantedObjectOf",
16923
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("z")],
16924
- [(0, import_datalog.lit)("wanted", (0, import_datalog.variable)("x")), (0, import_datalog.lit)("objectOf", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("z"))]
16957
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16958
+ [(0, import_datalog2.lit)("wanted", (0, import_datalog2.variable)("x")), (0, import_datalog2.lit)("objectOf", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"))]
16925
16959
  ),
16926
16960
  // Keyed by the parameter, since that is what a caller has in hand
16927
16961
  // when it wants the call sites told apart.
16928
- (0, import_datalog.rule)(
16962
+ (0, import_datalog2.rule)(
16929
16963
  "wantedParamAt",
16930
- [(0, import_datalog.variable)("p"), (0, import_datalog.variable)("r"), (0, import_datalog.variable)("z")],
16931
- [(0, import_datalog.lit)("wanted", (0, import_datalog.variable)("p")), (0, import_datalog.lit)("paramAt", (0, import_datalog.variable)("r"), (0, import_datalog.variable)("p"), (0, import_datalog.variable)("z"))]
16964
+ [(0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("z")],
16965
+ [(0, import_datalog2.lit)("wanted", (0, import_datalog2.variable)("p")), (0, import_datalog2.lit)("paramAt", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("z"))]
16932
16966
  ),
16933
- (0, import_datalog.rule)(
16967
+ (0, import_datalog2.rule)(
16934
16968
  "wantedComesFrom",
16935
- [(0, import_datalog.variable)("x"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n")],
16936
- [(0, import_datalog.lit)("wantedOrigin", (0, import_datalog.variable)("x")), (0, import_datalog.lit)("comesFrom", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"))]
16969
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16970
+ [(0, import_datalog2.lit)("wantedOrigin", (0, import_datalog2.variable)("x")), (0, import_datalog2.lit)("comesFrom", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))]
16937
16971
  ),
16938
- (0, import_datalog.rule)(
16972
+ (0, import_datalog2.rule)(
16939
16973
  "wantedCallsInto",
16940
- [(0, import_datalog.variable)("g"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n")],
16974
+ [(0, import_datalog2.variable)("g"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16941
16975
  [
16942
- (0, import_datalog.lit)("wantedOrigin", (0, import_datalog.variable)("x")),
16943
- (0, import_datalog.lit)("comesTo", (0, import_datalog.variable)("x"), (0, import_datalog.variable)("g")),
16944
- (0, import_datalog.lit)("callsInto", (0, import_datalog.variable)("g"), (0, import_datalog.variable)("m"), (0, import_datalog.variable)("n"))
16976
+ (0, import_datalog2.lit)("wantedOrigin", (0, import_datalog2.variable)("x")),
16977
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("g")),
16978
+ (0, import_datalog2.lit)("callsInto", (0, import_datalog2.variable)("g"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))
16945
16979
  ]
16946
16980
  )
16947
16981
  ];
@@ -16950,7 +16984,7 @@ var ANSWER_RELATIONS = [
16950
16984
  ];
16951
16985
 
16952
16986
  // src/facts/resolve.ts
16953
- var RESOLUTION_PROGRAM = (0, import_datalog2.deriveOnDemand)(
16987
+ var RESOLUTION_PROGRAM = (0, import_datalog3.deriveOnDemand)(
16954
16988
  [...RESOLUTION_RULES, ...RESOLUTION_QUESTIONS],
16955
16989
  ANSWER_RELATIONS
16956
16990
  );
@@ -16961,7 +16995,7 @@ function resolveCalls(db, callKeys) {
16961
16995
  for (const callKey of callKeys) {
16962
16996
  db.add("wanted", [callKey]);
16963
16997
  }
16964
- (0, import_datalog2.evaluate)(db, RESOLUTION_PROGRAM.rules);
16998
+ (0, import_datalog3.evaluate)(db, RESOLUTION_PROGRAM.rules);
16965
16999
  }
16966
17000
  function containedValues(db, objectKey) {
16967
17001
  return db.facts("holdsProperty").filter((row) => row[0] === objectKey).map((row) => [String(row[1]), String(row[2])]).sort(([left], [right]) => Number(left) - Number(right)).map(([, value]) => value);
@@ -18536,7 +18570,7 @@ async function parsePython(source) {
18536
18570
  // src/project.ts
18537
18571
  var import_node_fs3 = __toESM(require("fs"), 1);
18538
18572
  var import_node_path3 = __toESM(require("path"), 1);
18539
- var import_datalog3 = require("@suss/datalog");
18573
+ var import_datalog4 = require("@suss/datalog");
18540
18574
  var import_extractor4 = require("@suss/extractor");
18541
18575
 
18542
18576
  // src/routers.ts
@@ -19486,7 +19520,7 @@ function reportUnresolvedProjectModules(options) {
19486
19520
  }
19487
19521
  }
19488
19522
  async function extractPythonProject(options) {
19489
- const db = new import_datalog3.Database();
19523
+ const db = new import_datalog4.Database();
19490
19524
  const summaries = [];
19491
19525
  const gapHandling = options.gapHandling ?? "permissive";
19492
19526
  const displayPathOf = (file2) => options.workspaceRoot !== void 0 ? import_node_path3.default.relative(options.workspaceRoot, file2) : file2;
package/dist/index.js CHANGED
@@ -15703,7 +15703,7 @@ function date4(params) {
15703
15703
  // ../../../node_modules/zod/v4/classic/external.js
15704
15704
  config(en_default());
15705
15705
 
15706
- // ../../ir-core/dist/chunk-HBAMPBAO.js
15706
+ // ../../ir-core/dist/chunk-AQYS5AC6.js
15707
15707
  function gqlIdentityKey(typeName, fieldName) {
15708
15708
  return `gql:${typeName}.${fieldName}`;
15709
15709
  }
@@ -16005,6 +16005,9 @@ function normalizePath(path4) {
16005
16005
  );
16006
16006
  return normalized;
16007
16007
  }
16008
+ function pathShape(path4) {
16009
+ return normalizePath(path4).replace(/\{[^}]*\}/g, "{}");
16010
+ }
16008
16011
  function methodsAgree(a, b) {
16009
16012
  if (a === null || b === null) {
16010
16013
  return false;
@@ -16056,12 +16059,17 @@ var restSemantics = defineBoundarySemantics({
16056
16059
  * settles it inside the bucket. The identity key stays what a reader
16057
16060
  * sees and a suppression targets ("GET /users", "* /users"), and
16058
16061
  * this key groups what a reader still tells apart.
16062
+ *
16063
+ * A parameter's name goes too. A spec written by hand says
16064
+ * `{userId}` where the Express route that serves it says `:id`, and
16065
+ * both match the same requests, so pairing on the name gave two
16066
+ * boundaries that never met and a run with nothing to report.
16059
16067
  */
16060
16068
  pairingKey(semantics) {
16061
16069
  if (semantics.method === null || semantics.path === null) {
16062
16070
  return null;
16063
16071
  }
16064
- return `rest ${normalizePath(semantics.path)}`;
16072
+ return `rest ${pathShape(semantics.path)}`;
16065
16073
  },
16066
16074
  sidesAgree(a, b) {
16067
16075
  return methodsAgree(a.method, b.method);
@@ -16440,6 +16448,7 @@ function statementIn(call) {
16440
16448
  import { deriveOnDemand, evaluate } from "@suss/datalog";
16441
16449
 
16442
16450
  // ../../resolution/dist/index.js
16451
+ import { ruleLabel } from "@suss/datalog";
16443
16452
  import { constant, lit, rule, variable as v } from "@suss/datalog";
16444
16453
  var VALUE_STEP = constant("value");
16445
16454
  var RESULT_STEP = constant("result");
@@ -16447,14 +16456,29 @@ var RESOLUTION_RULES = [
16447
16456
  // Aliasing: const x = y, or an identifier referencing a declaration.
16448
16457
  // A language with a hop of its own, like JavaScript's `.bind`, states
16449
16458
  // it as a step too, or every question but `comesTo` misses it.
16450
- rule("stepsTo", [v("x"), v("y"), VALUE_STEP], [lit("binds", v("x"), v("y"))]),
16459
+ rule(
16460
+ "stepsTo",
16461
+ [v("x"), v("y"), VALUE_STEP],
16462
+ [lit("binds", v("x"), v("y"))],
16463
+ "alias"
16464
+ ),
16451
16465
  // A name written more than once has the value the last write left
16452
16466
  // there. The adapter works out which write that is and stays quiet
16453
16467
  // when control flow decides, so such a name steps nowhere at all.
16454
16468
  rule(
16455
16469
  "stepsTo",
16456
16470
  [v("x"), v("y"), VALUE_STEP],
16457
- [lit("endsHolding", v("x"), v("y"))]
16471
+ [lit("endsHolding", v("x"), v("y"))],
16472
+ "last write"
16473
+ ),
16474
+ // A fallback says the value is one of its branches, so each branch is
16475
+ // a step. A branch that resolves to nothing makes no claim, and two
16476
+ // branches resolving to different things fail the single-answer policy.
16477
+ rule(
16478
+ "stepsTo",
16479
+ [v("x"), v("b"), VALUE_STEP],
16480
+ [lit("fallbackBranch", v("x"), v("b"))],
16481
+ "fallback"
16458
16482
  ),
16459
16483
  // An import steps to what the module exports under that name.
16460
16484
  rule(
@@ -16463,7 +16487,8 @@ var RESOLUTION_RULES = [
16463
16487
  [
16464
16488
  lit("imports", v("x"), v("m"), v("n")),
16465
16489
  lit("moduleExport", v("m"), v("n"), v("value"))
16466
- ]
16490
+ ],
16491
+ "import"
16467
16492
  ),
16468
16493
  // A parameter steps to what a call passes it. A function called from
16469
16494
  // several places leaves its parameter with more than one value, and a
@@ -16471,7 +16496,8 @@ var RESOLUTION_RULES = [
16471
16496
  rule(
16472
16497
  "stepsTo",
16473
16498
  [v("p"), v("a"), VALUE_STEP],
16474
- [lit("passesArgument", v("r"), v("p"), v("a"))]
16499
+ [lit("passesArgument", v("r"), v("p"), v("a"))],
16500
+ "argument"
16475
16501
  ),
16476
16502
  // Reading a property steps to what the object contains under that
16477
16503
  // name, whichever way the object arrived: `routes.list` off a name,
@@ -16483,7 +16509,8 @@ var RESOLUTION_RULES = [
16483
16509
  lit("readsProperty", v("x"), v("o"), v("n")),
16484
16510
  lit("objectOf", v("o"), v("obj")),
16485
16511
  lit("contains", v("obj"), v("n"), v("held"))
16486
- ]
16512
+ ],
16513
+ "property read"
16487
16514
  ),
16488
16515
  // Calling a class makes one of it, so the call steps to the class and
16489
16516
  // a method read off the result is the one the class declares. The
@@ -16495,7 +16522,8 @@ var RESOLUTION_RULES = [
16495
16522
  lit("call", v("r"), v("c")),
16496
16523
  lit("comesTo", v("c"), v("cls")),
16497
16524
  lit("objectValue", v("cls"))
16498
- ]
16525
+ ],
16526
+ "class instance"
16499
16527
  ),
16500
16528
  // Wrapper transparency, derived: calling a factory that returns a
16501
16529
  // function which calls its parameter k steps to argument k.
@@ -16507,7 +16535,8 @@ var RESOLUTION_RULES = [
16507
16535
  lit("comesTo", v("c"), v("f")),
16508
16536
  lit("unwraps", v("f"), v("k")),
16509
16537
  lit("callArg", v("r"), v("k"), v("a"))
16510
- ]
16538
+ ],
16539
+ "factory unwrap"
16511
16540
  ),
16512
16541
  // Wrapper transparency, declared: a pack says this callee wraps
16513
16542
  // argument k. The callee has to come from the library the pack said,
@@ -16521,14 +16550,16 @@ var RESOLUTION_RULES = [
16521
16550
  lit("wrapperModule", v("n"), v("m")),
16522
16551
  lit("calleeOrigin", v("r"), v("m")),
16523
16552
  lit("callArg", v("r"), v("k"), v("a"))
16524
- ]
16553
+ ],
16554
+ "declared wrapper"
16525
16555
  ),
16526
16556
  // The one step that runs a function forwards: a call steps to what
16527
16557
  // the function it invokes returns.
16528
16558
  rule(
16529
16559
  "stepsTo",
16530
16560
  [v("r"), v("ret"), RESULT_STEP],
16531
- [lit("invokes", v("r"), v("f")), lit("returnsValue", v("f"), v("ret"))]
16561
+ [lit("invokes", v("r"), v("f")), lit("returnsValue", v("f"), v("ret"))],
16562
+ "call result"
16532
16563
  ),
16533
16564
  // Where a walk gets to, and whether it ran a call on the way. A value
16534
16565
  // step keeps whatever the rest of the walk was, and a result step
@@ -16643,7 +16674,8 @@ var RESOLUTION_RULES = [
16643
16674
  rule(
16644
16675
  "moduleExport",
16645
16676
  [v("m"), v("n"), v("value")],
16646
- [lit("exportsAs", v("m"), v("n"), v("value"))]
16677
+ [lit("exportsAs", v("m"), v("n"), v("value"))],
16678
+ "export"
16647
16679
  ),
16648
16680
  rule(
16649
16681
  "moduleExport",
@@ -16651,7 +16683,8 @@ var RESOLUTION_RULES = [
16651
16683
  [
16652
16684
  lit("reExports", v("m"), v("n"), v("m2"), v("n2")),
16653
16685
  lit("moduleExport", v("m2"), v("n2"), v("value"))
16654
- ]
16686
+ ],
16687
+ "re-export"
16655
16688
  ),
16656
16689
  rule(
16657
16690
  "moduleExport",
@@ -16659,7 +16692,8 @@ var RESOLUTION_RULES = [
16659
16692
  [
16660
16693
  lit("reExportsAll", v("m"), v("m2")),
16661
16694
  lit("moduleExport", v("m2"), v("n"), v("value"))
16662
- ]
16695
+ ],
16696
+ "re-export all"
16663
16697
  ),
16664
16698
  // The function a call runs, written from the call's side because a
16665
16699
  // caller asking what a call gives back has the call in hand.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@suss/adapter-python",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "type": "module",
5
5
  "description": "Python language adapter for suss — parses source with tree-sitter (WASM), resolves names with a lexical binder, and emits raw extractions for the suss pipeline.",
6
6
  "keywords": [
@@ -47,10 +47,10 @@
47
47
  "typecheck": "tsc --noEmit"
48
48
  },
49
49
  "dependencies": {
50
- "@suss/behavioral-ir": "0.10.0",
51
- "@suss/datalog": "0.10.0",
52
- "@suss/extractor": "0.10.0",
53
- "@suss/sql": "0.10.0",
50
+ "@suss/behavioral-ir": "0.12.0",
51
+ "@suss/datalog": "0.12.0",
52
+ "@suss/extractor": "0.12.0",
53
+ "@suss/sql": "0.12.0",
54
54
  "web-tree-sitter": "^0.26.11"
55
55
  },
56
56
  "devDependencies": {