@suss/adapter-ruby 0.18.0 → 0.20.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.
Files changed (3) hide show
  1. package/dist/index.cjs +809 -60
  2. package/dist/index.js +807 -58
  3. package/package.json +4 -4
package/dist/index.cjs CHANGED
@@ -63,6 +63,9 @@ function rangeOf(node) {
63
63
  end: node.endPosition.row + 1
64
64
  };
65
65
  }
66
+ function spanOf(node) {
67
+ return { start: node.startIndex, end: node.endIndex };
68
+ }
66
69
  function field(node, name) {
67
70
  return node.childForFieldName(name);
68
71
  }
@@ -782,6 +785,9 @@ function invocationEffects(definitionNode) {
782
785
  });
783
786
  }
784
787
 
788
+ // src/storage.ts
789
+ var import_datalog3 = require("@suss/datalog");
790
+
785
791
  // ../../../node_modules/zod/v4/classic/external.js
786
792
  var external_exports = {};
787
793
  __export(external_exports, {
@@ -1462,8 +1468,8 @@ function assertNever(_x) {
1462
1468
  function assert(_) {
1463
1469
  }
1464
1470
  function getEnumValues(entries) {
1465
- const numericValues = Object.values(entries).filter((v) => typeof v === "number");
1466
- const values = Object.entries(entries).filter(([k, _]) => numericValues.indexOf(+k) === -1).map(([_, v]) => v);
1471
+ const numericValues = Object.values(entries).filter((v2) => typeof v2 === "number");
1472
+ const values = Object.entries(entries).filter(([k, _]) => numericValues.indexOf(+k) === -1).map(([_, v2]) => v2);
1467
1473
  return values;
1468
1474
  }
1469
1475
  function joinValues(array2, separator = "|") {
@@ -1517,9 +1523,9 @@ function defineLazy(object2, key, getter) {
1517
1523
  }
1518
1524
  return value;
1519
1525
  },
1520
- set(v) {
1526
+ set(v2) {
1521
1527
  Object.defineProperty(object2, key, {
1522
- value: v
1528
+ value: v2
1523
1529
  // configurable: true,
1524
1530
  });
1525
1531
  },
@@ -3206,10 +3212,10 @@ var $ZodUUID = /* @__PURE__ */ $constructor("$ZodUUID", (inst, def) => {
3206
3212
  v7: 7,
3207
3213
  v8: 8
3208
3214
  };
3209
- const v = versionMap[def.version];
3210
- if (v === void 0)
3215
+ const v2 = versionMap[def.version];
3216
+ if (v2 === void 0)
3211
3217
  throw new Error(`Invalid UUID version: "${def.version}"`);
3212
- def.pattern ?? (def.pattern = uuid(v));
3218
+ def.pattern ?? (def.pattern = uuid(v2));
3213
3219
  } else
3214
3220
  def.pattern ?? (def.pattern = uuid());
3215
3221
  $ZodStringFormat.init(inst, def);
@@ -3814,8 +3820,8 @@ var $ZodObject = /* @__PURE__ */ $constructor("$ZodObject", (inst, def) => {
3814
3820
  const field2 = shape[key]._zod;
3815
3821
  if (field2.values) {
3816
3822
  propValues[key] ?? (propValues[key] = /* @__PURE__ */ new Set());
3817
- for (const v of field2.values)
3818
- propValues[key].add(v);
3823
+ for (const v2 of field2.values)
3824
+ propValues[key].add(v2);
3819
3825
  }
3820
3826
  }
3821
3827
  return propValues;
@@ -4110,10 +4116,10 @@ var $ZodDiscriminatedUnion = /* @__PURE__ */ $constructor("$ZodDiscriminatedUnio
4110
4116
  const pv = option._zod.propValues;
4111
4117
  if (!pv || Object.keys(pv).length === 0)
4112
4118
  throw new Error(`Invalid discriminated union option at index "${def.options.indexOf(option)}"`);
4113
- for (const [k, v] of Object.entries(pv)) {
4119
+ for (const [k, v2] of Object.entries(pv)) {
4114
4120
  if (!propValues[k])
4115
4121
  propValues[k] = /* @__PURE__ */ new Set();
4116
- for (const val of v) {
4122
+ for (const val of v2) {
4117
4123
  propValues[k].add(val);
4118
4124
  }
4119
4125
  }
@@ -4127,11 +4133,11 @@ var $ZodDiscriminatedUnion = /* @__PURE__ */ $constructor("$ZodDiscriminatedUnio
4127
4133
  const values = o._zod.propValues?.[def.discriminator];
4128
4134
  if (!values || values.size === 0)
4129
4135
  throw new Error(`Invalid discriminated union option at index "${def.options.indexOf(o)}"`);
4130
- for (const v of values) {
4131
- if (map2.has(v)) {
4132
- throw new Error(`Duplicate discriminator value "${String(v)}"`);
4136
+ for (const v2 of values) {
4137
+ if (map2.has(v2)) {
4138
+ throw new Error(`Duplicate discriminator value "${String(v2)}"`);
4133
4139
  }
4134
- map2.set(v, o);
4140
+ map2.set(v2, o);
4135
4141
  }
4136
4142
  }
4137
4143
  return map2;
@@ -4770,8 +4776,8 @@ var $ZodPrefault = /* @__PURE__ */ $constructor("$ZodPrefault", (inst, def) => {
4770
4776
  var $ZodNonOptional = /* @__PURE__ */ $constructor("$ZodNonOptional", (inst, def) => {
4771
4777
  $ZodType.init(inst, def);
4772
4778
  defineLazy(inst._zod, "values", () => {
4773
- const v = def.innerType._zod.values;
4774
- return v ? new Set([...v].filter((x) => x !== void 0)) : void 0;
4779
+ const v2 = def.innerType._zod.values;
4780
+ return v2 ? new Set([...v2].filter((x) => x !== void 0)) : void 0;
4775
4781
  });
4776
4782
  inst._zod.parse = (payload, ctx) => {
4777
4783
  const result = def.innerType._zod.run(payload, ctx);
@@ -7168,7 +7174,7 @@ var error17 = () => {
7168
7174
  if (issue2.values.length === 1) {
7169
7175
  return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D4\u05E2\u05E8\u05DA \u05D7\u05D9\u05D9\u05D1 \u05DC\u05D4\u05D9\u05D5\u05EA ${stringifyPrimitive(issue2.values[0])}`;
7170
7176
  }
7171
- const stringified = issue2.values.map((v) => stringifyPrimitive(v));
7177
+ const stringified = issue2.values.map((v2) => stringifyPrimitive(v2));
7172
7178
  if (issue2.values.length === 2) {
7173
7179
  return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D4\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA \u05D4\u05DE\u05EA\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05DF ${stringified[0]} \u05D0\u05D5 ${stringified[1]}`;
7174
7180
  }
@@ -11923,7 +11929,7 @@ function _set(Class2, valueType, params) {
11923
11929
  }
11924
11930
  // @__NO_SIDE_EFFECTS__
11925
11931
  function _enum(Class2, values, params) {
11926
- const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;
11932
+ const entries = Array.isArray(values) ? Object.fromEntries(values.map((v2) => [v2, v2])) : values;
11927
11933
  return new Class2({
11928
11934
  type: "enum",
11929
11935
  entries,
@@ -12128,8 +12134,8 @@ function _stringbool(Classes, _params) {
12128
12134
  let truthyArray = params.truthy ?? ["true", "1", "yes", "on", "y", "enabled"];
12129
12135
  let falsyArray = params.falsy ?? ["false", "0", "no", "off", "n", "disabled"];
12130
12136
  if (params.case !== "sensitive") {
12131
- truthyArray = truthyArray.map((v) => typeof v === "string" ? v.toLowerCase() : v);
12132
- falsyArray = falsyArray.map((v) => typeof v === "string" ? v.toLowerCase() : v);
12137
+ truthyArray = truthyArray.map((v2) => typeof v2 === "string" ? v2.toLowerCase() : v2);
12138
+ falsyArray = falsyArray.map((v2) => typeof v2 === "string" ? v2.toLowerCase() : v2);
12133
12139
  }
12134
12140
  const truthySet = new Set(truthyArray);
12135
12141
  const falsySet = new Set(falsyArray);
@@ -12671,9 +12677,9 @@ var dateProcessor = (_schema, ctx, _json, _params) => {
12671
12677
  var enumProcessor = (schema, _ctx, json2, _params) => {
12672
12678
  const def = schema._zod.def;
12673
12679
  const values = getEnumValues(def.entries);
12674
- if (values.every((v) => typeof v === "number"))
12680
+ if (values.every((v2) => typeof v2 === "number"))
12675
12681
  json2.type = "number";
12676
- if (values.every((v) => typeof v === "string"))
12682
+ if (values.every((v2) => typeof v2 === "string"))
12677
12683
  json2.type = "string";
12678
12684
  json2.enum = values;
12679
12685
  };
@@ -12706,13 +12712,13 @@ var literalProcessor = (schema, ctx, json2, _params) => {
12706
12712
  json2.const = val;
12707
12713
  }
12708
12714
  } else {
12709
- if (vals.every((v) => typeof v === "number"))
12715
+ if (vals.every((v2) => typeof v2 === "number"))
12710
12716
  json2.type = "number";
12711
- if (vals.every((v) => typeof v === "string"))
12717
+ if (vals.every((v2) => typeof v2 === "string"))
12712
12718
  json2.type = "string";
12713
- if (vals.every((v) => typeof v === "boolean"))
12719
+ if (vals.every((v2) => typeof v2 === "boolean"))
12714
12720
  json2.type = "boolean";
12715
- if (vals.every((v) => v === null))
12721
+ if (vals.every((v2) => v2 === null))
12716
12722
  json2.type = "null";
12717
12723
  json2.enum = vals;
12718
12724
  }
@@ -12810,11 +12816,11 @@ var objectProcessor = (schema, ctx, _json, params) => {
12810
12816
  }
12811
12817
  const allKeys = new Set(Object.keys(shape));
12812
12818
  const requiredKeys = new Set([...allKeys].filter((key) => {
12813
- const v = def.shape[key]._zod;
12819
+ const v2 = def.shape[key]._zod;
12814
12820
  if (ctx.io === "input") {
12815
- return v.optin === void 0;
12821
+ return v2.optin === void 0;
12816
12822
  } else {
12817
- return v.optout === void 0;
12823
+ return v2.optout === void 0;
12818
12824
  }
12819
12825
  }));
12820
12826
  if (requiredKeys.size > 0) {
@@ -12934,7 +12940,7 @@ var recordProcessor = (schema, ctx, _json, params) => {
12934
12940
  }
12935
12941
  const keyValues = keyType._zod.values;
12936
12942
  if (keyValues) {
12937
- const validKeyValues = [...keyValues].filter((v) => typeof v === "string" || typeof v === "number");
12943
+ const validKeyValues = [...keyValues].filter((v2) => typeof v2 === "string" || typeof v2 === "number");
12938
12944
  if (validKeyValues.length > 0) {
12939
12945
  json2.required = validKeyValues;
12940
12946
  }
@@ -13499,12 +13505,12 @@ function _installLazyMethods(inst, group, methods) {
13499
13505
  });
13500
13506
  return bound;
13501
13507
  },
13502
- set(v) {
13508
+ set(v2) {
13503
13509
  Object.defineProperty(this, key, {
13504
13510
  configurable: true,
13505
13511
  writable: true,
13506
13512
  enumerable: true,
13507
- value: v
13513
+ value: v2
13508
13514
  });
13509
13515
  }
13510
13516
  });
@@ -14392,7 +14398,7 @@ var ZodEnum = /* @__PURE__ */ $constructor("ZodEnum", (inst, def) => {
14392
14398
  };
14393
14399
  });
14394
14400
  function _enum2(values, params) {
14395
- const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;
14401
+ const entries = Array.isArray(values) ? Object.fromEntries(values.map((v2) => [v2, v2])) : values;
14396
14402
  return new ZodEnum({
14397
14403
  type: "enum",
14398
14404
  entries,
@@ -14946,10 +14952,10 @@ function convertBaseSchema(schema, ctx) {
14946
14952
  if (enumValues.length === 1) {
14947
14953
  return z.literal(enumValues[0]);
14948
14954
  }
14949
- if (enumValues.every((v) => typeof v === "string")) {
14955
+ if (enumValues.every((v2) => typeof v2 === "string")) {
14950
14956
  return z.enum(enumValues);
14951
14957
  }
14952
- const literalSchemas = enumValues.map((v) => z.literal(v));
14958
+ const literalSchemas = enumValues.map((v2) => z.literal(v2));
14953
14959
  if (literalSchemas.length < 2) {
14954
14960
  return literalSchemas[0];
14955
14961
  }
@@ -15296,7 +15302,7 @@ function date4(params) {
15296
15302
  // ../../../node_modules/zod/v4/classic/external.js
15297
15303
  config(en_default());
15298
15304
 
15299
- // ../../ir-core/dist/chunk-HSJYPBJU.js
15305
+ // ../../ir-core/dist/chunk-52CH76PE.js
15300
15306
  function gqlIdentityKey(typeName, fieldName) {
15301
15307
  return `gql:${typeName}.${fieldName}`;
15302
15308
  }
@@ -15360,14 +15366,24 @@ var functionCallSemantics = defineBoundarySemantics({
15360
15366
  */
15361
15367
  canPair: () => true,
15362
15368
  /**
15363
- * `"fn:<package>::<exportPath>"` when both are set. Other in-process
15364
- * function-call units, such as components and bare handlers inside
15365
- * one repo, have no key at all.
15369
+ * `"fn:<package>::<exportPath>"` when both are set, and
15370
+ * `"fn:<module>::<exportName>"` for an in-repo unit that states its
15371
+ * module, the way a server action does. Components and bare
15372
+ * handlers state neither and have no key at all.
15366
15373
  */
15374
+ rewritePaths(semantics, rewrite) {
15375
+ if (semantics.module === void 0) {
15376
+ return semantics;
15377
+ }
15378
+ return { ...semantics, module: rewrite(semantics.module) };
15379
+ },
15367
15380
  identityKey(semantics) {
15368
15381
  if (semantics.package !== void 0 && semantics.exportPath !== void 0 && semantics.exportPath.length > 0) {
15369
15382
  return fnIdentityKey(semantics.package, semantics.exportPath);
15370
15383
  }
15384
+ if (semantics.module !== void 0 && semantics.exportName !== void 0) {
15385
+ return fnIdentityKey(semantics.module, [semantics.exportName]);
15386
+ }
15371
15387
  return null;
15372
15388
  }
15373
15389
  }
@@ -15878,7 +15894,16 @@ var ConfidenceInfoSchema = external_exports.object({
15878
15894
  });
15879
15895
  var SourceLocationSchema = external_exports.object({
15880
15896
  file: external_exports.string(),
15897
+ /** Line numbers, for a person reading the summary or an editor link. */
15881
15898
  range: external_exports.object({ start: external_exports.number(), end: external_exports.number() }),
15899
+ /**
15900
+ * Character offsets of the unit in its file. Identity and joins
15901
+ * measure with these, since two functions can share a line and never
15902
+ * an offset range; the line `range` above is the presentation of the
15903
+ * same place. Absent on summaries no source position backs, a
15904
+ * contract artifact's say.
15905
+ */
15906
+ span: external_exports.object({ start: external_exports.number(), end: external_exports.number() }).optional(),
15882
15907
  exportName: external_exports.string().nullable(),
15883
15908
  /**
15884
15909
  * The project the extract was pointed at, by the name that project
@@ -16003,6 +16028,733 @@ function storageBinding(opts) {
16003
16028
  };
16004
16029
  }
16005
16030
 
16031
+ // ../../resolution/dist/index.js
16032
+ var import_datalog = require("@suss/datalog");
16033
+ var import_datalog2 = require("@suss/datalog");
16034
+ var VALUE_STEP = (0, import_datalog2.constant)("value");
16035
+ var NAMESPACE_IMPORT_NAME = "*";
16036
+ var NAMESPACE_IMPORT = (0, import_datalog2.constant)(NAMESPACE_IMPORT_NAME);
16037
+ var RESULT_STEP = (0, import_datalog2.constant)("result");
16038
+ var RESOLUTION_RULES = [
16039
+ // Aliasing: const x = y, or an identifier referencing a declaration.
16040
+ // A language with a hop of its own, like JavaScript's `.bind`, states
16041
+ // it as a step too, or every question but `comesTo` misses it.
16042
+ (0, import_datalog2.rule)(
16043
+ "stepsTo",
16044
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), VALUE_STEP],
16045
+ [(0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"))],
16046
+ "alias"
16047
+ ),
16048
+ // A name written more than once has the value the last write left
16049
+ // there. The adapter works out which write that is and stays quiet
16050
+ // when control flow decides, so such a name steps nowhere at all.
16051
+ (0, import_datalog2.rule)(
16052
+ "stepsTo",
16053
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), VALUE_STEP],
16054
+ [(0, import_datalog2.lit)("endsHolding", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"))],
16055
+ "last write"
16056
+ ),
16057
+ // A fallback says the value is one of its branches, so each branch is
16058
+ // a step. A branch that resolves to nothing makes no claim, and two
16059
+ // branches resolving to different things fail the single-answer policy.
16060
+ (0, import_datalog2.rule)(
16061
+ "stepsTo",
16062
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("b"), VALUE_STEP],
16063
+ [(0, import_datalog2.lit)("fallbackBranch", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("b"))],
16064
+ "fallback"
16065
+ ),
16066
+ // An import steps to what the module exports under that name.
16067
+ (0, import_datalog2.rule)(
16068
+ "stepsTo",
16069
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("value"), VALUE_STEP],
16070
+ [
16071
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")),
16072
+ (0, import_datalog2.lit)("moduleExport", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value"))
16073
+ ],
16074
+ "import"
16075
+ ),
16076
+ // A parameter steps to what a call passes it. A function called from
16077
+ // several places leaves its parameter with more than one value, and a
16078
+ // caller that needs those apart asks `paramAt`.
16079
+ (0, import_datalog2.rule)(
16080
+ "stepsTo",
16081
+ [(0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("a"), VALUE_STEP],
16082
+ [(0, import_datalog2.lit)("passesArgument", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("a"))],
16083
+ "argument"
16084
+ ),
16085
+ // Reading a property steps to what the object contains under that
16086
+ // name, whichever way the object arrived: `routes.list` off a name,
16087
+ // or `make(body).handle` off a call.
16088
+ (0, import_datalog2.rule)(
16089
+ "stepsTo",
16090
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("held"), VALUE_STEP],
16091
+ [
16092
+ (0, import_datalog2.lit)("readsProperty", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("n")),
16093
+ (0, import_datalog2.lit)("objectOf", (0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("obj")),
16094
+ (0, import_datalog2.lit)("contains", (0, import_datalog2.variable)("obj"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("held"))
16095
+ ],
16096
+ "property read"
16097
+ ),
16098
+ // Calling a class makes one of it, so the call steps to the class and
16099
+ // a method read off the result is the one the class declares. The
16100
+ // caveat below is about a factory function, and a class is not one.
16101
+ (0, import_datalog2.rule)(
16102
+ "stepsTo",
16103
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("cls"), VALUE_STEP],
16104
+ [
16105
+ (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c")),
16106
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("cls")),
16107
+ (0, import_datalog2.lit)("objectValue", (0, import_datalog2.variable)("cls"))
16108
+ ],
16109
+ "class instance"
16110
+ ),
16111
+ // Wrapper transparency, derived: calling a factory that returns a
16112
+ // function which calls its parameter k steps to argument k.
16113
+ (0, import_datalog2.rule)(
16114
+ "stepsTo",
16115
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("a"), VALUE_STEP],
16116
+ [
16117
+ (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c")),
16118
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("f")),
16119
+ (0, import_datalog2.lit)("unwraps", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k")),
16120
+ (0, import_datalog2.lit)("callArg", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("a"))
16121
+ ],
16122
+ "factory unwrap"
16123
+ ),
16124
+ // Wrapper transparency, declared: a pack says this callee wraps
16125
+ // argument k. The callee has to come from the library the pack said,
16126
+ // so a local object spelled the same way is not mistaken for it.
16127
+ (0, import_datalog2.rule)(
16128
+ "stepsTo",
16129
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("a"), VALUE_STEP],
16130
+ [
16131
+ (0, import_datalog2.lit)("calleeName", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("n")),
16132
+ (0, import_datalog2.lit)("unwrapsByName", (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("k")),
16133
+ (0, import_datalog2.lit)("wrapperModule", (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("m")),
16134
+ (0, import_datalog2.lit)("calleeOrigin", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("m")),
16135
+ (0, import_datalog2.lit)("callArg", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("a"))
16136
+ ],
16137
+ "declared wrapper"
16138
+ ),
16139
+ // The one step that runs a function forwards: a call steps to what
16140
+ // the function it invokes returns.
16141
+ (0, import_datalog2.rule)(
16142
+ "stepsTo",
16143
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("ret"), RESULT_STEP],
16144
+ [(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"))],
16145
+ "call result"
16146
+ ),
16147
+ // Where a walk gets to, and whether it ran a call on the way. A value
16148
+ // step keeps whatever the rest of the walk was, and a result step
16149
+ // makes the whole walk one that ran a call.
16150
+ (0, import_datalog2.rule)(
16151
+ "reaches",
16152
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), (0, import_datalog2.variable)("kind")],
16153
+ [(0, import_datalog2.lit)("stepsTo", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), (0, import_datalog2.variable)("kind"))]
16154
+ ),
16155
+ (0, import_datalog2.rule)(
16156
+ "reaches",
16157
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), (0, import_datalog2.variable)("kind")],
16158
+ [
16159
+ (0, import_datalog2.lit)("stepsTo", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), VALUE_STEP),
16160
+ (0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"), (0, import_datalog2.variable)("kind"))
16161
+ ]
16162
+ ),
16163
+ // Two rules rather than one leaving the rest of the walk's kind free.
16164
+ // A free kind is a second question about the same relation, and a
16165
+ // demand-driven run then derives both to answer either.
16166
+ (0, import_datalog2.rule)(
16167
+ "reaches",
16168
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), RESULT_STEP],
16169
+ [
16170
+ (0, import_datalog2.lit)("stepsTo", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), RESULT_STEP),
16171
+ (0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"), VALUE_STEP)
16172
+ ]
16173
+ ),
16174
+ (0, import_datalog2.rule)(
16175
+ "reaches",
16176
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), RESULT_STEP],
16177
+ [
16178
+ (0, import_datalog2.lit)("stepsTo", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), RESULT_STEP),
16179
+ (0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"), RESULT_STEP)
16180
+ ]
16181
+ ),
16182
+ // What a value comes down to: the walk that never ran a call, stopped
16183
+ // at a function or an object. Something already written out comes to
16184
+ // itself, and every other walk ends at one of those.
16185
+ (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"))]),
16186
+ (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"))]),
16187
+ (0, import_datalog2.rule)(
16188
+ "comesTo",
16189
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16190
+ [(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"))]
16191
+ ),
16192
+ (0, import_datalog2.rule)(
16193
+ "comesTo",
16194
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16195
+ [(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"))]
16196
+ ),
16197
+ // The same stopping condition, for the walk that ran a call. A call
16198
+ // gets no `comesTo` answer on purpose: coming back with what a
16199
+ // factory returned would fight the unwrapping answer.
16200
+ (0, import_datalog2.rule)(
16201
+ "givesBack",
16202
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16203
+ [(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"))]
16204
+ ),
16205
+ (0, import_datalog2.rule)(
16206
+ "givesBack",
16207
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16208
+ [(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"))]
16209
+ ),
16210
+ // Following a value to the expression it is written as, whatever kind
16211
+ // that is. A GraphQL document is neither a function nor an object, so
16212
+ // `comesTo` never reaches one.
16213
+ (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"))]),
16214
+ (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"))]),
16215
+ (0, import_datalog2.rule)(
16216
+ "isWrittenAs",
16217
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16218
+ [(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"))]
16219
+ ),
16220
+ (0, import_datalog2.rule)(
16221
+ "isWrittenAs",
16222
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16223
+ [(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"))]
16224
+ ),
16225
+ // What one call site put in a parameter, told apart from what the
16226
+ // other callers passed.
16227
+ (0, import_datalog2.rule)(
16228
+ "paramAt",
16229
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("z")],
16230
+ [
16231
+ (0, import_datalog2.lit)("passesArgument", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("a")),
16232
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("a"), (0, import_datalog2.variable)("z"))
16233
+ ]
16234
+ ),
16235
+ // An argument arriving at the parameter it is passed to, by position
16236
+ // or by the name the caller wrote, keeping the call it went through
16237
+ // so `paramAt` can tell two call sites apart.
16238
+ (0, import_datalog2.rule)(
16239
+ "passesArgument",
16240
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("a")],
16241
+ [
16242
+ (0, import_datalog2.lit)("paramOf", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("p")),
16243
+ (0, import_datalog2.lit)("callsFunction", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")),
16244
+ (0, import_datalog2.lit)("callArg", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("a"))
16245
+ ]
16246
+ ),
16247
+ (0, import_datalog2.rule)(
16248
+ "passesArgument",
16249
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("a")],
16250
+ [
16251
+ (0, import_datalog2.lit)("paramNamed", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("p")),
16252
+ (0, import_datalog2.lit)("callsFunction", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")),
16253
+ (0, import_datalog2.lit)("callKeywordArg", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("a"))
16254
+ ]
16255
+ ),
16256
+ // Which module's export a re-exported name forwards to, however
16257
+ // many barrels deep the forwarding runs.
16258
+ (0, import_datalog2.rule)(
16259
+ "moduleForwards",
16260
+ [(0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("m2"), (0, import_datalog2.variable)("n2")],
16261
+ [(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"))]
16262
+ ),
16263
+ (0, import_datalog2.rule)(
16264
+ "moduleForwards",
16265
+ [(0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("m3"), (0, import_datalog2.variable)("n3")],
16266
+ [
16267
+ (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")),
16268
+ (0, import_datalog2.lit)("moduleForwards", (0, import_datalog2.variable)("m2"), (0, import_datalog2.variable)("n2"), (0, import_datalog2.variable)("m3"), (0, import_datalog2.variable)("n3"))
16269
+ ]
16270
+ ),
16271
+ // What a module exports: directly, or through re-export chains.
16272
+ (0, import_datalog2.rule)(
16273
+ "moduleExport",
16274
+ [(0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value")],
16275
+ [(0, import_datalog2.lit)("exportsAs", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value"))],
16276
+ "export"
16277
+ ),
16278
+ (0, import_datalog2.rule)(
16279
+ "moduleExport",
16280
+ [(0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value")],
16281
+ [
16282
+ (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")),
16283
+ (0, import_datalog2.lit)("moduleExport", (0, import_datalog2.variable)("m2"), (0, import_datalog2.variable)("n2"), (0, import_datalog2.variable)("value"))
16284
+ ],
16285
+ "re-export"
16286
+ ),
16287
+ (0, import_datalog2.rule)(
16288
+ "moduleExport",
16289
+ [(0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value")],
16290
+ [
16291
+ (0, import_datalog2.lit)("reExportsAll", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("m2")),
16292
+ (0, import_datalog2.lit)("moduleExport", (0, import_datalog2.variable)("m2"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value"))
16293
+ ],
16294
+ "re-export all"
16295
+ ),
16296
+ // The function a call runs, written from the call's side because a
16297
+ // caller asking what a call gives back has the call in hand.
16298
+ (0, import_datalog2.rule)(
16299
+ "invokes",
16300
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")],
16301
+ [(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"))]
16302
+ ),
16303
+ // The callee is itself a call: `daoBuilder()()`.
16304
+ (0, import_datalog2.rule)(
16305
+ "invokes",
16306
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")],
16307
+ [(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"))]
16308
+ ),
16309
+ // The object an expression refers to: a name through `comesTo`, a
16310
+ // factory call through what it gives back. Naming the step is what
16311
+ // makes `routes.list` and `make(body).handle` one rule.
16312
+ (0, import_datalog2.rule)(
16313
+ "objectOf",
16314
+ [(0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("obj")],
16315
+ [(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"))]
16316
+ ),
16317
+ (0, import_datalog2.rule)(
16318
+ "objectOf",
16319
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("obj")],
16320
+ [(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"))]
16321
+ ),
16322
+ // Which calls a function, found by the name the call is written as
16323
+ // rather than by resolving every callee in the project. A caller knows
16324
+ // the function and wants its call sites, so both of these start from
16325
+ // the function. Starting from `call` instead asks what every call in
16326
+ // the project imports, which was 72% of everything derived.
16327
+ (0, import_datalog2.rule)(
16328
+ "callsFunction",
16329
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")],
16330
+ [(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"))]
16331
+ ),
16332
+ (0, import_datalog2.rule)(
16333
+ "callsFunction",
16334
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")],
16335
+ [
16336
+ (0, import_datalog2.lit)("moduleExport", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("f")),
16337
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")),
16338
+ (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c"))
16339
+ ]
16340
+ ),
16341
+ // The same, for a language whose adapter writes the import down as a
16342
+ // declaration and the call's callee as the name referring to it.
16343
+ (0, import_datalog2.rule)(
16344
+ "callsFunction",
16345
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("f")],
16346
+ [
16347
+ (0, import_datalog2.lit)("moduleExport", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("f")),
16348
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("d"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")),
16349
+ (0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("d")),
16350
+ (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c"))
16351
+ ]
16352
+ ),
16353
+ // What an object contains, its base class included, so a method the base
16354
+ // declares is found on a subclass that never overrode it. A method both
16355
+ // declare gives two, and the caller decides. This is its own relation
16356
+ // rather than more `holdsProperty`, which stays something an adapter
16357
+ // states and the rules only read.
16358
+ (0, import_datalog2.rule)(
16359
+ "contains",
16360
+ [(0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("held")],
16361
+ [(0, import_datalog2.lit)("holdsProperty", (0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("held"))]
16362
+ ),
16363
+ (0, import_datalog2.rule)(
16364
+ "contains",
16365
+ [(0, import_datalog2.variable)("cls"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("held")],
16366
+ [
16367
+ (0, import_datalog2.lit)("extends", (0, import_datalog2.variable)("cls"), (0, import_datalog2.variable)("base")),
16368
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("base"), (0, import_datalog2.variable)("baseCls")),
16369
+ (0, import_datalog2.lit)("contains", (0, import_datalog2.variable)("baseCls"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("held"))
16370
+ ]
16371
+ ),
16372
+ // Which function a factory returns, and which of its parameters that
16373
+ // function calls: together they are what makes it a wrapper.
16374
+ (0, import_datalog2.rule)(
16375
+ "returnsFunc",
16376
+ [(0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("g")],
16377
+ [
16378
+ (0, import_datalog2.lit)("returnsValue", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("value")),
16379
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("value"), (0, import_datalog2.variable)("g")),
16380
+ (0, import_datalog2.lit)("func", (0, import_datalog2.variable)("g"))
16381
+ ]
16382
+ ),
16383
+ // A call made by a nested closure counts as made by the function
16384
+ // that declares it; the closure runs as part of that function.
16385
+ (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"))]),
16386
+ (0, import_datalog2.rule)(
16387
+ "bodyCallsDeep",
16388
+ [(0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("c")],
16389
+ [(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"))]
16390
+ ),
16391
+ (0, import_datalog2.rule)(
16392
+ "unwraps",
16393
+ [(0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k")],
16394
+ [
16395
+ (0, import_datalog2.lit)("returnsFunc", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("g")),
16396
+ (0, import_datalog2.lit)("bodyCallsDeep", (0, import_datalog2.variable)("g"), (0, import_datalog2.variable)("c")),
16397
+ (0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("p")),
16398
+ (0, import_datalog2.lit)("paramOf", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("p"))
16399
+ ]
16400
+ ),
16401
+ // Argument flow: which parameter a value traces back to. Directly
16402
+ // (an identifier bound to the parameter), or through a call to
16403
+ // another unwrapping factory. This is what lets
16404
+ // `createProtected(h) { return service.withAuth(h); }` unwrap:
16405
+ // the returned call passes h through withAuth, which unwraps.
16406
+ (0, import_datalog2.rule)(
16407
+ "flowsToParam",
16408
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("p")],
16409
+ [
16410
+ (0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("p")),
16411
+ (0, import_datalog2.lit)("paramOf", (0, import_datalog2.variable)("anyF"), (0, import_datalog2.variable)("anyK"), (0, import_datalog2.variable)("p"))
16412
+ ]
16413
+ ),
16414
+ (0, import_datalog2.rule)(
16415
+ "flowsToParam",
16416
+ [(0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("p")],
16417
+ [
16418
+ (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c")),
16419
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("f")),
16420
+ (0, import_datalog2.lit)("unwraps", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k")),
16421
+ (0, import_datalog2.lit)("callArg", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("a")),
16422
+ (0, import_datalog2.lit)("flowsToParam", (0, import_datalog2.variable)("a"), (0, import_datalog2.variable)("p"))
16423
+ ]
16424
+ ),
16425
+ (0, import_datalog2.rule)(
16426
+ "unwraps",
16427
+ [(0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k")],
16428
+ [
16429
+ (0, import_datalog2.lit)("returnsValue", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("value")),
16430
+ (0, import_datalog2.lit)("flowsToParam", (0, import_datalog2.variable)("value"), (0, import_datalog2.variable)("p")),
16431
+ (0, import_datalog2.lit)("paramOf", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("k"), (0, import_datalog2.variable)("p"))
16432
+ ]
16433
+ ),
16434
+ // Where a name comes from, when what it refers to lives outside the
16435
+ // source being read. A walk ends at something written out in source,
16436
+ // so it never reaches a library's own function.
16437
+ (0, import_datalog2.rule)(
16438
+ "comesFrom",
16439
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16440
+ [(0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))]
16441
+ ),
16442
+ (0, import_datalog2.rule)(
16443
+ "comesFrom",
16444
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16445
+ [
16446
+ (0, import_datalog2.lit)("reaches", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), VALUE_STEP),
16447
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))
16448
+ ]
16449
+ ),
16450
+ // Calling f ends up calling the name n that module m exports, one
16451
+ // hop through f's own body or deeper through a wrapper of a wrapper.
16452
+ // Several results is normal: a composed decorator applies them all.
16453
+ (0, import_datalog2.rule)(
16454
+ "callsInto",
16455
+ [(0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16456
+ [
16457
+ (0, import_datalog2.lit)("bodyCallsDeep", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("c")),
16458
+ (0, import_datalog2.lit)("comesFrom", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))
16459
+ ]
16460
+ ),
16461
+ (0, import_datalog2.rule)(
16462
+ "callsInto",
16463
+ [(0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16464
+ [
16465
+ (0, import_datalog2.lit)("bodyCallsDeep", (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("c")),
16466
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("g")),
16467
+ (0, import_datalog2.lit)("callsInto", (0, import_datalog2.variable)("g"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))
16468
+ ]
16469
+ ),
16470
+ // The question callers ask: what a value comes to, narrowed to the
16471
+ // functions. Objects appear in the middle of chains and never in an
16472
+ // answer.
16473
+ (0, import_datalog2.rule)(
16474
+ "resolves",
16475
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16476
+ [(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"))]
16477
+ )
16478
+ ];
16479
+ var RESOLUTION_QUESTIONS = [
16480
+ (0, import_datalog2.rule)(
16481
+ "wantedResolves",
16482
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16483
+ [(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"))]
16484
+ ),
16485
+ (0, import_datalog2.rule)(
16486
+ "wantedComesTo",
16487
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16488
+ [(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"))]
16489
+ ),
16490
+ (0, import_datalog2.rule)(
16491
+ "wantedComesTo",
16492
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16493
+ [(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"))]
16494
+ ),
16495
+ (0, import_datalog2.rule)(
16496
+ "wantedIsWrittenAs",
16497
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16498
+ [(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"))]
16499
+ ),
16500
+ // A call is given no `comesTo`, so this is the only way to ask what
16501
+ // object one arrives at, and without it a demand-driven run derives
16502
+ // `objectOf` nowhere.
16503
+ (0, import_datalog2.rule)(
16504
+ "wantedObjectOf",
16505
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16506
+ [(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"))]
16507
+ ),
16508
+ // Keyed by the parameter, since that is what a caller has in hand
16509
+ // when it wants the call sites told apart.
16510
+ (0, import_datalog2.rule)(
16511
+ "wantedParamAt",
16512
+ [(0, import_datalog2.variable)("p"), (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("z")],
16513
+ [(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"))]
16514
+ ),
16515
+ (0, import_datalog2.rule)(
16516
+ "wantedComesFrom",
16517
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16518
+ [(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"))]
16519
+ ),
16520
+ // Call-origin questions, for attribution, in their own demand
16521
+ // class. Attribution stops at the import declaration, so nothing
16522
+ // here demands reaches or callsInto. The chains are closures with
16523
+ // no depth bound: an alias run of any length resolves.
16524
+ (0, import_datalog2.rule)("callOriginChain", [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("x")], [(0, import_datalog2.lit)("wantedCallOrigin", (0, import_datalog2.variable)("x"))]),
16525
+ (0, import_datalog2.rule)(
16526
+ "callOriginChain",
16527
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16528
+ [(0, import_datalog2.lit)("callOriginChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")), (0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"))]
16529
+ ),
16530
+ (0, import_datalog2.rule)(
16531
+ "callOriginChain",
16532
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16533
+ [
16534
+ (0, import_datalog2.lit)("callOriginChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")),
16535
+ (0, import_datalog2.lit)("endsHolding", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"))
16536
+ ]
16537
+ ),
16538
+ (0, import_datalog2.rule)(
16539
+ "callOriginChain",
16540
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16541
+ [
16542
+ (0, import_datalog2.lit)("callOriginChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")),
16543
+ (0, import_datalog2.lit)("fallbackBranch", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"))
16544
+ ]
16545
+ ),
16546
+ // The chain with at least one hop taken, which is what tells a
16547
+ // destructured binding apart from asking about a node directly.
16548
+ (0, import_datalog2.rule)(
16549
+ "callOriginChainStepped",
16550
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16551
+ [(0, import_datalog2.lit)("callOriginChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")), (0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"))]
16552
+ ),
16553
+ (0, import_datalog2.rule)(
16554
+ "callOriginChainStepped",
16555
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16556
+ [
16557
+ (0, import_datalog2.lit)("callOriginChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")),
16558
+ (0, import_datalog2.lit)("endsHolding", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"))
16559
+ ]
16560
+ ),
16561
+ (0, import_datalog2.rule)(
16562
+ "callOriginChainStepped",
16563
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16564
+ [
16565
+ (0, import_datalog2.lit)("callOriginChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")),
16566
+ (0, import_datalog2.lit)("fallbackBranch", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"))
16567
+ ]
16568
+ ),
16569
+ (0, import_datalog2.rule)(
16570
+ "wantedCallOriginPair",
16571
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16572
+ [
16573
+ (0, import_datalog2.lit)("callOriginChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")),
16574
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))
16575
+ ]
16576
+ ),
16577
+ // An import of a project barrel is an import of what the barrel
16578
+ // forwards, so the pair surfaces the module behind the chain.
16579
+ (0, import_datalog2.rule)(
16580
+ "wantedCallOriginPair",
16581
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m2"), (0, import_datalog2.variable)("n2")],
16582
+ [
16583
+ (0, import_datalog2.lit)("callOriginChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")),
16584
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")),
16585
+ (0, import_datalog2.lit)("moduleForwards", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("m2"), (0, import_datalog2.variable)("n2"))
16586
+ ]
16587
+ ),
16588
+ // A namespace member: the module's export of the member's own name.
16589
+ // The imports literal leads, since it is the smallest relation.
16590
+ (0, import_datalog2.rule)(
16591
+ "wantedCallOriginPair",
16592
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("p")],
16593
+ [
16594
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("m"), NAMESPACE_IMPORT),
16595
+ (0, import_datalog2.lit)("readsProperty", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("p")),
16596
+ (0, import_datalog2.lit)("callOriginChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"))
16597
+ ]
16598
+ ),
16599
+ (0, import_datalog2.rule)(
16600
+ "wantedCallOriginPair",
16601
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("p")],
16602
+ [
16603
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("d"), (0, import_datalog2.variable)("m"), NAMESPACE_IMPORT),
16604
+ (0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("d")),
16605
+ (0, import_datalog2.lit)("readsProperty", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("p")),
16606
+ (0, import_datalog2.lit)("callOriginChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"))
16607
+ ]
16608
+ ),
16609
+ // What a call made: through the call to its callee, whose own alias
16610
+ // chain leads to the import.
16611
+ (0, import_datalog2.rule)(
16612
+ "callMadeChain",
16613
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("f")],
16614
+ [(0, import_datalog2.lit)("callOriginChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("c")), (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("f"))]
16615
+ ),
16616
+ (0, import_datalog2.rule)(
16617
+ "callMadeChain",
16618
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16619
+ [(0, import_datalog2.lit)("callMadeChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")), (0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"))]
16620
+ ),
16621
+ (0, import_datalog2.rule)(
16622
+ "callMadeChain",
16623
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16624
+ [(0, import_datalog2.lit)("callMadeChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")), (0, import_datalog2.lit)("endsHolding", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"))]
16625
+ ),
16626
+ (0, import_datalog2.rule)(
16627
+ "wantedCallOriginPair",
16628
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16629
+ [
16630
+ (0, import_datalog2.lit)("callMadeChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")),
16631
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))
16632
+ ]
16633
+ ),
16634
+ // A member destructured off what a call made keeps the member name
16635
+ // as one more path segment.
16636
+ (0, import_datalog2.rule)(
16637
+ "callMemberChain",
16638
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("f"), (0, import_datalog2.variable)("p")],
16639
+ [
16640
+ (0, import_datalog2.lit)("callOriginChainStepped", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("e")),
16641
+ (0, import_datalog2.lit)("readsProperty", (0, import_datalog2.variable)("e"), (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("p")),
16642
+ (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("f"))
16643
+ ]
16644
+ ),
16645
+ (0, import_datalog2.rule)(
16646
+ "callMemberChain",
16647
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), (0, import_datalog2.variable)("p")],
16648
+ [
16649
+ (0, import_datalog2.lit)("callMemberChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("p")),
16650
+ (0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"))
16651
+ ]
16652
+ ),
16653
+ (0, import_datalog2.rule)(
16654
+ "callMemberChain",
16655
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z"), (0, import_datalog2.variable)("p")],
16656
+ [
16657
+ (0, import_datalog2.lit)("callMemberChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("p")),
16658
+ (0, import_datalog2.lit)("endsHolding", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"))
16659
+ ]
16660
+ ),
16661
+ (0, import_datalog2.rule)(
16662
+ "wantedCallOriginMember",
16663
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("p")],
16664
+ [
16665
+ (0, import_datalog2.lit)("callMemberChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("p")),
16666
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))
16667
+ ]
16668
+ ),
16669
+ (0, import_datalog2.rule)(
16670
+ "wantedCallsInto",
16671
+ [(0, import_datalog2.variable)("g"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")],
16672
+ [
16673
+ (0, import_datalog2.lit)("wantedOrigin", (0, import_datalog2.variable)("x")),
16674
+ (0, import_datalog2.lit)("comesTo", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("g")),
16675
+ (0, import_datalog2.lit)("callsInto", (0, import_datalog2.variable)("g"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"))
16676
+ ]
16677
+ ),
16678
+ // The export table of one module, keyed by the module asked about.
16679
+ // The moduleExport rules flatten re-export chains of any length, and
16680
+ // the demand cone stays on export facts alone.
16681
+ (0, import_datalog2.rule)(
16682
+ "wantedModuleExport",
16683
+ [(0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value")],
16684
+ [
16685
+ (0, import_datalog2.lit)("wantedExportsOf", (0, import_datalog2.variable)("m")),
16686
+ (0, import_datalog2.lit)("moduleExport", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("value"))
16687
+ ]
16688
+ ),
16689
+ // The calls behind a receiver, for a pack that wants the anchor a
16690
+ // chain hangs off; the README's anchor section says which hops and
16691
+ // why the asking side applies the single-answer policy.
16692
+ // A class's ancestry, one hop per extends through the binding that
16693
+ // says which class the written base is; the names on the way out
16694
+ // are what a storage pack matches its library's bases against.
16695
+ (0, import_datalog2.rule)("ancestryChain", [(0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("c")], [(0, import_datalog2.lit)("wantedAncestry", (0, import_datalog2.variable)("c"))]),
16696
+ (0, import_datalog2.rule)(
16697
+ "ancestryChain",
16698
+ [(0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("b2")],
16699
+ [
16700
+ (0, import_datalog2.lit)("ancestryChain", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("b")),
16701
+ (0, import_datalog2.lit)("extends", (0, import_datalog2.variable)("b"), (0, import_datalog2.variable)("x")),
16702
+ (0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("b2"))
16703
+ ]
16704
+ ),
16705
+ (0, import_datalog2.rule)(
16706
+ "wantedBaseName",
16707
+ [(0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("n")],
16708
+ [(0, import_datalog2.lit)("ancestryChain", (0, import_datalog2.variable)("c"), (0, import_datalog2.variable)("b")), (0, import_datalog2.lit)("extendsNamed", (0, import_datalog2.variable)("b"), (0, import_datalog2.variable)("n"))]
16709
+ ),
16710
+ (0, import_datalog2.rule)("anchorChain", [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("x")], [(0, import_datalog2.lit)("wantedAnchor", (0, import_datalog2.variable)("x"))]),
16711
+ (0, import_datalog2.rule)(
16712
+ "anchorChain",
16713
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16714
+ [(0, import_datalog2.lit)("anchorChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")), (0, import_datalog2.lit)("binds", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"))]
16715
+ ),
16716
+ (0, import_datalog2.rule)(
16717
+ "anchorChain",
16718
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16719
+ [(0, import_datalog2.lit)("anchorChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")), (0, import_datalog2.lit)("endsHolding", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"))]
16720
+ ),
16721
+ (0, import_datalog2.rule)(
16722
+ "anchorChain",
16723
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16724
+ [(0, import_datalog2.lit)("anchorChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")), (0, import_datalog2.lit)("fallbackBranch", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("z"))]
16725
+ ),
16726
+ (0, import_datalog2.rule)(
16727
+ "anchorChain",
16728
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("z")],
16729
+ [
16730
+ (0, import_datalog2.lit)("anchorChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")),
16731
+ (0, import_datalog2.lit)("imports", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n")),
16732
+ (0, import_datalog2.lit)("moduleExport", (0, import_datalog2.variable)("m"), (0, import_datalog2.variable)("n"), (0, import_datalog2.variable)("z"))
16733
+ ]
16734
+ ),
16735
+ (0, import_datalog2.rule)(
16736
+ "anchorChain",
16737
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("c")],
16738
+ [(0, import_datalog2.lit)("anchorChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("r")), (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c"))]
16739
+ ),
16740
+ (0, import_datalog2.rule)(
16741
+ "anchorChain",
16742
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("o")],
16743
+ [
16744
+ (0, import_datalog2.lit)("anchorChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("y")),
16745
+ (0, import_datalog2.lit)("readsProperty", (0, import_datalog2.variable)("y"), (0, import_datalog2.variable)("o"), (0, import_datalog2.variable)("n"))
16746
+ ]
16747
+ ),
16748
+ (0, import_datalog2.rule)(
16749
+ "wantedAnchorCall",
16750
+ [(0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("r")],
16751
+ [(0, import_datalog2.lit)("anchorChain", (0, import_datalog2.variable)("x"), (0, import_datalog2.variable)("r")), (0, import_datalog2.lit)("call", (0, import_datalog2.variable)("r"), (0, import_datalog2.variable)("c"))]
16752
+ )
16753
+ ];
16754
+ var ANSWER_RELATIONS = [
16755
+ ...new Set(RESOLUTION_QUESTIONS.map((r) => r.head.relation))
16756
+ ];
16757
+
16006
16758
  // src/storage.ts
16007
16759
  function children2(node) {
16008
16760
  return node.namedChildren.filter((child) => child !== null);
@@ -16023,21 +16775,17 @@ function rootConstant(node) {
16023
16775
  }
16024
16776
  return rootConstant(receiver);
16025
16777
  }
16026
- function reachesBase(facts, classKey, bases, seen = /* @__PURE__ */ new Set()) {
16027
- if (seen.has(classKey)) {
16028
- return false;
16029
- }
16030
- seen.add(classKey);
16031
- const named = facts.facts("extendsNamed").filter((row) => String(row[0]) === classKey).map((row) => String(row[1]));
16032
- if (named.some((name) => bases.includes(name))) {
16033
- return true;
16034
- }
16035
- return facts.facts("extends").filter((row) => String(row[0]) === classKey).flatMap(
16036
- (row) => facts.facts("binds").filter((bound) => String(bound[0]) === String(row[1])).map((bound) => String(bound[1]))
16037
- ).some((next) => reachesBase(facts, next, bases, seen));
16778
+ var ANCESTRY_PROGRAM = (0, import_datalog3.deriveOnDemand)(
16779
+ [...RESOLUTION_RULES, ...RESOLUTION_QUESTIONS],
16780
+ ANSWER_RELATIONS
16781
+ );
16782
+ function reachesBase(facts, classKey, bases) {
16783
+ facts.add("wantedAncestry", [classKey]);
16784
+ (0, import_datalog3.evaluate)(facts, ANCESTRY_PROGRAM.rules);
16785
+ return facts.lookup("wantedBaseName", 0, classKey).some((row) => bases.includes(String(row[1])));
16038
16786
  }
16039
- function classBehind(facts, constant) {
16040
- const wanted = `#${constant.text}`;
16787
+ function classBehind(facts, constant2) {
16788
+ const wanted = `#${constant2.text}`;
16041
16789
  const bound = new Set(
16042
16790
  facts.facts("binds").filter((row) => String(row[0]).endsWith(wanted)).map((row) => String(row[1]))
16043
16791
  );
@@ -16080,11 +16828,11 @@ function storageEffects(calls, options) {
16080
16828
  if (partOfOne.has(call.id)) {
16081
16829
  continue;
16082
16830
  }
16083
- const constant = rootConstant(call);
16084
- if (constant === null) {
16831
+ const constant2 = rootConstant(call);
16832
+ if (constant2 === null) {
16085
16833
  continue;
16086
16834
  }
16087
- const classKey = classBehind(options.facts, constant);
16835
+ const classKey = classBehind(options.facts, constant2);
16088
16836
  if (classKey === void 0) {
16089
16837
  continue;
16090
16838
  }
@@ -16102,7 +16850,7 @@ function storageEffects(calls, options) {
16102
16850
  recognition: "ruby-storage",
16103
16851
  storageSystem: pattern.storageSystem,
16104
16852
  scope: pattern.baseClasses[0] ?? "",
16105
- container: constant.text
16853
+ container: constant2.text
16106
16854
  }),
16107
16855
  callee: call.text,
16108
16856
  interaction: {
@@ -16589,6 +17337,7 @@ function buildFieldUnit(pack, typeName, decl, filePath) {
16589
17337
  kind: "resolver",
16590
17338
  file: filePath,
16591
17339
  range: rangeOf(decl.node),
17340
+ span: spanOf(decl.node),
16592
17341
  exportName: null,
16593
17342
  exportPath: null
16594
17343
  },
@@ -16658,7 +17407,7 @@ async function parseRuby(source) {
16658
17407
  // src/project.ts
16659
17408
  var import_node_fs3 = __toESM(require("fs"), 1);
16660
17409
  var import_node_path3 = __toESM(require("path"), 1);
16661
- var import_datalog = require("@suss/datalog");
17410
+ var import_datalog4 = require("@suss/datalog");
16662
17411
  var import_extractor4 = require("@suss/extractor");
16663
17412
 
16664
17413
  // src/facts/values.ts
@@ -17101,7 +17850,7 @@ function emitConstantBindings(db, perFile) {
17101
17850
 
17102
17851
  // src/project.ts
17103
17852
  async function extractRubyProject(options) {
17104
- const db = new import_datalog.Database();
17853
+ const db = new import_datalog4.Database();
17105
17854
  const summaries = [];
17106
17855
  const constants = [];
17107
17856
  const cache = createFileCache(