@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.
- package/dist/index.cjs +809 -60
- package/dist/index.js +807 -58
- 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((
|
|
1466
|
-
const values = Object.entries(entries).filter(([k, _]) => numericValues.indexOf(+k) === -1).map(([_,
|
|
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(
|
|
1526
|
+
set(v2) {
|
|
1521
1527
|
Object.defineProperty(object2, key, {
|
|
1522
|
-
value:
|
|
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
|
|
3210
|
-
if (
|
|
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(
|
|
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
|
|
3818
|
-
propValues[key].add(
|
|
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,
|
|
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
|
|
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
|
|
4131
|
-
if (map2.has(
|
|
4132
|
-
throw new Error(`Duplicate discriminator value "${String(
|
|
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(
|
|
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
|
|
4774
|
-
return
|
|
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((
|
|
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((
|
|
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((
|
|
12132
|
-
falsyArray = falsyArray.map((
|
|
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((
|
|
12680
|
+
if (values.every((v2) => typeof v2 === "number"))
|
|
12675
12681
|
json2.type = "number";
|
|
12676
|
-
if (values.every((
|
|
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((
|
|
12715
|
+
if (vals.every((v2) => typeof v2 === "number"))
|
|
12710
12716
|
json2.type = "number";
|
|
12711
|
-
if (vals.every((
|
|
12717
|
+
if (vals.every((v2) => typeof v2 === "string"))
|
|
12712
12718
|
json2.type = "string";
|
|
12713
|
-
if (vals.every((
|
|
12719
|
+
if (vals.every((v2) => typeof v2 === "boolean"))
|
|
12714
12720
|
json2.type = "boolean";
|
|
12715
|
-
if (vals.every((
|
|
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
|
|
12819
|
+
const v2 = def.shape[key]._zod;
|
|
12814
12820
|
if (ctx.io === "input") {
|
|
12815
|
-
return
|
|
12821
|
+
return v2.optin === void 0;
|
|
12816
12822
|
} else {
|
|
12817
|
-
return
|
|
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((
|
|
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(
|
|
13508
|
+
set(v2) {
|
|
13503
13509
|
Object.defineProperty(this, key, {
|
|
13504
13510
|
configurable: true,
|
|
13505
13511
|
writable: true,
|
|
13506
13512
|
enumerable: true,
|
|
13507
|
-
value:
|
|
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((
|
|
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((
|
|
14955
|
+
if (enumValues.every((v2) => typeof v2 === "string")) {
|
|
14950
14956
|
return z.enum(enumValues);
|
|
14951
14957
|
}
|
|
14952
|
-
const literalSchemas = enumValues.map((
|
|
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-
|
|
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
|
|
15364
|
-
*
|
|
15365
|
-
*
|
|
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
|
-
|
|
16027
|
-
|
|
16028
|
-
|
|
16029
|
-
|
|
16030
|
-
|
|
16031
|
-
|
|
16032
|
-
|
|
16033
|
-
|
|
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,
|
|
16040
|
-
const wanted = `#${
|
|
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
|
|
16084
|
-
if (
|
|
16831
|
+
const constant2 = rootConstant(call);
|
|
16832
|
+
if (constant2 === null) {
|
|
16085
16833
|
continue;
|
|
16086
16834
|
}
|
|
16087
|
-
const classKey = classBehind(options.facts,
|
|
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:
|
|
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
|
|
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
|
|
17853
|
+
const db = new import_datalog4.Database();
|
|
17105
17854
|
const summaries = [];
|
|
17106
17855
|
const constants = [];
|
|
17107
17856
|
const cache = createFileCache(
|