@suss/resolution 0.35.0 → 0.36.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 +1380 -1208
- package/dist/index.d.cts +61 -1
- package/dist/index.d.ts +61 -1
- package/dist/index.js +1366 -1204
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -42,6 +42,10 @@ __export(index_exports, {
|
|
|
42
42
|
RESOLUTION_QUESTIONS: () => RESOLUTION_QUESTIONS,
|
|
43
43
|
RESOLUTION_RULES: () => RESOLUTION_RULES,
|
|
44
44
|
RESULT_STEP: () => RESULT_STEP,
|
|
45
|
+
SELF_AS_CLASS: () => SELF_AS_CLASS,
|
|
46
|
+
SELF_AS_CLASS_NAME: () => SELF_AS_CLASS_NAME,
|
|
47
|
+
SELF_AS_INSTANCE: () => SELF_AS_INSTANCE,
|
|
48
|
+
SELF_AS_INSTANCE_NAME: () => SELF_AS_INSTANCE_NAME,
|
|
45
49
|
SPREAD_ENTRY: () => SPREAD_ENTRY,
|
|
46
50
|
UNDER_ANSWER_RELATIONS: () => UNDER_ANSWER_RELATIONS,
|
|
47
51
|
UNDER_QUESTION_ROW_BUDGET: () => UNDER_QUESTION_ROW_BUDGET,
|
|
@@ -81,6 +85,8 @@ __export(index_exports, {
|
|
|
81
85
|
isObserved: () => isObserved,
|
|
82
86
|
isWrittenAsUnder: () => isWrittenAsUnder,
|
|
83
87
|
joinMountedPath: () => joinMountedPath,
|
|
88
|
+
keptVariants: () => keptVariants,
|
|
89
|
+
memberOf: () => memberOf,
|
|
84
90
|
mergeStoredDependencies: () => mergeStoredDependencies,
|
|
85
91
|
mountPathsOf: () => mountPathsOf,
|
|
86
92
|
noDependencies: () => noDependencies,
|
|
@@ -90,6 +96,7 @@ __export(index_exports, {
|
|
|
90
96
|
objectOfUnder: () => objectOfUnder,
|
|
91
97
|
observeDemand: () => observeDemand,
|
|
92
98
|
packHashes: () => packHashes,
|
|
99
|
+
plainKeyOf: () => plainKeyOf,
|
|
93
100
|
proofRules: () => proofRules,
|
|
94
101
|
queryFacts: () => queryFacts,
|
|
95
102
|
readDispatchOutcomes: () => readDispatchOutcomes,
|
|
@@ -99,6 +106,8 @@ __export(index_exports, {
|
|
|
99
106
|
resolutionProgram: () => resolutionProgram,
|
|
100
107
|
resolutionUnderProgram: () => resolutionUnderProgram,
|
|
101
108
|
resolvedFunctions: () => resolvedFunctions,
|
|
109
|
+
selfFormOf: () => selfFormOf,
|
|
110
|
+
selfResultOf: () => selfResultOf,
|
|
102
111
|
settledFunction: () => settledFunction,
|
|
103
112
|
sourceLeavesOf: () => sourceLeavesOf,
|
|
104
113
|
spanOfKey: () => spanOfKey,
|
|
@@ -108,6 +117,7 @@ __export(index_exports, {
|
|
|
108
117
|
underQuestionSpend: () => underQuestionSpend,
|
|
109
118
|
unpackHashes: () => unpackHashes,
|
|
110
119
|
valueLeftByWrites: () => valueLeftByWrites,
|
|
120
|
+
variantKey: () => variantKey,
|
|
111
121
|
walkRecordsByFile: () => walkRecordsByFile,
|
|
112
122
|
writesRunInOrder: () => writesRunInOrder,
|
|
113
123
|
writtenAnswersFor: () => writtenAnswersFor,
|
|
@@ -139,7 +149,8 @@ var ASKING_RELATIONS = [
|
|
|
139
149
|
"wantedType",
|
|
140
150
|
"wantedUses",
|
|
141
151
|
"wantedSource",
|
|
142
|
-
"wantedInputRead"
|
|
152
|
+
"wantedInputRead",
|
|
153
|
+
"wantedMembers"
|
|
143
154
|
];
|
|
144
155
|
var NO_LANGUAGE_RULES = [];
|
|
145
156
|
var programs = /* @__PURE__ */ new WeakMap();
|
|
@@ -2064,6 +2075,155 @@ function importedFilesByFile(db, displayPathOf) {
|
|
|
2064
2075
|
return byFile;
|
|
2065
2076
|
}
|
|
2066
2077
|
|
|
2078
|
+
// src/receiverSelf.ts
|
|
2079
|
+
var import_datalog3 = require("@suss/datalog");
|
|
2080
|
+
var MEMBERS_QUESTION = "wantedMembers";
|
|
2081
|
+
var SELF_AS_CLASS_NAME = "class";
|
|
2082
|
+
var SELF_AS_CLASS = (0, import_datalog3.constant)(SELF_AS_CLASS_NAME);
|
|
2083
|
+
var SELF_AS_INSTANCE_NAME = "instance";
|
|
2084
|
+
var SELF_AS_INSTANCE = (0, import_datalog3.constant)(SELF_AS_INSTANCE_NAME);
|
|
2085
|
+
var SELF_RULES = [
|
|
2086
|
+
(0, import_datalog3.rule)(
|
|
2087
|
+
"selfBehind",
|
|
2088
|
+
[(0, import_datalog3.variable)("s"), (0, import_datalog3.variable)("s"), (0, import_datalog3.variable)("form")],
|
|
2089
|
+
[(0, import_datalog3.lit)("selfReceiver", (0, import_datalog3.variable)("f"), (0, import_datalog3.variable)("s"), (0, import_datalog3.variable)("form"))],
|
|
2090
|
+
"the receiver"
|
|
2091
|
+
),
|
|
2092
|
+
// `klass = self` or `job = new(...)`. Only names, so a receiver passed
|
|
2093
|
+
// into another method is that method's parameter and never its own.
|
|
2094
|
+
(0, import_datalog3.rule)(
|
|
2095
|
+
"selfBehind",
|
|
2096
|
+
[(0, import_datalog3.variable)("x"), (0, import_datalog3.variable)("s"), (0, import_datalog3.variable)("form")],
|
|
2097
|
+
[
|
|
2098
|
+
(0, import_datalog3.lit)("nameHop", (0, import_datalog3.variable)("x"), (0, import_datalog3.variable)("y")),
|
|
2099
|
+
(0, import_datalog3.lit)("selfBehind", (0, import_datalog3.variable)("y"), (0, import_datalog3.variable)("s"), (0, import_datalog3.variable)("form"))
|
|
2100
|
+
],
|
|
2101
|
+
"a name for the receiver"
|
|
2102
|
+
),
|
|
2103
|
+
// Calling the class makes one of it: Python's `cls(...)` and
|
|
2104
|
+
// TypeScript's `new this(...)`.
|
|
2105
|
+
(0, import_datalog3.rule)(
|
|
2106
|
+
"selfBehind",
|
|
2107
|
+
[(0, import_datalog3.variable)("r"), (0, import_datalog3.variable)("s"), SELF_AS_INSTANCE],
|
|
2108
|
+
[
|
|
2109
|
+
(0, import_datalog3.lit)("call", (0, import_datalog3.variable)("r"), (0, import_datalog3.variable)("c")),
|
|
2110
|
+
(0, import_datalog3.lit)("selfBehind", (0, import_datalog3.variable)("c"), (0, import_datalog3.variable)("s"), SELF_AS_CLASS)
|
|
2111
|
+
],
|
|
2112
|
+
"made from the receiver's class"
|
|
2113
|
+
),
|
|
2114
|
+
// A method that returns its receiver, or one made from it, returns the
|
|
2115
|
+
// caller's: `Report.build(x)` is a Report when `build` is
|
|
2116
|
+
// `def self.build(x) = new(x)`, whichever class `build` is written in.
|
|
2117
|
+
(0, import_datalog3.rule)(
|
|
2118
|
+
"selfResult",
|
|
2119
|
+
[(0, import_datalog3.variable)("r"), (0, import_datalog3.variable)("o"), (0, import_datalog3.variable)("form")],
|
|
2120
|
+
[
|
|
2121
|
+
(0, import_datalog3.lit)("call", (0, import_datalog3.variable)("r"), (0, import_datalog3.variable)("c")),
|
|
2122
|
+
(0, import_datalog3.lit)("readsProperty", (0, import_datalog3.variable)("c"), (0, import_datalog3.variable)("o"), (0, import_datalog3.variable)("n")),
|
|
2123
|
+
(0, import_datalog3.lit)("invokes", (0, import_datalog3.variable)("r"), (0, import_datalog3.variable)("f")),
|
|
2124
|
+
(0, import_datalog3.lit)("returnsValue", (0, import_datalog3.variable)("f"), (0, import_datalog3.variable)("ret")),
|
|
2125
|
+
(0, import_datalog3.lit)("selfReceiver", (0, import_datalog3.variable)("f"), (0, import_datalog3.variable)("s"), (0, import_datalog3.variable)("any")),
|
|
2126
|
+
(0, import_datalog3.lit)("selfBehind", (0, import_datalog3.variable)("ret"), (0, import_datalog3.variable)("s"), (0, import_datalog3.variable)("form"))
|
|
2127
|
+
],
|
|
2128
|
+
"returns its receiver"
|
|
2129
|
+
),
|
|
2130
|
+
(0, import_datalog3.rule)(
|
|
2131
|
+
"selfResult",
|
|
2132
|
+
[(0, import_datalog3.variable)("x"), (0, import_datalog3.variable)("o"), (0, import_datalog3.variable)("form")],
|
|
2133
|
+
[
|
|
2134
|
+
(0, import_datalog3.lit)("nameHop", (0, import_datalog3.variable)("x"), (0, import_datalog3.variable)("y")),
|
|
2135
|
+
(0, import_datalog3.lit)("selfResult", (0, import_datalog3.variable)("y"), (0, import_datalog3.variable)("o"), (0, import_datalog3.variable)("form"))
|
|
2136
|
+
],
|
|
2137
|
+
"a name for what it returned"
|
|
2138
|
+
)
|
|
2139
|
+
];
|
|
2140
|
+
var SELF_QUESTIONS = [
|
|
2141
|
+
(0, import_datalog3.rule)(
|
|
2142
|
+
"wantedSelfBehind",
|
|
2143
|
+
[(0, import_datalog3.variable)("x"), (0, import_datalog3.variable)("s"), (0, import_datalog3.variable)("form")],
|
|
2144
|
+
[(0, import_datalog3.lit)("wanted", (0, import_datalog3.variable)("x")), (0, import_datalog3.lit)("selfBehind", (0, import_datalog3.variable)("x"), (0, import_datalog3.variable)("s"), (0, import_datalog3.variable)("form"))]
|
|
2145
|
+
),
|
|
2146
|
+
(0, import_datalog3.rule)(
|
|
2147
|
+
"wantedSelfResult",
|
|
2148
|
+
[(0, import_datalog3.variable)("x"), (0, import_datalog3.variable)("o"), (0, import_datalog3.variable)("form")],
|
|
2149
|
+
[(0, import_datalog3.lit)("wanted", (0, import_datalog3.variable)("x")), (0, import_datalog3.lit)("selfResult", (0, import_datalog3.variable)("x"), (0, import_datalog3.variable)("o"), (0, import_datalog3.variable)("form"))]
|
|
2150
|
+
),
|
|
2151
|
+
// Every member a class has, its bases' included, and the ones a nearer
|
|
2152
|
+
// member overrides, for a walk that looks a method up on a subclass.
|
|
2153
|
+
(0, import_datalog3.rule)(
|
|
2154
|
+
"wantedMemberOf",
|
|
2155
|
+
[(0, import_datalog3.variable)("cls"), (0, import_datalog3.variable)("n"), (0, import_datalog3.variable)("held")],
|
|
2156
|
+
[
|
|
2157
|
+
(0, import_datalog3.lit)(MEMBERS_QUESTION, (0, import_datalog3.variable)("cls")),
|
|
2158
|
+
(0, import_datalog3.lit)("contains", (0, import_datalog3.variable)("cls"), (0, import_datalog3.variable)("n"), (0, import_datalog3.variable)("held"))
|
|
2159
|
+
]
|
|
2160
|
+
),
|
|
2161
|
+
(0, import_datalog3.rule)(
|
|
2162
|
+
"wantedMemberOverridden",
|
|
2163
|
+
[(0, import_datalog3.variable)("cls"), (0, import_datalog3.variable)("n"), (0, import_datalog3.variable)("h")],
|
|
2164
|
+
[
|
|
2165
|
+
(0, import_datalog3.lit)(MEMBERS_QUESTION, (0, import_datalog3.variable)("cls")),
|
|
2166
|
+
(0, import_datalog3.lit)("contains", (0, import_datalog3.variable)("cls"), (0, import_datalog3.variable)("n"), (0, import_datalog3.variable)("m")),
|
|
2167
|
+
(0, import_datalog3.lit)("overrides", (0, import_datalog3.variable)("m"), (0, import_datalog3.variable)("n"), (0, import_datalog3.variable)("h"))
|
|
2168
|
+
]
|
|
2169
|
+
)
|
|
2170
|
+
];
|
|
2171
|
+
function selfResultOf(db, key) {
|
|
2172
|
+
const rows = db.lookup("wantedSelfResult", 0, key);
|
|
2173
|
+
const [only] = rows;
|
|
2174
|
+
return rows.length === 1 && only !== void 0 ? { receiver: String(only[1]), form: String(only[2]) } : null;
|
|
2175
|
+
}
|
|
2176
|
+
function selfFormOf(db, key, receiver) {
|
|
2177
|
+
const forms = new Set(
|
|
2178
|
+
db.lookup("wantedSelfBehind", 0, key).filter((row) => String(row[1]) === receiver).map((row) => String(row[2]))
|
|
2179
|
+
);
|
|
2180
|
+
const [only] = forms;
|
|
2181
|
+
return forms.size === 1 && only !== void 0 ? only : null;
|
|
2182
|
+
}
|
|
2183
|
+
var ON_SUBCLASS = "#on=";
|
|
2184
|
+
function variantKey(key, subclass) {
|
|
2185
|
+
return `${key}${ON_SUBCLASS}${encodeURIComponent(subclass.name)}@${encodeURIComponent(subclass.file)}`;
|
|
2186
|
+
}
|
|
2187
|
+
function plainKeyOf(key) {
|
|
2188
|
+
const at = key.indexOf(ON_SUBCLASS);
|
|
2189
|
+
return at === -1 ? key : key.slice(0, at);
|
|
2190
|
+
}
|
|
2191
|
+
function keptVariants(variants) {
|
|
2192
|
+
const callers = /* @__PURE__ */ new Map();
|
|
2193
|
+
for (const variant of variants) {
|
|
2194
|
+
for (const callee of variant.calls) {
|
|
2195
|
+
const known = callers.get(callee) ?? [];
|
|
2196
|
+
known.push(variant.key);
|
|
2197
|
+
callers.set(callee, known);
|
|
2198
|
+
}
|
|
2199
|
+
}
|
|
2200
|
+
const kept = /* @__PURE__ */ new Set();
|
|
2201
|
+
const queue = variants.filter((variant) => variant.differs).map((variant) => variant.key);
|
|
2202
|
+
for (let key = queue.pop(); key !== void 0; key = queue.pop()) {
|
|
2203
|
+
if (kept.has(key)) {
|
|
2204
|
+
continue;
|
|
2205
|
+
}
|
|
2206
|
+
kept.add(key);
|
|
2207
|
+
queue.push(...callers.get(key) ?? []);
|
|
2208
|
+
}
|
|
2209
|
+
return kept;
|
|
2210
|
+
}
|
|
2211
|
+
|
|
2212
|
+
// src/members.ts
|
|
2213
|
+
function memberOf(db, classKey, name, program) {
|
|
2214
|
+
askResolution(db, [classKey], MEMBERS_QUESTION, program);
|
|
2215
|
+
const overridden = new Set(
|
|
2216
|
+
db.lookup("wantedMemberOverridden", 0, classKey).filter((row) => String(row[1]) === name).map((row) => String(row[2]))
|
|
2217
|
+
);
|
|
2218
|
+
const found = [
|
|
2219
|
+
...new Set(
|
|
2220
|
+
db.lookup("wantedMemberOf", 0, classKey).filter((row) => String(row[1]) === name).map((row) => String(row[2])).filter((held) => !overridden.has(held))
|
|
2221
|
+
)
|
|
2222
|
+
];
|
|
2223
|
+
const [only] = found;
|
|
2224
|
+
return found.length === 1 && only !== void 0 ? only : null;
|
|
2225
|
+
}
|
|
2226
|
+
|
|
2067
2227
|
// src/mount.ts
|
|
2068
2228
|
function joinMountedPath(prefix, path) {
|
|
2069
2229
|
const trimmed = prefix.endsWith("/") ? prefix.slice(0, -1) : prefix;
|
|
@@ -2233,132 +2393,132 @@ function addPackWords(db, words) {
|
|
|
2233
2393
|
}
|
|
2234
2394
|
|
|
2235
2395
|
// src/passedOn.ts
|
|
2236
|
-
var
|
|
2396
|
+
var import_datalog4 = require("@suss/datalog");
|
|
2237
2397
|
var USES_QUESTION = "wantedUses";
|
|
2238
2398
|
var PASSED_ON_RULES = [
|
|
2239
|
-
(0,
|
|
2240
|
-
(0,
|
|
2241
|
-
(0,
|
|
2399
|
+
(0, import_datalog4.rule)("passedOn", [(0, import_datalog4.variable)("x")], [(0, import_datalog4.lit)("returnsValue", (0, import_datalog4.variable)("f"), (0, import_datalog4.variable)("x"))], "returned"),
|
|
2400
|
+
(0, import_datalog4.rule)("passedOn", [(0, import_datalog4.variable)("x")], [(0, import_datalog4.lit)("yieldsValue", (0, import_datalog4.variable)("f"), (0, import_datalog4.variable)("x"))], "yielded"),
|
|
2401
|
+
(0, import_datalog4.rule)(
|
|
2242
2402
|
"passedOn",
|
|
2243
|
-
[(0,
|
|
2244
|
-
[(0,
|
|
2403
|
+
[(0, import_datalog4.variable)("x")],
|
|
2404
|
+
[(0, import_datalog4.lit)("callArg", (0, import_datalog4.variable)("r"), (0, import_datalog4.variable)("k"), (0, import_datalog4.variable)("x"))],
|
|
2245
2405
|
"an argument"
|
|
2246
2406
|
),
|
|
2247
|
-
(0,
|
|
2407
|
+
(0, import_datalog4.rule)(
|
|
2248
2408
|
"passedOn",
|
|
2249
|
-
[(0,
|
|
2250
|
-
[(0,
|
|
2409
|
+
[(0, import_datalog4.variable)("x")],
|
|
2410
|
+
[(0, import_datalog4.lit)("callKeywordArg", (0, import_datalog4.variable)("r"), (0, import_datalog4.variable)("k"), (0, import_datalog4.variable)("x"))],
|
|
2251
2411
|
"a keyword argument"
|
|
2252
2412
|
),
|
|
2253
|
-
(0,
|
|
2254
|
-
(0,
|
|
2413
|
+
(0, import_datalog4.rule)("passedOn", [(0, import_datalog4.variable)("x")], [(0, import_datalog4.lit)("binds", (0, import_datalog4.variable)("y"), (0, import_datalog4.variable)("x"))], "another name"),
|
|
2414
|
+
(0, import_datalog4.rule)(
|
|
2255
2415
|
"passedOn",
|
|
2256
|
-
[(0,
|
|
2257
|
-
[(0,
|
|
2416
|
+
[(0, import_datalog4.variable)("x")],
|
|
2417
|
+
[(0, import_datalog4.lit)("endsHolding", (0, import_datalog4.variable)("y"), (0, import_datalog4.variable)("x"))],
|
|
2258
2418
|
"another name's last write"
|
|
2259
2419
|
),
|
|
2260
|
-
(0,
|
|
2420
|
+
(0, import_datalog4.rule)(
|
|
2261
2421
|
"passedOn",
|
|
2262
|
-
[(0,
|
|
2263
|
-
[(0,
|
|
2422
|
+
[(0, import_datalog4.variable)("x")],
|
|
2423
|
+
[(0, import_datalog4.lit)("mayHold", (0, import_datalog4.variable)("y"), (0, import_datalog4.variable)("x"))],
|
|
2264
2424
|
"one of another name's writes"
|
|
2265
2425
|
),
|
|
2266
|
-
(0,
|
|
2426
|
+
(0, import_datalog4.rule)(
|
|
2267
2427
|
"passedOn",
|
|
2268
|
-
[(0,
|
|
2269
|
-
[(0,
|
|
2428
|
+
[(0, import_datalog4.variable)("x")],
|
|
2429
|
+
[(0, import_datalog4.lit)("holdsProperty", (0, import_datalog4.variable)("o"), (0, import_datalog4.variable)("n"), (0, import_datalog4.variable)("x"))],
|
|
2270
2430
|
"held by an object"
|
|
2271
2431
|
),
|
|
2272
|
-
(0,
|
|
2432
|
+
(0, import_datalog4.rule)(
|
|
2273
2433
|
"passedOn",
|
|
2274
|
-
[(0,
|
|
2275
|
-
[(0,
|
|
2434
|
+
[(0, import_datalog4.variable)("x")],
|
|
2435
|
+
[(0, import_datalog4.lit)("storesProperty", (0, import_datalog4.variable)("o"), (0, import_datalog4.variable)("n"), (0, import_datalog4.variable)("x"), (0, import_datalog4.variable)("k"))],
|
|
2276
2436
|
"stored on an object"
|
|
2277
2437
|
),
|
|
2278
|
-
(0,
|
|
2438
|
+
(0, import_datalog4.rule)(
|
|
2279
2439
|
"passedOn",
|
|
2280
|
-
[(0,
|
|
2281
|
-
[(0,
|
|
2440
|
+
[(0, import_datalog4.variable)("x")],
|
|
2441
|
+
[(0, import_datalog4.lit)("holdsUnderKey", (0, import_datalog4.variable)("o"), (0, import_datalog4.variable)("x"))],
|
|
2282
2442
|
"stored under a key"
|
|
2283
2443
|
),
|
|
2284
|
-
(0,
|
|
2444
|
+
(0, import_datalog4.rule)(
|
|
2285
2445
|
"passedOn",
|
|
2286
|
-
[(0,
|
|
2287
|
-
[(0,
|
|
2446
|
+
[(0, import_datalog4.variable)("x")],
|
|
2447
|
+
[(0, import_datalog4.lit)("readsKeyed", (0, import_datalog4.variable)("r"), (0, import_datalog4.variable)("o"), (0, import_datalog4.variable)("x"))],
|
|
2288
2448
|
"used as a key"
|
|
2289
2449
|
),
|
|
2290
|
-
(0,
|
|
2291
|
-
(0,
|
|
2450
|
+
(0, import_datalog4.rule)("passedOn", [(0, import_datalog4.variable)("x")], [(0, import_datalog4.lit)("entersValue", (0, import_datalog4.variable)("x"))], "entered"),
|
|
2451
|
+
(0, import_datalog4.rule)(
|
|
2292
2452
|
"passedOn",
|
|
2293
|
-
[(0,
|
|
2294
|
-
[(0,
|
|
2453
|
+
[(0, import_datalog4.variable)("x")],
|
|
2454
|
+
[(0, import_datalog4.lit)("entersAs", (0, import_datalog4.variable)("y"), (0, import_datalog4.variable)("x"))],
|
|
2295
2455
|
"entered under a name"
|
|
2296
2456
|
),
|
|
2297
|
-
(0,
|
|
2457
|
+
(0, import_datalog4.rule)(
|
|
2298
2458
|
"passedOn",
|
|
2299
|
-
[(0,
|
|
2300
|
-
[(0,
|
|
2459
|
+
[(0, import_datalog4.variable)("x")],
|
|
2460
|
+
[(0, import_datalog4.lit)("paramDefault", (0, import_datalog4.variable)("p"), (0, import_datalog4.variable)("x"))],
|
|
2301
2461
|
"a parameter default"
|
|
2302
2462
|
),
|
|
2303
|
-
(0,
|
|
2463
|
+
(0, import_datalog4.rule)(
|
|
2304
2464
|
"passedOn",
|
|
2305
|
-
[(0,
|
|
2306
|
-
[(0,
|
|
2465
|
+
[(0, import_datalog4.variable)("x")],
|
|
2466
|
+
[(0, import_datalog4.lit)("fallbackBranch", (0, import_datalog4.variable)("e"), (0, import_datalog4.variable)("x"))],
|
|
2307
2467
|
"a fallback branch"
|
|
2308
2468
|
),
|
|
2309
|
-
(0,
|
|
2469
|
+
(0, import_datalog4.rule)(
|
|
2310
2470
|
"passedOn",
|
|
2311
|
-
[(0,
|
|
2312
|
-
[(0,
|
|
2471
|
+
[(0, import_datalog4.variable)("x")],
|
|
2472
|
+
[(0, import_datalog4.lit)("conditionalBranch", (0, import_datalog4.variable)("e"), (0, import_datalog4.variable)("x"))],
|
|
2313
2473
|
"a conditional branch"
|
|
2314
2474
|
),
|
|
2315
2475
|
// `app.router` and `app[key]` hand out a part of the value, so the value
|
|
2316
2476
|
// goes wherever that part goes. This rule skips a part called at once,
|
|
2317
2477
|
// `app.run()`, which `wantedCalledMethod` lists instead.
|
|
2318
|
-
(0,
|
|
2478
|
+
(0, import_datalog4.rule)(
|
|
2319
2479
|
"passedOn",
|
|
2320
|
-
[(0,
|
|
2321
|
-
[(0,
|
|
2480
|
+
[(0, import_datalog4.variable)("x")],
|
|
2481
|
+
[(0, import_datalog4.lit)("readsProperty", (0, import_datalog4.variable)("r"), (0, import_datalog4.variable)("x"), (0, import_datalog4.variable)("n")), (0, import_datalog4.lit)("passedOn", (0, import_datalog4.variable)("r"))],
|
|
2322
2482
|
"a property passed on"
|
|
2323
2483
|
),
|
|
2324
|
-
(0,
|
|
2484
|
+
(0, import_datalog4.rule)(
|
|
2325
2485
|
"passedOn",
|
|
2326
|
-
[(0,
|
|
2327
|
-
[(0,
|
|
2486
|
+
[(0, import_datalog4.variable)("x")],
|
|
2487
|
+
[(0, import_datalog4.lit)("readsKeyed", (0, import_datalog4.variable)("r"), (0, import_datalog4.variable)("x"), (0, import_datalog4.variable)("k")), (0, import_datalog4.lit)("passedOn", (0, import_datalog4.variable)("r"))],
|
|
2328
2488
|
"an entry passed on"
|
|
2329
2489
|
),
|
|
2330
2490
|
// A method's result can be the value itself, as a builder's is, or
|
|
2331
2491
|
// carry what was registered on it, as `s.router(contract, handlers)`
|
|
2332
2492
|
// does, so passing the result on passes the value on.
|
|
2333
|
-
(0,
|
|
2493
|
+
(0, import_datalog4.rule)(
|
|
2334
2494
|
"passedOn",
|
|
2335
|
-
[(0,
|
|
2495
|
+
[(0, import_datalog4.variable)("x")],
|
|
2336
2496
|
[
|
|
2337
|
-
(0,
|
|
2338
|
-
(0,
|
|
2339
|
-
(0,
|
|
2497
|
+
(0, import_datalog4.lit)("readsProperty", (0, import_datalog4.variable)("r"), (0, import_datalog4.variable)("x"), (0, import_datalog4.variable)("n")),
|
|
2498
|
+
(0, import_datalog4.lit)("call", (0, import_datalog4.variable)("c"), (0, import_datalog4.variable)("r")),
|
|
2499
|
+
(0, import_datalog4.lit)("passedOn", (0, import_datalog4.variable)("c"))
|
|
2340
2500
|
],
|
|
2341
2501
|
"a method result passed on"
|
|
2342
2502
|
)
|
|
2343
2503
|
];
|
|
2344
2504
|
var USES_QUESTIONS = [
|
|
2345
|
-
(0,
|
|
2505
|
+
(0, import_datalog4.rule)(
|
|
2346
2506
|
"wantedPassedOn",
|
|
2347
|
-
[(0,
|
|
2348
|
-
[(0,
|
|
2507
|
+
[(0, import_datalog4.variable)("x")],
|
|
2508
|
+
[(0, import_datalog4.lit)(USES_QUESTION, (0, import_datalog4.variable)("x")), (0, import_datalog4.lit)("passedOn", (0, import_datalog4.variable)("x"))]
|
|
2349
2509
|
),
|
|
2350
|
-
(0,
|
|
2510
|
+
(0, import_datalog4.rule)(
|
|
2351
2511
|
"wantedPassedOn",
|
|
2352
|
-
[(0,
|
|
2353
|
-
[(0,
|
|
2512
|
+
[(0, import_datalog4.variable)("x")],
|
|
2513
|
+
[(0, import_datalog4.lit)(USES_QUESTION, (0, import_datalog4.variable)("x")), (0, import_datalog4.lit)("call", (0, import_datalog4.variable)("r"), (0, import_datalog4.variable)("x"))]
|
|
2354
2514
|
),
|
|
2355
|
-
(0,
|
|
2515
|
+
(0, import_datalog4.rule)(
|
|
2356
2516
|
"wantedCalledMethod",
|
|
2357
|
-
[(0,
|
|
2517
|
+
[(0, import_datalog4.variable)("x"), (0, import_datalog4.variable)("n")],
|
|
2358
2518
|
[
|
|
2359
|
-
(0,
|
|
2360
|
-
(0,
|
|
2361
|
-
(0,
|
|
2519
|
+
(0, import_datalog4.lit)(USES_QUESTION, (0, import_datalog4.variable)("x")),
|
|
2520
|
+
(0, import_datalog4.lit)("readsProperty", (0, import_datalog4.variable)("r"), (0, import_datalog4.variable)("x"), (0, import_datalog4.variable)("n")),
|
|
2521
|
+
(0, import_datalog4.lit)("call", (0, import_datalog4.variable)("c"), (0, import_datalog4.variable)("r"))
|
|
2362
2522
|
]
|
|
2363
2523
|
)
|
|
2364
2524
|
];
|
|
@@ -2377,13 +2537,13 @@ function staysInItsFunction(uses, ownMethods) {
|
|
|
2377
2537
|
}
|
|
2378
2538
|
|
|
2379
2539
|
// src/session.ts
|
|
2380
|
-
var
|
|
2540
|
+
var import_datalog5 = require("@suss/datalog");
|
|
2381
2541
|
var PROOF_OVERRIDES = {
|
|
2382
2542
|
overridden: "readsOverridden",
|
|
2383
2543
|
found: "readsMemberOn"
|
|
2384
2544
|
};
|
|
2385
2545
|
function proofRules(rules) {
|
|
2386
|
-
return (0,
|
|
2546
|
+
return (0, import_datalog5.rulesDeriving)(rules, [
|
|
2387
2547
|
"resolves",
|
|
2388
2548
|
PROOF_OVERRIDES.overridden,
|
|
2389
2549
|
PROOF_OVERRIDES.found
|
|
@@ -2393,7 +2553,7 @@ function explainResolvedKey(options) {
|
|
|
2393
2553
|
const { db, rules, key, locate, displayPath } = options;
|
|
2394
2554
|
const witnessRules = proofRules(rules);
|
|
2395
2555
|
const started = performance.now();
|
|
2396
|
-
(0,
|
|
2556
|
+
(0, import_datalog5.evaluate)(db, witnessRules, import_datalog5.witnesses);
|
|
2397
2557
|
const evaluateMs = performance.now() - started;
|
|
2398
2558
|
const { baseFacts, derivedFacts } = factCounts(db, witnessRules);
|
|
2399
2559
|
const targets = answersFor(db, "resolves", key, PROOF_OVERRIDES);
|
|
@@ -2401,7 +2561,7 @@ function explainResolvedKey(options) {
|
|
|
2401
2561
|
return null;
|
|
2402
2562
|
}
|
|
2403
2563
|
const target = targets[0];
|
|
2404
|
-
const proof = (0,
|
|
2564
|
+
const proof = (0, import_datalog5.proofOf)(
|
|
2405
2565
|
db,
|
|
2406
2566
|
"resolves",
|
|
2407
2567
|
[key, target],
|
|
@@ -2714,30 +2874,30 @@ function sharedConstruction(writes) {
|
|
|
2714
2874
|
}
|
|
2715
2875
|
|
|
2716
2876
|
// src/index.ts
|
|
2717
|
-
var
|
|
2718
|
-
var VALUE_STEP = (0,
|
|
2877
|
+
var import_datalog6 = require("@suss/datalog");
|
|
2878
|
+
var VALUE_STEP = (0, import_datalog6.constant)("value");
|
|
2719
2879
|
var NAMESPACE_IMPORT_NAME = "*";
|
|
2720
|
-
var NAMESPACE_IMPORT = (0,
|
|
2880
|
+
var NAMESPACE_IMPORT = (0, import_datalog6.constant)(NAMESPACE_IMPORT_NAME);
|
|
2721
2881
|
var DEFAULT_IMPORT_NAME = "default";
|
|
2722
|
-
var DEFAULT_IMPORT = (0,
|
|
2882
|
+
var DEFAULT_IMPORT = (0, import_datalog6.constant)(DEFAULT_IMPORT_NAME);
|
|
2723
2883
|
var GLOBAL_MODULE = "global";
|
|
2724
2884
|
var NAMESPACE_MEMBER_RULE = "namespace member";
|
|
2725
2885
|
var BASE_CLASS_RULE = "base class";
|
|
2726
2886
|
var NAME_HOP_RULE = "name hop";
|
|
2727
|
-
var INSTANCE_STEP = (0,
|
|
2887
|
+
var INSTANCE_STEP = (0, import_datalog6.constant)("instance");
|
|
2728
2888
|
var RECEIVER_STORE_NAME = "receiver";
|
|
2729
|
-
var RECEIVER_STORE = (0,
|
|
2889
|
+
var RECEIVER_STORE = (0, import_datalog6.constant)(RECEIVER_STORE_NAME);
|
|
2730
2890
|
var NAMED_STORE_NAME = "name";
|
|
2731
|
-
var NAMED_STORE = (0,
|
|
2891
|
+
var NAMED_STORE = (0, import_datalog6.constant)(NAMED_STORE_NAME);
|
|
2732
2892
|
var UNPLACED_STORE_NAME = "unplaced";
|
|
2733
|
-
var NO_ARGUMENTS = (0,
|
|
2734
|
-
var FIRST_POSITION = (0,
|
|
2735
|
-
var THEN_METHOD = (0,
|
|
2736
|
-
var RESULT_STEP = (0,
|
|
2893
|
+
var NO_ARGUMENTS = (0, import_datalog6.constant)("0");
|
|
2894
|
+
var FIRST_POSITION = (0, import_datalog6.constant)("0");
|
|
2895
|
+
var THEN_METHOD = (0, import_datalog6.constant)("then");
|
|
2896
|
+
var RESULT_STEP = (0, import_datalog6.constant)("result");
|
|
2737
2897
|
var NO_CONTEXT_NAME = "none";
|
|
2738
|
-
var NO_CONTEXT = (0,
|
|
2898
|
+
var NO_CONTEXT = (0, import_datalog6.constant)(NO_CONTEXT_NAME);
|
|
2739
2899
|
var STEP_LATTICE = [
|
|
2740
|
-
{ soFar: VALUE_STEP, next: (0,
|
|
2900
|
+
{ soFar: VALUE_STEP, next: (0, import_datalog6.variable)("kind"), took: (0, import_datalog6.variable)("kind") },
|
|
2741
2901
|
{ soFar: INSTANCE_STEP, next: VALUE_STEP, took: INSTANCE_STEP },
|
|
2742
2902
|
{ soFar: INSTANCE_STEP, next: INSTANCE_STEP, took: INSTANCE_STEP },
|
|
2743
2903
|
{ soFar: INSTANCE_STEP, next: RESULT_STEP, took: RESULT_STEP },
|
|
@@ -2746,1191 +2906,1191 @@ var STEP_LATTICE = [
|
|
|
2746
2906
|
{ soFar: RESULT_STEP, next: RESULT_STEP, took: RESULT_STEP }
|
|
2747
2907
|
];
|
|
2748
2908
|
var DISPATCH_RULES = [
|
|
2749
|
-
(0,
|
|
2909
|
+
(0, import_datalog6.rule)(
|
|
2750
2910
|
"entryRead",
|
|
2751
|
-
[(0,
|
|
2752
|
-
[(0,
|
|
2911
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o")],
|
|
2912
|
+
[(0, import_datalog6.lit)("choosesEntry", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"))]
|
|
2753
2913
|
),
|
|
2754
|
-
(0,
|
|
2914
|
+
(0, import_datalog6.rule)(
|
|
2755
2915
|
"entryRead",
|
|
2756
|
-
[(0,
|
|
2757
|
-
[(0,
|
|
2916
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o")],
|
|
2917
|
+
[(0, import_datalog6.lit)("namedEntryRead", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n"))]
|
|
2758
2918
|
),
|
|
2759
|
-
(0,
|
|
2919
|
+
(0, import_datalog6.rule)(
|
|
2760
2920
|
"entryRead",
|
|
2761
|
-
[(0,
|
|
2762
|
-
[(0,
|
|
2921
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o")],
|
|
2922
|
+
[(0, import_datalog6.lit)("choosesEntryLike", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("s"))]
|
|
2763
2923
|
),
|
|
2764
2924
|
// Every entry of a read whose key is partly written out, by name. A rule
|
|
2765
2925
|
// cannot compare strings, so dispatch.ts keeps the names that match, and
|
|
2766
2926
|
// these stay out of `dispatchesTo`.
|
|
2767
|
-
(0,
|
|
2927
|
+
(0, import_datalog6.rule)(
|
|
2768
2928
|
"likeEntryAt",
|
|
2769
|
-
[(0,
|
|
2929
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
2770
2930
|
[
|
|
2771
|
-
(0,
|
|
2772
|
-
(0,
|
|
2773
|
-
(0,
|
|
2931
|
+
(0, import_datalog6.lit)("choosesEntryLike", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("s")),
|
|
2932
|
+
(0, import_datalog6.lit)("containerOf", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("obj")),
|
|
2933
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
2774
2934
|
]
|
|
2775
2935
|
),
|
|
2776
|
-
(0,
|
|
2936
|
+
(0, import_datalog6.rule)(
|
|
2777
2937
|
"namedEntryRead",
|
|
2778
|
-
[(0,
|
|
2779
|
-
[(0,
|
|
2938
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")],
|
|
2939
|
+
[(0, import_datalog6.lit)("choosesNamedEntry", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n"))]
|
|
2780
2940
|
),
|
|
2781
|
-
(0,
|
|
2941
|
+
(0, import_datalog6.rule)(
|
|
2782
2942
|
"namedEntryRead",
|
|
2783
|
-
[(0,
|
|
2784
|
-
[(0,
|
|
2943
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")],
|
|
2944
|
+
[(0, import_datalog6.lit)("readsEntry", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n"))]
|
|
2785
2945
|
),
|
|
2786
2946
|
// The container a read takes its entry from: an object written out, or
|
|
2787
2947
|
// a collection the program fills through its methods.
|
|
2788
|
-
(0,
|
|
2789
|
-
(0,
|
|
2948
|
+
(0, import_datalog6.rule)("containerOf", [(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("obj")], [(0, import_datalog6.lit)("objectOf", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("obj"))]),
|
|
2949
|
+
(0, import_datalog6.rule)(
|
|
2790
2950
|
"containerOf",
|
|
2791
|
-
[(0,
|
|
2951
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c")],
|
|
2792
2952
|
[
|
|
2793
|
-
(0,
|
|
2794
|
-
(0,
|
|
2953
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c"), VALUE_STEP),
|
|
2954
|
+
(0, import_datalog6.lit)("collectionValue", (0, import_datalog6.variable)("c"))
|
|
2795
2955
|
]
|
|
2796
2956
|
),
|
|
2797
|
-
(0,
|
|
2798
|
-
(0,
|
|
2957
|
+
(0, import_datalog6.rule)("containerOf", [(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("c")], [(0, import_datalog6.lit)("collectionValue", (0, import_datalog6.variable)("c"))]),
|
|
2958
|
+
(0, import_datalog6.rule)(
|
|
2799
2959
|
"entryAt",
|
|
2800
|
-
[(0,
|
|
2960
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("held")],
|
|
2801
2961
|
[
|
|
2802
|
-
(0,
|
|
2803
|
-
(0,
|
|
2804
|
-
(0,
|
|
2962
|
+
(0, import_datalog6.lit)("choosesEntry", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o")),
|
|
2963
|
+
(0, import_datalog6.lit)("containerOf", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("obj")),
|
|
2964
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
2805
2965
|
],
|
|
2806
2966
|
"any entry"
|
|
2807
2967
|
),
|
|
2808
|
-
(0,
|
|
2968
|
+
(0, import_datalog6.rule)(
|
|
2809
2969
|
"entryAt",
|
|
2810
|
-
[(0,
|
|
2970
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("held")],
|
|
2811
2971
|
[
|
|
2812
|
-
(0,
|
|
2813
|
-
(0,
|
|
2814
|
-
(0,
|
|
2972
|
+
(0, import_datalog6.lit)("namedEntryRead", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")),
|
|
2973
|
+
(0, import_datalog6.lit)("containerOf", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("obj")),
|
|
2974
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
2815
2975
|
],
|
|
2816
2976
|
"named entry"
|
|
2817
2977
|
),
|
|
2818
|
-
(0,
|
|
2978
|
+
(0, import_datalog6.rule)(
|
|
2819
2979
|
"entryAt",
|
|
2820
|
-
[(0,
|
|
2821
|
-
[(0,
|
|
2980
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("held")],
|
|
2981
|
+
[(0, import_datalog6.lit)("computedEntryAt", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("held"))]
|
|
2822
2982
|
),
|
|
2823
2983
|
// A write under a key the source computes, `T[name] = fn` or a map's
|
|
2824
2984
|
// `set`, could be under any name, so every read of the container may
|
|
2825
2985
|
// come back with it, a read narrowed to one name included.
|
|
2826
|
-
(0,
|
|
2986
|
+
(0, import_datalog6.rule)(
|
|
2827
2987
|
"computedEntryAt",
|
|
2828
|
-
[(0,
|
|
2988
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("held")],
|
|
2829
2989
|
[
|
|
2830
|
-
(0,
|
|
2831
|
-
(0,
|
|
2832
|
-
(0,
|
|
2833
|
-
(0,
|
|
2990
|
+
(0, import_datalog6.lit)("entryRead", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o")),
|
|
2991
|
+
(0, import_datalog6.lit)("containerOf", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c")),
|
|
2992
|
+
(0, import_datalog6.lit)("refersToObject", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c")),
|
|
2993
|
+
(0, import_datalog6.lit)("holdsUnderKey", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("held"))
|
|
2834
2994
|
],
|
|
2835
2995
|
"entry under a computed key"
|
|
2836
2996
|
),
|
|
2837
2997
|
// The read a call takes its function from: the callee itself, a name
|
|
2838
2998
|
// for it, or the call when the call is the read, as Ruby's `send` is.
|
|
2839
|
-
(0,
|
|
2999
|
+
(0, import_datalog6.rule)(
|
|
2840
3000
|
"callsEntryAt",
|
|
2841
|
-
[(0,
|
|
2842
|
-
[(0,
|
|
3001
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")],
|
|
3002
|
+
[(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")), (0, import_datalog6.lit)("entryRead", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"))]
|
|
2843
3003
|
),
|
|
2844
|
-
(0,
|
|
3004
|
+
(0, import_datalog6.rule)(
|
|
2845
3005
|
"callsEntryAt",
|
|
2846
|
-
[(0,
|
|
3006
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")],
|
|
2847
3007
|
[
|
|
2848
|
-
(0,
|
|
2849
|
-
(0,
|
|
2850
|
-
(0,
|
|
3008
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")),
|
|
3009
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("site"), VALUE_STEP),
|
|
3010
|
+
(0, import_datalog6.lit)("entryRead", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"))
|
|
2851
3011
|
]
|
|
2852
3012
|
),
|
|
2853
|
-
(0,
|
|
2854
|
-
(0,
|
|
3013
|
+
(0, import_datalog6.rule)("callsEntryAt", [(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("r")], [(0, import_datalog6.lit)("callsChosenEntry", (0, import_datalog6.variable)("r"))]),
|
|
3014
|
+
(0, import_datalog6.rule)(
|
|
2855
3015
|
"callsEntryAt",
|
|
2856
|
-
[(0,
|
|
2857
|
-
[(0,
|
|
3016
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")],
|
|
3017
|
+
[(0, import_datalog6.lit)("callsEntryInBranch", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site"))]
|
|
2858
3018
|
),
|
|
2859
3019
|
// `c ? T[k] : undefined` is one of its branches, so a call through it
|
|
2860
3020
|
// may run what the read gives. The other branch may be some other
|
|
2861
3021
|
// function, so dispatch.ts never counts such a call as certain.
|
|
2862
|
-
(0,
|
|
3022
|
+
(0, import_datalog6.rule)(
|
|
2863
3023
|
"callsEntryInBranch",
|
|
2864
|
-
[(0,
|
|
2865
|
-
[(0,
|
|
3024
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")],
|
|
3025
|
+
[(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")), (0, import_datalog6.lit)("branchReadsEntry", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("site"))]
|
|
2866
3026
|
),
|
|
2867
|
-
(0,
|
|
3027
|
+
(0, import_datalog6.rule)(
|
|
2868
3028
|
"callsEntryInBranch",
|
|
2869
|
-
[(0,
|
|
3029
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")],
|
|
2870
3030
|
[
|
|
2871
|
-
(0,
|
|
2872
|
-
(0,
|
|
2873
|
-
(0,
|
|
3031
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")),
|
|
3032
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("x"), VALUE_STEP),
|
|
3033
|
+
(0, import_datalog6.lit)("branchReadsEntry", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("site"))
|
|
2874
3034
|
]
|
|
2875
3035
|
),
|
|
2876
|
-
(0,
|
|
3036
|
+
(0, import_datalog6.rule)(
|
|
2877
3037
|
"branchReadsEntry",
|
|
2878
|
-
[(0,
|
|
3038
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("site")],
|
|
2879
3039
|
[
|
|
2880
|
-
(0,
|
|
2881
|
-
(0,
|
|
3040
|
+
(0, import_datalog6.lit)("conditionalBranch", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("site")),
|
|
3041
|
+
(0, import_datalog6.lit)("entryRead", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"))
|
|
2882
3042
|
]
|
|
2883
3043
|
),
|
|
2884
|
-
(0,
|
|
3044
|
+
(0, import_datalog6.rule)(
|
|
2885
3045
|
"branchReadsEntry",
|
|
2886
|
-
[(0,
|
|
3046
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("site")],
|
|
2887
3047
|
[
|
|
2888
|
-
(0,
|
|
2889
|
-
(0,
|
|
2890
|
-
(0,
|
|
3048
|
+
(0, import_datalog6.lit)("conditionalBranch", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("b")),
|
|
3049
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("b"), (0, import_datalog6.variable)("site"), VALUE_STEP),
|
|
3050
|
+
(0, import_datalog6.lit)("entryRead", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"))
|
|
2891
3051
|
]
|
|
2892
3052
|
),
|
|
2893
|
-
(0,
|
|
3053
|
+
(0, import_datalog6.rule)(
|
|
2894
3054
|
"dispatchesTo",
|
|
2895
|
-
[(0,
|
|
3055
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")],
|
|
2896
3056
|
[
|
|
2897
|
-
(0,
|
|
2898
|
-
(0,
|
|
2899
|
-
(0,
|
|
2900
|
-
(0,
|
|
3057
|
+
(0, import_datalog6.lit)("callsEntryAt", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")),
|
|
3058
|
+
(0, import_datalog6.lit)("entryAt", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("held")),
|
|
3059
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("held"), (0, import_datalog6.variable)("f")),
|
|
3060
|
+
(0, import_datalog6.lit)("func", (0, import_datalog6.variable)("f"))
|
|
2901
3061
|
]
|
|
2902
3062
|
),
|
|
2903
3063
|
// A collection a program fills is an object the way a written one is,
|
|
2904
3064
|
// so a write through a name for it lands on it.
|
|
2905
|
-
(0,
|
|
3065
|
+
(0, import_datalog6.rule)("refersToObject", [(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("c")], [(0, import_datalog6.lit)("collectionValue", (0, import_datalog6.variable)("c"))])
|
|
2906
3066
|
];
|
|
2907
3067
|
var STATED_RULES = [
|
|
2908
3068
|
// Aliasing: const x = y, or an identifier referencing a declaration.
|
|
2909
3069
|
// Every chain that follows a name takes the name hops, so a hop added
|
|
2910
3070
|
// here reaches all of them.
|
|
2911
|
-
(0,
|
|
3071
|
+
(0, import_datalog6.rule)("nameHop", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")], [(0, import_datalog6.lit)("binds", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"))], "alias"),
|
|
2912
3072
|
// A name written more than once has the value the last write left
|
|
2913
3073
|
// there. The adapter works out which write that is, and stays quiet
|
|
2914
3074
|
// when control flow decides; the rule below takes that name instead.
|
|
2915
|
-
(0,
|
|
3075
|
+
(0, import_datalog6.rule)(
|
|
2916
3076
|
"nameHop",
|
|
2917
|
-
[(0,
|
|
2918
|
-
[(0,
|
|
3077
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")],
|
|
3078
|
+
[(0, import_datalog6.lit)("endsHolding", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"))],
|
|
2919
3079
|
"last write"
|
|
2920
3080
|
),
|
|
2921
3081
|
// A name whose writes nothing orders leads to each of them, so a
|
|
2922
3082
|
// caller that can use several values gets them all and one that needs
|
|
2923
3083
|
// a single value gets none. A write stating no value stops every step.
|
|
2924
|
-
(0,
|
|
3084
|
+
(0, import_datalog6.rule)(
|
|
2925
3085
|
"nameHop",
|
|
2926
|
-
[(0,
|
|
2927
|
-
[(0,
|
|
3086
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")],
|
|
3087
|
+
[(0, import_datalog6.lit)("mayHold", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), (0, import_datalog6.lit)("writesAllStated", (0, import_datalog6.variable)("x"))],
|
|
2928
3088
|
"one of several writes"
|
|
2929
3089
|
),
|
|
2930
3090
|
// A fallback says the value is one of its branches, so each branch is
|
|
2931
3091
|
// a step. A branch that resolves to nothing makes no claim, and two
|
|
2932
3092
|
// branches resolving to different things fail the single-answer policy.
|
|
2933
|
-
(0,
|
|
3093
|
+
(0, import_datalog6.rule)(
|
|
2934
3094
|
"nameHop",
|
|
2935
|
-
[(0,
|
|
2936
|
-
[(0,
|
|
3095
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("b")],
|
|
3096
|
+
[(0, import_datalog6.lit)("fallbackBranch", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("b"))],
|
|
2937
3097
|
"fallback"
|
|
2938
3098
|
),
|
|
2939
3099
|
// Every name hop is a value step. A language with a hop of its own, like
|
|
2940
3100
|
// Ruby's `Const.new`, states it as a step too, or every question but
|
|
2941
3101
|
// `comesTo` misses it.
|
|
2942
|
-
(0,
|
|
3102
|
+
(0, import_datalog6.rule)(
|
|
2943
3103
|
"hop",
|
|
2944
|
-
[(0,
|
|
2945
|
-
[(0,
|
|
3104
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"), VALUE_STEP],
|
|
3105
|
+
[(0, import_datalog6.lit)("nameHop", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"))],
|
|
2946
3106
|
NAME_HOP_RULE
|
|
2947
3107
|
),
|
|
2948
3108
|
// An import steps to what the module exports under that name. It is
|
|
2949
3109
|
// not a name hop, because the call-origin chains stop at the import.
|
|
2950
|
-
(0,
|
|
3110
|
+
(0, import_datalog6.rule)(
|
|
2951
3111
|
"hop",
|
|
2952
|
-
[(0,
|
|
3112
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("value"), VALUE_STEP],
|
|
2953
3113
|
[
|
|
2954
|
-
(0,
|
|
2955
|
-
(0,
|
|
3114
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")),
|
|
3115
|
+
(0, import_datalog6.lit)("moduleExport", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("value"))
|
|
2956
3116
|
],
|
|
2957
3117
|
"import"
|
|
2958
3118
|
),
|
|
2959
3119
|
// A parameter steps to what a call passes it. A function called from
|
|
2960
3120
|
// several places leaves its parameter with more than one value, and a
|
|
2961
3121
|
// caller that needs those apart asks `passesArgument`, which keeps the call.
|
|
2962
|
-
(0,
|
|
3122
|
+
(0, import_datalog6.rule)(
|
|
2963
3123
|
"stepsTo",
|
|
2964
|
-
[(0,
|
|
2965
|
-
[(0,
|
|
3124
|
+
[(0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("a"), VALUE_STEP],
|
|
3125
|
+
[(0, import_datalog6.lit)("passesArgument", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("a"))],
|
|
2966
3126
|
"argument"
|
|
2967
3127
|
),
|
|
2968
3128
|
// Reading a property steps to what the object contains under that
|
|
2969
3129
|
// name, whichever way the object arrived: `routes.list` off a name,
|
|
2970
3130
|
// or `make(body).handle` off a call.
|
|
2971
|
-
(0,
|
|
3131
|
+
(0, import_datalog6.rule)(
|
|
2972
3132
|
"stepsTo",
|
|
2973
|
-
[(0,
|
|
3133
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("held"), VALUE_STEP],
|
|
2974
3134
|
[
|
|
2975
|
-
(0,
|
|
2976
|
-
(0,
|
|
2977
|
-
(0,
|
|
3135
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")),
|
|
3136
|
+
(0, import_datalog6.lit)("objectOf", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("obj")),
|
|
3137
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
2978
3138
|
],
|
|
2979
3139
|
"property read"
|
|
2980
3140
|
),
|
|
2981
3141
|
// Calling a class makes one of it, so the call steps to the class and
|
|
2982
3142
|
// a method read off the result is the one the class declares. The
|
|
2983
3143
|
// caveat below is about a factory function, and a class is not one.
|
|
2984
|
-
(0,
|
|
3144
|
+
(0, import_datalog6.rule)(
|
|
2985
3145
|
"hop",
|
|
2986
|
-
[(0,
|
|
3146
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("cls"), INSTANCE_STEP],
|
|
2987
3147
|
[
|
|
2988
|
-
(0,
|
|
2989
|
-
(0,
|
|
2990
|
-
(0,
|
|
3148
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")),
|
|
3149
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("cls")),
|
|
3150
|
+
(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("cls"))
|
|
2991
3151
|
],
|
|
2992
3152
|
"class instance"
|
|
2993
3153
|
),
|
|
2994
3154
|
// The receiver a method is called on. Being one of a class is the
|
|
2995
3155
|
// same hop a construction takes, so a method read off `self` finds
|
|
2996
3156
|
// what the class declares.
|
|
2997
|
-
(0,
|
|
3157
|
+
(0, import_datalog6.rule)(
|
|
2998
3158
|
"hop",
|
|
2999
|
-
[(0,
|
|
3000
|
-
[(0,
|
|
3159
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("cls"), INSTANCE_STEP],
|
|
3160
|
+
[(0, import_datalog6.lit)("instanceOf", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("cls"))],
|
|
3001
3161
|
"receiver instance"
|
|
3002
3162
|
),
|
|
3003
3163
|
// A finder the library declares, keyed on the base a pack named so a
|
|
3004
3164
|
// project class with a method of the same name on another hierarchy is
|
|
3005
3165
|
// left alone. The DESIGN says what a chain of them composes into.
|
|
3006
|
-
(0,
|
|
3166
|
+
(0, import_datalog6.rule)(
|
|
3007
3167
|
"hop",
|
|
3008
|
-
[(0,
|
|
3168
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("cls"), INSTANCE_STEP],
|
|
3009
3169
|
[
|
|
3010
|
-
(0,
|
|
3011
|
-
(0,
|
|
3012
|
-
(0,
|
|
3013
|
-
(0,
|
|
3170
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")),
|
|
3171
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("m")),
|
|
3172
|
+
(0, import_datalog6.lit)("objectOf", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("cls")),
|
|
3173
|
+
(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("cls")),
|
|
3014
3174
|
// Before `libraryBase`, so the demand rewrite asks it with the base
|
|
3015
3175
|
// bound and walks an ancestry only for a method a pack declared.
|
|
3016
|
-
(0,
|
|
3017
|
-
(0,
|
|
3176
|
+
(0, import_datalog6.lit)("givesBackOne", (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("m")),
|
|
3177
|
+
(0, import_datalog6.lit)("libraryBase", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"))
|
|
3018
3178
|
],
|
|
3019
3179
|
"declared finder"
|
|
3020
3180
|
),
|
|
3021
3181
|
// The same word, for a library that takes the class as an argument
|
|
3022
3182
|
// instead of as the receiver. The argument having to reach the base a
|
|
3023
3183
|
// pack named is what keeps an unrelated `get` out.
|
|
3024
|
-
(0,
|
|
3184
|
+
(0, import_datalog6.rule)(
|
|
3025
3185
|
"hop",
|
|
3026
|
-
[(0,
|
|
3186
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("cls"), INSTANCE_STEP],
|
|
3027
3187
|
[
|
|
3028
|
-
(0,
|
|
3029
|
-
(0,
|
|
3030
|
-
(0,
|
|
3188
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")),
|
|
3189
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("m")),
|
|
3190
|
+
(0, import_datalog6.lit)("callArg", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("k"), (0, import_datalog6.variable)("a")),
|
|
3031
3191
|
// Before `libraryBase`, so the demand rewrite asks it with the base
|
|
3032
3192
|
// bound and walks an ancestry only for a method a pack declared.
|
|
3033
|
-
(0,
|
|
3034
|
-
(0,
|
|
3035
|
-
(0,
|
|
3193
|
+
(0, import_datalog6.lit)("givesBackOneOfArgument", (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("k")),
|
|
3194
|
+
(0, import_datalog6.lit)("objectOf", (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("cls")),
|
|
3195
|
+
(0, import_datalog6.lit)("libraryBase", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"))
|
|
3036
3196
|
],
|
|
3037
3197
|
"declared argument finder"
|
|
3038
3198
|
),
|
|
3039
3199
|
// The same again for a function called on its own rather than read off
|
|
3040
3200
|
// anything, keyed on the module it was imported from so a project
|
|
3041
3201
|
// function spelled the same way is not mistaken for it.
|
|
3042
|
-
(0,
|
|
3202
|
+
(0, import_datalog6.rule)(
|
|
3043
3203
|
"hop",
|
|
3044
|
-
[(0,
|
|
3204
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("cls"), INSTANCE_STEP],
|
|
3045
3205
|
[
|
|
3046
|
-
(0,
|
|
3047
|
-
(0,
|
|
3048
|
-
(0,
|
|
3049
|
-
(0,
|
|
3050
|
-
(0,
|
|
3206
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")),
|
|
3207
|
+
(0, import_datalog6.lit)("comesFrom", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("mod"), (0, import_datalog6.variable)("n")),
|
|
3208
|
+
(0, import_datalog6.lit)("givesBackOneOfImport", (0, import_datalog6.variable)("mod"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("k")),
|
|
3209
|
+
(0, import_datalog6.lit)("callArg", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("k"), (0, import_datalog6.variable)("a")),
|
|
3210
|
+
(0, import_datalog6.lit)("objectOf", (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("cls"))
|
|
3051
3211
|
],
|
|
3052
3212
|
"declared import finder"
|
|
3053
3213
|
),
|
|
3054
3214
|
// A block opened over a library's own constructor. The pack says
|
|
3055
3215
|
// entering one gives back the object it built, so the name the block
|
|
3056
3216
|
// opens is that call.
|
|
3057
|
-
(0,
|
|
3217
|
+
(0, import_datalog6.rule)(
|
|
3058
3218
|
"hop",
|
|
3059
|
-
[(0,
|
|
3219
|
+
[(0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("r"), VALUE_STEP],
|
|
3060
3220
|
[
|
|
3061
|
-
(0,
|
|
3062
|
-
(0,
|
|
3063
|
-
(0,
|
|
3064
|
-
(0,
|
|
3221
|
+
(0, import_datalog6.lit)("entersAs", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("r")),
|
|
3222
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")),
|
|
3223
|
+
(0, import_datalog6.lit)("comesFrom", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("mod"), (0, import_datalog6.variable)("n")),
|
|
3224
|
+
(0, import_datalog6.lit)("entersAsSelf", (0, import_datalog6.variable)("mod"), (0, import_datalog6.variable)("n"))
|
|
3065
3225
|
],
|
|
3066
3226
|
"context manager returns self"
|
|
3067
3227
|
),
|
|
3068
3228
|
// A method the language says hands back the object it was called on,
|
|
3069
3229
|
// such as JavaScript's `.bind` or Ruby's `freeze`. Each adapter lists
|
|
3070
3230
|
// its language's own in `returnsReceiver`, keyed on the method's name.
|
|
3071
|
-
(0,
|
|
3231
|
+
(0, import_datalog6.rule)(
|
|
3072
3232
|
"hop",
|
|
3073
|
-
[(0,
|
|
3233
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("o"), VALUE_STEP],
|
|
3074
3234
|
[
|
|
3075
|
-
(0,
|
|
3076
|
-
(0,
|
|
3077
|
-
(0,
|
|
3235
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")),
|
|
3236
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("m")),
|
|
3237
|
+
(0, import_datalog6.lit)("returnsReceiver", (0, import_datalog6.variable)("m"))
|
|
3078
3238
|
],
|
|
3079
3239
|
"returns its receiver"
|
|
3080
3240
|
),
|
|
3081
3241
|
// Wrapper transparency, derived: calling a factory that returns a
|
|
3082
3242
|
// function which calls its parameter k steps to argument k.
|
|
3083
|
-
(0,
|
|
3243
|
+
(0, import_datalog6.rule)(
|
|
3084
3244
|
"hop",
|
|
3085
|
-
[(0,
|
|
3245
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("a"), VALUE_STEP],
|
|
3086
3246
|
[
|
|
3087
|
-
(0,
|
|
3088
|
-
(0,
|
|
3089
|
-
(0,
|
|
3090
|
-
(0,
|
|
3247
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")),
|
|
3248
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("f")),
|
|
3249
|
+
(0, import_datalog6.lit)("unwraps", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("k")),
|
|
3250
|
+
(0, import_datalog6.lit)("callArg", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("k"), (0, import_datalog6.variable)("a"))
|
|
3091
3251
|
],
|
|
3092
3252
|
"factory unwrap"
|
|
3093
3253
|
),
|
|
3094
3254
|
// Wrapper transparency, declared: a pack says module m's n hands back
|
|
3095
3255
|
// argument k. DESIGN.md says why the argument has to describe a value.
|
|
3096
|
-
(0,
|
|
3256
|
+
(0, import_datalog6.rule)(
|
|
3097
3257
|
"hop",
|
|
3098
|
-
[(0,
|
|
3258
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("a"), VALUE_STEP],
|
|
3099
3259
|
[
|
|
3100
|
-
(0,
|
|
3101
|
-
(0,
|
|
3102
|
-
(0,
|
|
3103
|
-
(0,
|
|
3104
|
-
(0,
|
|
3260
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")),
|
|
3261
|
+
(0, import_datalog6.lit)("comesFrom", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")),
|
|
3262
|
+
(0, import_datalog6.lit)("unwrapsByName", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("k")),
|
|
3263
|
+
(0, import_datalog6.lit)("callArg", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("k"), (0, import_datalog6.variable)("a")),
|
|
3264
|
+
(0, import_datalog6.lit)("describesValue", (0, import_datalog6.variable)("a"))
|
|
3105
3265
|
],
|
|
3106
3266
|
"declared wrapper"
|
|
3107
3267
|
),
|
|
3108
3268
|
// A container fills a parameter from the decorator a pack says
|
|
3109
3269
|
// supplies it, so the parameter is written as that decorator's call.
|
|
3110
|
-
(0,
|
|
3270
|
+
(0, import_datalog6.rule)(
|
|
3111
3271
|
"hop",
|
|
3112
|
-
[(0,
|
|
3272
|
+
[(0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("d"), VALUE_STEP],
|
|
3113
3273
|
[
|
|
3114
|
-
(0,
|
|
3115
|
-
(0,
|
|
3116
|
-
(0,
|
|
3117
|
-
(0,
|
|
3274
|
+
(0, import_datalog6.lit)("decoratedWith", (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("d")),
|
|
3275
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("d"), (0, import_datalog6.variable)("c")),
|
|
3276
|
+
(0, import_datalog6.lit)("comesFrom", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")),
|
|
3277
|
+
(0, import_datalog6.lit)("suppliesParameter", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"))
|
|
3118
3278
|
],
|
|
3119
3279
|
"supplied by a decorator"
|
|
3120
3280
|
),
|
|
3121
3281
|
// Every value but an object written with nothing in it. The demand
|
|
3122
3282
|
// rewrite refuses negation, so each kind of value gets a rule.
|
|
3123
3283
|
...[
|
|
3124
|
-
(0,
|
|
3125
|
-
(0,
|
|
3126
|
-
(0,
|
|
3127
|
-
(0,
|
|
3128
|
-
(0,
|
|
3129
|
-
].map((kind) => (0,
|
|
3284
|
+
(0, import_datalog6.lit)("func", (0, import_datalog6.variable)("a")),
|
|
3285
|
+
(0, import_datalog6.lit)("writtenValue", (0, import_datalog6.variable)("a")),
|
|
3286
|
+
(0, import_datalog6.lit)("holdsProperty", (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("x")),
|
|
3287
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")),
|
|
3288
|
+
(0, import_datalog6.lit)("stepsTo", (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("kind"))
|
|
3289
|
+
].map((kind) => (0, import_datalog6.rule)("describesValue", [(0, import_datalog6.variable)("a")], [kind])),
|
|
3130
3290
|
// The one step that runs a function forwards: a call steps to what
|
|
3131
3291
|
// the function it invokes returns.
|
|
3132
|
-
(0,
|
|
3292
|
+
(0, import_datalog6.rule)(
|
|
3133
3293
|
"hop",
|
|
3134
|
-
[(0,
|
|
3135
|
-
[(0,
|
|
3294
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("ret"), RESULT_STEP],
|
|
3295
|
+
[(0, import_datalog6.lit)("invokes", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")), (0, import_datalog6.lit)("returnsValue", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("ret"))],
|
|
3136
3296
|
"call result"
|
|
3137
3297
|
),
|
|
3138
3298
|
// A `.then` callback's first parameter is handed what the promise it
|
|
3139
3299
|
// was chained on settles to, so the parameter steps to that receiver.
|
|
3140
|
-
(0,
|
|
3300
|
+
(0, import_datalog6.rule)(
|
|
3141
3301
|
"hop",
|
|
3142
|
-
[(0,
|
|
3302
|
+
[(0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("r"), VALUE_STEP],
|
|
3143
3303
|
[
|
|
3144
|
-
(0,
|
|
3145
|
-
(0,
|
|
3146
|
-
(0,
|
|
3147
|
-
(0,
|
|
3304
|
+
(0, import_datalog6.lit)("paramOf", (0, import_datalog6.variable)("cb"), FIRST_POSITION, (0, import_datalog6.variable)("p")),
|
|
3305
|
+
(0, import_datalog6.lit)("callArg", (0, import_datalog6.variable)("t"), FIRST_POSITION, (0, import_datalog6.variable)("cb")),
|
|
3306
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("t"), (0, import_datalog6.variable)("m")),
|
|
3307
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("r"), THEN_METHOD)
|
|
3148
3308
|
],
|
|
3149
3309
|
"then gives"
|
|
3150
3310
|
),
|
|
3151
3311
|
// What a function says it gives back when its body never states a
|
|
3152
3312
|
// value. The adapter stays quiet about the annotation whenever the
|
|
3153
3313
|
// body does state one, so the two never answer the same question.
|
|
3154
|
-
(0,
|
|
3314
|
+
(0, import_datalog6.rule)(
|
|
3155
3315
|
"hop",
|
|
3156
|
-
[(0,
|
|
3316
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("cls"), RESULT_STEP],
|
|
3157
3317
|
[
|
|
3158
|
-
(0,
|
|
3159
|
-
(0,
|
|
3160
|
-
(0,
|
|
3161
|
-
(0,
|
|
3318
|
+
(0, import_datalog6.lit)("invokes", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")),
|
|
3319
|
+
(0, import_datalog6.lit)("returnsClass", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("x")),
|
|
3320
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("cls")),
|
|
3321
|
+
(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("cls"))
|
|
3162
3322
|
],
|
|
3163
3323
|
"declared return type"
|
|
3164
3324
|
),
|
|
3165
3325
|
// Where a walk gets to, under the strongest step it took: value, then
|
|
3166
3326
|
// instance, then result. The walk so far comes first, so demand stays
|
|
3167
3327
|
// on the value asked about; the README says what the other order cost.
|
|
3168
|
-
(0,
|
|
3328
|
+
(0, import_datalog6.rule)(
|
|
3169
3329
|
"reaches",
|
|
3170
|
-
[(0,
|
|
3171
|
-
[(0,
|
|
3330
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"), (0, import_datalog6.variable)("kind")],
|
|
3331
|
+
[(0, import_datalog6.lit)("stepsTo", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"), (0, import_datalog6.variable)("kind"))]
|
|
3172
3332
|
),
|
|
3173
3333
|
// A rule per pair rather than one leaving the next step's kind free. A
|
|
3174
3334
|
// free kind is a second question about the same relation, and a
|
|
3175
3335
|
// demand-driven run then derives both to answer either.
|
|
3176
3336
|
...STEP_LATTICE.map(
|
|
3177
|
-
({ soFar, next, took }) => (0,
|
|
3337
|
+
({ soFar, next, took }) => (0, import_datalog6.rule)(
|
|
3178
3338
|
"reaches",
|
|
3179
|
-
[(0,
|
|
3339
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"), took],
|
|
3180
3340
|
[
|
|
3181
|
-
(0,
|
|
3182
|
-
(0,
|
|
3341
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"), soFar),
|
|
3342
|
+
(0, import_datalog6.lit)("stepsTo", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("z"), next)
|
|
3183
3343
|
]
|
|
3184
3344
|
)
|
|
3185
3345
|
),
|
|
3186
3346
|
// A context is an allocation site, or nothing at all for a value read
|
|
3187
3347
|
// outside every site. Both are stated, so a rule that starts a walk
|
|
3188
3348
|
// binds its context from a premise rather than from a negation.
|
|
3189
|
-
(0,
|
|
3190
|
-
(0,
|
|
3349
|
+
(0, import_datalog6.rule)("context", [NO_CONTEXT], [], "no context"),
|
|
3350
|
+
(0, import_datalog6.rule)(
|
|
3191
3351
|
"context",
|
|
3192
|
-
[(0,
|
|
3193
|
-
[(0,
|
|
3352
|
+
[(0, import_datalog6.variable)("site")],
|
|
3353
|
+
[(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls"))],
|
|
3194
3354
|
"site context"
|
|
3195
3355
|
),
|
|
3196
3356
|
// The same closure, with the context the walk started under and the
|
|
3197
3357
|
// context it arrived under. It takes `hop`, because an argument and a
|
|
3198
3358
|
// property read have their own rules below.
|
|
3199
|
-
(0,
|
|
3359
|
+
(0, import_datalog6.rule)(
|
|
3200
3360
|
"reachesUnder",
|
|
3201
|
-
[(0,
|
|
3202
|
-
[(0,
|
|
3361
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("kind")],
|
|
3362
|
+
[(0, import_datalog6.lit)("context", (0, import_datalog6.variable)("c")), (0, import_datalog6.lit)("hop", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"), (0, import_datalog6.variable)("kind"))],
|
|
3203
3363
|
"under one hop"
|
|
3204
3364
|
),
|
|
3205
3365
|
...STEP_LATTICE.map(
|
|
3206
|
-
({ soFar, next, took }) => (0,
|
|
3366
|
+
({ soFar, next, took }) => (0, import_datalog6.rule)(
|
|
3207
3367
|
"reachesUnder",
|
|
3208
|
-
[(0,
|
|
3368
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z"), (0, import_datalog6.variable)("c2"), took],
|
|
3209
3369
|
[
|
|
3210
|
-
(0,
|
|
3211
|
-
(0,
|
|
3370
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("c2"), soFar),
|
|
3371
|
+
(0, import_datalog6.lit)("hop", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("z"), next)
|
|
3212
3372
|
]
|
|
3213
3373
|
)
|
|
3214
3374
|
),
|
|
3215
3375
|
// The receiver read under a site is that site. The ordinary hop from a
|
|
3216
3376
|
// receiver to its class stays in `hop`, so `self` under any context
|
|
3217
3377
|
// still comes to the class a single-answer reader wants.
|
|
3218
|
-
(0,
|
|
3378
|
+
(0, import_datalog6.rule)(
|
|
3219
3379
|
"reachesUnder",
|
|
3220
|
-
[(0,
|
|
3221
|
-
[(0,
|
|
3380
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("c"), VALUE_STEP],
|
|
3381
|
+
[(0, import_datalog6.lit)("instanceOf", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("cls")), (0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("cls"))],
|
|
3222
3382
|
"receiver is the site"
|
|
3223
3383
|
),
|
|
3224
|
-
(0,
|
|
3384
|
+
(0, import_datalog6.rule)(
|
|
3225
3385
|
"reachesUnder",
|
|
3226
|
-
[(0,
|
|
3386
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("c2"), (0, import_datalog6.variable)("c2"), (0, import_datalog6.variable)("kind")],
|
|
3227
3387
|
[
|
|
3228
|
-
(0,
|
|
3229
|
-
(0,
|
|
3230
|
-
(0,
|
|
3388
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("c2"), (0, import_datalog6.variable)("kind")),
|
|
3389
|
+
(0, import_datalog6.lit)("instanceOf", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("cls")),
|
|
3390
|
+
(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("c2"), (0, import_datalog6.variable)("cls"))
|
|
3231
3391
|
],
|
|
3232
3392
|
"reached receiver is the site"
|
|
3233
3393
|
),
|
|
3234
3394
|
// The object an expression refers to under a context. A site is an
|
|
3235
3395
|
// answer here, unlike `objectOf`, and the class an instance is one of
|
|
3236
3396
|
// is an answer only under no context.
|
|
3237
|
-
(0,
|
|
3397
|
+
(0, import_datalog6.rule)(
|
|
3238
3398
|
"objectOfUnder",
|
|
3239
|
-
[(0,
|
|
3240
|
-
[(0,
|
|
3399
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("site")],
|
|
3400
|
+
[(0, import_datalog6.lit)("context", (0, import_datalog6.variable)("c")), (0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls"))],
|
|
3241
3401
|
"site is its own object"
|
|
3242
3402
|
),
|
|
3243
|
-
(0,
|
|
3403
|
+
(0, import_datalog6.rule)(
|
|
3244
3404
|
"objectOfUnder",
|
|
3245
|
-
[(0,
|
|
3405
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("site")],
|
|
3246
3406
|
[
|
|
3247
|
-
(0,
|
|
3248
|
-
(0,
|
|
3407
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("c2"), VALUE_STEP),
|
|
3408
|
+
(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls"))
|
|
3249
3409
|
],
|
|
3250
3410
|
"name of a site"
|
|
3251
3411
|
),
|
|
3252
|
-
(0,
|
|
3412
|
+
(0, import_datalog6.rule)(
|
|
3253
3413
|
"objectOfUnder",
|
|
3254
|
-
[(0,
|
|
3414
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("obj")],
|
|
3255
3415
|
[
|
|
3256
|
-
(0,
|
|
3257
|
-
(0,
|
|
3416
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("c2"), VALUE_STEP),
|
|
3417
|
+
(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("obj"))
|
|
3258
3418
|
],
|
|
3259
3419
|
"written object under a context"
|
|
3260
3420
|
),
|
|
3261
|
-
(0,
|
|
3421
|
+
(0, import_datalog6.rule)(
|
|
3262
3422
|
"objectOfUnder",
|
|
3263
|
-
[(0,
|
|
3423
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("obj")],
|
|
3264
3424
|
[
|
|
3265
|
-
(0,
|
|
3266
|
-
(0,
|
|
3425
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("c2"), RESULT_STEP),
|
|
3426
|
+
(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("obj"))
|
|
3267
3427
|
],
|
|
3268
3428
|
"returned object under a context"
|
|
3269
3429
|
),
|
|
3270
|
-
(0,
|
|
3430
|
+
(0, import_datalog6.rule)(
|
|
3271
3431
|
"objectOfUnder",
|
|
3272
|
-
[(0,
|
|
3432
|
+
[(0, import_datalog6.variable)("o"), NO_CONTEXT, (0, import_datalog6.variable)("cls")],
|
|
3273
3433
|
[
|
|
3274
|
-
(0,
|
|
3434
|
+
(0, import_datalog6.lit)(
|
|
3275
3435
|
"reachesUnder",
|
|
3276
|
-
(0,
|
|
3436
|
+
(0, import_datalog6.variable)("o"),
|
|
3277
3437
|
NO_CONTEXT,
|
|
3278
|
-
(0,
|
|
3438
|
+
(0, import_datalog6.variable)("cls"),
|
|
3279
3439
|
NO_CONTEXT,
|
|
3280
3440
|
INSTANCE_STEP
|
|
3281
3441
|
),
|
|
3282
|
-
(0,
|
|
3442
|
+
(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("cls"))
|
|
3283
3443
|
],
|
|
3284
3444
|
"class reached with no context"
|
|
3285
3445
|
),
|
|
3286
|
-
(0,
|
|
3446
|
+
(0, import_datalog6.rule)(
|
|
3287
3447
|
"objectOfUnder",
|
|
3288
|
-
[(0,
|
|
3289
|
-
[(0,
|
|
3448
|
+
[(0, import_datalog6.variable)("o"), NO_CONTEXT, (0, import_datalog6.variable)("cls")],
|
|
3449
|
+
[(0, import_datalog6.lit)("instanceOf", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("cls"))],
|
|
3290
3450
|
"receiver class with no context"
|
|
3291
3451
|
),
|
|
3292
|
-
(0,
|
|
3452
|
+
(0, import_datalog6.rule)(
|
|
3293
3453
|
"objectOfUnder",
|
|
3294
|
-
[(0,
|
|
3295
|
-
[(0,
|
|
3454
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("o")],
|
|
3455
|
+
[(0, import_datalog6.lit)("context", (0, import_datalog6.variable)("c")), (0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("o"))],
|
|
3296
3456
|
"object under a context is itself"
|
|
3297
3457
|
),
|
|
3298
3458
|
// A property read goes on under the site the object was made at, so a
|
|
3299
3459
|
// field read off two constructions gives each one its own value. A
|
|
3300
3460
|
// class or a literal object keeps the context the walk was already in.
|
|
3301
|
-
(0,
|
|
3461
|
+
(0, import_datalog6.rule)(
|
|
3302
3462
|
"reachesUnder",
|
|
3303
|
-
[(0,
|
|
3463
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("held"), (0, import_datalog6.variable)("site"), VALUE_STEP],
|
|
3304
3464
|
[
|
|
3305
|
-
(0,
|
|
3306
|
-
(0,
|
|
3307
|
-
(0,
|
|
3308
|
-
(0,
|
|
3309
|
-
(0,
|
|
3465
|
+
(0, import_datalog6.lit)("context", (0, import_datalog6.variable)("c")),
|
|
3466
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")),
|
|
3467
|
+
(0, import_datalog6.lit)("objectOfUnder", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("site")),
|
|
3468
|
+
(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls")),
|
|
3469
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
3310
3470
|
],
|
|
3311
3471
|
"property read at a site"
|
|
3312
3472
|
),
|
|
3313
|
-
(0,
|
|
3473
|
+
(0, import_datalog6.rule)(
|
|
3314
3474
|
"reachesUnder",
|
|
3315
|
-
[(0,
|
|
3475
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("held"), (0, import_datalog6.variable)("c"), VALUE_STEP],
|
|
3316
3476
|
[
|
|
3317
|
-
(0,
|
|
3318
|
-
(0,
|
|
3319
|
-
(0,
|
|
3320
|
-
(0,
|
|
3321
|
-
(0,
|
|
3477
|
+
(0, import_datalog6.lit)("context", (0, import_datalog6.variable)("c")),
|
|
3478
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")),
|
|
3479
|
+
(0, import_datalog6.lit)("objectOfUnder", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("obj")),
|
|
3480
|
+
(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("obj")),
|
|
3481
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
3322
3482
|
],
|
|
3323
3483
|
"property read off an object"
|
|
3324
3484
|
),
|
|
3325
|
-
(0,
|
|
3485
|
+
(0, import_datalog6.rule)(
|
|
3326
3486
|
"reachesUnder",
|
|
3327
|
-
[(0,
|
|
3487
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("held"), (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("kind")],
|
|
3328
3488
|
[
|
|
3329
|
-
(0,
|
|
3330
|
-
(0,
|
|
3331
|
-
(0,
|
|
3332
|
-
(0,
|
|
3333
|
-
(0,
|
|
3489
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("c2"), (0, import_datalog6.variable)("kind")),
|
|
3490
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")),
|
|
3491
|
+
(0, import_datalog6.lit)("objectOfUnder", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c2"), (0, import_datalog6.variable)("site")),
|
|
3492
|
+
(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls")),
|
|
3493
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
3334
3494
|
],
|
|
3335
3495
|
"reached property read at a site"
|
|
3336
3496
|
),
|
|
3337
|
-
(0,
|
|
3497
|
+
(0, import_datalog6.rule)(
|
|
3338
3498
|
"reachesUnder",
|
|
3339
|
-
[(0,
|
|
3499
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("held"), (0, import_datalog6.variable)("c2"), (0, import_datalog6.variable)("kind")],
|
|
3340
3500
|
[
|
|
3341
|
-
(0,
|
|
3342
|
-
(0,
|
|
3343
|
-
(0,
|
|
3344
|
-
(0,
|
|
3345
|
-
(0,
|
|
3501
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("c2"), (0, import_datalog6.variable)("kind")),
|
|
3502
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")),
|
|
3503
|
+
(0, import_datalog6.lit)("objectOfUnder", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("c2"), (0, import_datalog6.variable)("obj")),
|
|
3504
|
+
(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("obj")),
|
|
3505
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
3346
3506
|
],
|
|
3347
3507
|
"reached property read off an object"
|
|
3348
3508
|
),
|
|
3349
3509
|
// A parameter goes on at the argument, under the context its caller
|
|
3350
3510
|
// was read in, and only from the calls that run the function under the
|
|
3351
3511
|
// context the walk is in. This is the one hop that changes context.
|
|
3352
|
-
(0,
|
|
3512
|
+
(0, import_datalog6.rule)(
|
|
3353
3513
|
"reachesUnder",
|
|
3354
|
-
[(0,
|
|
3514
|
+
[(0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("c3"), VALUE_STEP],
|
|
3355
3515
|
[
|
|
3356
|
-
(0,
|
|
3357
|
-
(0,
|
|
3358
|
-
(0,
|
|
3359
|
-
(0,
|
|
3516
|
+
(0, import_datalog6.lit)("context", (0, import_datalog6.variable)("c")),
|
|
3517
|
+
(0, import_datalog6.lit)("paramOf", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("i"), (0, import_datalog6.variable)("p")),
|
|
3518
|
+
(0, import_datalog6.lit)("entersUnder", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("c3")),
|
|
3519
|
+
(0, import_datalog6.lit)("callArg", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("i"), (0, import_datalog6.variable)("a"))
|
|
3360
3520
|
],
|
|
3361
3521
|
"argument under a context"
|
|
3362
3522
|
),
|
|
3363
|
-
(0,
|
|
3523
|
+
(0, import_datalog6.rule)(
|
|
3364
3524
|
"reachesUnder",
|
|
3365
|
-
[(0,
|
|
3525
|
+
[(0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("c3"), VALUE_STEP],
|
|
3366
3526
|
[
|
|
3367
|
-
(0,
|
|
3368
|
-
(0,
|
|
3369
|
-
(0,
|
|
3370
|
-
(0,
|
|
3527
|
+
(0, import_datalog6.lit)("context", (0, import_datalog6.variable)("c")),
|
|
3528
|
+
(0, import_datalog6.lit)("paramNamed", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("p")),
|
|
3529
|
+
(0, import_datalog6.lit)("entersUnder", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("c3")),
|
|
3530
|
+
(0, import_datalog6.lit)("callKeywordArg", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("a"))
|
|
3371
3531
|
],
|
|
3372
3532
|
"keyword argument under a context"
|
|
3373
3533
|
),
|
|
3374
|
-
(0,
|
|
3534
|
+
(0, import_datalog6.rule)(
|
|
3375
3535
|
"reachesUnder",
|
|
3376
|
-
[(0,
|
|
3536
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("c3"), (0, import_datalog6.variable)("kind")],
|
|
3377
3537
|
[
|
|
3378
|
-
(0,
|
|
3379
|
-
(0,
|
|
3380
|
-
(0,
|
|
3381
|
-
(0,
|
|
3538
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("c2"), (0, import_datalog6.variable)("kind")),
|
|
3539
|
+
(0, import_datalog6.lit)("paramOf", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("i"), (0, import_datalog6.variable)("p")),
|
|
3540
|
+
(0, import_datalog6.lit)("entersUnder", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c2"), (0, import_datalog6.variable)("c3")),
|
|
3541
|
+
(0, import_datalog6.lit)("callArg", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("i"), (0, import_datalog6.variable)("a"))
|
|
3382
3542
|
],
|
|
3383
3543
|
"reached argument under a context"
|
|
3384
3544
|
),
|
|
3385
|
-
(0,
|
|
3545
|
+
(0, import_datalog6.rule)(
|
|
3386
3546
|
"reachesUnder",
|
|
3387
|
-
[(0,
|
|
3547
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("c3"), (0, import_datalog6.variable)("kind")],
|
|
3388
3548
|
[
|
|
3389
|
-
(0,
|
|
3390
|
-
(0,
|
|
3391
|
-
(0,
|
|
3392
|
-
(0,
|
|
3549
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("c2"), (0, import_datalog6.variable)("kind")),
|
|
3550
|
+
(0, import_datalog6.lit)("paramNamed", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("p")),
|
|
3551
|
+
(0, import_datalog6.lit)("entersUnder", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c2"), (0, import_datalog6.variable)("c3")),
|
|
3552
|
+
(0, import_datalog6.lit)("callKeywordArg", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("a"))
|
|
3393
3553
|
],
|
|
3394
3554
|
"reached keyword argument under a context"
|
|
3395
3555
|
),
|
|
3396
3556
|
// Which call runs which function under which context. A construction
|
|
3397
3557
|
// runs its constructor under the site it makes, a method call runs
|
|
3398
3558
|
// under the site its receiver is, and anything else under no context.
|
|
3399
|
-
(0,
|
|
3559
|
+
(0, import_datalog6.rule)(
|
|
3400
3560
|
"entersUnder",
|
|
3401
|
-
[(0,
|
|
3561
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("ctor"), (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("caller")],
|
|
3402
3562
|
[
|
|
3403
|
-
(0,
|
|
3404
|
-
(0,
|
|
3405
|
-
(0,
|
|
3563
|
+
(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls")),
|
|
3564
|
+
(0, import_datalog6.lit)("runsConstructor", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("ctor")),
|
|
3565
|
+
(0, import_datalog6.lit)("callUnder", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("caller"))
|
|
3406
3566
|
],
|
|
3407
3567
|
"construction enters its constructor"
|
|
3408
3568
|
),
|
|
3409
3569
|
// When methodCallUnder and objectOfUnder bind as many columns, as they do
|
|
3410
3570
|
// once contains has run, the rewrite joins the one written first. This
|
|
3411
3571
|
// order reads the receiver under the call's own sites, not every site.
|
|
3412
|
-
(0,
|
|
3572
|
+
(0, import_datalog6.rule)(
|
|
3413
3573
|
"entersUnder",
|
|
3414
|
-
[(0,
|
|
3574
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("caller")],
|
|
3415
3575
|
[
|
|
3416
|
-
(0,
|
|
3417
|
-
(0,
|
|
3418
|
-
(0,
|
|
3419
|
-
(0,
|
|
3576
|
+
(0, import_datalog6.lit)("methodCallUnder", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("caller")),
|
|
3577
|
+
(0, import_datalog6.lit)("objectOfUnder", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("caller"), (0, import_datalog6.variable)("site")),
|
|
3578
|
+
(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls")),
|
|
3579
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("f"))
|
|
3420
3580
|
],
|
|
3421
3581
|
"method call enters under its receiver"
|
|
3422
3582
|
),
|
|
3423
|
-
(0,
|
|
3583
|
+
(0, import_datalog6.rule)(
|
|
3424
3584
|
"methodCallUnder",
|
|
3425
|
-
[(0,
|
|
3585
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("caller")],
|
|
3426
3586
|
[
|
|
3427
|
-
(0,
|
|
3428
|
-
(0,
|
|
3429
|
-
(0,
|
|
3587
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("cal")),
|
|
3588
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("cal"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("m")),
|
|
3589
|
+
(0, import_datalog6.lit)("callUnder", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("caller"))
|
|
3430
3590
|
]
|
|
3431
3591
|
),
|
|
3432
3592
|
// A call written as a name runs with whatever receiver the body
|
|
3433
3593
|
// around it has, so a plain function called from a method keeps the
|
|
3434
3594
|
// site rather than taking every caller of it.
|
|
3435
|
-
(0,
|
|
3595
|
+
(0, import_datalog6.rule)(
|
|
3436
3596
|
"entersUnder",
|
|
3437
|
-
[(0,
|
|
3597
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("c")],
|
|
3438
3598
|
[
|
|
3439
|
-
(0,
|
|
3440
|
-
(0,
|
|
3441
|
-
(0,
|
|
3599
|
+
(0, import_datalog6.lit)("context", (0, import_datalog6.variable)("c")),
|
|
3600
|
+
(0, import_datalog6.lit)("callsNamed", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")),
|
|
3601
|
+
(0, import_datalog6.lit)("callUnder", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c"))
|
|
3442
3602
|
],
|
|
3443
3603
|
"named call enters under the site it is made in"
|
|
3444
3604
|
),
|
|
3445
|
-
(0,
|
|
3605
|
+
(0, import_datalog6.rule)(
|
|
3446
3606
|
"entersUnder",
|
|
3447
|
-
[(0,
|
|
3607
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f"), NO_CONTEXT, (0, import_datalog6.variable)("caller")],
|
|
3448
3608
|
[
|
|
3449
|
-
(0,
|
|
3450
|
-
(0,
|
|
3609
|
+
(0, import_datalog6.lit)("callsFunction", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")),
|
|
3610
|
+
(0, import_datalog6.lit)("callUnder", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("caller"))
|
|
3451
3611
|
],
|
|
3452
3612
|
"call enters with no context"
|
|
3453
3613
|
),
|
|
3454
3614
|
// The constructor a construction runs, the ancestry included, so a
|
|
3455
3615
|
// subclass that declares none still fills in what it inherits.
|
|
3456
|
-
(0,
|
|
3616
|
+
(0, import_datalog6.rule)(
|
|
3457
3617
|
"runsConstructor",
|
|
3458
|
-
[(0,
|
|
3459
|
-
[(0,
|
|
3618
|
+
[(0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("f")],
|
|
3619
|
+
[(0, import_datalog6.lit)("initializes", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("f"))]
|
|
3460
3620
|
),
|
|
3461
|
-
(0,
|
|
3621
|
+
(0, import_datalog6.rule)(
|
|
3462
3622
|
"runsConstructor",
|
|
3463
|
-
[(0,
|
|
3623
|
+
[(0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("f")],
|
|
3464
3624
|
[
|
|
3465
|
-
(0,
|
|
3466
|
-
(0,
|
|
3467
|
-
(0,
|
|
3625
|
+
(0, import_datalog6.lit)("extends", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("b")),
|
|
3626
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("b"), (0, import_datalog6.variable)("base")),
|
|
3627
|
+
(0, import_datalog6.lit)("runsConstructor", (0, import_datalog6.variable)("base"), (0, import_datalog6.variable)("f"))
|
|
3468
3628
|
]
|
|
3469
3629
|
),
|
|
3470
3630
|
// Which body a call is written in, a closure's calls included. Joining
|
|
3471
3631
|
// `bodyCalls` on the callee would put every call of a bare name in
|
|
3472
3632
|
// Python or Ruby in every body that calls that name.
|
|
3473
|
-
(0,
|
|
3474
|
-
(0,
|
|
3633
|
+
(0, import_datalog6.rule)("callInBody", [(0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("r")], [(0, import_datalog6.lit)("makesCall", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("r"))]),
|
|
3634
|
+
(0, import_datalog6.rule)(
|
|
3475
3635
|
"callInBody",
|
|
3476
|
-
[(0,
|
|
3477
|
-
[(0,
|
|
3636
|
+
[(0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("r")],
|
|
3637
|
+
[(0, import_datalog6.lit)("containsFn", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("g")), (0, import_datalog6.lit)("callInBody", (0, import_datalog6.variable)("g"), (0, import_datalog6.variable)("r"))]
|
|
3478
3638
|
),
|
|
3479
3639
|
// The context a call is made under: every site of the class whose
|
|
3480
3640
|
// method or constructor it is written in, and no context for a call
|
|
3481
3641
|
// outside every method body.
|
|
3482
|
-
(0,
|
|
3642
|
+
(0, import_datalog6.rule)(
|
|
3483
3643
|
"callUnder",
|
|
3484
|
-
[(0,
|
|
3644
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")],
|
|
3485
3645
|
[
|
|
3486
|
-
(0,
|
|
3487
|
-
(0,
|
|
3488
|
-
(0,
|
|
3646
|
+
(0, import_datalog6.lit)("callInBody", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("r")),
|
|
3647
|
+
(0, import_datalog6.lit)("holdsProperty", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("f")),
|
|
3648
|
+
(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls"))
|
|
3489
3649
|
],
|
|
3490
3650
|
"call in a method"
|
|
3491
3651
|
),
|
|
3492
|
-
(0,
|
|
3652
|
+
(0, import_datalog6.rule)(
|
|
3493
3653
|
"callUnder",
|
|
3494
|
-
[(0,
|
|
3654
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")],
|
|
3495
3655
|
[
|
|
3496
|
-
(0,
|
|
3497
|
-
(0,
|
|
3498
|
-
(0,
|
|
3656
|
+
(0, import_datalog6.lit)("callInBody", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("r")),
|
|
3657
|
+
(0, import_datalog6.lit)("initializes", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("f")),
|
|
3658
|
+
(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls"))
|
|
3499
3659
|
],
|
|
3500
3660
|
"call in a constructor"
|
|
3501
3661
|
),
|
|
3502
3662
|
// A plain function entered under a site makes its own calls under
|
|
3503
3663
|
// that site, so a chain of plain functions off one method keeps it.
|
|
3504
|
-
(0,
|
|
3664
|
+
(0, import_datalog6.rule)(
|
|
3505
3665
|
"callUnder",
|
|
3506
|
-
[(0,
|
|
3666
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")],
|
|
3507
3667
|
[
|
|
3508
|
-
(0,
|
|
3509
|
-
(0,
|
|
3510
|
-
(0,
|
|
3668
|
+
(0, import_datalog6.lit)("callOutsideMethod", (0, import_datalog6.variable)("r")),
|
|
3669
|
+
(0, import_datalog6.lit)("callInBody", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("r")),
|
|
3670
|
+
(0, import_datalog6.lit)("entersUnder", (0, import_datalog6.variable)("into"), (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("c4"))
|
|
3511
3671
|
],
|
|
3512
3672
|
"call in a function entered under a site"
|
|
3513
3673
|
),
|
|
3514
|
-
(0,
|
|
3674
|
+
(0, import_datalog6.rule)(
|
|
3515
3675
|
"callUnder",
|
|
3516
|
-
[(0,
|
|
3517
|
-
[(0,
|
|
3676
|
+
[(0, import_datalog6.variable)("r"), NO_CONTEXT],
|
|
3677
|
+
[(0, import_datalog6.lit)("callOutsideMethod", (0, import_datalog6.variable)("r"))],
|
|
3518
3678
|
"call outside every method"
|
|
3519
3679
|
),
|
|
3520
3680
|
// The two questions a caller puts under a context, stopping where
|
|
3521
3681
|
// `isWrittenAs` and `comesTo` stop, whatever context the walk ended in.
|
|
3522
|
-
(0,
|
|
3682
|
+
(0, import_datalog6.rule)(
|
|
3523
3683
|
"isWrittenAsUnder",
|
|
3524
|
-
[(0,
|
|
3525
|
-
[(0,
|
|
3684
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("x")],
|
|
3685
|
+
[(0, import_datalog6.lit)("context", (0, import_datalog6.variable)("c")), (0, import_datalog6.lit)("writtenValue", (0, import_datalog6.variable)("x"))]
|
|
3526
3686
|
),
|
|
3527
|
-
(0,
|
|
3687
|
+
(0, import_datalog6.rule)(
|
|
3528
3688
|
"isWrittenAsUnder",
|
|
3529
|
-
[(0,
|
|
3530
|
-
[(0,
|
|
3689
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("x")],
|
|
3690
|
+
[(0, import_datalog6.lit)("context", (0, import_datalog6.variable)("c")), (0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("x"))]
|
|
3531
3691
|
),
|
|
3532
|
-
(0,
|
|
3692
|
+
(0, import_datalog6.rule)(
|
|
3533
3693
|
"isWrittenAsUnder",
|
|
3534
|
-
[(0,
|
|
3694
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z")],
|
|
3535
3695
|
[
|
|
3536
|
-
(0,
|
|
3537
|
-
(0,
|
|
3696
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z"), (0, import_datalog6.variable)("c2"), VALUE_STEP),
|
|
3697
|
+
(0, import_datalog6.lit)("writtenValue", (0, import_datalog6.variable)("z"))
|
|
3538
3698
|
]
|
|
3539
3699
|
),
|
|
3540
|
-
(0,
|
|
3700
|
+
(0, import_datalog6.rule)(
|
|
3541
3701
|
"isWrittenAsUnder",
|
|
3542
|
-
[(0,
|
|
3702
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z")],
|
|
3543
3703
|
[
|
|
3544
|
-
(0,
|
|
3545
|
-
(0,
|
|
3704
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z"), (0, import_datalog6.variable)("c2"), VALUE_STEP),
|
|
3705
|
+
(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("z"))
|
|
3546
3706
|
]
|
|
3547
3707
|
),
|
|
3548
3708
|
// The fallbacks a value passes under a context, so a value reader treats
|
|
3549
3709
|
// `a or b` the same way whichever path asked about it.
|
|
3550
|
-
(0,
|
|
3710
|
+
(0, import_datalog6.rule)(
|
|
3551
3711
|
"fallbackBehindUnder",
|
|
3552
|
-
[(0,
|
|
3553
|
-
[(0,
|
|
3712
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("x")],
|
|
3713
|
+
[(0, import_datalog6.lit)("context", (0, import_datalog6.variable)("c")), (0, import_datalog6.lit)("fallbackBranch", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("b"))]
|
|
3554
3714
|
),
|
|
3555
|
-
(0,
|
|
3715
|
+
(0, import_datalog6.rule)(
|
|
3556
3716
|
"fallbackBehindUnder",
|
|
3557
|
-
[(0,
|
|
3717
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("f")],
|
|
3558
3718
|
[
|
|
3559
|
-
(0,
|
|
3560
|
-
(0,
|
|
3719
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c2"), VALUE_STEP),
|
|
3720
|
+
(0, import_datalog6.lit)("fallbackBranch", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("b"))
|
|
3561
3721
|
]
|
|
3562
3722
|
),
|
|
3563
|
-
(0,
|
|
3723
|
+
(0, import_datalog6.rule)(
|
|
3564
3724
|
"comesToUnder",
|
|
3565
|
-
[(0,
|
|
3566
|
-
[(0,
|
|
3725
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("x")],
|
|
3726
|
+
[(0, import_datalog6.lit)("context", (0, import_datalog6.variable)("c")), (0, import_datalog6.lit)("func", (0, import_datalog6.variable)("x"))]
|
|
3567
3727
|
),
|
|
3568
|
-
(0,
|
|
3728
|
+
(0, import_datalog6.rule)(
|
|
3569
3729
|
"comesToUnder",
|
|
3570
|
-
[(0,
|
|
3571
|
-
[(0,
|
|
3730
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("x")],
|
|
3731
|
+
[(0, import_datalog6.lit)("context", (0, import_datalog6.variable)("c")), (0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("x"))]
|
|
3572
3732
|
),
|
|
3573
|
-
(0,
|
|
3733
|
+
(0, import_datalog6.rule)(
|
|
3574
3734
|
"comesToUnder",
|
|
3575
|
-
[(0,
|
|
3735
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z")],
|
|
3576
3736
|
[
|
|
3577
|
-
(0,
|
|
3578
|
-
(0,
|
|
3737
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z"), (0, import_datalog6.variable)("c2"), VALUE_STEP),
|
|
3738
|
+
(0, import_datalog6.lit)("func", (0, import_datalog6.variable)("z"))
|
|
3579
3739
|
]
|
|
3580
3740
|
),
|
|
3581
|
-
(0,
|
|
3741
|
+
(0, import_datalog6.rule)(
|
|
3582
3742
|
"comesToUnder",
|
|
3583
|
-
[(0,
|
|
3743
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z")],
|
|
3584
3744
|
[
|
|
3585
|
-
(0,
|
|
3586
|
-
(0,
|
|
3745
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z"), (0, import_datalog6.variable)("c2"), VALUE_STEP),
|
|
3746
|
+
(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("z"))
|
|
3587
3747
|
]
|
|
3588
3748
|
),
|
|
3589
|
-
(0,
|
|
3749
|
+
(0, import_datalog6.rule)(
|
|
3590
3750
|
"comesToUnder",
|
|
3591
|
-
[(0,
|
|
3751
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z")],
|
|
3592
3752
|
[
|
|
3593
|
-
(0,
|
|
3594
|
-
(0,
|
|
3753
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z"), (0, import_datalog6.variable)("c2"), INSTANCE_STEP),
|
|
3754
|
+
(0, import_datalog6.lit)("func", (0, import_datalog6.variable)("z"))
|
|
3595
3755
|
]
|
|
3596
3756
|
),
|
|
3597
|
-
(0,
|
|
3757
|
+
(0, import_datalog6.rule)(
|
|
3598
3758
|
"comesToUnder",
|
|
3599
|
-
[(0,
|
|
3759
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z")],
|
|
3600
3760
|
[
|
|
3601
|
-
(0,
|
|
3602
|
-
(0,
|
|
3761
|
+
(0, import_datalog6.lit)("reachesUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z"), (0, import_datalog6.variable)("c2"), INSTANCE_STEP),
|
|
3762
|
+
(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("z"))
|
|
3603
3763
|
]
|
|
3604
3764
|
),
|
|
3605
3765
|
// What a value comes down to: the walk that never ran a call, stopped
|
|
3606
3766
|
// at a function or an object. Something already written out comes to
|
|
3607
3767
|
// itself, and every other walk ends at one of those.
|
|
3608
|
-
(0,
|
|
3609
|
-
(0,
|
|
3610
|
-
(0,
|
|
3768
|
+
(0, import_datalog6.rule)("comesTo", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("x")], [(0, import_datalog6.lit)("func", (0, import_datalog6.variable)("x"))]),
|
|
3769
|
+
(0, import_datalog6.rule)("comesTo", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("x")], [(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("x"))]),
|
|
3770
|
+
(0, import_datalog6.rule)(
|
|
3611
3771
|
"comesTo",
|
|
3612
|
-
[(0,
|
|
3613
|
-
[(0,
|
|
3772
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
3773
|
+
[(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"), VALUE_STEP), (0, import_datalog6.lit)("func", (0, import_datalog6.variable)("z"))]
|
|
3614
3774
|
),
|
|
3615
|
-
(0,
|
|
3775
|
+
(0, import_datalog6.rule)(
|
|
3616
3776
|
"comesTo",
|
|
3617
|
-
[(0,
|
|
3618
|
-
[(0,
|
|
3777
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
3778
|
+
[(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"), VALUE_STEP), (0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("z"))]
|
|
3619
3779
|
),
|
|
3620
3780
|
// An instance walk stops the same way, so a method read off
|
|
3621
3781
|
// `new App()` still finds what the class declares.
|
|
3622
|
-
(0,
|
|
3782
|
+
(0, import_datalog6.rule)(
|
|
3623
3783
|
"comesTo",
|
|
3624
|
-
[(0,
|
|
3625
|
-
[(0,
|
|
3784
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
3785
|
+
[(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"), INSTANCE_STEP), (0, import_datalog6.lit)("func", (0, import_datalog6.variable)("z"))]
|
|
3626
3786
|
),
|
|
3627
|
-
(0,
|
|
3787
|
+
(0, import_datalog6.rule)(
|
|
3628
3788
|
"comesTo",
|
|
3629
|
-
[(0,
|
|
3630
|
-
[(0,
|
|
3789
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
3790
|
+
[(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"), INSTANCE_STEP), (0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("z"))]
|
|
3631
3791
|
),
|
|
3632
3792
|
// The same stopping condition, for the walk that ran a call. A call
|
|
3633
3793
|
// gets no `comesTo` answer on purpose: coming back with what a
|
|
3634
3794
|
// factory returned would fight the unwrapping answer.
|
|
3635
|
-
(0,
|
|
3795
|
+
(0, import_datalog6.rule)(
|
|
3636
3796
|
"givesBack",
|
|
3637
|
-
[(0,
|
|
3638
|
-
[(0,
|
|
3797
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
3798
|
+
[(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"), RESULT_STEP), (0, import_datalog6.lit)("func", (0, import_datalog6.variable)("z"))]
|
|
3639
3799
|
),
|
|
3640
|
-
(0,
|
|
3800
|
+
(0, import_datalog6.rule)(
|
|
3641
3801
|
"givesBack",
|
|
3642
|
-
[(0,
|
|
3643
|
-
[(0,
|
|
3802
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
3803
|
+
[(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"), RESULT_STEP), (0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("z"))]
|
|
3644
3804
|
),
|
|
3645
3805
|
// `(c) => asyncHandler(fn)` gives back the wrapper's own closure and
|
|
3646
3806
|
// the fn it unwraps. This is the unwrapped one, which a caller prefers
|
|
3647
3807
|
// for the same reason `comesTo` wins over `givesBack` on the call.
|
|
3648
|
-
(0,
|
|
3808
|
+
(0, import_datalog6.rule)(
|
|
3649
3809
|
"givesBackUnwrapped",
|
|
3650
|
-
[(0,
|
|
3810
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
3651
3811
|
[
|
|
3652
|
-
(0,
|
|
3653
|
-
(0,
|
|
3654
|
-
(0,
|
|
3655
|
-
(0,
|
|
3812
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r"), RESULT_STEP),
|
|
3813
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")),
|
|
3814
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("z")),
|
|
3815
|
+
(0, import_datalog6.lit)("func", (0, import_datalog6.variable)("z"))
|
|
3656
3816
|
]
|
|
3657
3817
|
),
|
|
3658
3818
|
// Following a value to the expression it is written as, whatever kind
|
|
3659
3819
|
// that is. A GraphQL document is neither a function nor an object, so
|
|
3660
3820
|
// `comesTo` never reaches one.
|
|
3661
|
-
(0,
|
|
3662
|
-
(0,
|
|
3663
|
-
(0,
|
|
3821
|
+
(0, import_datalog6.rule)("isWrittenAs", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("x")], [(0, import_datalog6.lit)("writtenValue", (0, import_datalog6.variable)("x"))]),
|
|
3822
|
+
(0, import_datalog6.rule)("isWrittenAs", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("x")], [(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("x"))]),
|
|
3823
|
+
(0, import_datalog6.rule)(
|
|
3664
3824
|
"isWrittenAs",
|
|
3665
|
-
[(0,
|
|
3666
|
-
[(0,
|
|
3825
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
3826
|
+
[(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"), VALUE_STEP), (0, import_datalog6.lit)("writtenValue", (0, import_datalog6.variable)("z"))]
|
|
3667
3827
|
),
|
|
3668
|
-
(0,
|
|
3828
|
+
(0, import_datalog6.rule)(
|
|
3669
3829
|
"isWrittenAs",
|
|
3670
|
-
[(0,
|
|
3671
|
-
[(0,
|
|
3830
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
3831
|
+
[(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"), VALUE_STEP), (0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("z"))]
|
|
3672
3832
|
),
|
|
3673
3833
|
// A call is written as whatever its callee's return value is written
|
|
3674
3834
|
// as. Unlike `comesTo`, this has nothing to protect: which expression
|
|
3675
3835
|
// a value was written as does not compete with unwrapping it.
|
|
3676
|
-
(0,
|
|
3836
|
+
(0, import_datalog6.rule)(
|
|
3677
3837
|
"isWrittenAs",
|
|
3678
|
-
[(0,
|
|
3838
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
3679
3839
|
[
|
|
3680
|
-
(0,
|
|
3681
|
-
(0,
|
|
3682
|
-
(0,
|
|
3840
|
+
(0, import_datalog6.lit)("invokes", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("f")),
|
|
3841
|
+
(0, import_datalog6.lit)("returnsValue", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("ret")),
|
|
3842
|
+
(0, import_datalog6.lit)("isWrittenAs", (0, import_datalog6.variable)("ret"), (0, import_datalog6.variable)("z"))
|
|
3683
3843
|
]
|
|
3684
3844
|
),
|
|
3685
3845
|
// The fallbacks, `a || b`, a value passes on the way to what it is
|
|
3686
3846
|
// written as. A reader of values takes one whole when every answer came
|
|
3687
3847
|
// through it, so the reader's own `||` decides which branches count.
|
|
3688
|
-
(0,
|
|
3848
|
+
(0, import_datalog6.rule)(
|
|
3689
3849
|
"fallbackBehind",
|
|
3690
|
-
[(0,
|
|
3691
|
-
[(0,
|
|
3850
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("x")],
|
|
3851
|
+
[(0, import_datalog6.lit)("fallbackBranch", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("b"))]
|
|
3692
3852
|
),
|
|
3693
|
-
(0,
|
|
3853
|
+
(0, import_datalog6.rule)(
|
|
3694
3854
|
"fallbackBehind",
|
|
3695
|
-
[(0,
|
|
3855
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("f")],
|
|
3696
3856
|
[
|
|
3697
|
-
(0,
|
|
3698
|
-
(0,
|
|
3857
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("f"), VALUE_STEP),
|
|
3858
|
+
(0, import_datalog6.lit)("fallbackBranch", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("b"))
|
|
3699
3859
|
]
|
|
3700
3860
|
),
|
|
3701
|
-
(0,
|
|
3861
|
+
(0, import_datalog6.rule)(
|
|
3702
3862
|
"fallbackBehind",
|
|
3703
|
-
[(0,
|
|
3863
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("f")],
|
|
3704
3864
|
[
|
|
3705
|
-
(0,
|
|
3706
|
-
(0,
|
|
3707
|
-
(0,
|
|
3865
|
+
(0, import_datalog6.lit)("invokes", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("g")),
|
|
3866
|
+
(0, import_datalog6.lit)("returnsValue", (0, import_datalog6.variable)("g"), (0, import_datalog6.variable)("ret")),
|
|
3867
|
+
(0, import_datalog6.lit)("fallbackBehind", (0, import_datalog6.variable)("ret"), (0, import_datalog6.variable)("f"))
|
|
3708
3868
|
]
|
|
3709
3869
|
),
|
|
3710
3870
|
// Which expression running f hands back, whether f returns it, writes
|
|
3711
3871
|
// it into a name first, or ends on it as a shorthand body.
|
|
3712
|
-
(0,
|
|
3872
|
+
(0, import_datalog6.rule)(
|
|
3713
3873
|
"returnsCall",
|
|
3714
|
-
[(0,
|
|
3715
|
-
[(0,
|
|
3874
|
+
[(0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c")],
|
|
3875
|
+
[(0, import_datalog6.lit)("returnsValue", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("v")), (0, import_datalog6.lit)("isWrittenAs", (0, import_datalog6.variable)("v"), (0, import_datalog6.variable)("c"))]
|
|
3716
3876
|
),
|
|
3717
3877
|
// An argument arriving at the parameter it is passed to, by position
|
|
3718
3878
|
// or by the name the caller wrote, keeping the call it went through
|
|
3719
3879
|
// so a caller can tell two call sites apart. The callee comes before the
|
|
3720
3880
|
// parameter, so a walk that starts from the argument asks which function
|
|
3721
3881
|
// its call runs instead of trying every function with a parameter there.
|
|
3722
|
-
(0,
|
|
3882
|
+
(0, import_datalog6.rule)(
|
|
3723
3883
|
"passesArgument",
|
|
3724
|
-
[(0,
|
|
3884
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("a")],
|
|
3725
3885
|
[
|
|
3726
|
-
(0,
|
|
3727
|
-
(0,
|
|
3728
|
-
(0,
|
|
3886
|
+
(0, import_datalog6.lit)("callsFunction", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")),
|
|
3887
|
+
(0, import_datalog6.lit)("paramOf", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("k"), (0, import_datalog6.variable)("p")),
|
|
3888
|
+
(0, import_datalog6.lit)("callArg", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("k"), (0, import_datalog6.variable)("a"))
|
|
3729
3889
|
]
|
|
3730
3890
|
),
|
|
3731
|
-
(0,
|
|
3891
|
+
(0, import_datalog6.rule)(
|
|
3732
3892
|
"passesArgument",
|
|
3733
|
-
[(0,
|
|
3893
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("a")],
|
|
3734
3894
|
[
|
|
3735
|
-
(0,
|
|
3736
|
-
(0,
|
|
3737
|
-
(0,
|
|
3895
|
+
(0, import_datalog6.lit)("callsFunction", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")),
|
|
3896
|
+
(0, import_datalog6.lit)("paramNamed", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("p")),
|
|
3897
|
+
(0, import_datalog6.lit)("callKeywordArg", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("a"))
|
|
3738
3898
|
]
|
|
3739
3899
|
),
|
|
3740
3900
|
// The expressions that refer to a parameter under another name. An
|
|
3741
3901
|
// adapter may key a read of the parameter as the parameter itself,
|
|
3742
3902
|
// or as its own node linked by binds; both arrive here.
|
|
3743
|
-
(0,
|
|
3903
|
+
(0, import_datalog6.rule)(
|
|
3744
3904
|
"refersToParam",
|
|
3745
|
-
[(0,
|
|
3746
|
-
[(0,
|
|
3905
|
+
[(0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("p")],
|
|
3906
|
+
[(0, import_datalog6.lit)("paramOf", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("k"), (0, import_datalog6.variable)("p"))]
|
|
3747
3907
|
),
|
|
3748
|
-
(0,
|
|
3908
|
+
(0, import_datalog6.rule)(
|
|
3749
3909
|
"refersToParam",
|
|
3750
|
-
[(0,
|
|
3751
|
-
[(0,
|
|
3910
|
+
[(0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("p")],
|
|
3911
|
+
[(0, import_datalog6.lit)("paramNamed", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("p"))]
|
|
3752
3912
|
),
|
|
3753
3913
|
// No import step, since no module exports a parameter.
|
|
3754
|
-
(0,
|
|
3914
|
+
(0, import_datalog6.rule)(
|
|
3755
3915
|
"refersToParam",
|
|
3756
|
-
[(0,
|
|
3757
|
-
[(0,
|
|
3916
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("p")],
|
|
3917
|
+
[(0, import_datalog6.lit)("refersToParam", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("p")), (0, import_datalog6.lit)("nameHop", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"))]
|
|
3758
3918
|
),
|
|
3759
3919
|
// An object the runtime provides and nothing declares: the process
|
|
3760
3920
|
// environment, or one of the process's output streams. Each is
|
|
3761
3921
|
// followed the same way, from the spot a pack says spells it.
|
|
3762
|
-
(0,
|
|
3763
|
-
(0,
|
|
3922
|
+
(0, import_datalog6.rule)("runtimeObject", [(0, import_datalog6.variable)("w")], [(0, import_datalog6.lit)("environmentObject", (0, import_datalog6.variable)("w"))]),
|
|
3923
|
+
(0, import_datalog6.rule)("runtimeObject", [(0, import_datalog6.variable)("w")], [(0, import_datalog6.lit)("streamObject", (0, import_datalog6.variable)("w"))]),
|
|
3764
3924
|
// An expression whose value is the runtime object w: the way a pack
|
|
3765
3925
|
// spells it, a name declared as that, or a parameter a caller handed
|
|
3766
3926
|
// one of those to, however many calls deep.
|
|
3767
|
-
(0,
|
|
3927
|
+
(0, import_datalog6.rule)(
|
|
3768
3928
|
"runtimeValue",
|
|
3769
|
-
[(0,
|
|
3770
|
-
[(0,
|
|
3929
|
+
[(0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("o")],
|
|
3930
|
+
[(0, import_datalog6.lit)("runtimeObject", (0, import_datalog6.variable)("w")), (0, import_datalog6.lit)("refersToObject", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("w"))]
|
|
3771
3931
|
),
|
|
3772
|
-
(0,
|
|
3932
|
+
(0, import_datalog6.rule)(
|
|
3773
3933
|
"runtimeValue",
|
|
3774
|
-
[(0,
|
|
3934
|
+
[(0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("o")],
|
|
3775
3935
|
[
|
|
3776
|
-
(0,
|
|
3777
|
-
(0,
|
|
3778
|
-
(0,
|
|
3936
|
+
(0, import_datalog6.lit)("runtimeValue", (0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("a")),
|
|
3937
|
+
(0, import_datalog6.lit)("passesArgument", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("a")),
|
|
3938
|
+
(0, import_datalog6.lit)("refersToParam", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("p"))
|
|
3779
3939
|
]
|
|
3780
3940
|
),
|
|
3781
3941
|
// A parameter that defaults to the environment, for the callers that
|
|
3782
3942
|
// pass nothing. `loadConfig(env = process.env)` is written that way
|
|
3783
3943
|
// so that most of the program never mentions the environment at all.
|
|
3784
|
-
(0,
|
|
3944
|
+
(0, import_datalog6.rule)(
|
|
3785
3945
|
"runtimeValue",
|
|
3786
|
-
[(0,
|
|
3946
|
+
[(0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("o")],
|
|
3787
3947
|
[
|
|
3788
|
-
(0,
|
|
3789
|
-
(0,
|
|
3790
|
-
(0,
|
|
3948
|
+
(0, import_datalog6.lit)("runtimeValue", (0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("d")),
|
|
3949
|
+
(0, import_datalog6.lit)("paramDefault", (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("d")),
|
|
3950
|
+
(0, import_datalog6.lit)("refersToParam", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("p"))
|
|
3791
3951
|
]
|
|
3792
3952
|
),
|
|
3793
3953
|
// Which environment object a keyed read takes its entry from. The
|
|
3794
3954
|
// object comes first because a project writes a handful of those and
|
|
3795
3955
|
// thousands of keyed reads, and the join starts at the small end.
|
|
3796
|
-
(0,
|
|
3956
|
+
(0, import_datalog6.rule)(
|
|
3797
3957
|
"environmentRead",
|
|
3798
|
-
[(0,
|
|
3958
|
+
[(0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("x")],
|
|
3799
3959
|
[
|
|
3800
|
-
(0,
|
|
3801
|
-
(0,
|
|
3802
|
-
(0,
|
|
3960
|
+
(0, import_datalog6.lit)("environmentObject", (0, import_datalog6.variable)("w")),
|
|
3961
|
+
(0, import_datalog6.lit)("runtimeValue", (0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("o")),
|
|
3962
|
+
(0, import_datalog6.lit)("readsKeyed", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("x"))
|
|
3803
3963
|
]
|
|
3804
3964
|
),
|
|
3805
|
-
(0,
|
|
3965
|
+
(0, import_datalog6.rule)(
|
|
3806
3966
|
"readsEnvNamed",
|
|
3807
|
-
[(0,
|
|
3808
|
-
[(0,
|
|
3967
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("x")],
|
|
3968
|
+
[(0, import_datalog6.lit)("environmentRead", (0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("x"))]
|
|
3809
3969
|
),
|
|
3810
3970
|
// A parameter whose value is an environment variable's name: a read
|
|
3811
3971
|
// site takes its name from it, or it is handed on to a parameter that
|
|
3812
3972
|
// does. Asked from the site, so the recursion runs callee to caller.
|
|
3813
|
-
(0,
|
|
3973
|
+
(0, import_datalog6.rule)(
|
|
3814
3974
|
"paramNamesEnv",
|
|
3815
|
-
[(0,
|
|
3975
|
+
[(0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("site")],
|
|
3816
3976
|
[
|
|
3817
|
-
(0,
|
|
3818
|
-
(0,
|
|
3977
|
+
(0, import_datalog6.lit)("readsEnvNamed", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("x")),
|
|
3978
|
+
(0, import_datalog6.lit)("refersToParam", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("p"))
|
|
3819
3979
|
]
|
|
3820
3980
|
),
|
|
3821
|
-
(0,
|
|
3981
|
+
(0, import_datalog6.rule)(
|
|
3822
3982
|
"paramNamesEnv",
|
|
3823
|
-
[(0,
|
|
3983
|
+
[(0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("site")],
|
|
3824
3984
|
[
|
|
3825
|
-
(0,
|
|
3826
|
-
(0,
|
|
3827
|
-
(0,
|
|
3985
|
+
(0, import_datalog6.lit)("refersToParam", (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("p")),
|
|
3986
|
+
(0, import_datalog6.lit)("passesArgument", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("q"), (0, import_datalog6.variable)("a")),
|
|
3987
|
+
(0, import_datalog6.lit)("paramNamesEnv", (0, import_datalog6.variable)("q"), (0, import_datalog6.variable)("site"))
|
|
3828
3988
|
]
|
|
3829
3989
|
),
|
|
3830
3990
|
// The class some declaration says a value is one of: its own, or that of
|
|
3831
3991
|
// anything the value steps to, a caller's argument included. Two callers
|
|
3832
3992
|
// can disagree, so the asking side decides whether it got one.
|
|
3833
|
-
(0,
|
|
3834
|
-
(0,
|
|
3993
|
+
(0, import_datalog6.rule)("typedAs", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("t")], [(0, import_datalog6.lit)("instanceOf", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("t"))]),
|
|
3994
|
+
(0, import_datalog6.rule)(
|
|
3835
3995
|
"typedAs",
|
|
3836
|
-
[(0,
|
|
3996
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("t")],
|
|
3837
3997
|
[
|
|
3838
|
-
(0,
|
|
3839
|
-
(0,
|
|
3998
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"), VALUE_STEP),
|
|
3999
|
+
(0, import_datalog6.lit)("instanceOf", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("t"))
|
|
3840
4000
|
]
|
|
3841
4001
|
),
|
|
3842
4002
|
// Which module's export a re-exported name forwards to, however
|
|
3843
4003
|
// many barrels deep the forwarding runs.
|
|
3844
|
-
(0,
|
|
4004
|
+
(0, import_datalog6.rule)(
|
|
3845
4005
|
"moduleForwards",
|
|
3846
|
-
[(0,
|
|
3847
|
-
[(0,
|
|
4006
|
+
[(0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("m2"), (0, import_datalog6.variable)("n2")],
|
|
4007
|
+
[(0, import_datalog6.lit)("reExports", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("m2"), (0, import_datalog6.variable)("n2"))]
|
|
3848
4008
|
),
|
|
3849
|
-
(0,
|
|
4009
|
+
(0, import_datalog6.rule)(
|
|
3850
4010
|
"moduleForwards",
|
|
3851
|
-
[(0,
|
|
4011
|
+
[(0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("m3"), (0, import_datalog6.variable)("n3")],
|
|
3852
4012
|
[
|
|
3853
|
-
(0,
|
|
3854
|
-
(0,
|
|
4013
|
+
(0, import_datalog6.lit)("reExports", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("m2"), (0, import_datalog6.variable)("n2")),
|
|
4014
|
+
(0, import_datalog6.lit)("moduleForwards", (0, import_datalog6.variable)("m2"), (0, import_datalog6.variable)("n2"), (0, import_datalog6.variable)("m3"), (0, import_datalog6.variable)("n3"))
|
|
3855
4015
|
]
|
|
3856
4016
|
),
|
|
3857
4017
|
// What a module exports: directly, or through re-export chains.
|
|
3858
|
-
(0,
|
|
4018
|
+
(0, import_datalog6.rule)(
|
|
3859
4019
|
"moduleExport",
|
|
3860
|
-
[(0,
|
|
3861
|
-
[(0,
|
|
4020
|
+
[(0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("value")],
|
|
4021
|
+
[(0, import_datalog6.lit)("exportsAs", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("value"))],
|
|
3862
4022
|
"export"
|
|
3863
4023
|
),
|
|
3864
|
-
(0,
|
|
4024
|
+
(0, import_datalog6.rule)(
|
|
3865
4025
|
"moduleExport",
|
|
3866
|
-
[(0,
|
|
4026
|
+
[(0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("value")],
|
|
3867
4027
|
[
|
|
3868
|
-
(0,
|
|
3869
|
-
(0,
|
|
4028
|
+
(0, import_datalog6.lit)("reExports", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("m2"), (0, import_datalog6.variable)("n2")),
|
|
4029
|
+
(0, import_datalog6.lit)("moduleExport", (0, import_datalog6.variable)("m2"), (0, import_datalog6.variable)("n2"), (0, import_datalog6.variable)("value"))
|
|
3870
4030
|
],
|
|
3871
4031
|
"re-export"
|
|
3872
4032
|
),
|
|
3873
|
-
(0,
|
|
4033
|
+
(0, import_datalog6.rule)(
|
|
3874
4034
|
"moduleExport",
|
|
3875
|
-
[(0,
|
|
4035
|
+
[(0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("value")],
|
|
3876
4036
|
[
|
|
3877
|
-
(0,
|
|
3878
|
-
(0,
|
|
4037
|
+
(0, import_datalog6.lit)("reExportsAll", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("m2")),
|
|
4038
|
+
(0, import_datalog6.lit)("moduleExport", (0, import_datalog6.variable)("m2"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("value"))
|
|
3879
4039
|
],
|
|
3880
4040
|
"re-export all"
|
|
3881
4041
|
),
|
|
3882
4042
|
// The function a call runs, written from the call's side because a
|
|
3883
4043
|
// caller asking what a call gives back has the call in hand.
|
|
3884
|
-
(0,
|
|
4044
|
+
(0, import_datalog6.rule)(
|
|
3885
4045
|
"invokes",
|
|
3886
|
-
[(0,
|
|
3887
|
-
[(0,
|
|
4046
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")],
|
|
4047
|
+
[(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")), (0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("f"))]
|
|
3888
4048
|
),
|
|
3889
4049
|
// The callee is itself a call: `daoBuilder()()`.
|
|
3890
|
-
(0,
|
|
4050
|
+
(0, import_datalog6.rule)(
|
|
3891
4051
|
"invokes",
|
|
3892
|
-
[(0,
|
|
3893
|
-
[(0,
|
|
4052
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")],
|
|
4053
|
+
[(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")), (0, import_datalog6.lit)("givesBack", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("f"))]
|
|
3894
4054
|
),
|
|
3895
4055
|
// The object an expression refers to: a name through `comesTo`, a
|
|
3896
4056
|
// factory call through what it gives back. Naming the step is what
|
|
3897
4057
|
// makes `routes.list` and `make(body).handle` one rule.
|
|
3898
|
-
(0,
|
|
4058
|
+
(0, import_datalog6.rule)(
|
|
3899
4059
|
"objectOf",
|
|
3900
|
-
[(0,
|
|
3901
|
-
[(0,
|
|
4060
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("obj")],
|
|
4061
|
+
[(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("obj")), (0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("obj"))]
|
|
3902
4062
|
),
|
|
3903
|
-
(0,
|
|
4063
|
+
(0, import_datalog6.rule)(
|
|
3904
4064
|
"objectOf",
|
|
3905
|
-
[(0,
|
|
3906
|
-
[(0,
|
|
4065
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj")],
|
|
4066
|
+
[(0, import_datalog6.lit)("givesBack", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj")), (0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("obj"))]
|
|
3907
4067
|
),
|
|
3908
4068
|
// A construction is the object it made, and so is any name for it.
|
|
3909
4069
|
// The class stays an answer too, so an instance whose site is not in
|
|
3910
4070
|
// the run still reads what the class stores.
|
|
3911
|
-
(0,
|
|
4071
|
+
(0, import_datalog6.rule)(
|
|
3912
4072
|
"objectOf",
|
|
3913
|
-
[(0,
|
|
3914
|
-
[(0,
|
|
4073
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("site")],
|
|
4074
|
+
[(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("c"))]
|
|
3915
4075
|
),
|
|
3916
|
-
(0,
|
|
4076
|
+
(0, import_datalog6.rule)(
|
|
3917
4077
|
"objectOf",
|
|
3918
|
-
[(0,
|
|
4078
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("site")],
|
|
3919
4079
|
[
|
|
3920
|
-
(0,
|
|
3921
|
-
(0,
|
|
4080
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("site"), VALUE_STEP),
|
|
4081
|
+
(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("c"))
|
|
3922
4082
|
]
|
|
3923
4083
|
),
|
|
3924
4084
|
// So is one a call hands back when it passes no arguments, as
|
|
3925
4085
|
// `get_settings()` hands back `Settings()`, since only the construction
|
|
3926
4086
|
// contains the field defaults its class declares.
|
|
3927
|
-
(0,
|
|
4087
|
+
(0, import_datalog6.rule)(
|
|
3928
4088
|
"objectOf",
|
|
3929
|
-
[(0,
|
|
4089
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("site")],
|
|
3930
4090
|
[
|
|
3931
|
-
(0,
|
|
3932
|
-
(0,
|
|
3933
|
-
(0,
|
|
4091
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("site"), RESULT_STEP),
|
|
4092
|
+
(0, import_datalog6.lit)("callArgCount", (0, import_datalog6.variable)("site"), NO_ARGUMENTS),
|
|
4093
|
+
(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("c"))
|
|
3934
4094
|
]
|
|
3935
4095
|
),
|
|
3936
4096
|
// Which calls a function, found by the name the call is written as
|
|
@@ -3938,114 +4098,114 @@ var STATED_RULES = [
|
|
|
3938
4098
|
// the function and wants its call sites, so both of these start from
|
|
3939
4099
|
// the function. Starting from `call` instead asks what every call in
|
|
3940
4100
|
// the project imports, which was 72% of everything derived.
|
|
3941
|
-
(0,
|
|
4101
|
+
(0, import_datalog6.rule)(
|
|
3942
4102
|
"callsNamed",
|
|
3943
|
-
[(0,
|
|
3944
|
-
[(0,
|
|
4103
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")],
|
|
4104
|
+
[(0, import_datalog6.lit)("binds", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("f")), (0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c"))]
|
|
3945
4105
|
),
|
|
3946
|
-
(0,
|
|
4106
|
+
(0, import_datalog6.rule)(
|
|
3947
4107
|
"callsNamed",
|
|
3948
|
-
[(0,
|
|
4108
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")],
|
|
3949
4109
|
[
|
|
3950
|
-
(0,
|
|
3951
|
-
(0,
|
|
3952
|
-
(0,
|
|
4110
|
+
(0, import_datalog6.lit)("moduleExport", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("f")),
|
|
4111
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")),
|
|
4112
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c"))
|
|
3953
4113
|
]
|
|
3954
4114
|
),
|
|
3955
4115
|
// The same, for a language whose adapter writes the import down as a
|
|
3956
4116
|
// declaration and the call's callee as the name referring to it.
|
|
3957
|
-
(0,
|
|
4117
|
+
(0, import_datalog6.rule)(
|
|
3958
4118
|
"callsNamed",
|
|
3959
|
-
[(0,
|
|
4119
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")],
|
|
3960
4120
|
[
|
|
3961
|
-
(0,
|
|
3962
|
-
(0,
|
|
3963
|
-
(0,
|
|
3964
|
-
(0,
|
|
4121
|
+
(0, import_datalog6.lit)("moduleExport", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("f")),
|
|
4122
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("d"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")),
|
|
4123
|
+
(0, import_datalog6.lit)("binds", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("d")),
|
|
4124
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c"))
|
|
3965
4125
|
]
|
|
3966
4126
|
),
|
|
3967
4127
|
// `const f = (x) => ...` declares the name and puts the parameters on
|
|
3968
4128
|
// the arrow, so everything above arrives at the declaration and
|
|
3969
4129
|
// `paramOf` is about the arrow. One binds hop joins the two.
|
|
3970
|
-
(0,
|
|
4130
|
+
(0, import_datalog6.rule)(
|
|
3971
4131
|
"callsNamed",
|
|
3972
|
-
[(0,
|
|
3973
|
-
[(0,
|
|
4132
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")],
|
|
4133
|
+
[(0, import_datalog6.lit)("binds", (0, import_datalog6.variable)("g"), (0, import_datalog6.variable)("f")), (0, import_datalog6.lit)("callsNamed", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("g"))]
|
|
3974
4134
|
),
|
|
3975
4135
|
// Every one of those, and the binds hop again over the whole
|
|
3976
4136
|
// relation, so a property holding a name for a function is reached
|
|
3977
4137
|
// the way it was before the two were told apart.
|
|
3978
|
-
(0,
|
|
3979
|
-
(0,
|
|
4138
|
+
(0, import_datalog6.rule)("callsFunction", [(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")], [(0, import_datalog6.lit)("callsNamed", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f"))]),
|
|
4139
|
+
(0, import_datalog6.rule)(
|
|
3980
4140
|
"callsFunction",
|
|
3981
|
-
[(0,
|
|
3982
|
-
[(0,
|
|
4141
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")],
|
|
4142
|
+
[(0, import_datalog6.lit)("binds", (0, import_datalog6.variable)("g"), (0, import_datalog6.variable)("f")), (0, import_datalog6.lit)("callsFunction", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("g"))]
|
|
3983
4143
|
),
|
|
3984
4144
|
// A function written on an object, called off it: `client.get(o)`.
|
|
3985
4145
|
// The receiver comes from the object through `refersToObject`, not from
|
|
3986
4146
|
// `objectOf`: a walk from every reader of the name was most of a run.
|
|
3987
|
-
(0,
|
|
4147
|
+
(0, import_datalog6.rule)(
|
|
3988
4148
|
"callsFunction",
|
|
3989
|
-
[(0,
|
|
4149
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")],
|
|
3990
4150
|
[
|
|
3991
|
-
(0,
|
|
3992
|
-
(0,
|
|
3993
|
-
(0,
|
|
3994
|
-
(0,
|
|
4151
|
+
(0, import_datalog6.lit)("holdsProperty", (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("f")),
|
|
4152
|
+
(0, import_datalog6.lit)("refersToObject", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("obj")),
|
|
4153
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")),
|
|
4154
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c"))
|
|
3995
4155
|
]
|
|
3996
4156
|
),
|
|
3997
4157
|
// A name bound to a factory's result, called: `const get =
|
|
3998
4158
|
// makeReader(env)` then `get(name)`. Written from the factory's call so
|
|
3999
4159
|
// the walk starts where `callsFunction` already has an answer.
|
|
4000
|
-
(0,
|
|
4160
|
+
(0, import_datalog6.rule)(
|
|
4001
4161
|
"callsFunction",
|
|
4002
|
-
[(0,
|
|
4162
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")],
|
|
4003
4163
|
[
|
|
4004
|
-
(0,
|
|
4005
|
-
(0,
|
|
4006
|
-
(0,
|
|
4164
|
+
(0, import_datalog6.lit)("returnsValue", (0, import_datalog6.variable)("g"), (0, import_datalog6.variable)("f")),
|
|
4165
|
+
(0, import_datalog6.lit)("callsFunction", (0, import_datalog6.variable)("r0"), (0, import_datalog6.variable)("g")),
|
|
4166
|
+
(0, import_datalog6.lit)("callsNamed", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("r0"))
|
|
4007
4167
|
]
|
|
4008
4168
|
),
|
|
4009
4169
|
// The same, called straight off the factory's call, as
|
|
4010
4170
|
// `register("created")(handler)` or a Python decorator written that way.
|
|
4011
|
-
(0,
|
|
4171
|
+
(0, import_datalog6.rule)(
|
|
4012
4172
|
"callsFunction",
|
|
4013
|
-
[(0,
|
|
4173
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")],
|
|
4014
4174
|
[
|
|
4015
|
-
(0,
|
|
4016
|
-
(0,
|
|
4017
|
-
(0,
|
|
4175
|
+
(0, import_datalog6.lit)("returnsValue", (0, import_datalog6.variable)("g"), (0, import_datalog6.variable)("f")),
|
|
4176
|
+
(0, import_datalog6.lit)("callsFunction", (0, import_datalog6.variable)("r0"), (0, import_datalog6.variable)("g")),
|
|
4177
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("r0"))
|
|
4018
4178
|
]
|
|
4019
4179
|
),
|
|
4020
4180
|
// The expressions that refer to an object under another name, through
|
|
4021
4181
|
// a name hop or an import. Asked from the object, so it visits only
|
|
4022
4182
|
// them.
|
|
4023
|
-
(0,
|
|
4183
|
+
(0, import_datalog6.rule)("refersToObject", [(0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("obj")], [(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("obj"))]),
|
|
4024
4184
|
// A construction is an object too, and the one a name for it refers to.
|
|
4025
|
-
(0,
|
|
4185
|
+
(0, import_datalog6.rule)(
|
|
4026
4186
|
"refersToObject",
|
|
4027
|
-
[(0,
|
|
4028
|
-
[(0,
|
|
4187
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("site")],
|
|
4188
|
+
[(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("c"))]
|
|
4029
4189
|
),
|
|
4030
4190
|
// The process environment and the output streams are objects nothing
|
|
4031
4191
|
// declares, so a pack saying which expression spells one is the only
|
|
4032
4192
|
// way in.
|
|
4033
|
-
(0,
|
|
4193
|
+
(0, import_datalog6.rule)("refersToObject", [(0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("w")], [(0, import_datalog6.lit)("runtimeObject", (0, import_datalog6.variable)("w"))]),
|
|
4034
4194
|
// The hop comes first so a check with both ends bound walks forward from
|
|
4035
4195
|
// the name, which the named store needs. With one end bound, the bound
|
|
4036
4196
|
// literal goes first whatever order the body is written in.
|
|
4037
|
-
(0,
|
|
4197
|
+
(0, import_datalog6.rule)(
|
|
4038
4198
|
"refersToObject",
|
|
4039
|
-
[(0,
|
|
4040
|
-
[(0,
|
|
4199
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj")],
|
|
4200
|
+
[(0, import_datalog6.lit)("nameHop", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), (0, import_datalog6.lit)("refersToObject", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("obj"))]
|
|
4041
4201
|
),
|
|
4042
|
-
(0,
|
|
4202
|
+
(0, import_datalog6.rule)(
|
|
4043
4203
|
"refersToObject",
|
|
4044
|
-
[(0,
|
|
4204
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj")],
|
|
4045
4205
|
[
|
|
4046
|
-
(0,
|
|
4047
|
-
(0,
|
|
4048
|
-
(0,
|
|
4206
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")),
|
|
4207
|
+
(0, import_datalog6.lit)("moduleExport", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("y")),
|
|
4208
|
+
(0, import_datalog6.lit)("refersToObject", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("obj"))
|
|
4049
4209
|
]
|
|
4050
4210
|
),
|
|
4051
4211
|
// What an object contains, its base class included, so a method the base
|
|
@@ -4053,417 +4213,418 @@ var STATED_RULES = [
|
|
|
4053
4213
|
// declare gives two, and the caller decides. This is its own relation
|
|
4054
4214
|
// rather than more `holdsProperty`, which stays something an adapter
|
|
4055
4215
|
// states and the rules only read.
|
|
4056
|
-
(0,
|
|
4216
|
+
(0, import_datalog6.rule)(
|
|
4057
4217
|
"contains",
|
|
4058
|
-
[(0,
|
|
4059
|
-
[(0,
|
|
4218
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
4219
|
+
[(0, import_datalog6.lit)("holdsProperty", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))]
|
|
4060
4220
|
),
|
|
4061
|
-
(0,
|
|
4221
|
+
(0, import_datalog6.rule)(
|
|
4062
4222
|
"contains",
|
|
4063
|
-
[(0,
|
|
4223
|
+
[(0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
4064
4224
|
[
|
|
4065
|
-
(0,
|
|
4066
|
-
(0,
|
|
4067
|
-
(0,
|
|
4225
|
+
(0, import_datalog6.lit)("extends", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("base")),
|
|
4226
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("base"), (0, import_datalog6.variable)("baseCls")),
|
|
4227
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("baseCls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
4068
4228
|
],
|
|
4069
4229
|
BASE_CLASS_RULE
|
|
4070
4230
|
),
|
|
4071
4231
|
// A module a Ruby class prepends is an ancestor too. It comes before the
|
|
4072
4232
|
// class in lookup, which `overrides` says, so it has a relation of its own.
|
|
4073
|
-
(0,
|
|
4233
|
+
(0, import_datalog6.rule)(
|
|
4074
4234
|
"contains",
|
|
4075
|
-
[(0,
|
|
4235
|
+
[(0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
4076
4236
|
[
|
|
4077
|
-
(0,
|
|
4078
|
-
(0,
|
|
4079
|
-
(0,
|
|
4237
|
+
(0, import_datalog6.lit)("prepends", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("mod")),
|
|
4238
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("mod"), (0, import_datalog6.variable)("modObj")),
|
|
4239
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("modObj"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
4080
4240
|
],
|
|
4081
4241
|
"prepended module"
|
|
4082
4242
|
),
|
|
4083
4243
|
// An association is read off an instance as a property, and stating
|
|
4084
4244
|
// it as `contains` is what puts it on the ancestry rule, so a concern
|
|
4085
4245
|
// or a base class can be the one that declares it.
|
|
4086
|
-
(0,
|
|
4246
|
+
(0, import_datalog6.rule)(
|
|
4087
4247
|
"contains",
|
|
4088
|
-
[(0,
|
|
4089
|
-
[(0,
|
|
4248
|
+
[(0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("t")],
|
|
4249
|
+
[(0, import_datalog6.lit)("declaresAssociation", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("t"))],
|
|
4090
4250
|
"declared association"
|
|
4091
4251
|
),
|
|
4092
4252
|
// The same, for a language that buries the declaration in an ordinary
|
|
4093
4253
|
// assignment. Keying on the module the callable came from is what
|
|
4094
4254
|
// keeps a project function spelled the same way out.
|
|
4095
|
-
(0,
|
|
4255
|
+
(0, import_datalog6.rule)(
|
|
4096
4256
|
"contains",
|
|
4097
|
-
[(0,
|
|
4257
|
+
[(0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("t")],
|
|
4098
4258
|
[
|
|
4099
|
-
(0,
|
|
4100
|
-
(0,
|
|
4101
|
-
(0,
|
|
4259
|
+
(0, import_datalog6.lit)("fieldCall", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("t")),
|
|
4260
|
+
(0, import_datalog6.lit)("comesFrom", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("name")),
|
|
4261
|
+
(0, import_datalog6.lit)("associationConstructor", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("name"))
|
|
4102
4262
|
],
|
|
4103
4263
|
"constructed association"
|
|
4104
4264
|
),
|
|
4105
4265
|
// What the constructor put on the receiver. The class is the object
|
|
4106
4266
|
// for an instance whose own site is not in the run.
|
|
4107
|
-
(0,
|
|
4267
|
+
(0, import_datalog6.rule)(
|
|
4108
4268
|
"contains",
|
|
4109
|
-
[(0,
|
|
4269
|
+
[(0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
4110
4270
|
[
|
|
4111
|
-
(0,
|
|
4112
|
-
(0,
|
|
4271
|
+
(0, import_datalog6.lit)("initializes", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("f")),
|
|
4272
|
+
(0, import_datalog6.lit)("storesProperty", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"), RECEIVER_STORE)
|
|
4113
4273
|
],
|
|
4114
4274
|
"constructor store"
|
|
4115
4275
|
),
|
|
4116
4276
|
// What any other method of the class put there. Two methods writing
|
|
4117
4277
|
// one name give two rows, since nothing here orders them.
|
|
4118
|
-
(0,
|
|
4278
|
+
(0, import_datalog6.rule)(
|
|
4119
4279
|
"contains",
|
|
4120
|
-
[(0,
|
|
4280
|
+
[(0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
4121
4281
|
[
|
|
4122
|
-
(0,
|
|
4123
|
-
(0,
|
|
4282
|
+
(0, import_datalog6.lit)("holdsProperty", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("f")),
|
|
4283
|
+
(0, import_datalog6.lit)("storesProperty", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"), RECEIVER_STORE)
|
|
4124
4284
|
],
|
|
4125
4285
|
"method store"
|
|
4126
4286
|
),
|
|
4127
4287
|
// A write through a name, `client.timeout = 5`, lands on the object the
|
|
4128
4288
|
// name refers to. The writes to the property asked about come off an
|
|
4129
4289
|
// index, and each name is checked forward against the one object.
|
|
4130
|
-
(0,
|
|
4290
|
+
(0, import_datalog6.rule)(
|
|
4131
4291
|
"contains",
|
|
4132
|
-
[(0,
|
|
4292
|
+
[(0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
4133
4293
|
[
|
|
4134
|
-
(0,
|
|
4135
|
-
(0,
|
|
4294
|
+
(0, import_datalog6.lit)("storesProperty", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"), NAMED_STORE),
|
|
4295
|
+
(0, import_datalog6.lit)("refersToObject", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj"))
|
|
4136
4296
|
],
|
|
4137
4297
|
"named store"
|
|
4138
4298
|
),
|
|
4139
4299
|
// A member a class declares itself under a name one of its bases also
|
|
4140
4300
|
// contains. `contains` keeps both, and a caller that needs one answer
|
|
4141
4301
|
// prefers the member declared nearer the object the read went through.
|
|
4142
|
-
(0,
|
|
4302
|
+
(0, import_datalog6.rule)(
|
|
4143
4303
|
"overrides",
|
|
4144
|
-
[(0,
|
|
4304
|
+
[(0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("h")],
|
|
4145
4305
|
[
|
|
4146
|
-
(0,
|
|
4147
|
-
(0,
|
|
4148
|
-
(0,
|
|
4149
|
-
(0,
|
|
4306
|
+
(0, import_datalog6.lit)("holdsProperty", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("m")),
|
|
4307
|
+
(0, import_datalog6.lit)("extends", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("b")),
|
|
4308
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("b"), (0, import_datalog6.variable)("base")),
|
|
4309
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("base"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("h"))
|
|
4150
4310
|
]
|
|
4151
4311
|
),
|
|
4152
4312
|
// The same for a field default, which a plain subclass contains too.
|
|
4153
|
-
(0,
|
|
4313
|
+
(0, import_datalog6.rule)(
|
|
4154
4314
|
"overrides",
|
|
4155
|
-
[(0,
|
|
4315
|
+
[(0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("h")],
|
|
4156
4316
|
[
|
|
4157
|
-
(0,
|
|
4158
|
-
(0,
|
|
4159
|
-
(0,
|
|
4160
|
-
(0,
|
|
4317
|
+
(0, import_datalog6.lit)("declaresDefault", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("m")),
|
|
4318
|
+
(0, import_datalog6.lit)("extends", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("b")),
|
|
4319
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("b"), (0, import_datalog6.variable)("base")),
|
|
4320
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("base"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("h"))
|
|
4161
4321
|
]
|
|
4162
4322
|
),
|
|
4163
4323
|
// A prepended module's member comes before the class's own and what the
|
|
4164
4324
|
// class inherits. The module is found by a name hop, since `comesTo`
|
|
4165
4325
|
// asked backwards from the module walks to it from every value.
|
|
4166
|
-
(0,
|
|
4326
|
+
(0, import_datalog6.rule)(
|
|
4167
4327
|
"overrides",
|
|
4168
|
-
[(0,
|
|
4328
|
+
[(0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("h")],
|
|
4169
4329
|
[
|
|
4170
|
-
(0,
|
|
4171
|
-
(0,
|
|
4172
|
-
(0,
|
|
4173
|
-
(0,
|
|
4330
|
+
(0, import_datalog6.lit)("holdsProperty", (0, import_datalog6.variable)("modObj"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("m")),
|
|
4331
|
+
(0, import_datalog6.lit)("nameHop", (0, import_datalog6.variable)("mod"), (0, import_datalog6.variable)("modObj")),
|
|
4332
|
+
(0, import_datalog6.lit)("prepends", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("mod")),
|
|
4333
|
+
(0, import_datalog6.lit)("holdsProperty", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("h"))
|
|
4174
4334
|
]
|
|
4175
4335
|
),
|
|
4176
|
-
(0,
|
|
4336
|
+
(0, import_datalog6.rule)(
|
|
4177
4337
|
"overrides",
|
|
4178
|
-
[(0,
|
|
4179
|
-
[
|
|
4180
|
-
(0,
|
|
4181
|
-
(0,
|
|
4182
|
-
(0,
|
|
4183
|
-
(0,
|
|
4184
|
-
(0,
|
|
4185
|
-
(0,
|
|
4338
|
+
[(0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("h")],
|
|
4339
|
+
[
|
|
4340
|
+
(0, import_datalog6.lit)("holdsProperty", (0, import_datalog6.variable)("modObj"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("m")),
|
|
4341
|
+
(0, import_datalog6.lit)("nameHop", (0, import_datalog6.variable)("mod"), (0, import_datalog6.variable)("modObj")),
|
|
4342
|
+
(0, import_datalog6.lit)("prepends", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("mod")),
|
|
4343
|
+
(0, import_datalog6.lit)("extends", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("b")),
|
|
4344
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("b"), (0, import_datalog6.variable)("base")),
|
|
4345
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("base"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("h"))
|
|
4186
4346
|
]
|
|
4187
4347
|
),
|
|
4188
4348
|
// The objects a read reads a name off, and on each one the members the
|
|
4189
4349
|
// read finds that another member there overrides.
|
|
4190
|
-
(0,
|
|
4350
|
+
(0, import_datalog6.rule)(
|
|
4191
4351
|
"readsFrom",
|
|
4192
|
-
[(0,
|
|
4352
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("n")],
|
|
4193
4353
|
[
|
|
4194
|
-
(0,
|
|
4195
|
-
(0,
|
|
4354
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")),
|
|
4355
|
+
(0, import_datalog6.lit)("objectOf", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("obj"))
|
|
4196
4356
|
]
|
|
4197
4357
|
),
|
|
4198
|
-
(0,
|
|
4358
|
+
(0, import_datalog6.rule)(
|
|
4199
4359
|
"readsOverridden",
|
|
4200
|
-
[(0,
|
|
4360
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("h")],
|
|
4201
4361
|
[
|
|
4202
|
-
(0,
|
|
4203
|
-
(0,
|
|
4204
|
-
(0,
|
|
4362
|
+
(0, import_datalog6.lit)("readsFrom", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("n")),
|
|
4363
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("m")),
|
|
4364
|
+
(0, import_datalog6.lit)("overrides", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("h"))
|
|
4205
4365
|
]
|
|
4206
4366
|
),
|
|
4207
4367
|
// Every member, for a read with an override, so `contains` is asked with
|
|
4208
4368
|
// the object and name bound, the way the property read already asks it.
|
|
4209
|
-
(0,
|
|
4369
|
+
(0, import_datalog6.rule)(
|
|
4210
4370
|
"readsMemberOn",
|
|
4211
|
-
[(0,
|
|
4371
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("h")],
|
|
4212
4372
|
[
|
|
4213
|
-
(0,
|
|
4214
|
-
(0,
|
|
4215
|
-
(0,
|
|
4373
|
+
(0, import_datalog6.lit)("readsOverridden", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("shadowing"), (0, import_datalog6.variable)("overridden")),
|
|
4374
|
+
(0, import_datalog6.lit)("readsFrom", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("n")),
|
|
4375
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("h"))
|
|
4216
4376
|
]
|
|
4217
4377
|
),
|
|
4218
4378
|
// A call written with a class's own name, which is how most languages
|
|
4219
4379
|
// spell a construction. A language that spells one some other way
|
|
4220
4380
|
// states its own rule for this, the way Ruby does for `Const.new`.
|
|
4221
|
-
(0,
|
|
4381
|
+
(0, import_datalog6.rule)(
|
|
4222
4382
|
"constructsNamed",
|
|
4223
|
-
[(0,
|
|
4224
|
-
[(0,
|
|
4383
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("cls")],
|
|
4384
|
+
[(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("cls")), (0, import_datalog6.lit)("callsNamed", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("cls"))]
|
|
4225
4385
|
),
|
|
4226
4386
|
// Each construction is an object of its own containing what its
|
|
4227
4387
|
// class stores, so two sites are two objects.
|
|
4228
|
-
(0,
|
|
4388
|
+
(0, import_datalog6.rule)(
|
|
4229
4389
|
"contains",
|
|
4230
|
-
[(0,
|
|
4390
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
4231
4391
|
[
|
|
4232
|
-
(0,
|
|
4233
|
-
(0,
|
|
4392
|
+
(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls")),
|
|
4393
|
+
(0, import_datalog6.lit)("contains", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
4234
4394
|
],
|
|
4235
4395
|
"allocated instance"
|
|
4236
4396
|
),
|
|
4237
4397
|
// A construction written with no arguments keeps every field default its
|
|
4238
4398
|
// class declares. Any argument could fill a field through a constructor
|
|
4239
4399
|
// the run cannot see, and a finder's result was built somewhere else.
|
|
4240
|
-
(0,
|
|
4400
|
+
(0, import_datalog6.rule)(
|
|
4241
4401
|
"contains",
|
|
4242
|
-
[(0,
|
|
4402
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
4243
4403
|
[
|
|
4244
|
-
(0,
|
|
4245
|
-
(0,
|
|
4246
|
-
(0,
|
|
4247
|
-
(0,
|
|
4248
|
-
(0,
|
|
4404
|
+
(0, import_datalog6.lit)("callArgCount", (0, import_datalog6.variable)("site"), NO_ARGUMENTS),
|
|
4405
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("c")),
|
|
4406
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("cls")),
|
|
4407
|
+
(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("cls")),
|
|
4408
|
+
(0, import_datalog6.lit)("fieldDefault", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
4249
4409
|
],
|
|
4250
4410
|
"construction with no arguments"
|
|
4251
4411
|
),
|
|
4252
4412
|
// On a plain class nothing generates a constructor that could replace
|
|
4253
4413
|
// an annotated attribute, so every instance shares it.
|
|
4254
|
-
(0,
|
|
4414
|
+
(0, import_datalog6.rule)(
|
|
4255
4415
|
"contains",
|
|
4256
|
-
[(0,
|
|
4416
|
+
[(0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
4257
4417
|
[
|
|
4258
|
-
(0,
|
|
4259
|
-
(0,
|
|
4418
|
+
(0, import_datalog6.lit)("declaresDefault", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")),
|
|
4419
|
+
(0, import_datalog6.lit)("plainAncestry", (0, import_datalog6.variable)("cls"))
|
|
4260
4420
|
],
|
|
4261
4421
|
"plain class attribute"
|
|
4262
4422
|
),
|
|
4263
4423
|
// A class nothing generates a constructor for. The adapter states it
|
|
4264
4424
|
// only where the source shows it, since a rule cannot say "unless", and
|
|
4265
4425
|
// a class written over one base is plain when that base is.
|
|
4266
|
-
(0,
|
|
4267
|
-
(0,
|
|
4426
|
+
(0, import_datalog6.rule)("plainAncestry", [(0, import_datalog6.variable)("c")], [(0, import_datalog6.lit)("plainClass", (0, import_datalog6.variable)("c"))]),
|
|
4427
|
+
(0, import_datalog6.rule)(
|
|
4268
4428
|
"plainAncestry",
|
|
4269
|
-
[(0,
|
|
4429
|
+
[(0, import_datalog6.variable)("c")],
|
|
4270
4430
|
[
|
|
4271
|
-
(0,
|
|
4272
|
-
(0,
|
|
4273
|
-
(0,
|
|
4431
|
+
(0, import_datalog6.lit)("extendsOnly", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("base")),
|
|
4432
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("base"), (0, import_datalog6.variable)("baseCls")),
|
|
4433
|
+
(0, import_datalog6.lit)("plainAncestry", (0, import_datalog6.variable)("baseCls"))
|
|
4274
4434
|
]
|
|
4275
4435
|
),
|
|
4276
4436
|
// A field default, its base class's included. It stays out of `contains`,
|
|
4277
4437
|
// which every instance reads, because a constructor may replace it.
|
|
4278
|
-
(0,
|
|
4438
|
+
(0, import_datalog6.rule)(
|
|
4279
4439
|
"fieldDefault",
|
|
4280
|
-
[(0,
|
|
4281
|
-
[(0,
|
|
4440
|
+
[(0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
4441
|
+
[(0, import_datalog6.lit)("declaresDefault", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))]
|
|
4282
4442
|
),
|
|
4283
|
-
(0,
|
|
4443
|
+
(0, import_datalog6.rule)(
|
|
4284
4444
|
"fieldDefault",
|
|
4285
|
-
[(0,
|
|
4445
|
+
[(0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
4286
4446
|
[
|
|
4287
|
-
(0,
|
|
4288
|
-
(0,
|
|
4289
|
-
(0,
|
|
4447
|
+
(0, import_datalog6.lit)("extends", (0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("base")),
|
|
4448
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("base"), (0, import_datalog6.variable)("baseCls")),
|
|
4449
|
+
(0, import_datalog6.lit)("fieldDefault", (0, import_datalog6.variable)("baseCls"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
4290
4450
|
],
|
|
4291
4451
|
BASE_CLASS_RULE
|
|
4292
4452
|
),
|
|
4293
4453
|
// A call that makes one of a class. Every finder a pack declared is
|
|
4294
4454
|
// one too, so `User.find(1)` is a site the same way `User.new` is.
|
|
4295
|
-
(0,
|
|
4455
|
+
(0, import_datalog6.rule)(
|
|
4296
4456
|
"allocates",
|
|
4297
|
-
[(0,
|
|
4457
|
+
[(0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls")],
|
|
4298
4458
|
[
|
|
4299
|
-
(0,
|
|
4300
|
-
(0,
|
|
4459
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("c")),
|
|
4460
|
+
(0, import_datalog6.lit)("stepsTo", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls"), INSTANCE_STEP)
|
|
4301
4461
|
],
|
|
4302
4462
|
"allocation site"
|
|
4303
4463
|
),
|
|
4304
4464
|
// The library base a class's ancestry arrives at, however many of a
|
|
4305
4465
|
// project's own classes sit in between. A base the run declares has a
|
|
4306
4466
|
// node to keep walking from; one it does not has only a name.
|
|
4307
|
-
(0,
|
|
4308
|
-
(0,
|
|
4467
|
+
(0, import_datalog6.rule)("libraryBase", [(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("n")], [(0, import_datalog6.lit)("extendsNamed", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("n"))]),
|
|
4468
|
+
(0, import_datalog6.rule)(
|
|
4309
4469
|
"libraryBase",
|
|
4310
|
-
[(0,
|
|
4470
|
+
[(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("n")],
|
|
4311
4471
|
[
|
|
4312
|
-
(0,
|
|
4313
|
-
(0,
|
|
4314
|
-
(0,
|
|
4472
|
+
(0, import_datalog6.lit)("extends", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("x")),
|
|
4473
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("b")),
|
|
4474
|
+
(0, import_datalog6.lit)("libraryBase", (0, import_datalog6.variable)("b"), (0, import_datalog6.variable)("n"))
|
|
4315
4475
|
]
|
|
4316
4476
|
),
|
|
4317
4477
|
// A base a library hands back from a call rather than exporting as a
|
|
4318
4478
|
// class, SQLAlchemy's `Base = declarative_base()`. The walk stops at
|
|
4319
4479
|
// the call, so the function it called is the name to match on.
|
|
4320
|
-
(0,
|
|
4480
|
+
(0, import_datalog6.rule)(
|
|
4321
4481
|
"libraryBase",
|
|
4322
|
-
[(0,
|
|
4482
|
+
[(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("n")],
|
|
4323
4483
|
[
|
|
4324
|
-
(0,
|
|
4325
|
-
(0,
|
|
4326
|
-
(0,
|
|
4327
|
-
(0,
|
|
4484
|
+
(0, import_datalog6.lit)("extends", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("x")),
|
|
4485
|
+
(0, import_datalog6.lit)("isWrittenAs", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r")),
|
|
4486
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("cc")),
|
|
4487
|
+
(0, import_datalog6.lit)("comesFrom", (0, import_datalog6.variable)("cc"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"))
|
|
4328
4488
|
]
|
|
4329
4489
|
),
|
|
4330
4490
|
// Which function a factory returns, and which of its parameters that
|
|
4331
4491
|
// function calls: together they are what makes it a wrapper.
|
|
4332
|
-
(0,
|
|
4492
|
+
(0, import_datalog6.rule)(
|
|
4333
4493
|
"returnsFunc",
|
|
4334
|
-
[(0,
|
|
4494
|
+
[(0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("g")],
|
|
4335
4495
|
[
|
|
4336
|
-
(0,
|
|
4337
|
-
(0,
|
|
4338
|
-
(0,
|
|
4496
|
+
(0, import_datalog6.lit)("returnsValue", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("value")),
|
|
4497
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("value"), (0, import_datalog6.variable)("g")),
|
|
4498
|
+
(0, import_datalog6.lit)("func", (0, import_datalog6.variable)("g"))
|
|
4339
4499
|
]
|
|
4340
4500
|
),
|
|
4341
4501
|
// A call made by a nested closure counts as made by the function
|
|
4342
4502
|
// that declares it; the closure runs as part of that function.
|
|
4343
|
-
(0,
|
|
4344
|
-
(0,
|
|
4503
|
+
(0, import_datalog6.rule)("bodyCallsDeep", [(0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c")], [(0, import_datalog6.lit)("bodyCalls", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c"))]),
|
|
4504
|
+
(0, import_datalog6.rule)(
|
|
4345
4505
|
"bodyCallsDeep",
|
|
4346
|
-
[(0,
|
|
4347
|
-
[(0,
|
|
4506
|
+
[(0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c")],
|
|
4507
|
+
[(0, import_datalog6.lit)("containsFn", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("g")), (0, import_datalog6.lit)("bodyCallsDeep", (0, import_datalog6.variable)("g"), (0, import_datalog6.variable)("c"))]
|
|
4348
4508
|
),
|
|
4349
|
-
(0,
|
|
4509
|
+
(0, import_datalog6.rule)(
|
|
4350
4510
|
"unwraps",
|
|
4351
|
-
[(0,
|
|
4511
|
+
[(0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("k")],
|
|
4352
4512
|
[
|
|
4353
|
-
(0,
|
|
4354
|
-
(0,
|
|
4355
|
-
(0,
|
|
4356
|
-
(0,
|
|
4513
|
+
(0, import_datalog6.lit)("returnsFunc", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("g")),
|
|
4514
|
+
(0, import_datalog6.lit)("bodyCallsDeep", (0, import_datalog6.variable)("g"), (0, import_datalog6.variable)("c")),
|
|
4515
|
+
(0, import_datalog6.lit)("refersToParam", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("p")),
|
|
4516
|
+
(0, import_datalog6.lit)("paramOf", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("k"), (0, import_datalog6.variable)("p"))
|
|
4357
4517
|
]
|
|
4358
4518
|
),
|
|
4359
4519
|
// Which parameter a value traces back to: the parameter under any name,
|
|
4360
4520
|
// or a call passing it to another factory that unwraps, which is how
|
|
4361
4521
|
// `createProtected(h) { return service.withAuth(h); }` unwraps.
|
|
4362
|
-
(0,
|
|
4522
|
+
(0, import_datalog6.rule)(
|
|
4363
4523
|
"flowsToParam",
|
|
4364
|
-
[(0,
|
|
4365
|
-
[(0,
|
|
4524
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("p")],
|
|
4525
|
+
[(0, import_datalog6.lit)("refersToParam", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("p"))]
|
|
4366
4526
|
),
|
|
4367
|
-
(0,
|
|
4527
|
+
(0, import_datalog6.rule)(
|
|
4368
4528
|
"flowsToParam",
|
|
4369
|
-
[(0,
|
|
4529
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("p")],
|
|
4370
4530
|
[
|
|
4371
|
-
(0,
|
|
4372
|
-
(0,
|
|
4373
|
-
(0,
|
|
4374
|
-
(0,
|
|
4375
|
-
(0,
|
|
4531
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")),
|
|
4532
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("f")),
|
|
4533
|
+
(0, import_datalog6.lit)("unwraps", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("k")),
|
|
4534
|
+
(0, import_datalog6.lit)("callArg", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("k"), (0, import_datalog6.variable)("a")),
|
|
4535
|
+
(0, import_datalog6.lit)("flowsToParam", (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("p"))
|
|
4376
4536
|
]
|
|
4377
4537
|
),
|
|
4378
|
-
(0,
|
|
4538
|
+
(0, import_datalog6.rule)(
|
|
4379
4539
|
"unwraps",
|
|
4380
|
-
[(0,
|
|
4540
|
+
[(0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("k")],
|
|
4381
4541
|
[
|
|
4382
|
-
(0,
|
|
4383
|
-
(0,
|
|
4384
|
-
(0,
|
|
4542
|
+
(0, import_datalog6.lit)("returnsValue", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("value")),
|
|
4543
|
+
(0, import_datalog6.lit)("flowsToParam", (0, import_datalog6.variable)("value"), (0, import_datalog6.variable)("p")),
|
|
4544
|
+
(0, import_datalog6.lit)("paramOf", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("k"), (0, import_datalog6.variable)("p"))
|
|
4385
4545
|
]
|
|
4386
4546
|
),
|
|
4387
4547
|
// Where a name comes from, when what it refers to lives outside the
|
|
4388
4548
|
// source being read. A walk ends at what the source writes out, so it
|
|
4389
4549
|
// never reaches a library's own function; these rules do.
|
|
4390
|
-
(0,
|
|
4550
|
+
(0, import_datalog6.rule)(
|
|
4391
4551
|
"comesFrom",
|
|
4392
|
-
[(0,
|
|
4393
|
-
[(0,
|
|
4552
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")],
|
|
4553
|
+
[(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"))]
|
|
4394
4554
|
),
|
|
4395
|
-
(0,
|
|
4555
|
+
(0, import_datalog6.rule)(
|
|
4396
4556
|
"comesFrom",
|
|
4397
|
-
[(0,
|
|
4557
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")],
|
|
4398
4558
|
[
|
|
4399
|
-
(0,
|
|
4400
|
-
(0,
|
|
4559
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"), VALUE_STEP),
|
|
4560
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"))
|
|
4401
4561
|
]
|
|
4402
4562
|
),
|
|
4403
4563
|
// A member read off a whole-module import: the member's own name is
|
|
4404
4564
|
// what the module exports, so `fastapi.APIRouter` comes from
|
|
4405
4565
|
// fastapi's `APIRouter`. Directly, or through a name for the module.
|
|
4406
|
-
(0,
|
|
4566
|
+
(0, import_datalog6.rule)(
|
|
4407
4567
|
"comesFrom",
|
|
4408
|
-
[(0,
|
|
4568
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")],
|
|
4409
4569
|
[
|
|
4410
|
-
(0,
|
|
4411
|
-
(0,
|
|
4570
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("ns"), (0, import_datalog6.variable)("n")),
|
|
4571
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("ns"), (0, import_datalog6.variable)("m"), NAMESPACE_IMPORT)
|
|
4412
4572
|
],
|
|
4413
4573
|
NAMESPACE_MEMBER_RULE
|
|
4414
4574
|
),
|
|
4415
|
-
(0,
|
|
4575
|
+
(0, import_datalog6.rule)(
|
|
4416
4576
|
"comesFrom",
|
|
4417
|
-
[(0,
|
|
4577
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")],
|
|
4418
4578
|
[
|
|
4419
|
-
(0,
|
|
4420
|
-
(0,
|
|
4421
|
-
(0,
|
|
4579
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")),
|
|
4580
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("ns"), VALUE_STEP),
|
|
4581
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("ns"), (0, import_datalog6.variable)("m"), NAMESPACE_IMPORT)
|
|
4422
4582
|
],
|
|
4423
4583
|
NAMESPACE_MEMBER_RULE
|
|
4424
4584
|
),
|
|
4425
4585
|
// A CommonJS module hands its exports over as the default, so after
|
|
4426
4586
|
// `import React from "react"`, `React.memo` is react's `memo`.
|
|
4427
|
-
(0,
|
|
4587
|
+
(0, import_datalog6.rule)(
|
|
4428
4588
|
"comesFrom",
|
|
4429
|
-
[(0,
|
|
4589
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")],
|
|
4430
4590
|
[
|
|
4431
|
-
(0,
|
|
4432
|
-
(0,
|
|
4433
|
-
(0,
|
|
4591
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")),
|
|
4592
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("d"), VALUE_STEP),
|
|
4593
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("d"), (0, import_datalog6.variable)("m"), DEFAULT_IMPORT)
|
|
4434
4594
|
],
|
|
4435
4595
|
NAMESPACE_MEMBER_RULE
|
|
4436
4596
|
),
|
|
4437
4597
|
// Calling f ends up calling the name n that module m exports, one
|
|
4438
4598
|
// hop through f's own body or deeper through a wrapper of a wrapper.
|
|
4439
4599
|
// Several results is normal: a composed decorator applies them all.
|
|
4440
|
-
(0,
|
|
4600
|
+
(0, import_datalog6.rule)(
|
|
4441
4601
|
"callsInto",
|
|
4442
|
-
[(0,
|
|
4602
|
+
[(0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")],
|
|
4443
4603
|
[
|
|
4444
|
-
(0,
|
|
4445
|
-
(0,
|
|
4604
|
+
(0, import_datalog6.lit)("bodyCallsDeep", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c")),
|
|
4605
|
+
(0, import_datalog6.lit)("comesFrom", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"))
|
|
4446
4606
|
]
|
|
4447
4607
|
),
|
|
4448
|
-
(0,
|
|
4608
|
+
(0, import_datalog6.rule)(
|
|
4449
4609
|
"callsInto",
|
|
4450
|
-
[(0,
|
|
4610
|
+
[(0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")],
|
|
4451
4611
|
[
|
|
4452
|
-
(0,
|
|
4453
|
-
(0,
|
|
4454
|
-
(0,
|
|
4612
|
+
(0, import_datalog6.lit)("bodyCallsDeep", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c")),
|
|
4613
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("g")),
|
|
4614
|
+
(0, import_datalog6.lit)("callsInto", (0, import_datalog6.variable)("g"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"))
|
|
4455
4615
|
]
|
|
4456
4616
|
),
|
|
4457
4617
|
// The question callers ask: what a value comes to, narrowed to the
|
|
4458
4618
|
// functions. Objects appear in the middle of chains and never in an
|
|
4459
4619
|
// answer.
|
|
4460
|
-
(0,
|
|
4620
|
+
(0, import_datalog6.rule)(
|
|
4461
4621
|
"resolves",
|
|
4462
|
-
[(0,
|
|
4463
|
-
[(0,
|
|
4622
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
4623
|
+
[(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")), (0, import_datalog6.lit)("func", (0, import_datalog6.variable)("z"))]
|
|
4464
4624
|
),
|
|
4465
4625
|
...DISPATCH_RULES,
|
|
4466
|
-
...PASSED_ON_RULES
|
|
4626
|
+
...PASSED_ON_RULES,
|
|
4627
|
+
...SELF_RULES
|
|
4467
4628
|
];
|
|
4468
4629
|
function alsoSteps(rules) {
|
|
4469
4630
|
return [
|
|
@@ -4474,52 +4635,52 @@ function alsoSteps(rules) {
|
|
|
4474
4635
|
var RESOLUTION_RULES = alsoSteps(STATED_RULES);
|
|
4475
4636
|
var SOURCE_STEPS = [VALUE_STEP, RESULT_STEP];
|
|
4476
4637
|
var WRITTEN_KEY_READS = [
|
|
4477
|
-
(0,
|
|
4478
|
-
(0,
|
|
4638
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")),
|
|
4639
|
+
(0, import_datalog6.lit)("readsEntry", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n"))
|
|
4479
4640
|
];
|
|
4480
4641
|
var SOURCE_READS = [
|
|
4481
4642
|
...WRITTEN_KEY_READS,
|
|
4482
|
-
(0,
|
|
4643
|
+
(0, import_datalog6.lit)("readsKeyed", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("k"))
|
|
4483
4644
|
];
|
|
4484
4645
|
function writtenAnswers(asking) {
|
|
4485
4646
|
return [
|
|
4486
|
-
(0,
|
|
4647
|
+
(0, import_datalog6.rule)(
|
|
4487
4648
|
"wantedIsWrittenAs",
|
|
4488
|
-
[(0,
|
|
4489
|
-
[(0,
|
|
4649
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
4650
|
+
[(0, import_datalog6.lit)(asking, (0, import_datalog6.variable)("x")), (0, import_datalog6.lit)("isWrittenAs", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"))]
|
|
4490
4651
|
),
|
|
4491
|
-
(0,
|
|
4652
|
+
(0, import_datalog6.rule)(
|
|
4492
4653
|
"wantedFallbackBehind",
|
|
4493
|
-
[(0,
|
|
4494
|
-
[(0,
|
|
4654
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("f")],
|
|
4655
|
+
[(0, import_datalog6.lit)(asking, (0, import_datalog6.variable)("x")), (0, import_datalog6.lit)("fallbackBehind", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("f"))]
|
|
4495
4656
|
),
|
|
4496
|
-
(0,
|
|
4657
|
+
(0, import_datalog6.rule)(
|
|
4497
4658
|
"wantedReadsOverridden",
|
|
4498
|
-
[(0,
|
|
4499
|
-
[(0,
|
|
4659
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("h")],
|
|
4660
|
+
[(0, import_datalog6.lit)(asking, (0, import_datalog6.variable)("x")), (0, import_datalog6.lit)("readsOverridden", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("h"))]
|
|
4500
4661
|
),
|
|
4501
|
-
(0,
|
|
4662
|
+
(0, import_datalog6.rule)(
|
|
4502
4663
|
"wantedReadsMemberOn",
|
|
4503
|
-
[(0,
|
|
4504
|
-
[(0,
|
|
4664
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("h")],
|
|
4665
|
+
[(0, import_datalog6.lit)(asking, (0, import_datalog6.variable)("x")), (0, import_datalog6.lit)("readsMemberOn", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("obj"), (0, import_datalog6.variable)("h"))]
|
|
4505
4666
|
)
|
|
4506
4667
|
];
|
|
4507
4668
|
}
|
|
4508
4669
|
var RESOLUTION_QUESTIONS = [
|
|
4509
|
-
(0,
|
|
4670
|
+
(0, import_datalog6.rule)(
|
|
4510
4671
|
"wantedResolves",
|
|
4511
|
-
[(0,
|
|
4512
|
-
[(0,
|
|
4672
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
4673
|
+
[(0, import_datalog6.lit)("wanted", (0, import_datalog6.variable)("x")), (0, import_datalog6.lit)("resolves", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"))]
|
|
4513
4674
|
),
|
|
4514
|
-
(0,
|
|
4675
|
+
(0, import_datalog6.rule)(
|
|
4515
4676
|
"wantedComesTo",
|
|
4516
|
-
[(0,
|
|
4517
|
-
[(0,
|
|
4677
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
4678
|
+
[(0, import_datalog6.lit)("wanted", (0, import_datalog6.variable)("x")), (0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"))]
|
|
4518
4679
|
),
|
|
4519
|
-
(0,
|
|
4680
|
+
(0, import_datalog6.rule)(
|
|
4520
4681
|
"wantedComesTo",
|
|
4521
|
-
[(0,
|
|
4522
|
-
[(0,
|
|
4682
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
4683
|
+
[(0, import_datalog6.lit)("wantedOrigin", (0, import_datalog6.variable)("x")), (0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"))]
|
|
4523
4684
|
),
|
|
4524
4685
|
...writtenAnswers("wanted"),
|
|
4525
4686
|
// A caller that reads only what a value is written as asks this way,
|
|
@@ -4528,666 +4689,667 @@ var RESOLUTION_QUESTIONS = [
|
|
|
4528
4689
|
// A call is given no `comesTo`, so this is the only way to ask what
|
|
4529
4690
|
// object one arrives at, and a demand-driven run derives `objectOf`
|
|
4530
4691
|
// nowhere without it. An allocation site is not one of the answers.
|
|
4531
|
-
(0,
|
|
4692
|
+
(0, import_datalog6.rule)(
|
|
4532
4693
|
"wantedObjectOf",
|
|
4533
|
-
[(0,
|
|
4694
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
4534
4695
|
[
|
|
4535
|
-
(0,
|
|
4536
|
-
(0,
|
|
4537
|
-
(0,
|
|
4696
|
+
(0, import_datalog6.lit)("wanted", (0, import_datalog6.variable)("x")),
|
|
4697
|
+
(0, import_datalog6.lit)("objectOf", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")),
|
|
4698
|
+
(0, import_datalog6.lit)("objectValue", (0, import_datalog6.variable)("z"))
|
|
4538
4699
|
]
|
|
4539
4700
|
),
|
|
4540
4701
|
// The same three questions under one allocation site, keyed by the
|
|
4541
4702
|
// value and the site both. An allocation site is an answer here,
|
|
4542
4703
|
// unlike `wantedObjectOf`, since a site is what a context is.
|
|
4543
|
-
(0,
|
|
4704
|
+
(0, import_datalog6.rule)(
|
|
4544
4705
|
"wantedIsWrittenAsUnder",
|
|
4545
|
-
[(0,
|
|
4706
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z")],
|
|
4546
4707
|
[
|
|
4547
|
-
(0,
|
|
4548
|
-
(0,
|
|
4708
|
+
(0, import_datalog6.lit)("wantedUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c")),
|
|
4709
|
+
(0, import_datalog6.lit)("isWrittenAsUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z"))
|
|
4549
4710
|
]
|
|
4550
4711
|
),
|
|
4551
4712
|
// Where a class was made, for a caller about to ask a value question
|
|
4552
4713
|
// under each. Going through `constructsNamed` keeps the demand on the
|
|
4553
4714
|
// calls written with the class's name rather than on every call.
|
|
4554
|
-
(0,
|
|
4715
|
+
(0, import_datalog6.rule)(
|
|
4555
4716
|
"wantedAllocatedAt",
|
|
4556
|
-
[(0,
|
|
4717
|
+
[(0, import_datalog6.variable)("cls"), (0, import_datalog6.variable)("site")],
|
|
4557
4718
|
[
|
|
4558
|
-
(0,
|
|
4559
|
-
(0,
|
|
4560
|
-
(0,
|
|
4719
|
+
(0, import_datalog6.lit)("wantedSites", (0, import_datalog6.variable)("cls")),
|
|
4720
|
+
(0, import_datalog6.lit)("constructsNamed", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls")),
|
|
4721
|
+
(0, import_datalog6.lit)("allocates", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("cls"))
|
|
4561
4722
|
]
|
|
4562
4723
|
),
|
|
4563
|
-
(0,
|
|
4724
|
+
(0, import_datalog6.rule)(
|
|
4564
4725
|
"wantedComesToUnder",
|
|
4565
|
-
[(0,
|
|
4726
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z")],
|
|
4566
4727
|
[
|
|
4567
|
-
(0,
|
|
4568
|
-
(0,
|
|
4728
|
+
(0, import_datalog6.lit)("wantedUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c")),
|
|
4729
|
+
(0, import_datalog6.lit)("comesToUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z"))
|
|
4569
4730
|
]
|
|
4570
4731
|
),
|
|
4571
|
-
(0,
|
|
4732
|
+
(0, import_datalog6.rule)(
|
|
4572
4733
|
"wantedObjectOfUnder",
|
|
4573
|
-
[(0,
|
|
4734
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z")],
|
|
4574
4735
|
[
|
|
4575
|
-
(0,
|
|
4576
|
-
(0,
|
|
4736
|
+
(0, import_datalog6.lit)("wantedUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c")),
|
|
4737
|
+
(0, import_datalog6.lit)("objectOfUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z"))
|
|
4577
4738
|
]
|
|
4578
4739
|
),
|
|
4579
|
-
(0,
|
|
4740
|
+
(0, import_datalog6.rule)(
|
|
4580
4741
|
"wantedFallbackBehindUnder",
|
|
4581
|
-
[(0,
|
|
4742
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("f")],
|
|
4582
4743
|
[
|
|
4583
|
-
(0,
|
|
4584
|
-
(0,
|
|
4744
|
+
(0, import_datalog6.lit)("wantedUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c")),
|
|
4745
|
+
(0, import_datalog6.lit)("fallbackBehindUnder", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("f"))
|
|
4585
4746
|
]
|
|
4586
4747
|
),
|
|
4587
4748
|
// The same for the function a call returns: `app.use(requireCaller(config))`
|
|
4588
4749
|
// registers what the factory gives back, and `resolves` on the call
|
|
4589
4750
|
// says nothing unless the factory unwraps an argument.
|
|
4590
|
-
(0,
|
|
4751
|
+
(0, import_datalog6.rule)(
|
|
4591
4752
|
"wantedGivesBack",
|
|
4592
|
-
[(0,
|
|
4593
|
-
[(0,
|
|
4753
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
4754
|
+
[(0, import_datalog6.lit)("wanted", (0, import_datalog6.variable)("x")), (0, import_datalog6.lit)("givesBack", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"))]
|
|
4594
4755
|
),
|
|
4595
|
-
(0,
|
|
4756
|
+
(0, import_datalog6.rule)(
|
|
4596
4757
|
"wantedGivesBackUnwrapped",
|
|
4597
|
-
[(0,
|
|
4598
|
-
[(0,
|
|
4758
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
4759
|
+
[(0, import_datalog6.lit)("wanted", (0, import_datalog6.variable)("x")), (0, import_datalog6.lit)("givesBackUnwrapped", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"))]
|
|
4599
4760
|
),
|
|
4600
4761
|
// The argument as the caller wrote it, keyed by the parameter, since
|
|
4601
4762
|
// that is what a caller has in hand when it wants the call sites told
|
|
4602
4763
|
// apart. The caller settles the argument however its kind of value needs.
|
|
4603
|
-
(0,
|
|
4764
|
+
(0, import_datalog6.rule)(
|
|
4604
4765
|
"wantedPassesArgument",
|
|
4605
|
-
[(0,
|
|
4606
|
-
[(0,
|
|
4766
|
+
[(0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("a")],
|
|
4767
|
+
[(0, import_datalog6.lit)("wanted", (0, import_datalog6.variable)("p")), (0, import_datalog6.lit)("passesArgument", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("a"))]
|
|
4607
4768
|
),
|
|
4608
|
-
(0,
|
|
4769
|
+
(0, import_datalog6.rule)(
|
|
4609
4770
|
"wantedReturnsCall",
|
|
4610
|
-
[(0,
|
|
4611
|
-
[(0,
|
|
4771
|
+
[(0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c")],
|
|
4772
|
+
[(0, import_datalog6.lit)("wanted", (0, import_datalog6.variable)("f")), (0, import_datalog6.lit)("returnsCall", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("c"))]
|
|
4612
4773
|
),
|
|
4613
4774
|
// Seeded with the expressions that spell the environment, a handful
|
|
4614
4775
|
// per project. The reads cannot be the seed: one written through a
|
|
4615
4776
|
// parameter is nowhere a scan of the source looks.
|
|
4616
|
-
(0,
|
|
4777
|
+
(0, import_datalog6.rule)(
|
|
4617
4778
|
"wantedParamNamesEnv",
|
|
4618
|
-
[(0,
|
|
4779
|
+
[(0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("site")],
|
|
4619
4780
|
[
|
|
4620
|
-
(0,
|
|
4621
|
-
(0,
|
|
4622
|
-
(0,
|
|
4781
|
+
(0, import_datalog6.lit)("wantedEnvObject", (0, import_datalog6.variable)("w")),
|
|
4782
|
+
(0, import_datalog6.lit)("environmentRead", (0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("x")),
|
|
4783
|
+
(0, import_datalog6.lit)("paramNamesEnv", (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("site"))
|
|
4623
4784
|
]
|
|
4624
4785
|
),
|
|
4625
4786
|
// The parameters the environment object is handed to, from the same
|
|
4626
4787
|
// seed, so a question about one is a lookup rather than a read of
|
|
4627
4788
|
// every file that could call its function.
|
|
4628
|
-
(0,
|
|
4789
|
+
(0, import_datalog6.rule)(
|
|
4629
4790
|
"wantedEnvParameter",
|
|
4630
|
-
[(0,
|
|
4791
|
+
[(0, import_datalog6.variable)("p")],
|
|
4631
4792
|
[
|
|
4632
|
-
(0,
|
|
4633
|
-
(0,
|
|
4634
|
-
(0,
|
|
4793
|
+
(0, import_datalog6.lit)("wantedEnvObject", (0, import_datalog6.variable)("w")),
|
|
4794
|
+
(0, import_datalog6.lit)("runtimeValue", (0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("p")),
|
|
4795
|
+
(0, import_datalog6.lit)("paramNamed", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("p"))
|
|
4635
4796
|
]
|
|
4636
4797
|
),
|
|
4637
4798
|
// The calls that hand it on, for an asker to resolve, since the
|
|
4638
4799
|
// parameter on the other side is in a file nothing has read yet.
|
|
4639
|
-
(0,
|
|
4800
|
+
(0, import_datalog6.rule)(
|
|
4640
4801
|
"wantedEnvPassingCall",
|
|
4641
|
-
[(0,
|
|
4802
|
+
[(0, import_datalog6.variable)("r")],
|
|
4642
4803
|
[
|
|
4643
|
-
(0,
|
|
4644
|
-
(0,
|
|
4645
|
-
(0,
|
|
4804
|
+
(0, import_datalog6.lit)("wantedEnvObject", (0, import_datalog6.variable)("w")),
|
|
4805
|
+
(0, import_datalog6.lit)("runtimeValue", (0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("a")),
|
|
4806
|
+
(0, import_datalog6.lit)("callArg", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("k"), (0, import_datalog6.variable)("a"))
|
|
4646
4807
|
]
|
|
4647
4808
|
),
|
|
4648
4809
|
// The same relation asked from one expression. Seeding from the
|
|
4649
4810
|
// objects instead would settle it for every expression in the
|
|
4650
4811
|
// project, and a caller holding an argument wants only that one.
|
|
4651
|
-
(0,
|
|
4812
|
+
(0, import_datalog6.rule)(
|
|
4652
4813
|
"wantedEnvironmentValue",
|
|
4653
|
-
[(0,
|
|
4814
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("w")],
|
|
4654
4815
|
[
|
|
4655
|
-
(0,
|
|
4656
|
-
(0,
|
|
4657
|
-
(0,
|
|
4816
|
+
(0, import_datalog6.lit)("wanted", (0, import_datalog6.variable)("o")),
|
|
4817
|
+
(0, import_datalog6.lit)("runtimeValue", (0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("o")),
|
|
4818
|
+
(0, import_datalog6.lit)("environmentObject", (0, import_datalog6.variable)("w"))
|
|
4658
4819
|
]
|
|
4659
4820
|
),
|
|
4660
4821
|
// Every expression an output stream reaches, from the spots that spell
|
|
4661
4822
|
// one, so a writer at `out.write(...)` looks its receiver up.
|
|
4662
|
-
(0,
|
|
4823
|
+
(0, import_datalog6.rule)(
|
|
4663
4824
|
"wantedStreamValue",
|
|
4664
|
-
[(0,
|
|
4665
|
-
[(0,
|
|
4825
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("w")],
|
|
4826
|
+
[(0, import_datalog6.lit)("wantedStreamObject", (0, import_datalog6.variable)("w")), (0, import_datalog6.lit)("runtimeValue", (0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("o"))]
|
|
4666
4827
|
),
|
|
4667
4828
|
// The functions whose return becomes the exit code: a call the value
|
|
4668
4829
|
// that ends up as the code is, or one it reaches. DESIGN.md has the seeds.
|
|
4669
|
-
(0,
|
|
4830
|
+
(0, import_datalog6.rule)("exitStart", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("x")], [(0, import_datalog6.lit)("wantedExitSink", (0, import_datalog6.variable)("x"))]),
|
|
4670
4831
|
// `reaches` takes no step through a call that picks its function from a
|
|
4671
4832
|
// table, so the walk starts again from what each function there returns.
|
|
4672
|
-
(0,
|
|
4833
|
+
(0, import_datalog6.rule)(
|
|
4673
4834
|
"exitStart",
|
|
4674
|
-
[(0,
|
|
4835
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("ret")],
|
|
4675
4836
|
[
|
|
4676
|
-
(0,
|
|
4677
|
-
(0,
|
|
4678
|
-
(0,
|
|
4837
|
+
(0, import_datalog6.lit)("exitReached", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")),
|
|
4838
|
+
(0, import_datalog6.lit)("dispatchesTo", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("f")),
|
|
4839
|
+
(0, import_datalog6.lit)("returnsValue", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("ret"))
|
|
4679
4840
|
]
|
|
4680
4841
|
),
|
|
4681
|
-
(0,
|
|
4682
|
-
(0,
|
|
4842
|
+
(0, import_datalog6.rule)("exitReached", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("s")], [(0, import_datalog6.lit)("exitStart", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("s"))]),
|
|
4843
|
+
(0, import_datalog6.rule)(
|
|
4683
4844
|
"exitReached",
|
|
4684
|
-
[(0,
|
|
4845
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")],
|
|
4685
4846
|
[
|
|
4686
|
-
(0,
|
|
4687
|
-
(0,
|
|
4847
|
+
(0, import_datalog6.lit)("exitStart", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("s")),
|
|
4848
|
+
(0, import_datalog6.lit)("reaches", (0, import_datalog6.variable)("s"), (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("kind"))
|
|
4688
4849
|
]
|
|
4689
4850
|
),
|
|
4690
|
-
(0,
|
|
4851
|
+
(0, import_datalog6.rule)(
|
|
4691
4852
|
"wantedExitCodeFrom",
|
|
4692
|
-
[(0,
|
|
4693
|
-
[(0,
|
|
4853
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("f")],
|
|
4854
|
+
[(0, import_datalog6.lit)("exitReached", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), (0, import_datalog6.lit)("invokes", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("f"))]
|
|
4694
4855
|
),
|
|
4695
|
-
(0,
|
|
4856
|
+
(0, import_datalog6.rule)(
|
|
4696
4857
|
"wantedExitCodeFrom",
|
|
4697
|
-
[(0,
|
|
4698
|
-
[(0,
|
|
4858
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("f")],
|
|
4859
|
+
[(0, import_datalog6.lit)("exitReached", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), (0, import_datalog6.lit)("dispatchesTo", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("f"))]
|
|
4699
4860
|
),
|
|
4700
4861
|
// The functions a call may run when it takes one from a table, with the
|
|
4701
4862
|
// entry each came from, and the entries that come to no function. The
|
|
4702
4863
|
// reader in dispatch.ts decides whether the call runs exactly one.
|
|
4703
|
-
(0,
|
|
4864
|
+
(0, import_datalog6.rule)(
|
|
4704
4865
|
"wantedDispatchSite",
|
|
4705
|
-
[(0,
|
|
4706
|
-
[(0,
|
|
4866
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")],
|
|
4867
|
+
[(0, import_datalog6.lit)("wantedDispatch", (0, import_datalog6.variable)("r")), (0, import_datalog6.lit)("callsEntryAt", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site"))]
|
|
4707
4868
|
),
|
|
4708
|
-
(0,
|
|
4869
|
+
(0, import_datalog6.rule)(
|
|
4709
4870
|
"wantedDispatchEntry",
|
|
4710
|
-
[(0,
|
|
4871
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("held")],
|
|
4711
4872
|
[
|
|
4712
|
-
(0,
|
|
4713
|
-
(0,
|
|
4714
|
-
(0,
|
|
4873
|
+
(0, import_datalog6.lit)("wantedDispatch", (0, import_datalog6.variable)("r")),
|
|
4874
|
+
(0, import_datalog6.lit)("callsEntryAt", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")),
|
|
4875
|
+
(0, import_datalog6.lit)("entryAt", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("held"))
|
|
4715
4876
|
]
|
|
4716
4877
|
),
|
|
4717
|
-
(0,
|
|
4878
|
+
(0, import_datalog6.rule)(
|
|
4718
4879
|
"wantedDispatchInBranch",
|
|
4719
|
-
[(0,
|
|
4880
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")],
|
|
4720
4881
|
[
|
|
4721
|
-
(0,
|
|
4722
|
-
(0,
|
|
4882
|
+
(0, import_datalog6.lit)("wantedDispatch", (0, import_datalog6.variable)("r")),
|
|
4883
|
+
(0, import_datalog6.lit)("callsEntryInBranch", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site"))
|
|
4723
4884
|
]
|
|
4724
4885
|
),
|
|
4725
|
-
(0,
|
|
4886
|
+
(0, import_datalog6.rule)(
|
|
4726
4887
|
"wantedDispatchComputed",
|
|
4727
|
-
[(0,
|
|
4888
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("held")],
|
|
4728
4889
|
[
|
|
4729
|
-
(0,
|
|
4730
|
-
(0,
|
|
4731
|
-
(0,
|
|
4890
|
+
(0, import_datalog6.lit)("wantedDispatch", (0, import_datalog6.variable)("r")),
|
|
4891
|
+
(0, import_datalog6.lit)("callsEntryAt", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")),
|
|
4892
|
+
(0, import_datalog6.lit)("computedEntryAt", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("held"))
|
|
4732
4893
|
]
|
|
4733
4894
|
),
|
|
4734
|
-
(0,
|
|
4895
|
+
(0, import_datalog6.rule)(
|
|
4735
4896
|
"wantedDispatchFunction",
|
|
4736
|
-
[(0,
|
|
4897
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("held"), (0, import_datalog6.variable)("f")],
|
|
4737
4898
|
[
|
|
4738
|
-
(0,
|
|
4739
|
-
(0,
|
|
4740
|
-
(0,
|
|
4741
|
-
(0,
|
|
4742
|
-
(0,
|
|
4899
|
+
(0, import_datalog6.lit)("wantedDispatch", (0, import_datalog6.variable)("r")),
|
|
4900
|
+
(0, import_datalog6.lit)("callsEntryAt", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")),
|
|
4901
|
+
(0, import_datalog6.lit)("entryAt", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("held")),
|
|
4902
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("held"), (0, import_datalog6.variable)("f")),
|
|
4903
|
+
(0, import_datalog6.lit)("func", (0, import_datalog6.variable)("f"))
|
|
4743
4904
|
]
|
|
4744
4905
|
),
|
|
4745
|
-
(0,
|
|
4906
|
+
(0, import_datalog6.rule)(
|
|
4746
4907
|
"wantedDispatchLikeEntry",
|
|
4747
|
-
[(0,
|
|
4908
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
4748
4909
|
[
|
|
4749
|
-
(0,
|
|
4750
|
-
(0,
|
|
4751
|
-
(0,
|
|
4910
|
+
(0, import_datalog6.lit)("wantedDispatch", (0, import_datalog6.variable)("r")),
|
|
4911
|
+
(0, import_datalog6.lit)("callsEntryAt", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")),
|
|
4912
|
+
(0, import_datalog6.lit)("likeEntryAt", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
4752
4913
|
]
|
|
4753
4914
|
),
|
|
4754
|
-
(0,
|
|
4915
|
+
(0, import_datalog6.rule)(
|
|
4755
4916
|
"wantedDispatchLikeFunction",
|
|
4756
|
-
[(0,
|
|
4917
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("held"), (0, import_datalog6.variable)("f")],
|
|
4757
4918
|
[
|
|
4758
|
-
(0,
|
|
4759
|
-
(0,
|
|
4760
|
-
(0,
|
|
4761
|
-
(0,
|
|
4762
|
-
(0,
|
|
4919
|
+
(0, import_datalog6.lit)("wantedDispatch", (0, import_datalog6.variable)("r")),
|
|
4920
|
+
(0, import_datalog6.lit)("callsEntryAt", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("site")),
|
|
4921
|
+
(0, import_datalog6.lit)("likeEntryAt", (0, import_datalog6.variable)("site"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")),
|
|
4922
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("held"), (0, import_datalog6.variable)("f")),
|
|
4923
|
+
(0, import_datalog6.lit)("func", (0, import_datalog6.variable)("f"))
|
|
4763
4924
|
]
|
|
4764
4925
|
),
|
|
4765
4926
|
// What a function there calls in its own body, for an entry written as
|
|
4766
4927
|
// a lambda, which no summary describes.
|
|
4767
|
-
(0,
|
|
4928
|
+
(0, import_datalog6.rule)(
|
|
4768
4929
|
"wantedDispatchThrough",
|
|
4769
|
-
[(0,
|
|
4930
|
+
[(0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("g")],
|
|
4770
4931
|
[
|
|
4771
|
-
(0,
|
|
4772
|
-
(0,
|
|
4773
|
-
(0,
|
|
4774
|
-
(0,
|
|
4932
|
+
(0, import_datalog6.lit)("wantedDispatch", (0, import_datalog6.variable)("r")),
|
|
4933
|
+
(0, import_datalog6.lit)("dispatchesTo", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("f")),
|
|
4934
|
+
(0, import_datalog6.lit)("makesCall", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("r2")),
|
|
4935
|
+
(0, import_datalog6.lit)("invokes", (0, import_datalog6.variable)("r2"), (0, import_datalog6.variable)("g"))
|
|
4775
4936
|
]
|
|
4776
4937
|
),
|
|
4777
4938
|
// The calls that hand a stream on, so the asker can read the callee's file.
|
|
4778
|
-
(0,
|
|
4939
|
+
(0, import_datalog6.rule)(
|
|
4779
4940
|
"wantedStreamPassingCall",
|
|
4780
|
-
[(0,
|
|
4941
|
+
[(0, import_datalog6.variable)("r")],
|
|
4781
4942
|
[
|
|
4782
|
-
(0,
|
|
4783
|
-
(0,
|
|
4784
|
-
(0,
|
|
4943
|
+
(0, import_datalog6.lit)("wantedStreamObject", (0, import_datalog6.variable)("w")),
|
|
4944
|
+
(0, import_datalog6.lit)("runtimeValue", (0, import_datalog6.variable)("w"), (0, import_datalog6.variable)("a")),
|
|
4945
|
+
(0, import_datalog6.lit)("callArg", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("k"), (0, import_datalog6.variable)("a"))
|
|
4785
4946
|
]
|
|
4786
4947
|
),
|
|
4787
4948
|
// Whether an expression is a parameter under another name, for a
|
|
4788
4949
|
// caller deciding whether going and reading that parameter's callers
|
|
4789
4950
|
// could change the answer it already has.
|
|
4790
|
-
(0,
|
|
4951
|
+
(0, import_datalog6.rule)(
|
|
4791
4952
|
"wantedRefersToParam",
|
|
4792
|
-
[(0,
|
|
4793
|
-
[(0,
|
|
4953
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("p")],
|
|
4954
|
+
[(0, import_datalog6.lit)("wanted", (0, import_datalog6.variable)("o")), (0, import_datalog6.lit)("refersToParam", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("p"))]
|
|
4794
4955
|
),
|
|
4795
4956
|
// The types a value is declared as, beside each argument its own
|
|
4796
4957
|
// callers pass, so the asking side can refuse a caller passing
|
|
4797
4958
|
// something no declaration types.
|
|
4798
|
-
(0,
|
|
4959
|
+
(0, import_datalog6.rule)(
|
|
4799
4960
|
"wantedTypedAs",
|
|
4800
|
-
[(0,
|
|
4801
|
-
[(0,
|
|
4961
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("t")],
|
|
4962
|
+
[(0, import_datalog6.lit)("wantedType", (0, import_datalog6.variable)("x")), (0, import_datalog6.lit)("typedAs", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("t"))]
|
|
4802
4963
|
),
|
|
4803
|
-
(0,
|
|
4964
|
+
(0, import_datalog6.rule)(
|
|
4804
4965
|
"wantedTypePassed",
|
|
4805
|
-
[(0,
|
|
4966
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("a")],
|
|
4806
4967
|
[
|
|
4807
|
-
(0,
|
|
4808
|
-
(0,
|
|
4809
|
-
(0,
|
|
4968
|
+
(0, import_datalog6.lit)("wantedType", (0, import_datalog6.variable)("o")),
|
|
4969
|
+
(0, import_datalog6.lit)("refersToParam", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("p")),
|
|
4970
|
+
(0, import_datalog6.lit)("passesArgument", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("a"))
|
|
4810
4971
|
]
|
|
4811
4972
|
),
|
|
4812
|
-
(0,
|
|
4973
|
+
(0, import_datalog6.rule)(
|
|
4813
4974
|
"wantedPassedTypedAs",
|
|
4814
|
-
[(0,
|
|
4975
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("t")],
|
|
4815
4976
|
[
|
|
4816
|
-
(0,
|
|
4817
|
-
(0,
|
|
4818
|
-
(0,
|
|
4819
|
-
(0,
|
|
4977
|
+
(0, import_datalog6.lit)("wantedType", (0, import_datalog6.variable)("o")),
|
|
4978
|
+
(0, import_datalog6.lit)("refersToParam", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("p")),
|
|
4979
|
+
(0, import_datalog6.lit)("passesArgument", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("a")),
|
|
4980
|
+
(0, import_datalog6.lit)("typedAs", (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("t"))
|
|
4820
4981
|
]
|
|
4821
4982
|
),
|
|
4822
|
-
(0,
|
|
4983
|
+
(0, import_datalog6.rule)(
|
|
4823
4984
|
"wantedPassedParam",
|
|
4824
|
-
[(0,
|
|
4985
|
+
[(0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("a")],
|
|
4825
4986
|
[
|
|
4826
|
-
(0,
|
|
4827
|
-
(0,
|
|
4828
|
-
(0,
|
|
4829
|
-
(0,
|
|
4987
|
+
(0, import_datalog6.lit)("wantedType", (0, import_datalog6.variable)("o")),
|
|
4988
|
+
(0, import_datalog6.lit)("refersToParam", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("p")),
|
|
4989
|
+
(0, import_datalog6.lit)("passesArgument", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("a")),
|
|
4990
|
+
(0, import_datalog6.lit)("refersToParam", (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("q"))
|
|
4830
4991
|
]
|
|
4831
4992
|
),
|
|
4832
|
-
(0,
|
|
4993
|
+
(0, import_datalog6.rule)(
|
|
4833
4994
|
"wantedComesFrom",
|
|
4834
|
-
[(0,
|
|
4835
|
-
[(0,
|
|
4995
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")],
|
|
4996
|
+
[(0, import_datalog6.lit)("wantedOrigin", (0, import_datalog6.variable)("x")), (0, import_datalog6.lit)("comesFrom", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"))]
|
|
4836
4997
|
),
|
|
4837
4998
|
// Call-origin questions, for attribution, in their own demand
|
|
4838
4999
|
// class. Attribution stops at the import declaration, so nothing
|
|
4839
5000
|
// here demands reaches or callsInto. The chains are closures with
|
|
4840
5001
|
// no depth bound: an alias run of any length resolves.
|
|
4841
|
-
(0,
|
|
5002
|
+
(0, import_datalog6.rule)("callOriginChain", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("x")], [(0, import_datalog6.lit)("wantedCallOrigin", (0, import_datalog6.variable)("x"))]),
|
|
4842
5003
|
// The chain with at least one hop taken, which is what tells a
|
|
4843
5004
|
// destructured binding apart from asking about a node directly. The
|
|
4844
5005
|
// whole chain is the seed plus those hops.
|
|
4845
|
-
(0,
|
|
5006
|
+
(0, import_datalog6.rule)(
|
|
4846
5007
|
"callOriginChain",
|
|
4847
|
-
[(0,
|
|
4848
|
-
[(0,
|
|
5008
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
5009
|
+
[(0, import_datalog6.lit)("callOriginChainStepped", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"))]
|
|
4849
5010
|
),
|
|
4850
|
-
(0,
|
|
5011
|
+
(0, import_datalog6.rule)(
|
|
4851
5012
|
"callOriginChainStepped",
|
|
4852
|
-
[(0,
|
|
4853
|
-
[(0,
|
|
5013
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
5014
|
+
[(0, import_datalog6.lit)("callOriginChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), (0, import_datalog6.lit)("nameHop", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("z"))]
|
|
4854
5015
|
),
|
|
4855
|
-
(0,
|
|
5016
|
+
(0, import_datalog6.rule)(
|
|
4856
5017
|
"wantedCallOriginPair",
|
|
4857
|
-
[(0,
|
|
5018
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")],
|
|
4858
5019
|
[
|
|
4859
|
-
(0,
|
|
4860
|
-
(0,
|
|
5020
|
+
(0, import_datalog6.lit)("callOriginChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")),
|
|
5021
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"))
|
|
4861
5022
|
]
|
|
4862
5023
|
),
|
|
4863
5024
|
// An import of a project barrel is an import of what the barrel
|
|
4864
5025
|
// forwards, so the pair surfaces the module behind the chain.
|
|
4865
|
-
(0,
|
|
5026
|
+
(0, import_datalog6.rule)(
|
|
4866
5027
|
"wantedCallOriginPair",
|
|
4867
|
-
[(0,
|
|
5028
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m2"), (0, import_datalog6.variable)("n2")],
|
|
4868
5029
|
[
|
|
4869
|
-
(0,
|
|
4870
|
-
(0,
|
|
4871
|
-
(0,
|
|
5030
|
+
(0, import_datalog6.lit)("callOriginChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")),
|
|
5031
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")),
|
|
5032
|
+
(0, import_datalog6.lit)("moduleForwards", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("m2"), (0, import_datalog6.variable)("n2"))
|
|
4872
5033
|
]
|
|
4873
5034
|
),
|
|
4874
5035
|
// A namespace member: the module's export of the member's own name.
|
|
4875
5036
|
// The imports literal leads, since it is the smallest relation.
|
|
4876
|
-
(0,
|
|
5037
|
+
(0, import_datalog6.rule)(
|
|
4877
5038
|
"wantedCallOriginPair",
|
|
4878
|
-
[(0,
|
|
5039
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("p")],
|
|
4879
5040
|
[
|
|
4880
|
-
(0,
|
|
4881
|
-
(0,
|
|
4882
|
-
(0,
|
|
5041
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("m"), NAMESPACE_IMPORT),
|
|
5042
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("p")),
|
|
5043
|
+
(0, import_datalog6.lit)("callOriginChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"))
|
|
4883
5044
|
]
|
|
4884
5045
|
),
|
|
4885
|
-
(0,
|
|
5046
|
+
(0, import_datalog6.rule)(
|
|
4886
5047
|
"wantedCallOriginPair",
|
|
4887
|
-
[(0,
|
|
5048
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("p")],
|
|
4888
5049
|
[
|
|
4889
|
-
(0,
|
|
4890
|
-
(0,
|
|
4891
|
-
(0,
|
|
4892
|
-
(0,
|
|
5050
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("d"), (0, import_datalog6.variable)("m"), NAMESPACE_IMPORT),
|
|
5051
|
+
(0, import_datalog6.lit)("binds", (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("d")),
|
|
5052
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("p")),
|
|
5053
|
+
(0, import_datalog6.lit)("callOriginChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"))
|
|
4893
5054
|
]
|
|
4894
5055
|
),
|
|
4895
5056
|
// What a call made: through the call to its callee, whose own alias
|
|
4896
5057
|
// chain leads to the import.
|
|
4897
|
-
(0,
|
|
5058
|
+
(0, import_datalog6.rule)(
|
|
4898
5059
|
"callMadeChain",
|
|
4899
|
-
[(0,
|
|
4900
|
-
[(0,
|
|
5060
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("f")],
|
|
5061
|
+
[(0, import_datalog6.lit)("callOriginChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c")), (0, import_datalog6.lit)("call", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("f"))]
|
|
4901
5062
|
),
|
|
4902
|
-
(0,
|
|
5063
|
+
(0, import_datalog6.rule)(
|
|
4903
5064
|
"callMadeChain",
|
|
4904
|
-
[(0,
|
|
4905
|
-
[(0,
|
|
5065
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
5066
|
+
[(0, import_datalog6.lit)("callMadeChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), (0, import_datalog6.lit)("nameHop", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("z"))]
|
|
4906
5067
|
),
|
|
4907
|
-
(0,
|
|
5068
|
+
(0, import_datalog6.rule)(
|
|
4908
5069
|
"wantedCallOriginPair",
|
|
4909
|
-
[(0,
|
|
5070
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")],
|
|
4910
5071
|
[
|
|
4911
|
-
(0,
|
|
4912
|
-
(0,
|
|
5072
|
+
(0, import_datalog6.lit)("callMadeChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")),
|
|
5073
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"))
|
|
4913
5074
|
]
|
|
4914
5075
|
),
|
|
4915
5076
|
// A member destructured off what a call made keeps the member name
|
|
4916
5077
|
// as one more path segment.
|
|
4917
|
-
(0,
|
|
5078
|
+
(0, import_datalog6.rule)(
|
|
4918
5079
|
"callMemberChain",
|
|
4919
|
-
[(0,
|
|
5080
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("p")],
|
|
4920
5081
|
[
|
|
4921
|
-
(0,
|
|
4922
|
-
(0,
|
|
4923
|
-
(0,
|
|
5082
|
+
(0, import_datalog6.lit)("callOriginChainStepped", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("e")),
|
|
5083
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("e"), (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("p")),
|
|
5084
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("f"))
|
|
4924
5085
|
]
|
|
4925
5086
|
),
|
|
4926
|
-
(0,
|
|
5087
|
+
(0, import_datalog6.rule)(
|
|
4927
5088
|
"callMemberChain",
|
|
4928
|
-
[(0,
|
|
5089
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z"), (0, import_datalog6.variable)("p")],
|
|
4929
5090
|
[
|
|
4930
|
-
(0,
|
|
4931
|
-
(0,
|
|
5091
|
+
(0, import_datalog6.lit)("callMemberChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("p")),
|
|
5092
|
+
(0, import_datalog6.lit)("nameHop", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("z"))
|
|
4932
5093
|
]
|
|
4933
5094
|
),
|
|
4934
|
-
(0,
|
|
5095
|
+
(0, import_datalog6.rule)(
|
|
4935
5096
|
"wantedCallOriginMember",
|
|
4936
|
-
[(0,
|
|
5097
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("p")],
|
|
4937
5098
|
[
|
|
4938
|
-
(0,
|
|
4939
|
-
(0,
|
|
5099
|
+
(0, import_datalog6.lit)("callMemberChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("p")),
|
|
5100
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"))
|
|
4940
5101
|
]
|
|
4941
5102
|
),
|
|
4942
|
-
(0,
|
|
5103
|
+
(0, import_datalog6.rule)(
|
|
4943
5104
|
"wantedCallsInto",
|
|
4944
|
-
[(0,
|
|
5105
|
+
[(0, import_datalog6.variable)("g"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")],
|
|
4945
5106
|
[
|
|
4946
|
-
(0,
|
|
4947
|
-
(0,
|
|
4948
|
-
(0,
|
|
5107
|
+
(0, import_datalog6.lit)("wantedOrigin", (0, import_datalog6.variable)("x")),
|
|
5108
|
+
(0, import_datalog6.lit)("comesTo", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("g")),
|
|
5109
|
+
(0, import_datalog6.lit)("callsInto", (0, import_datalog6.variable)("g"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"))
|
|
4949
5110
|
]
|
|
4950
5111
|
),
|
|
4951
5112
|
// Subject identity, its own demand class; the README's subject
|
|
4952
5113
|
// section says why the origin pair rides on the written-value walk.
|
|
4953
|
-
(0,
|
|
5114
|
+
(0, import_datalog6.rule)(
|
|
4954
5115
|
"wantedSubjectWritten",
|
|
4955
|
-
[(0,
|
|
4956
|
-
[(0,
|
|
5116
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r")],
|
|
5117
|
+
[(0, import_datalog6.lit)("wantedSubject", (0, import_datalog6.variable)("x")), (0, import_datalog6.lit)("isWrittenAs", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r"))]
|
|
4957
5118
|
),
|
|
4958
|
-
(0,
|
|
5119
|
+
(0, import_datalog6.rule)(
|
|
4959
5120
|
"wantedSubjectConstruction",
|
|
4960
|
-
[(0,
|
|
5121
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")],
|
|
4961
5122
|
[
|
|
4962
|
-
(0,
|
|
4963
|
-
(0,
|
|
4964
|
-
(0,
|
|
4965
|
-
(0,
|
|
5123
|
+
(0, import_datalog6.lit)("wantedSubject", (0, import_datalog6.variable)("x")),
|
|
5124
|
+
(0, import_datalog6.lit)("isWrittenAs", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r")),
|
|
5125
|
+
(0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c")),
|
|
5126
|
+
(0, import_datalog6.lit)("comesFrom", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"))
|
|
4966
5127
|
]
|
|
4967
5128
|
),
|
|
4968
5129
|
// The export table of one module, keyed by the module asked about.
|
|
4969
5130
|
// The moduleExport rules flatten re-export chains of any length, and
|
|
4970
5131
|
// the demand cone stays on export facts alone.
|
|
4971
|
-
(0,
|
|
5132
|
+
(0, import_datalog6.rule)(
|
|
4972
5133
|
"wantedModuleExport",
|
|
4973
|
-
[(0,
|
|
5134
|
+
[(0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("value")],
|
|
4974
5135
|
[
|
|
4975
|
-
(0,
|
|
4976
|
-
(0,
|
|
5136
|
+
(0, import_datalog6.lit)("wantedExportsOf", (0, import_datalog6.variable)("m")),
|
|
5137
|
+
(0, import_datalog6.lit)("moduleExport", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("value"))
|
|
4977
5138
|
]
|
|
4978
5139
|
),
|
|
4979
5140
|
// A class's ancestry: each base as written, then the class that name
|
|
4980
5141
|
// comes to through the name hops. A storage pack matches its library's
|
|
4981
5142
|
// bases against the base names along the way.
|
|
4982
|
-
(0,
|
|
4983
|
-
(0,
|
|
5143
|
+
(0, import_datalog6.rule)("ancestryChain", [(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("c")], [(0, import_datalog6.lit)("wantedAncestry", (0, import_datalog6.variable)("c"))]),
|
|
5144
|
+
(0, import_datalog6.rule)(
|
|
4984
5145
|
"ancestryChain",
|
|
4985
|
-
[(0,
|
|
4986
|
-
[(0,
|
|
5146
|
+
[(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("x")],
|
|
5147
|
+
[(0, import_datalog6.lit)("ancestryChain", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("b")), (0, import_datalog6.lit)("extends", (0, import_datalog6.variable)("b"), (0, import_datalog6.variable)("x"))]
|
|
4987
5148
|
),
|
|
4988
|
-
(0,
|
|
5149
|
+
(0, import_datalog6.rule)(
|
|
4989
5150
|
"ancestryChain",
|
|
4990
|
-
[(0,
|
|
4991
|
-
[(0,
|
|
5151
|
+
[(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("x")],
|
|
5152
|
+
[(0, import_datalog6.lit)("ancestryChain", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("b")), (0, import_datalog6.lit)("prepends", (0, import_datalog6.variable)("b"), (0, import_datalog6.variable)("x"))]
|
|
4992
5153
|
),
|
|
4993
|
-
(0,
|
|
5154
|
+
(0, import_datalog6.rule)(
|
|
4994
5155
|
"ancestryChain",
|
|
4995
|
-
[(0,
|
|
4996
|
-
[(0,
|
|
5156
|
+
[(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z")],
|
|
5157
|
+
[(0, import_datalog6.lit)("ancestryChain", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("y")), (0, import_datalog6.lit)("nameHop", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("z"))]
|
|
4997
5158
|
),
|
|
4998
|
-
(0,
|
|
5159
|
+
(0, import_datalog6.rule)(
|
|
4999
5160
|
"ancestryChain",
|
|
5000
|
-
[(0,
|
|
5161
|
+
[(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("z")],
|
|
5001
5162
|
[
|
|
5002
|
-
(0,
|
|
5003
|
-
(0,
|
|
5004
|
-
(0,
|
|
5163
|
+
(0, import_datalog6.lit)("ancestryChain", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("y")),
|
|
5164
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")),
|
|
5165
|
+
(0, import_datalog6.lit)("moduleExport", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("z"))
|
|
5005
5166
|
]
|
|
5006
5167
|
),
|
|
5007
|
-
(0,
|
|
5168
|
+
(0, import_datalog6.rule)(
|
|
5008
5169
|
"wantedBaseName",
|
|
5009
|
-
[(0,
|
|
5010
|
-
[(0,
|
|
5170
|
+
[(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("n")],
|
|
5171
|
+
[(0, import_datalog6.lit)("ancestryChain", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("b")), (0, import_datalog6.lit)("extendsNamed", (0, import_datalog6.variable)("b"), (0, import_datalog6.variable)("n"))]
|
|
5011
5172
|
),
|
|
5012
5173
|
// Each method the same chain declares, so a caller that settled a
|
|
5013
5174
|
// receiver on a class can tell a method the project writes itself
|
|
5014
5175
|
// from one only the library provides.
|
|
5015
|
-
(0,
|
|
5176
|
+
(0, import_datalog6.rule)(
|
|
5016
5177
|
"wantedDeclaredName",
|
|
5017
|
-
[(0,
|
|
5178
|
+
[(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("n")],
|
|
5018
5179
|
[
|
|
5019
|
-
(0,
|
|
5020
|
-
(0,
|
|
5180
|
+
(0, import_datalog6.lit)("ancestryChain", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("b")),
|
|
5181
|
+
(0, import_datalog6.lit)("holdsProperty", (0, import_datalog6.variable)("b"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
5021
5182
|
]
|
|
5022
5183
|
),
|
|
5023
5184
|
// A method the class gets under a name the source computes rather than
|
|
5024
5185
|
// writes out. The adapter settles the name against the same facts and
|
|
5025
5186
|
// says so, and the chain reports it beside the ones written out.
|
|
5026
|
-
(0,
|
|
5187
|
+
(0, import_datalog6.rule)(
|
|
5027
5188
|
"wantedDeclaredName",
|
|
5028
|
-
[(0,
|
|
5029
|
-
[(0,
|
|
5189
|
+
[(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("n")],
|
|
5190
|
+
[(0, import_datalog6.lit)("ancestryChain", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("b")), (0, import_datalog6.lit)("declaresName", (0, import_datalog6.variable)("b"), (0, import_datalog6.variable)("n"))]
|
|
5030
5191
|
),
|
|
5031
5192
|
// The method behind each callback the chain registers, by the event
|
|
5032
5193
|
// that runs it. A base registering one reaches every class below it,
|
|
5033
5194
|
// and the method may be declared anywhere along the same chain.
|
|
5034
|
-
(0,
|
|
5195
|
+
(0, import_datalog6.rule)(
|
|
5035
5196
|
"wantedCallbackMethod",
|
|
5036
|
-
[(0,
|
|
5197
|
+
[(0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("event"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held")],
|
|
5037
5198
|
[
|
|
5038
|
-
(0,
|
|
5039
|
-
(0,
|
|
5040
|
-
(0,
|
|
5041
|
-
(0,
|
|
5199
|
+
(0, import_datalog6.lit)("ancestryChain", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("b")),
|
|
5200
|
+
(0, import_datalog6.lit)("classCallback", (0, import_datalog6.variable)("b"), (0, import_datalog6.variable)("event"), (0, import_datalog6.variable)("n")),
|
|
5201
|
+
(0, import_datalog6.lit)("ancestryChain", (0, import_datalog6.variable)("c"), (0, import_datalog6.variable)("b2")),
|
|
5202
|
+
(0, import_datalog6.lit)("holdsProperty", (0, import_datalog6.variable)("b2"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("held"))
|
|
5042
5203
|
]
|
|
5043
5204
|
),
|
|
5044
5205
|
// The calls behind a receiver, for a pack that wants the anchor a
|
|
5045
5206
|
// chain hangs off; the README's anchor section says which hops and
|
|
5046
5207
|
// why the asking side applies the single-answer policy.
|
|
5047
|
-
(0,
|
|
5048
|
-
(0,
|
|
5208
|
+
(0, import_datalog6.rule)("anchorChain", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("x")], [(0, import_datalog6.lit)("wantedAnchor", (0, import_datalog6.variable)("x"))]),
|
|
5209
|
+
(0, import_datalog6.rule)(
|
|
5049
5210
|
"anchorChain",
|
|
5050
|
-
[(0,
|
|
5051
|
-
[(0,
|
|
5211
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
5212
|
+
[(0, import_datalog6.lit)("anchorChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), (0, import_datalog6.lit)("nameHop", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("z"))]
|
|
5052
5213
|
),
|
|
5053
|
-
(0,
|
|
5214
|
+
(0, import_datalog6.rule)(
|
|
5054
5215
|
"anchorChain",
|
|
5055
|
-
[(0,
|
|
5216
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
5056
5217
|
[
|
|
5057
|
-
(0,
|
|
5058
|
-
(0,
|
|
5059
|
-
(0,
|
|
5218
|
+
(0, import_datalog6.lit)("anchorChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")),
|
|
5219
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")),
|
|
5220
|
+
(0, import_datalog6.lit)("moduleExport", (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("z"))
|
|
5060
5221
|
]
|
|
5061
5222
|
),
|
|
5062
|
-
(0,
|
|
5223
|
+
(0, import_datalog6.rule)(
|
|
5063
5224
|
"anchorChain",
|
|
5064
|
-
[(0,
|
|
5065
|
-
[(0,
|
|
5225
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("c")],
|
|
5226
|
+
[(0, import_datalog6.lit)("anchorChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r")), (0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c"))]
|
|
5066
5227
|
),
|
|
5067
|
-
(0,
|
|
5228
|
+
(0, import_datalog6.rule)(
|
|
5068
5229
|
"anchorChain",
|
|
5069
|
-
[(0,
|
|
5230
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("o")],
|
|
5070
5231
|
[
|
|
5071
|
-
(0,
|
|
5072
|
-
(0,
|
|
5232
|
+
(0, import_datalog6.lit)("anchorChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")),
|
|
5233
|
+
(0, import_datalog6.lit)("readsProperty", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n"))
|
|
5073
5234
|
]
|
|
5074
5235
|
),
|
|
5075
|
-
(0,
|
|
5236
|
+
(0, import_datalog6.rule)(
|
|
5076
5237
|
"wantedAnchorCall",
|
|
5077
|
-
[(0,
|
|
5078
|
-
[(0,
|
|
5238
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r")],
|
|
5239
|
+
[(0, import_datalog6.lit)("anchorChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r")), (0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c"))]
|
|
5079
5240
|
),
|
|
5080
5241
|
...USES_QUESTIONS,
|
|
5242
|
+
...SELF_QUESTIONS,
|
|
5081
5243
|
// Where a value came from, asked from the value. DESIGN.md says why the
|
|
5082
5244
|
// walk takes `hop`, why it descends into the object a read is off, and
|
|
5083
5245
|
// why a guard's question stops at a call.
|
|
5084
|
-
(0,
|
|
5246
|
+
(0, import_datalog6.rule)("sourceChain", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("x")], [(0, import_datalog6.lit)("wantedSource", (0, import_datalog6.variable)("x"))]),
|
|
5085
5247
|
...SOURCE_STEPS.map(
|
|
5086
|
-
(kind) => (0,
|
|
5248
|
+
(kind) => (0, import_datalog6.rule)(
|
|
5087
5249
|
"sourceChain",
|
|
5088
|
-
[(0,
|
|
5089
|
-
[(0,
|
|
5250
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
5251
|
+
[(0, import_datalog6.lit)("sourceChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), (0, import_datalog6.lit)("hop", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("z"), kind)]
|
|
5090
5252
|
)
|
|
5091
5253
|
),
|
|
5092
5254
|
...SOURCE_READS.map(
|
|
5093
|
-
(read) => (0,
|
|
5255
|
+
(read) => (0, import_datalog6.rule)(
|
|
5094
5256
|
"sourceChain",
|
|
5095
|
-
[(0,
|
|
5096
|
-
[(0,
|
|
5257
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("o")],
|
|
5258
|
+
[(0, import_datalog6.lit)("sourceChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), read]
|
|
5097
5259
|
)
|
|
5098
5260
|
),
|
|
5099
|
-
(0,
|
|
5261
|
+
(0, import_datalog6.rule)(
|
|
5100
5262
|
"sourceChain",
|
|
5101
|
-
[(0,
|
|
5263
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("a")],
|
|
5102
5264
|
[
|
|
5103
|
-
(0,
|
|
5104
|
-
(0,
|
|
5265
|
+
(0, import_datalog6.lit)("sourceChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r")),
|
|
5266
|
+
(0, import_datalog6.lit)("converts", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("n"))
|
|
5105
5267
|
]
|
|
5106
5268
|
),
|
|
5107
|
-
(0,
|
|
5269
|
+
(0, import_datalog6.rule)(
|
|
5108
5270
|
"wantedSourceConverts",
|
|
5109
|
-
[(0,
|
|
5271
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("n")],
|
|
5110
5272
|
[
|
|
5111
|
-
(0,
|
|
5112
|
-
(0,
|
|
5273
|
+
(0, import_datalog6.lit)("sourceChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r")),
|
|
5274
|
+
(0, import_datalog6.lit)("converts", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("a"), (0, import_datalog6.variable)("n"))
|
|
5113
5275
|
]
|
|
5114
5276
|
),
|
|
5115
|
-
(0,
|
|
5116
|
-
(0,
|
|
5277
|
+
(0, import_datalog6.rule)("inputChain", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("x")], [(0, import_datalog6.lit)("wantedInputRead", (0, import_datalog6.variable)("x"))]),
|
|
5278
|
+
(0, import_datalog6.rule)(
|
|
5117
5279
|
"inputChain",
|
|
5118
|
-
[(0,
|
|
5119
|
-
[(0,
|
|
5280
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("z")],
|
|
5281
|
+
[(0, import_datalog6.lit)("inputChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), (0, import_datalog6.lit)("nameHop", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("z"))]
|
|
5120
5282
|
),
|
|
5121
5283
|
...SOURCE_READS.map(
|
|
5122
|
-
(read) => (0,
|
|
5284
|
+
(read) => (0, import_datalog6.rule)(
|
|
5123
5285
|
"inputChain",
|
|
5124
|
-
[(0,
|
|
5125
|
-
[(0,
|
|
5286
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("o")],
|
|
5287
|
+
[(0, import_datalog6.lit)("inputChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), read]
|
|
5126
5288
|
)
|
|
5127
5289
|
),
|
|
5128
|
-
(0,
|
|
5129
|
-
(0,
|
|
5290
|
+
(0, import_datalog6.rule)("sourceMember", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")], [(0, import_datalog6.lit)("sourceChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"))]),
|
|
5291
|
+
(0, import_datalog6.rule)("sourceMember", [(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")], [(0, import_datalog6.lit)("inputChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"))]),
|
|
5130
5292
|
// The chain's steps and what each member is, keyed by the value asked
|
|
5131
5293
|
// about, so the asking side can rebuild the path a leaf was read along.
|
|
5132
5294
|
...SOURCE_STEPS.map(
|
|
5133
|
-
(kind) => (0,
|
|
5295
|
+
(kind) => (0, import_datalog6.rule)(
|
|
5134
5296
|
"wantedSourceHop",
|
|
5135
|
-
[(0,
|
|
5136
|
-
[(0,
|
|
5297
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("z")],
|
|
5298
|
+
[(0, import_datalog6.lit)("sourceChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), (0, import_datalog6.lit)("hop", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("z"), kind)]
|
|
5137
5299
|
)
|
|
5138
5300
|
),
|
|
5139
|
-
(0,
|
|
5301
|
+
(0, import_datalog6.rule)(
|
|
5140
5302
|
"wantedSourceHop",
|
|
5141
|
-
[(0,
|
|
5142
|
-
[(0,
|
|
5303
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("z")],
|
|
5304
|
+
[(0, import_datalog6.lit)("inputChain", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), (0, import_datalog6.lit)("nameHop", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("z"))]
|
|
5143
5305
|
),
|
|
5144
5306
|
...WRITTEN_KEY_READS.map(
|
|
5145
|
-
(read) => (0,
|
|
5307
|
+
(read) => (0, import_datalog6.rule)(
|
|
5146
5308
|
"wantedSourceRead",
|
|
5147
|
-
[(0,
|
|
5148
|
-
[(0,
|
|
5309
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("n")],
|
|
5310
|
+
[(0, import_datalog6.lit)("sourceMember", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")), read]
|
|
5149
5311
|
)
|
|
5150
5312
|
),
|
|
5151
|
-
(0,
|
|
5313
|
+
(0, import_datalog6.rule)(
|
|
5152
5314
|
"wantedSourceKeyed",
|
|
5153
|
-
[(0,
|
|
5315
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("o")],
|
|
5154
5316
|
[
|
|
5155
|
-
(0,
|
|
5156
|
-
(0,
|
|
5317
|
+
(0, import_datalog6.lit)("sourceMember", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")),
|
|
5318
|
+
(0, import_datalog6.lit)("readsKeyed", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("o"), (0, import_datalog6.variable)("k"))
|
|
5157
5319
|
]
|
|
5158
5320
|
),
|
|
5159
|
-
(0,
|
|
5321
|
+
(0, import_datalog6.rule)(
|
|
5160
5322
|
"wantedSourceParam",
|
|
5161
|
-
[(0,
|
|
5323
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("f")],
|
|
5162
5324
|
[
|
|
5163
|
-
(0,
|
|
5164
|
-
(0,
|
|
5325
|
+
(0, import_datalog6.lit)("sourceMember", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("p")),
|
|
5326
|
+
(0, import_datalog6.lit)("paramOf", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("k"), (0, import_datalog6.variable)("p"))
|
|
5165
5327
|
]
|
|
5166
5328
|
),
|
|
5167
|
-
(0,
|
|
5329
|
+
(0, import_datalog6.rule)(
|
|
5168
5330
|
"wantedSourceParam",
|
|
5169
|
-
[(0,
|
|
5331
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("p"), (0, import_datalog6.variable)("f")],
|
|
5170
5332
|
[
|
|
5171
|
-
(0,
|
|
5172
|
-
(0,
|
|
5333
|
+
(0, import_datalog6.lit)("sourceMember", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("p")),
|
|
5334
|
+
(0, import_datalog6.lit)("paramNamed", (0, import_datalog6.variable)("f"), (0, import_datalog6.variable)("n"), (0, import_datalog6.variable)("p"))
|
|
5173
5335
|
]
|
|
5174
5336
|
),
|
|
5175
|
-
(0,
|
|
5337
|
+
(0, import_datalog6.rule)(
|
|
5176
5338
|
"wantedSourceWritten",
|
|
5177
|
-
[(0,
|
|
5178
|
-
[(0,
|
|
5339
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("w")],
|
|
5340
|
+
[(0, import_datalog6.lit)("sourceMember", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("w")), (0, import_datalog6.lit)("writtenValue", (0, import_datalog6.variable)("w"))]
|
|
5179
5341
|
),
|
|
5180
|
-
(0,
|
|
5342
|
+
(0, import_datalog6.rule)(
|
|
5181
5343
|
"wantedSourceCall",
|
|
5182
|
-
[(0,
|
|
5183
|
-
[(0,
|
|
5344
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r")],
|
|
5345
|
+
[(0, import_datalog6.lit)("sourceMember", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("r")), (0, import_datalog6.lit)("call", (0, import_datalog6.variable)("r"), (0, import_datalog6.variable)("c"))]
|
|
5184
5346
|
),
|
|
5185
|
-
(0,
|
|
5347
|
+
(0, import_datalog6.rule)(
|
|
5186
5348
|
"wantedSourceImport",
|
|
5187
|
-
[(0,
|
|
5349
|
+
[(0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n")],
|
|
5188
5350
|
[
|
|
5189
|
-
(0,
|
|
5190
|
-
(0,
|
|
5351
|
+
(0, import_datalog6.lit)("sourceMember", (0, import_datalog6.variable)("x"), (0, import_datalog6.variable)("y")),
|
|
5352
|
+
(0, import_datalog6.lit)("imports", (0, import_datalog6.variable)("y"), (0, import_datalog6.variable)("m"), (0, import_datalog6.variable)("n"))
|
|
5191
5353
|
]
|
|
5192
5354
|
)
|
|
5193
5355
|
];
|
|
@@ -5224,6 +5386,10 @@ var UNDER_ANSWER_RELATIONS = [
|
|
|
5224
5386
|
RESOLUTION_QUESTIONS,
|
|
5225
5387
|
RESOLUTION_RULES,
|
|
5226
5388
|
RESULT_STEP,
|
|
5389
|
+
SELF_AS_CLASS,
|
|
5390
|
+
SELF_AS_CLASS_NAME,
|
|
5391
|
+
SELF_AS_INSTANCE,
|
|
5392
|
+
SELF_AS_INSTANCE_NAME,
|
|
5227
5393
|
SPREAD_ENTRY,
|
|
5228
5394
|
UNDER_ANSWER_RELATIONS,
|
|
5229
5395
|
UNDER_QUESTION_ROW_BUDGET,
|
|
@@ -5263,6 +5429,8 @@ var UNDER_ANSWER_RELATIONS = [
|
|
|
5263
5429
|
isObserved,
|
|
5264
5430
|
isWrittenAsUnder,
|
|
5265
5431
|
joinMountedPath,
|
|
5432
|
+
keptVariants,
|
|
5433
|
+
memberOf,
|
|
5266
5434
|
mergeStoredDependencies,
|
|
5267
5435
|
mountPathsOf,
|
|
5268
5436
|
noDependencies,
|
|
@@ -5272,6 +5440,7 @@ var UNDER_ANSWER_RELATIONS = [
|
|
|
5272
5440
|
objectOfUnder,
|
|
5273
5441
|
observeDemand,
|
|
5274
5442
|
packHashes,
|
|
5443
|
+
plainKeyOf,
|
|
5275
5444
|
proofRules,
|
|
5276
5445
|
queryFacts,
|
|
5277
5446
|
readDispatchOutcomes,
|
|
@@ -5281,6 +5450,8 @@ var UNDER_ANSWER_RELATIONS = [
|
|
|
5281
5450
|
resolutionProgram,
|
|
5282
5451
|
resolutionUnderProgram,
|
|
5283
5452
|
resolvedFunctions,
|
|
5453
|
+
selfFormOf,
|
|
5454
|
+
selfResultOf,
|
|
5284
5455
|
settledFunction,
|
|
5285
5456
|
sourceLeavesOf,
|
|
5286
5457
|
spanOfKey,
|
|
@@ -5290,6 +5461,7 @@ var UNDER_ANSWER_RELATIONS = [
|
|
|
5290
5461
|
underQuestionSpend,
|
|
5291
5462
|
unpackHashes,
|
|
5292
5463
|
valueLeftByWrites,
|
|
5464
|
+
variantKey,
|
|
5293
5465
|
walkRecordsByFile,
|
|
5294
5466
|
writesRunInOrder,
|
|
5295
5467
|
writtenAnswersFor,
|