@neocompose/cli 0.77.0 → 0.77.1
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/CHANGELOG.md +38 -0
- package/dist/neo.mjs +1282 -533
- package/dist/test-worker.mjs +517 -268
- package/package.json +1 -1
- package/skills/neocompose-cli/SKILL.md +1 -1
- package/skills/neocompose-cli/references/cli-development.md +1 -1
- package/skills/neocompose-cli/references/declarations-and-construction.md +21 -2
- package/skills/neocompose-cli/references/neoscript.md +9 -0
package/dist/neo.mjs
CHANGED
|
@@ -122,36 +122,36 @@ var MemberKind;
|
|
|
122
122
|
var init_member_kind_enum = __esm({
|
|
123
123
|
"../packages/models/src/members/member-kind-enum.ts"() {
|
|
124
124
|
"use strict";
|
|
125
|
-
MemberKind = /* @__PURE__ */ ((
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
return
|
|
125
|
+
MemberKind = /* @__PURE__ */ ((MemberKind11) => {
|
|
126
|
+
MemberKind11[MemberKind11["Null"] = 0] = "Null";
|
|
127
|
+
MemberKind11[MemberKind11["Bool"] = 1] = "Bool";
|
|
128
|
+
MemberKind11[MemberKind11["Int"] = 2] = "Int";
|
|
129
|
+
MemberKind11[MemberKind11["String"] = 3] = "String";
|
|
130
|
+
MemberKind11[MemberKind11["Float"] = 4] = "Float";
|
|
131
|
+
MemberKind11[MemberKind11["Dictionary"] = 5] = "Dictionary";
|
|
132
|
+
MemberKind11[MemberKind11["List"] = 6] = "List";
|
|
133
|
+
MemberKind11[MemberKind11["Class"] = 7] = "Class";
|
|
134
|
+
MemberKind11[MemberKind11["Enum"] = 8] = "Enum";
|
|
135
|
+
MemberKind11[MemberKind11["Lookup"] = 9] = "Lookup";
|
|
136
|
+
MemberKind11[MemberKind11["NSProperty"] = 10] = "NSProperty";
|
|
137
|
+
MemberKind11[MemberKind11["Sprite"] = 11] = "Sprite";
|
|
138
|
+
MemberKind11[MemberKind11["Audio"] = 12] = "Audio";
|
|
139
|
+
MemberKind11[MemberKind11["Function"] = 13] = "Function";
|
|
140
|
+
MemberKind11[MemberKind11["Vector2"] = 14] = "Vector2";
|
|
141
|
+
MemberKind11[MemberKind11["Vector2Int"] = 15] = "Vector2Int";
|
|
142
|
+
MemberKind11[MemberKind11["Vector3"] = 16] = "Vector3";
|
|
143
|
+
MemberKind11[MemberKind11["Vector3Int"] = 17] = "Vector3Int";
|
|
144
|
+
MemberKind11[MemberKind11["DialogueLookup"] = 18] = "DialogueLookup";
|
|
145
|
+
MemberKind11[MemberKind11["Color"] = 19] = "Color";
|
|
146
|
+
MemberKind11[MemberKind11["Decimal"] = 20] = "Decimal";
|
|
147
|
+
MemberKind11[MemberKind11["Generic"] = 21] = "Generic";
|
|
148
|
+
MemberKind11[MemberKind11["Interface"] = 22] = "Interface";
|
|
149
|
+
MemberKind11[MemberKind11["NSFunction"] = 23] = "NSFunction";
|
|
150
|
+
MemberKind11[MemberKind11["FunctionRef"] = 24] = "FunctionRef";
|
|
151
|
+
MemberKind11[MemberKind11["NSDelegate"] = 25] = "NSDelegate";
|
|
152
|
+
MemberKind11[MemberKind11["NSAction"] = 26] = "NSAction";
|
|
153
|
+
MemberKind11[MemberKind11["Variant"] = 27] = "Variant";
|
|
154
|
+
return MemberKind11;
|
|
155
155
|
})(MemberKind || {});
|
|
156
156
|
}
|
|
157
157
|
});
|
|
@@ -3391,6 +3391,13 @@ var init_neoscript_guards = __esm({
|
|
|
3391
3391
|
function parameterHasDefault(argument2) {
|
|
3392
3392
|
return argument2.defaultValue !== void 0;
|
|
3393
3393
|
}
|
|
3394
|
+
function unnamedArgumentTypes(argumentTypes) {
|
|
3395
|
+
return argumentTypes.map((argument2) => {
|
|
3396
|
+
const { name, ...typeInfo } = argument2;
|
|
3397
|
+
void name;
|
|
3398
|
+
return typeInfo;
|
|
3399
|
+
});
|
|
3400
|
+
}
|
|
3394
3401
|
function hasAnyParameterDefault(argumentTypes) {
|
|
3395
3402
|
return argumentTypes.some(parameterHasDefault);
|
|
3396
3403
|
}
|
|
@@ -3474,6 +3481,15 @@ function typeInfosInvariantlyEqual(left, right) {
|
|
|
3474
3481
|
if (left.keyEnumId !== right.keyEnumId) return false;
|
|
3475
3482
|
return typeInfosInvariantlyEqual(left.entryTypeInfo, right.entryTypeInfo);
|
|
3476
3483
|
}
|
|
3484
|
+
if (left.type === 25 /* NSDelegate */ && right.type === 25 /* NSDelegate */) {
|
|
3485
|
+
if (!typeInfosInvariantlyEqual(left.returnTypeInfo, right.returnTypeInfo)) {
|
|
3486
|
+
return false;
|
|
3487
|
+
}
|
|
3488
|
+
if (left.argumentTypes.length !== right.argumentTypes.length) return false;
|
|
3489
|
+
return left.argumentTypes.every(
|
|
3490
|
+
(argument2, index) => typeInfosInvariantlyEqual(argument2, right.argumentTypes[index])
|
|
3491
|
+
);
|
|
3492
|
+
}
|
|
3477
3493
|
if (left.type === 26 /* NSAction */ && right.type === 26 /* NSAction */) {
|
|
3478
3494
|
if (left.argumentTypes.length !== right.argumentTypes.length) return false;
|
|
3479
3495
|
return left.argumentTypes.every(
|
|
@@ -9052,6 +9068,10 @@ function resolveInstanceEnv(effectiveClassId, classArguments2, classes) {
|
|
|
9052
9068
|
if (existing !== void 0 && existing.kind !== "unbound") continue;
|
|
9053
9069
|
env.set(paramId, { kind: "member", memberId: arg.memberId });
|
|
9054
9070
|
}
|
|
9071
|
+
closeForwardedGenericParams(env);
|
|
9072
|
+
return env;
|
|
9073
|
+
}
|
|
9074
|
+
function closeForwardedGenericParams(env) {
|
|
9055
9075
|
for (const [paramId, entry] of env) {
|
|
9056
9076
|
if (entry.kind !== "unbound") continue;
|
|
9057
9077
|
const seen = /* @__PURE__ */ new Set([paramId]);
|
|
@@ -9067,7 +9087,6 @@ function resolveInstanceEnv(effectiveClassId, classArguments2, classes) {
|
|
|
9067
9087
|
targetParamId = target.paramId;
|
|
9068
9088
|
}
|
|
9069
9089
|
}
|
|
9070
|
-
return env;
|
|
9071
9090
|
}
|
|
9072
9091
|
function firstUnboundParamId(env) {
|
|
9073
9092
|
for (const entry of env.values()) {
|
|
@@ -9521,10 +9540,13 @@ function typeInfoFromArgumentSignature(signature) {
|
|
|
9521
9540
|
...dictionarySignature.keyEnumId === void 0 ? {} : { keyEnumId: dictionarySignature.keyEnumId }
|
|
9522
9541
|
};
|
|
9523
9542
|
}
|
|
9543
|
+
if (signature.type === 25 /* NSDelegate */) {
|
|
9544
|
+
return signature;
|
|
9545
|
+
}
|
|
9524
9546
|
const typeInfo = { type: signature.type, required: signature.required };
|
|
9525
9547
|
if (!isNSTypeInfo(typeInfo)) {
|
|
9526
9548
|
throw new Error(
|
|
9527
|
-
`substituteMember: generic binding kind ${signature.type} cannot appear in a NeoScript callable type.`
|
|
9549
|
+
`substituteMember: generic binding kind ${MemberKind[signature.type] ?? signature.type} cannot appear in a NeoScript callable type.`
|
|
9528
9550
|
);
|
|
9529
9551
|
}
|
|
9530
9552
|
return typeInfo;
|
|
@@ -9614,6 +9636,20 @@ function typeArgumentSignatureOfMember(member, env, members, seen = /* @__PURE__
|
|
|
9614
9636
|
entry: entrySignature(resolved.entryMemberId, env, members, seen)
|
|
9615
9637
|
};
|
|
9616
9638
|
}
|
|
9639
|
+
if (isMemberDelegateBase(resolved)) {
|
|
9640
|
+
return {
|
|
9641
|
+
type: 25 /* NSDelegate */,
|
|
9642
|
+
required: required2,
|
|
9643
|
+
returnTypeInfo: substituteNestedTypeInfo(
|
|
9644
|
+
resolved.returnTypeInfo,
|
|
9645
|
+
env,
|
|
9646
|
+
members
|
|
9647
|
+
),
|
|
9648
|
+
argumentTypes: unnamedArgumentTypes(resolved.argumentTypes).map(
|
|
9649
|
+
(argument2) => substituteNestedTypeInfo(argument2, env, members)
|
|
9650
|
+
)
|
|
9651
|
+
};
|
|
9652
|
+
}
|
|
9617
9653
|
if (isMemberStringBase(resolved)) {
|
|
9618
9654
|
return {
|
|
9619
9655
|
type: 3 /* String */,
|
|
@@ -9701,6 +9737,12 @@ function signaturesEqual(a, b) {
|
|
|
9701
9737
|
if (ad.keyEnumId !== bd.keyEnumId) return false;
|
|
9702
9738
|
return signaturesEqual(ad.entry, bd.entry);
|
|
9703
9739
|
}
|
|
9740
|
+
if (a.type === 25 /* NSDelegate */ && b.type === 25 /* NSDelegate */) {
|
|
9741
|
+
return typeInfosInvariantlyEqual(
|
|
9742
|
+
a,
|
|
9743
|
+
b
|
|
9744
|
+
);
|
|
9745
|
+
}
|
|
9704
9746
|
return true;
|
|
9705
9747
|
}
|
|
9706
9748
|
function constructedSlotAccepts(slotMember, valueClassId, contextEnv, classes, members) {
|
|
@@ -9812,6 +9854,8 @@ var init_generics = __esm({
|
|
|
9812
9854
|
"use strict";
|
|
9813
9855
|
init_member_kinds();
|
|
9814
9856
|
init_neoscript_guards();
|
|
9857
|
+
init_type_info_equality();
|
|
9858
|
+
init_parameter_defaults();
|
|
9815
9859
|
init_world_system_classes();
|
|
9816
9860
|
init_structural_narrow();
|
|
9817
9861
|
init_classes();
|
|
@@ -10189,6 +10233,14 @@ function suppliedValueSettlesConstruction(member, value, context, path) {
|
|
|
10189
10233
|
}
|
|
10190
10234
|
return valueSettlesConstruction(member, { value }, context, path);
|
|
10191
10235
|
}
|
|
10236
|
+
function genericParameterName(parameterId, classes) {
|
|
10237
|
+
for (const neoClass of classes) {
|
|
10238
|
+
for (const parameter4 of neoClass.genericParams ?? []) {
|
|
10239
|
+
if (parameter4.id === parameterId) return parameter4.name;
|
|
10240
|
+
}
|
|
10241
|
+
}
|
|
10242
|
+
return void 0;
|
|
10243
|
+
}
|
|
10192
10244
|
function resolveConstructionTypeArguments(typeArguments, document) {
|
|
10193
10245
|
if (typeArguments === void 0) return void 0;
|
|
10194
10246
|
const bindings = {};
|
|
@@ -10213,8 +10265,10 @@ function resolveConstructionTypeArguments(typeArguments, document) {
|
|
|
10213
10265
|
}
|
|
10214
10266
|
}
|
|
10215
10267
|
if (binding === void 0) {
|
|
10268
|
+
const parameter4 = genericParameterName(parameterId, document.classes) ?? parameterId;
|
|
10269
|
+
const kind = typeof typeInfo.type === "number" ? MemberKind[typeInfo.type] : typeInfo.type;
|
|
10216
10270
|
throw new Error(
|
|
10217
|
-
`Construction type argument "${
|
|
10271
|
+
`Construction type argument "${parameter4}" (${kind}) has no matching type descriptor in the document.`
|
|
10218
10272
|
);
|
|
10219
10273
|
}
|
|
10220
10274
|
bindings[parameterId] = {
|
|
@@ -14604,6 +14658,162 @@ function collectReturnStatements(statements) {
|
|
|
14604
14658
|
}
|
|
14605
14659
|
return result;
|
|
14606
14660
|
}
|
|
14661
|
+
function collectIdentifierReads(expression, names) {
|
|
14662
|
+
if (names.size === 0) return [];
|
|
14663
|
+
const reads = [];
|
|
14664
|
+
const walk = (node, visible) => {
|
|
14665
|
+
switch (node.kind) {
|
|
14666
|
+
case "ident":
|
|
14667
|
+
if (visible.has(node.name))
|
|
14668
|
+
reads.push({ name: node.name, pos: node.pos });
|
|
14669
|
+
return;
|
|
14670
|
+
case "annotated":
|
|
14671
|
+
walk(node.expression, visible);
|
|
14672
|
+
return;
|
|
14673
|
+
case "member":
|
|
14674
|
+
walk(node.receiver, visible);
|
|
14675
|
+
return;
|
|
14676
|
+
case "index":
|
|
14677
|
+
walk(node.receiver, visible);
|
|
14678
|
+
walk(node.index, visible);
|
|
14679
|
+
return;
|
|
14680
|
+
case "call":
|
|
14681
|
+
walk(node.callee, visible);
|
|
14682
|
+
for (const argument2 of node.args) walk(argument2, visible);
|
|
14683
|
+
return;
|
|
14684
|
+
case "new":
|
|
14685
|
+
for (const argument2 of node.args) walk(argument2, visible);
|
|
14686
|
+
for (const field of node.initializer ?? []) walk(field.value, visible);
|
|
14687
|
+
return;
|
|
14688
|
+
case "litList":
|
|
14689
|
+
for (const element of node.elements) walk(element, visible);
|
|
14690
|
+
return;
|
|
14691
|
+
case "litDict":
|
|
14692
|
+
for (const entry of node.entries) {
|
|
14693
|
+
walk(entry.key, visible);
|
|
14694
|
+
walk(entry.value, visible);
|
|
14695
|
+
}
|
|
14696
|
+
return;
|
|
14697
|
+
case "litInterp":
|
|
14698
|
+
for (const part of node.parts) {
|
|
14699
|
+
if (part.kind === "expr") walk(part.expr, visible);
|
|
14700
|
+
}
|
|
14701
|
+
return;
|
|
14702
|
+
case "binary":
|
|
14703
|
+
case "coalesce":
|
|
14704
|
+
walk(node.left, visible);
|
|
14705
|
+
walk(node.right, visible);
|
|
14706
|
+
return;
|
|
14707
|
+
case "conditional":
|
|
14708
|
+
walk(node.condition, visible);
|
|
14709
|
+
walk(node.whenTrue, visible);
|
|
14710
|
+
walk(node.whenFalse, visible);
|
|
14711
|
+
return;
|
|
14712
|
+
case "unary":
|
|
14713
|
+
case "force":
|
|
14714
|
+
case "is":
|
|
14715
|
+
walk(node.operand, visible);
|
|
14716
|
+
return;
|
|
14717
|
+
case "lambda": {
|
|
14718
|
+
const inner = new Set(visible);
|
|
14719
|
+
for (const parameter4 of node.params) inner.delete(parameter4.name);
|
|
14720
|
+
for (const statement of node.body) walkStatement(statement, inner);
|
|
14721
|
+
return;
|
|
14722
|
+
}
|
|
14723
|
+
case "litNull":
|
|
14724
|
+
case "litBool":
|
|
14725
|
+
case "litInt":
|
|
14726
|
+
case "litFloat":
|
|
14727
|
+
case "litString":
|
|
14728
|
+
case "litTripleString":
|
|
14729
|
+
case "contextualEnum":
|
|
14730
|
+
return;
|
|
14731
|
+
}
|
|
14732
|
+
};
|
|
14733
|
+
const walkStatement = (statement, visible) => {
|
|
14734
|
+
switch (statement.kind) {
|
|
14735
|
+
case "varDecl":
|
|
14736
|
+
walk(statement.init, visible);
|
|
14737
|
+
return;
|
|
14738
|
+
case "if":
|
|
14739
|
+
for (const branch of statement.branches) {
|
|
14740
|
+
walk(branch.cond, visible);
|
|
14741
|
+
for (const inner of branch.body) walkStatement(inner, visible);
|
|
14742
|
+
}
|
|
14743
|
+
for (const inner of statement.elseBody ?? [])
|
|
14744
|
+
walkStatement(inner, visible);
|
|
14745
|
+
return;
|
|
14746
|
+
case "while":
|
|
14747
|
+
case "doWhile":
|
|
14748
|
+
walk(statement.condition, visible);
|
|
14749
|
+
for (const inner of statement.body) walkStatement(inner, visible);
|
|
14750
|
+
return;
|
|
14751
|
+
case "for": {
|
|
14752
|
+
walk(statement.initializer.init, visible);
|
|
14753
|
+
const inner = new Set(visible);
|
|
14754
|
+
inner.delete(statement.initializer.name);
|
|
14755
|
+
walk(statement.condition, inner);
|
|
14756
|
+
walkStatement(statement.iterator, inner);
|
|
14757
|
+
for (const bodyStatement of statement.body) {
|
|
14758
|
+
walkStatement(bodyStatement, inner);
|
|
14759
|
+
}
|
|
14760
|
+
return;
|
|
14761
|
+
}
|
|
14762
|
+
case "forEach": {
|
|
14763
|
+
walk(statement.collection, visible);
|
|
14764
|
+
const inner = new Set(visible);
|
|
14765
|
+
inner.delete(statement.name);
|
|
14766
|
+
if (statement.key) inner.delete(statement.key.name);
|
|
14767
|
+
for (const bodyStatement of statement.body) {
|
|
14768
|
+
walkStatement(bodyStatement, inner);
|
|
14769
|
+
}
|
|
14770
|
+
return;
|
|
14771
|
+
}
|
|
14772
|
+
case "switch":
|
|
14773
|
+
walk(statement.selector, visible);
|
|
14774
|
+
for (const section of statement.sections) {
|
|
14775
|
+
for (const label of section.labels) {
|
|
14776
|
+
if (label.kind === "case") walk(label.expression, visible);
|
|
14777
|
+
}
|
|
14778
|
+
for (const bodyStatement of section.body) {
|
|
14779
|
+
walkStatement(bodyStatement, visible);
|
|
14780
|
+
}
|
|
14781
|
+
}
|
|
14782
|
+
return;
|
|
14783
|
+
case "try":
|
|
14784
|
+
for (const bodyStatement of statement.body) {
|
|
14785
|
+
walkStatement(bodyStatement, visible);
|
|
14786
|
+
}
|
|
14787
|
+
for (const clause of statement.catches) {
|
|
14788
|
+
const catchScope = new Set(visible);
|
|
14789
|
+
catchScope.delete(clause.name);
|
|
14790
|
+
if (clause.filter) walk(clause.filter, catchScope);
|
|
14791
|
+
for (const bodyStatement of clause.body) {
|
|
14792
|
+
walkStatement(bodyStatement, catchScope);
|
|
14793
|
+
}
|
|
14794
|
+
}
|
|
14795
|
+
return;
|
|
14796
|
+
case "return":
|
|
14797
|
+
if (statement.expr) walk(statement.expr, visible);
|
|
14798
|
+
return;
|
|
14799
|
+
case "throw":
|
|
14800
|
+
if (statement.expr) walk(statement.expr, visible);
|
|
14801
|
+
return;
|
|
14802
|
+
case "assign":
|
|
14803
|
+
walk(statement.target, visible);
|
|
14804
|
+
if (statement.value) walk(statement.value, visible);
|
|
14805
|
+
return;
|
|
14806
|
+
case "exprStmt":
|
|
14807
|
+
walk(statement.expr, visible);
|
|
14808
|
+
return;
|
|
14809
|
+
case "break":
|
|
14810
|
+
case "continue":
|
|
14811
|
+
return;
|
|
14812
|
+
}
|
|
14813
|
+
};
|
|
14814
|
+
walk(expression, names);
|
|
14815
|
+
return reads;
|
|
14816
|
+
}
|
|
14607
14817
|
var init_strict_ast = __esm({
|
|
14608
14818
|
"../packages/neoscript-language/src/strict-ast.ts"() {
|
|
14609
14819
|
"use strict";
|
|
@@ -29321,6 +29531,25 @@ function substituteTypeParameters(member, receiver, declaring) {
|
|
|
29321
29531
|
};
|
|
29322
29532
|
return visit(member);
|
|
29323
29533
|
}
|
|
29534
|
+
function containsTypeParameter(type) {
|
|
29535
|
+
switch (type.kind) {
|
|
29536
|
+
case "typeParameter":
|
|
29537
|
+
return true;
|
|
29538
|
+
case "named":
|
|
29539
|
+
return type.typeArguments?.some(containsTypeParameter) ?? false;
|
|
29540
|
+
case "list":
|
|
29541
|
+
case "set":
|
|
29542
|
+
return containsTypeParameter(type.elementType);
|
|
29543
|
+
case "dictionary":
|
|
29544
|
+
return containsTypeParameter(type.keyType) || containsTypeParameter(type.valueType);
|
|
29545
|
+
case "delegate":
|
|
29546
|
+
return containsTypeParameter(type.returnType) || type.parameterTypes.some(containsTypeParameter);
|
|
29547
|
+
case "action":
|
|
29548
|
+
return type.parameterTypes.some(containsTypeParameter);
|
|
29549
|
+
default:
|
|
29550
|
+
return false;
|
|
29551
|
+
}
|
|
29552
|
+
}
|
|
29324
29553
|
var init_type_substitution = __esm({
|
|
29325
29554
|
"../packages/neoscript-language/src/type-substitution.ts"() {
|
|
29326
29555
|
"use strict";
|
|
@@ -30422,6 +30651,25 @@ function variable(id2, type, pointer, project) {
|
|
|
30422
30651
|
function isGeneratedPositionalCall(target, expression) {
|
|
30423
30652
|
return neoScriptRequiredConstructor(target) === null && target.constructorSignature !== void 0 && expression.argumentNames === void 0 && callHasPositionalArguments(expression);
|
|
30424
30653
|
}
|
|
30654
|
+
function closedConstructorParameters(parameters, targetType, schemaClass2) {
|
|
30655
|
+
return parameters.map((parameter4) => {
|
|
30656
|
+
const valueType = substituteTypeParameters(
|
|
30657
|
+
parameter4.valueType,
|
|
30658
|
+
targetType,
|
|
30659
|
+
schemaClass2
|
|
30660
|
+
);
|
|
30661
|
+
return {
|
|
30662
|
+
...parameter4,
|
|
30663
|
+
valueType,
|
|
30664
|
+
parameterType: substituteTypeParameters(
|
|
30665
|
+
parameter4.parameterType,
|
|
30666
|
+
targetType,
|
|
30667
|
+
schemaClass2
|
|
30668
|
+
),
|
|
30669
|
+
required: parameter4.required && valueType.nullable !== true
|
|
30670
|
+
};
|
|
30671
|
+
});
|
|
30672
|
+
}
|
|
30425
30673
|
function requiredMembersAfterArguments(schemaClass2, parameters, positionalCount) {
|
|
30426
30674
|
const names = [];
|
|
30427
30675
|
for (const parameter4 of parameters.slice(positionalCount)) {
|
|
@@ -31756,6 +32004,7 @@ function resolveNeoScriptType(type, context, project) {
|
|
|
31756
32004
|
)
|
|
31757
32005
|
} : {}
|
|
31758
32006
|
};
|
|
32007
|
+
assertTypeArgumentConstraints(named, resolved, type.pos, project);
|
|
31759
32008
|
break;
|
|
31760
32009
|
}
|
|
31761
32010
|
case "list":
|
|
@@ -31788,6 +32037,31 @@ function resolveNeoScriptType(type, context, project) {
|
|
|
31788
32037
|
}
|
|
31789
32038
|
return { ...resolved, nullable: !type.required };
|
|
31790
32039
|
}
|
|
32040
|
+
function wrappedTypeParameterMessage(target, project) {
|
|
32041
|
+
for (const argument2 of target.typeArguments ?? []) {
|
|
32042
|
+
if (argument2.kind === "typeParameter") continue;
|
|
32043
|
+
if (!containsTypeParameter(argument2)) continue;
|
|
32044
|
+
return `Cannot construct '${formatType(target, project)}': type argument '${formatType(argument2, project)}' wraps a type parameter. Pass the type parameter itself or a closed type.`;
|
|
32045
|
+
}
|
|
32046
|
+
return null;
|
|
32047
|
+
}
|
|
32048
|
+
function assertDirectTypeParameterArguments(target, pos, project) {
|
|
32049
|
+
const message = wrappedTypeParameterMessage(target, project);
|
|
32050
|
+
if (message !== null) throw new CompileError(message, pos);
|
|
32051
|
+
}
|
|
32052
|
+
function assertTypeArgumentConstraints(declaring, type, pos, project) {
|
|
32053
|
+
declaring.typeParameters?.forEach((parameter4, index) => {
|
|
32054
|
+
const argument2 = type.typeArguments?.[index];
|
|
32055
|
+
const constraint = parameter4.type.kind === "typeParameter" ? parameter4.type.constraint : void 0;
|
|
32056
|
+
if (argument2 === void 0 || constraint === void 0) return;
|
|
32057
|
+
const expected = substituteTypeParameters(constraint, type, declaring);
|
|
32058
|
+
if (isNeoScriptTypeAssignable(argument2, expected, project)) return;
|
|
32059
|
+
throw new CompileError(
|
|
32060
|
+
`Type argument '${formatType(argument2, project)}' does not satisfy '${parameter4.name} extends ${formatType(expected, project)}' on '${declaring.name}'.`,
|
|
32061
|
+
pos
|
|
32062
|
+
);
|
|
32063
|
+
});
|
|
32064
|
+
}
|
|
31791
32065
|
function intersectCollectionWritability(left, right) {
|
|
31792
32066
|
if (left === right) return left;
|
|
31793
32067
|
const writable = (value) => value === "local" /* Local */ || value === "save" /* Save */ || value === "session" /* Session */ || value === "runtime" /* Runtime */;
|
|
@@ -32217,6 +32491,18 @@ var init_strict_resolver = __esm({
|
|
|
32217
32491
|
}
|
|
32218
32492
|
return { fields, errors, deferredReferences: [...deferredReferences] };
|
|
32219
32493
|
}
|
|
32494
|
+
/**
|
|
32495
|
+
* P60 §2.3. A persisted delegate method group, graded exactly as the same
|
|
32496
|
+
* expression assigned to `expected` in a body.
|
|
32497
|
+
*/
|
|
32498
|
+
resolvePersistedMethodGroup(expression, expected) {
|
|
32499
|
+
const resolved = this.resolveExpression(
|
|
32500
|
+
expression,
|
|
32501
|
+
this.initialScope(),
|
|
32502
|
+
expected
|
|
32503
|
+
);
|
|
32504
|
+
this.requireAssignable(resolved.type, expected, expression.pos, "value");
|
|
32505
|
+
}
|
|
32220
32506
|
persistedListenerCompletions(receiver, expected) {
|
|
32221
32507
|
const scope = this.initialScope();
|
|
32222
32508
|
let receiverType = this.context.thisClass;
|
|
@@ -37238,7 +37524,8 @@ var init_strict_resolver = __esm({
|
|
|
37238
37524
|
resolveExecutableObjectInitializer(schemaClass2, expression, scope, expected) {
|
|
37239
37525
|
const settling = this.generatedConstructorSettlingEntries(
|
|
37240
37526
|
schemaClass2,
|
|
37241
|
-
expression
|
|
37527
|
+
expression,
|
|
37528
|
+
expected
|
|
37242
37529
|
);
|
|
37243
37530
|
const constructed = settling.length > 0 ? this.resolveClassConstructor(
|
|
37244
37531
|
schemaClass2.name,
|
|
@@ -37317,7 +37604,7 @@ var init_strict_resolver = __esm({
|
|
|
37317
37604
|
};
|
|
37318
37605
|
}
|
|
37319
37606
|
/** Block entries naming a required parameter the positional arguments skip. */
|
|
37320
|
-
generatedConstructorSettlingEntries(schemaClass2, expression) {
|
|
37607
|
+
generatedConstructorSettlingEntries(schemaClass2, expression, expected) {
|
|
37321
37608
|
const signature = schemaClass2.constructorSignature;
|
|
37322
37609
|
if (signature === void 0) return [];
|
|
37323
37610
|
const generated = isGeneratedPositionalCall(schemaClass2, expression) || (schemaClass2.declaredConstructors?.length ?? 0) === 0 && expression.argumentNames === void 0;
|
|
@@ -37325,7 +37612,11 @@ var init_strict_resolver = __esm({
|
|
|
37325
37612
|
const required2 = new Set(
|
|
37326
37613
|
requiredMembersAfterArguments(
|
|
37327
37614
|
schemaClass2,
|
|
37328
|
-
|
|
37615
|
+
closedConstructorParameters(
|
|
37616
|
+
signature.parameters,
|
|
37617
|
+
this.constructorTargetType(schemaClass2, expression, expected),
|
|
37618
|
+
schemaClass2
|
|
37619
|
+
),
|
|
37329
37620
|
expression.args.length
|
|
37330
37621
|
).map((name) => name.toLowerCase())
|
|
37331
37622
|
);
|
|
@@ -37362,9 +37653,8 @@ var init_strict_resolver = __esm({
|
|
|
37362
37653
|
}
|
|
37363
37654
|
const signature = replayingStoredConstruction ? schemaClass2.storedConstructionReplaySignature ?? schemaClass2.constructorSignature : schemaClass2.constructorSignature;
|
|
37364
37655
|
if (!signature) {
|
|
37365
|
-
const open = (schemaClass2.typeParameters?.length ?? 0) > 0;
|
|
37366
37656
|
throw new CompileError(
|
|
37367
|
-
|
|
37657
|
+
`Class '${className}' does not expose a generated public constructor.`,
|
|
37368
37658
|
pos
|
|
37369
37659
|
);
|
|
37370
37660
|
}
|
|
@@ -37373,19 +37663,11 @@ var init_strict_resolver = __esm({
|
|
|
37373
37663
|
expression,
|
|
37374
37664
|
expected
|
|
37375
37665
|
);
|
|
37376
|
-
const parameters =
|
|
37377
|
-
|
|
37378
|
-
|
|
37379
|
-
|
|
37380
|
-
|
|
37381
|
-
schemaClass2
|
|
37382
|
-
),
|
|
37383
|
-
parameterType: substituteTypeParameters(
|
|
37384
|
-
parameter4.parameterType,
|
|
37385
|
-
targetType,
|
|
37386
|
-
schemaClass2
|
|
37387
|
-
)
|
|
37388
|
-
}));
|
|
37666
|
+
const parameters = closedConstructorParameters(
|
|
37667
|
+
signature.parameters,
|
|
37668
|
+
targetType,
|
|
37669
|
+
schemaClass2
|
|
37670
|
+
);
|
|
37389
37671
|
const argumentsList2 = expression.args;
|
|
37390
37672
|
if (expression.argumentNames !== void 0) {
|
|
37391
37673
|
throw new CompileError(
|
|
@@ -37474,15 +37756,34 @@ var init_strict_resolver = __esm({
|
|
|
37474
37756
|
);
|
|
37475
37757
|
}
|
|
37476
37758
|
if (typeArguments !== void 0) {
|
|
37477
|
-
|
|
37759
|
+
const target = {
|
|
37478
37760
|
kind: "named",
|
|
37479
37761
|
typeId: schemaClass2.id,
|
|
37480
37762
|
typeArguments
|
|
37481
37763
|
};
|
|
37764
|
+
assertTypeArgumentConstraints(
|
|
37765
|
+
schemaClass2,
|
|
37766
|
+
target,
|
|
37767
|
+
expression.pos,
|
|
37768
|
+
this.project
|
|
37769
|
+
);
|
|
37770
|
+
assertDirectTypeParameterArguments(target, expression.pos, this.project);
|
|
37771
|
+
return target;
|
|
37482
37772
|
}
|
|
37483
37773
|
if (expected?.kind === "named" && expected.typeId === schemaClass2.id) {
|
|
37774
|
+
assertDirectTypeParameterArguments(
|
|
37775
|
+
expected,
|
|
37776
|
+
expression.pos,
|
|
37777
|
+
this.project
|
|
37778
|
+
);
|
|
37484
37779
|
return { ...expected, nullable: false };
|
|
37485
37780
|
}
|
|
37781
|
+
if ((schemaClass2.typeParameters?.length ?? 0) > 0) {
|
|
37782
|
+
throw new CompileError(
|
|
37783
|
+
`Cannot construct open generic Class '${schemaClass2.name}'; pass its type arguments.`,
|
|
37784
|
+
expression.pos
|
|
37785
|
+
);
|
|
37786
|
+
}
|
|
37486
37787
|
return {
|
|
37487
37788
|
kind: "named",
|
|
37488
37789
|
typeId: schemaClass2.id
|
|
@@ -44278,7 +44579,8 @@ function createEnvironment(documents, project) {
|
|
|
44278
44579
|
documents,
|
|
44279
44580
|
project,
|
|
44280
44581
|
projectIndex: createProjectIndex(project),
|
|
44281
|
-
|
|
44582
|
+
initializerResolvers: /* @__PURE__ */ new Map(),
|
|
44583
|
+
staticMember: false,
|
|
44282
44584
|
assignability: /* @__PURE__ */ new Map(),
|
|
44283
44585
|
enums,
|
|
44284
44586
|
types,
|
|
@@ -44463,162 +44765,6 @@ function identifierRange(anchor, read, fallback) {
|
|
|
44463
44765
|
if (slice !== read.name) return fallback;
|
|
44464
44766
|
return anchorSpan(anchor, read.pos, read.name.length);
|
|
44465
44767
|
}
|
|
44466
|
-
function collectIdentifierReads(expression, names) {
|
|
44467
|
-
if (names.size === 0) return [];
|
|
44468
|
-
const reads = [];
|
|
44469
|
-
const walk = (node, visible) => {
|
|
44470
|
-
switch (node.kind) {
|
|
44471
|
-
case "ident":
|
|
44472
|
-
if (visible.has(node.name))
|
|
44473
|
-
reads.push({ name: node.name, pos: node.pos });
|
|
44474
|
-
return;
|
|
44475
|
-
case "annotated":
|
|
44476
|
-
walk(node.expression, visible);
|
|
44477
|
-
return;
|
|
44478
|
-
case "member":
|
|
44479
|
-
walk(node.receiver, visible);
|
|
44480
|
-
return;
|
|
44481
|
-
case "index":
|
|
44482
|
-
walk(node.receiver, visible);
|
|
44483
|
-
walk(node.index, visible);
|
|
44484
|
-
return;
|
|
44485
|
-
case "call":
|
|
44486
|
-
walk(node.callee, visible);
|
|
44487
|
-
for (const argument2 of node.args) walk(argument2, visible);
|
|
44488
|
-
return;
|
|
44489
|
-
case "new":
|
|
44490
|
-
for (const argument2 of node.args) walk(argument2, visible);
|
|
44491
|
-
for (const field of node.initializer ?? []) walk(field.value, visible);
|
|
44492
|
-
return;
|
|
44493
|
-
case "litList":
|
|
44494
|
-
for (const element of node.elements) walk(element, visible);
|
|
44495
|
-
return;
|
|
44496
|
-
case "litDict":
|
|
44497
|
-
for (const entry of node.entries) {
|
|
44498
|
-
walk(entry.key, visible);
|
|
44499
|
-
walk(entry.value, visible);
|
|
44500
|
-
}
|
|
44501
|
-
return;
|
|
44502
|
-
case "litInterp":
|
|
44503
|
-
for (const part of node.parts) {
|
|
44504
|
-
if (part.kind === "expr") walk(part.expr, visible);
|
|
44505
|
-
}
|
|
44506
|
-
return;
|
|
44507
|
-
case "binary":
|
|
44508
|
-
case "coalesce":
|
|
44509
|
-
walk(node.left, visible);
|
|
44510
|
-
walk(node.right, visible);
|
|
44511
|
-
return;
|
|
44512
|
-
case "conditional":
|
|
44513
|
-
walk(node.condition, visible);
|
|
44514
|
-
walk(node.whenTrue, visible);
|
|
44515
|
-
walk(node.whenFalse, visible);
|
|
44516
|
-
return;
|
|
44517
|
-
case "unary":
|
|
44518
|
-
case "force":
|
|
44519
|
-
case "is":
|
|
44520
|
-
walk(node.operand, visible);
|
|
44521
|
-
return;
|
|
44522
|
-
case "lambda": {
|
|
44523
|
-
const inner = new Set(visible);
|
|
44524
|
-
for (const parameter4 of node.params) inner.delete(parameter4.name);
|
|
44525
|
-
for (const statement of node.body) walkStatement(statement, inner);
|
|
44526
|
-
return;
|
|
44527
|
-
}
|
|
44528
|
-
case "litNull":
|
|
44529
|
-
case "litBool":
|
|
44530
|
-
case "litInt":
|
|
44531
|
-
case "litFloat":
|
|
44532
|
-
case "litString":
|
|
44533
|
-
case "litTripleString":
|
|
44534
|
-
case "contextualEnum":
|
|
44535
|
-
return;
|
|
44536
|
-
}
|
|
44537
|
-
};
|
|
44538
|
-
const walkStatement = (statement, visible) => {
|
|
44539
|
-
switch (statement.kind) {
|
|
44540
|
-
case "varDecl":
|
|
44541
|
-
walk(statement.init, visible);
|
|
44542
|
-
return;
|
|
44543
|
-
case "if":
|
|
44544
|
-
for (const branch of statement.branches) {
|
|
44545
|
-
walk(branch.cond, visible);
|
|
44546
|
-
for (const inner of branch.body) walkStatement(inner, visible);
|
|
44547
|
-
}
|
|
44548
|
-
for (const inner of statement.elseBody ?? [])
|
|
44549
|
-
walkStatement(inner, visible);
|
|
44550
|
-
return;
|
|
44551
|
-
case "while":
|
|
44552
|
-
case "doWhile":
|
|
44553
|
-
walk(statement.condition, visible);
|
|
44554
|
-
for (const inner of statement.body) walkStatement(inner, visible);
|
|
44555
|
-
return;
|
|
44556
|
-
case "for": {
|
|
44557
|
-
walk(statement.initializer.init, visible);
|
|
44558
|
-
const inner = new Set(visible);
|
|
44559
|
-
inner.delete(statement.initializer.name);
|
|
44560
|
-
walk(statement.condition, inner);
|
|
44561
|
-
walkStatement(statement.iterator, inner);
|
|
44562
|
-
for (const bodyStatement of statement.body) {
|
|
44563
|
-
walkStatement(bodyStatement, inner);
|
|
44564
|
-
}
|
|
44565
|
-
return;
|
|
44566
|
-
}
|
|
44567
|
-
case "forEach": {
|
|
44568
|
-
walk(statement.collection, visible);
|
|
44569
|
-
const inner = new Set(visible);
|
|
44570
|
-
inner.delete(statement.name);
|
|
44571
|
-
if (statement.key) inner.delete(statement.key.name);
|
|
44572
|
-
for (const bodyStatement of statement.body) {
|
|
44573
|
-
walkStatement(bodyStatement, inner);
|
|
44574
|
-
}
|
|
44575
|
-
return;
|
|
44576
|
-
}
|
|
44577
|
-
case "switch":
|
|
44578
|
-
walk(statement.selector, visible);
|
|
44579
|
-
for (const section of statement.sections) {
|
|
44580
|
-
for (const label of section.labels) {
|
|
44581
|
-
if (label.kind === "case") walk(label.expression, visible);
|
|
44582
|
-
}
|
|
44583
|
-
for (const bodyStatement of section.body) {
|
|
44584
|
-
walkStatement(bodyStatement, visible);
|
|
44585
|
-
}
|
|
44586
|
-
}
|
|
44587
|
-
return;
|
|
44588
|
-
case "try":
|
|
44589
|
-
for (const bodyStatement of statement.body) {
|
|
44590
|
-
walkStatement(bodyStatement, visible);
|
|
44591
|
-
}
|
|
44592
|
-
for (const clause of statement.catches) {
|
|
44593
|
-
const catchScope = new Set(visible);
|
|
44594
|
-
catchScope.delete(clause.name);
|
|
44595
|
-
if (clause.filter) walk(clause.filter, catchScope);
|
|
44596
|
-
for (const bodyStatement of clause.body) {
|
|
44597
|
-
walkStatement(bodyStatement, catchScope);
|
|
44598
|
-
}
|
|
44599
|
-
}
|
|
44600
|
-
return;
|
|
44601
|
-
case "return":
|
|
44602
|
-
if (statement.expr) walk(statement.expr, visible);
|
|
44603
|
-
return;
|
|
44604
|
-
case "throw":
|
|
44605
|
-
if (statement.expr) walk(statement.expr, visible);
|
|
44606
|
-
return;
|
|
44607
|
-
case "assign":
|
|
44608
|
-
walk(statement.target, visible);
|
|
44609
|
-
if (statement.value) walk(statement.value, visible);
|
|
44610
|
-
return;
|
|
44611
|
-
case "exprStmt":
|
|
44612
|
-
walk(statement.expr, visible);
|
|
44613
|
-
return;
|
|
44614
|
-
case "break":
|
|
44615
|
-
case "continue":
|
|
44616
|
-
return;
|
|
44617
|
-
}
|
|
44618
|
-
};
|
|
44619
|
-
walk(expression, names);
|
|
44620
|
-
return reads;
|
|
44621
|
-
}
|
|
44622
44768
|
function validateProjectRootGlobal(uri, declaration, environment, diagnostics) {
|
|
44623
44769
|
if (declaration.name !== "root" || declaration.annotations.length !== 0) {
|
|
44624
44770
|
pushDiagnostic(
|
|
@@ -44742,7 +44888,7 @@ function validateMember(uri, member, ownerName, documentKind, ownerScope, enviro
|
|
|
44742
44888
|
member.initializer.text,
|
|
44743
44889
|
memberType2,
|
|
44744
44890
|
scope,
|
|
44745
|
-
environment,
|
|
44891
|
+
member.modifiers.includes("static") ? { ...environment, staticMember: true } : environment,
|
|
44746
44892
|
member.initializer.range,
|
|
44747
44893
|
diagnostics,
|
|
44748
44894
|
anchorOf(member.initializer),
|
|
@@ -45599,6 +45745,18 @@ function validateStatements(statements, returnType, scope, environment, uri, ran
|
|
|
45599
45745
|
}
|
|
45600
45746
|
}
|
|
45601
45747
|
function validateExpression(expression, expected, scope, environment, uri, range2, diagnostics, anchor) {
|
|
45748
|
+
if (expected?.name === "NeoDelegate" && validateDelegateMethodGroup(
|
|
45749
|
+
expression,
|
|
45750
|
+
expected,
|
|
45751
|
+
scope,
|
|
45752
|
+
environment,
|
|
45753
|
+
uri,
|
|
45754
|
+
range2,
|
|
45755
|
+
diagnostics,
|
|
45756
|
+
anchor
|
|
45757
|
+
)) {
|
|
45758
|
+
return;
|
|
45759
|
+
}
|
|
45602
45760
|
if (expected !== void 0 && isNeoVariantTypeName(expected.name) && !(expression.kind === "new" && expression.className === null)) {
|
|
45603
45761
|
validateVariantValuedExpression(
|
|
45604
45762
|
expression,
|
|
@@ -45888,6 +46046,22 @@ function validateExpression(expression, expected, scope, environment, uri, range
|
|
|
45888
46046
|
return argument2 ? [[parameter4.name, argument2]] : [];
|
|
45889
46047
|
})
|
|
45890
46048
|
);
|
|
46049
|
+
const wrapped = wrappedTypeParameterConstruction(
|
|
46050
|
+
declaration,
|
|
46051
|
+
siteTypeArguments,
|
|
46052
|
+
scope,
|
|
46053
|
+
environment,
|
|
46054
|
+
expression.pos
|
|
46055
|
+
);
|
|
46056
|
+
if (wrapped !== null) {
|
|
46057
|
+
pushDiagnostic(
|
|
46058
|
+
diagnostics,
|
|
46059
|
+
uri,
|
|
46060
|
+
range2,
|
|
46061
|
+
"wrapped-type-parameter-argument",
|
|
46062
|
+
wrapped
|
|
46063
|
+
);
|
|
46064
|
+
}
|
|
45891
46065
|
if (!variant2) {
|
|
45892
46066
|
for (const diagnostic of validateNeoConstructionSite(
|
|
45893
46067
|
environment.construction,
|
|
@@ -46509,8 +46683,14 @@ function describeType(type) {
|
|
|
46509
46683
|
const argumentsList2 = type.arguments?.length ? `<${type.arguments.map(describeType).join(", ")}>` : "";
|
|
46510
46684
|
return `${type.name}${argumentsList2}${type.nullable ? "?" : ""}`;
|
|
46511
46685
|
}
|
|
46686
|
+
function isAstPrimitiveTypeName(name) {
|
|
46687
|
+
return AST_PRIMITIVE_TYPE_NAMES.has(name);
|
|
46688
|
+
}
|
|
46512
46689
|
function semanticAst(type, pos) {
|
|
46513
46690
|
const common = { pos, required: type.nullable !== true };
|
|
46691
|
+
if (isAstPrimitiveTypeName(type.name)) {
|
|
46692
|
+
return { ...common, kind: "primitive", name: type.name };
|
|
46693
|
+
}
|
|
46514
46694
|
const args = type.arguments ?? [];
|
|
46515
46695
|
if ((type.name === "List" || type.name === "Set") && args[0]) {
|
|
46516
46696
|
return {
|
|
@@ -46535,23 +46715,11 @@ function semanticAst(type, pos) {
|
|
|
46535
46715
|
};
|
|
46536
46716
|
}
|
|
46537
46717
|
function validateListenerAnnotation(annotation2, expression, expected, scope, environment, uri, range2, diagnostics, anchor) {
|
|
46538
|
-
const
|
|
46539
|
-
|
|
46718
|
+
const { context, resolver } = initializerResolver(
|
|
46719
|
+
environment,
|
|
46720
|
+
scope.get("this")?.name ?? "",
|
|
46721
|
+
false
|
|
46540
46722
|
);
|
|
46541
|
-
const context = {
|
|
46542
|
-
project: environment.project,
|
|
46543
|
-
kind: "initializerExpression",
|
|
46544
|
-
...declaring ? {
|
|
46545
|
-
declaringType: { kind: "named", typeId: declaring.id },
|
|
46546
|
-
thisClass: { kind: "named", typeId: declaring.id },
|
|
46547
|
-
implicitMemberAccess: true
|
|
46548
|
-
} : {}
|
|
46549
|
-
};
|
|
46550
|
-
let resolver = environment.listenerResolvers.get(declaring?.id ?? "");
|
|
46551
|
-
if (!resolver) {
|
|
46552
|
-
resolver = new StrictNeoScriptResolver(context, environment.projectIndex);
|
|
46553
|
-
environment.listenerResolvers.set(declaring?.id ?? "", resolver);
|
|
46554
|
-
}
|
|
46555
46723
|
try {
|
|
46556
46724
|
let owner;
|
|
46557
46725
|
if (expression.kind === "new" && expression.className) {
|
|
@@ -46605,6 +46773,103 @@ function validateListenerAnnotation(annotation2, expression, expected, scope, en
|
|
|
46605
46773
|
);
|
|
46606
46774
|
}
|
|
46607
46775
|
}
|
|
46776
|
+
function validateDelegateMethodGroup(expression, expected, scope, environment, uri, range2, diagnostics, anchor) {
|
|
46777
|
+
const thisName = scope.get("this")?.name ?? "";
|
|
46778
|
+
if (!namesSourceFunction(expression, thisName, scope, environment))
|
|
46779
|
+
return false;
|
|
46780
|
+
const { context, resolver } = initializerResolver(
|
|
46781
|
+
environment,
|
|
46782
|
+
thisName,
|
|
46783
|
+
environment.staticMember
|
|
46784
|
+
);
|
|
46785
|
+
try {
|
|
46786
|
+
const delegate = resolveNeoScriptType(
|
|
46787
|
+
semanticAst(expected, expression.pos),
|
|
46788
|
+
context,
|
|
46789
|
+
environment.projectIndex
|
|
46790
|
+
);
|
|
46791
|
+
if (delegate.kind !== "delegate") return false;
|
|
46792
|
+
resolver.resolvePersistedMethodGroup(expression, delegate);
|
|
46793
|
+
} catch (error) {
|
|
46794
|
+
if (!(error instanceof CompileError)) throw error;
|
|
46795
|
+
pushDiagnostic(
|
|
46796
|
+
diagnostics,
|
|
46797
|
+
uri,
|
|
46798
|
+
anchor ? anchorSpan(anchor, error, 1) : range2,
|
|
46799
|
+
"invalid-delegate-method-group",
|
|
46800
|
+
error.message.replace(/^\d+:\d+: /, "")
|
|
46801
|
+
);
|
|
46802
|
+
}
|
|
46803
|
+
return true;
|
|
46804
|
+
}
|
|
46805
|
+
function namesSourceFunction(expression, thisName, scope, environment) {
|
|
46806
|
+
let owner;
|
|
46807
|
+
if (expression.kind === "ident") {
|
|
46808
|
+
owner = environment.types.get(thisName);
|
|
46809
|
+
} else if (expression.kind === "member" && expression.receiver.kind === "ident") {
|
|
46810
|
+
const receiver = expression.receiver.name;
|
|
46811
|
+
if (receiver === "this") owner = environment.types.get(thisName);
|
|
46812
|
+
else if (!scope.has(receiver)) owner = environment.types.get(receiver);
|
|
46813
|
+
} else {
|
|
46814
|
+
return false;
|
|
46815
|
+
}
|
|
46816
|
+
if (owner === void 0) return false;
|
|
46817
|
+
const target = sourceClassMemberByName(owner, expression.name, environment);
|
|
46818
|
+
return target?.member.kind === "function";
|
|
46819
|
+
}
|
|
46820
|
+
function wrappedTypeParameterConstruction(declaration, typeArguments, scope, environment, pos) {
|
|
46821
|
+
if (!typeArguments.some((argument2) => argument2.arguments?.length)) {
|
|
46822
|
+
return null;
|
|
46823
|
+
}
|
|
46824
|
+
const { context } = initializerResolver(
|
|
46825
|
+
environment,
|
|
46826
|
+
scope.get("this")?.name ?? "",
|
|
46827
|
+
false
|
|
46828
|
+
);
|
|
46829
|
+
let target;
|
|
46830
|
+
try {
|
|
46831
|
+
target = resolveNeoScriptType(
|
|
46832
|
+
{
|
|
46833
|
+
kind: "named",
|
|
46834
|
+
name: declaration.name,
|
|
46835
|
+
typeArguments: typeArguments.map(
|
|
46836
|
+
(argument2) => semanticAst(argument2, pos)
|
|
46837
|
+
),
|
|
46838
|
+
required: true,
|
|
46839
|
+
pos
|
|
46840
|
+
},
|
|
46841
|
+
context,
|
|
46842
|
+
environment.projectIndex
|
|
46843
|
+
);
|
|
46844
|
+
} catch (error) {
|
|
46845
|
+
if (error instanceof CompileError) return null;
|
|
46846
|
+
throw error;
|
|
46847
|
+
}
|
|
46848
|
+
return target.kind === "named" ? wrappedTypeParameterMessage(target, environment.projectIndex) : null;
|
|
46849
|
+
}
|
|
46850
|
+
function initializerResolver(environment, thisName, staticMember) {
|
|
46851
|
+
const declaring = environment.projectIndex.typeByName.get(thisName);
|
|
46852
|
+
const key = `${declaring?.id ?? ""}:${staticMember}`;
|
|
46853
|
+
let entry = environment.initializerResolvers.get(key);
|
|
46854
|
+
if (entry === void 0) {
|
|
46855
|
+
const declaringType = declaring ? { kind: "named", typeId: declaring.id } : void 0;
|
|
46856
|
+
const context = {
|
|
46857
|
+
project: environment.project,
|
|
46858
|
+
kind: "initializerExpression",
|
|
46859
|
+
...declaringType ? {
|
|
46860
|
+
declaringType,
|
|
46861
|
+
implicitMemberAccess: true,
|
|
46862
|
+
...staticMember ? { staticMember } : { thisClass: declaringType }
|
|
46863
|
+
} : {}
|
|
46864
|
+
};
|
|
46865
|
+
entry = {
|
|
46866
|
+
context,
|
|
46867
|
+
resolver: new StrictNeoScriptResolver(context, environment.projectIndex)
|
|
46868
|
+
};
|
|
46869
|
+
environment.initializerResolvers.set(key, entry);
|
|
46870
|
+
}
|
|
46871
|
+
return entry;
|
|
46872
|
+
}
|
|
46608
46873
|
function validateInlineAnnotation(annotation2, environment, uri, range2, diagnostics) {
|
|
46609
46874
|
if (annotation2.name !== "id") {
|
|
46610
46875
|
pushDiagnostic(
|
|
@@ -47281,7 +47546,7 @@ function classDerivesFromName(name, ancestorName, environment, seen = /* @__PURE
|
|
|
47281
47546
|
return classDerivesFromName(base.name, ancestorName, environment, seen);
|
|
47282
47547
|
});
|
|
47283
47548
|
}
|
|
47284
|
-
var NEO_VARIANT_FOLDER_SETTING, NEO_ANIMATION_CHILD_OVERRIDE_TYPE_NAME, primitiveType, LIST_COLUMN_INHERITANCE_KEY, DECLARATION_BODY_GLOBAL_TYPES, SEMANTIC_PRIMITIVE_TYPE_NAMES;
|
|
47549
|
+
var NEO_VARIANT_FOLDER_SETTING, NEO_ANIMATION_CHILD_OVERRIDE_TYPE_NAME, primitiveType, LIST_COLUMN_INHERITANCE_KEY, DECLARATION_BODY_GLOBAL_TYPES, SEMANTIC_PRIMITIVE_TYPE_NAMES, AST_PRIMITIVE_TYPE_NAMES;
|
|
47285
47550
|
var init_project_source_semantics = __esm({
|
|
47286
47551
|
"../packages/neoscript-language/src/project-source-semantics.ts"() {
|
|
47287
47552
|
"use strict";
|
|
@@ -47294,6 +47559,7 @@ var init_project_source_semantics = __esm({
|
|
|
47294
47559
|
init_listener_metadata_statement();
|
|
47295
47560
|
init_language_spec();
|
|
47296
47561
|
init_project_schema_contract_generated();
|
|
47562
|
+
init_strict_ast();
|
|
47297
47563
|
init_strict_compile_error();
|
|
47298
47564
|
init_executable_parser();
|
|
47299
47565
|
init_project_source_construction_diagnostics();
|
|
@@ -47319,6 +47585,7 @@ var init_project_source_semantics = __esm({
|
|
|
47319
47585
|
"decimal",
|
|
47320
47586
|
"string"
|
|
47321
47587
|
]);
|
|
47588
|
+
AST_PRIMITIVE_TYPE_NAMES = /* @__PURE__ */ new Set(["int", "float", "decimal", "bool", "string", "null", "void"]);
|
|
47322
47589
|
}
|
|
47323
47590
|
});
|
|
47324
47591
|
|
|
@@ -48406,6 +48673,7 @@ function buildProjectGraph(documents) {
|
|
|
48406
48673
|
...typeParameters.length ? { typeParameters } : {},
|
|
48407
48674
|
...classDeclaration?.modifiers.includes("abstract") ? { abstract: true } : {},
|
|
48408
48675
|
...classDeclaration?.modifiers.includes("sealed") ? { sealed: true } : {},
|
|
48676
|
+
...classDeclaration && allowsUserStorage(info, declarationsByName) ? { userClass: true } : {},
|
|
48409
48677
|
location: location(info.uri, info.declaration.range),
|
|
48410
48678
|
selectionLocation: location(info.uri, info.declaration.nameRange)
|
|
48411
48679
|
};
|
|
@@ -48911,7 +49179,7 @@ function collectReferencedBuiltinNames(documents, declared) {
|
|
|
48911
49179
|
}
|
|
48912
49180
|
return names;
|
|
48913
49181
|
}
|
|
48914
|
-
function
|
|
49182
|
+
function allowedStorage(annotations) {
|
|
48915
49183
|
const storage = annotations.find(
|
|
48916
49184
|
(annotation2) => annotation2.name === "storage"
|
|
48917
49185
|
);
|
|
@@ -48921,7 +49189,28 @@ function memberWritability(annotations) {
|
|
|
48921
49189
|
const positionalAllowed = storage?.arguments.find(
|
|
48922
49190
|
(argument2) => argument2.name === void 0
|
|
48923
49191
|
);
|
|
48924
|
-
|
|
49192
|
+
return (namedAllowed ?? positionalAllowed)?.text;
|
|
49193
|
+
}
|
|
49194
|
+
function allowsUserStorage(info, declarationsByName) {
|
|
49195
|
+
const visited = /* @__PURE__ */ new Set();
|
|
49196
|
+
let current = info;
|
|
49197
|
+
while (current !== void 0 && !visited.has(current.id)) {
|
|
49198
|
+
visited.add(current.id);
|
|
49199
|
+
const allowed = allowedStorage(current.declaration.annotations);
|
|
49200
|
+
if (allowed !== void 0) return /\.User\b/.test(allowed);
|
|
49201
|
+
let baseClass;
|
|
49202
|
+
for (const base of current.declaration.baseTypes) {
|
|
49203
|
+
const candidate = declarationsByName.get(base.name);
|
|
49204
|
+
if (candidate?.declaration.kind !== "class") continue;
|
|
49205
|
+
baseClass = candidate;
|
|
49206
|
+
break;
|
|
49207
|
+
}
|
|
49208
|
+
current = baseClass;
|
|
49209
|
+
}
|
|
49210
|
+
return false;
|
|
49211
|
+
}
|
|
49212
|
+
function memberWritability(annotations) {
|
|
49213
|
+
const allowed = allowedStorage(annotations);
|
|
48925
49214
|
if (/\.Immutable\b/.test(allowed ?? "")) return "immutable";
|
|
48926
49215
|
if (/\.Save\b/.test(allowed ?? "")) return "save";
|
|
48927
49216
|
if (/\.Session\b/.test(allowed ?? "")) return "session";
|
|
@@ -49638,7 +49927,18 @@ function validateGenericConstraintCycles(uri, declaration, diagnostics) {
|
|
|
49638
49927
|
}
|
|
49639
49928
|
}
|
|
49640
49929
|
function validateTypeApplication(uri, type, genericParameters, environment, diagnostics) {
|
|
49641
|
-
|
|
49930
|
+
type.typeArguments.forEach((argument2, index) => {
|
|
49931
|
+
const parameterSlot = type.name === "NeoAction" || type.name === "NeoDelegate" && index > 0;
|
|
49932
|
+
if (argument2.name === "NeoAction" && !parameterSlot) {
|
|
49933
|
+
diagnose(
|
|
49934
|
+
diagnostics,
|
|
49935
|
+
uri,
|
|
49936
|
+
argument2.range,
|
|
49937
|
+
"invalid-type-argument",
|
|
49938
|
+
`Type '${type.name}' cannot take 'NeoAction' as a type argument; an action is invoked as a statement, never used as a value.`
|
|
49939
|
+
);
|
|
49940
|
+
return;
|
|
49941
|
+
}
|
|
49642
49942
|
validateTypeApplication(
|
|
49643
49943
|
uri,
|
|
49644
49944
|
argument2,
|
|
@@ -49646,7 +49946,7 @@ function validateTypeApplication(uri, type, genericParameters, environment, diag
|
|
|
49646
49946
|
environment,
|
|
49647
49947
|
diagnostics
|
|
49648
49948
|
);
|
|
49649
|
-
}
|
|
49949
|
+
});
|
|
49650
49950
|
if (genericParameters.has(type.name)) {
|
|
49651
49951
|
if (type.typeArguments.length > 0) {
|
|
49652
49952
|
diagnose(
|
|
@@ -53123,7 +53423,7 @@ var init_registry = __esm({
|
|
|
53123
53423
|
"../packages/manifest/schema-contract/registry.mjs"() {
|
|
53124
53424
|
"use strict";
|
|
53125
53425
|
PROJECT_SCHEMA_CONTRACT = Object.freeze({
|
|
53126
|
-
cliVersion: "0.77.
|
|
53426
|
+
cliVersion: "0.77.1",
|
|
53127
53427
|
projectFileUploadBatchSize: 32,
|
|
53128
53428
|
documentRecords: {
|
|
53129
53429
|
member: {
|
|
@@ -66305,16 +66605,17 @@ var init_lookup_declared_type = __esm({
|
|
|
66305
66605
|
});
|
|
66306
66606
|
|
|
66307
66607
|
// ../packages/neoscript-runtime/src/values/member-declared-type-info.ts
|
|
66308
|
-
function resolveMemberDeclaredTypeInfo(member, members, ownerClass = null) {
|
|
66608
|
+
function resolveMemberDeclaredTypeInfo(member, members, ownerClass = null, env) {
|
|
66309
66609
|
return resolveMemberDeclaredTypeInfoInternal(
|
|
66310
66610
|
member,
|
|
66311
66611
|
members,
|
|
66312
66612
|
/* @__PURE__ */ new Set(),
|
|
66313
|
-
ownerClass
|
|
66613
|
+
ownerClass,
|
|
66614
|
+
env
|
|
66314
66615
|
);
|
|
66315
66616
|
}
|
|
66316
|
-
function resolveMemberDeclaredTypeInfoInternal(member, members, seen, ownerClass) {
|
|
66317
|
-
const resolved = resolveMember(member, members);
|
|
66617
|
+
function resolveMemberDeclaredTypeInfoInternal(member, members, seen, ownerClass, env) {
|
|
66618
|
+
const resolved = env === void 0 ? resolveMember(member, members) : substituteMember(member, env, members);
|
|
66318
66619
|
const memberId = getField(resolved, "id");
|
|
66319
66620
|
if (typeof memberId === "string" && seen.has(memberId)) return null;
|
|
66320
66621
|
const nextSeen = typeof memberId === "string" ? /* @__PURE__ */ new Set([...seen, memberId]) : new Set(seen);
|
|
@@ -66323,7 +66624,14 @@ function resolveMemberDeclaredTypeInfoInternal(member, members, seen, ownerClass
|
|
|
66323
66624
|
const typeArguments = Object.fromEntries(
|
|
66324
66625
|
Object.entries(resolved.classArguments ?? {}).flatMap(
|
|
66325
66626
|
([genericParamId, binding]) => {
|
|
66326
|
-
if (!isMemberGenericBinding(binding))
|
|
66627
|
+
if (!isMemberGenericBinding(binding)) {
|
|
66628
|
+
const forwarded = genericParamTypeInfo(
|
|
66629
|
+
ownerClass,
|
|
66630
|
+
binding.genericParamId,
|
|
66631
|
+
true
|
|
66632
|
+
);
|
|
66633
|
+
return forwarded === null ? [] : [[genericParamId, forwarded]];
|
|
66634
|
+
}
|
|
66327
66635
|
const argumentMember = members.find(
|
|
66328
66636
|
(candidate) => candidate.id === binding.memberId
|
|
66329
66637
|
);
|
|
@@ -66332,7 +66640,8 @@ function resolveMemberDeclaredTypeInfoInternal(member, members, seen, ownerClass
|
|
|
66332
66640
|
argumentMember,
|
|
66333
66641
|
members,
|
|
66334
66642
|
nextSeen,
|
|
66335
|
-
ownerClass
|
|
66643
|
+
ownerClass,
|
|
66644
|
+
env
|
|
66336
66645
|
);
|
|
66337
66646
|
return argumentType === null ? [] : [[genericParamId, argumentType]];
|
|
66338
66647
|
}
|
|
@@ -66372,22 +66681,14 @@ function resolveMemberDeclaredTypeInfoInternal(member, members, seen, ownerClass
|
|
|
66372
66681
|
type: 25 /* NSDelegate */,
|
|
66373
66682
|
required: isRequiredMember(resolved),
|
|
66374
66683
|
returnTypeInfo: resolved.returnTypeInfo,
|
|
66375
|
-
argumentTypes: resolved.argumentTypes
|
|
66376
|
-
const { name, ...typeInfo } = argument2;
|
|
66377
|
-
void name;
|
|
66378
|
-
return typeInfo;
|
|
66379
|
-
})
|
|
66684
|
+
argumentTypes: unnamedArgumentTypes(resolved.argumentTypes)
|
|
66380
66685
|
};
|
|
66381
66686
|
}
|
|
66382
66687
|
if (isMemberActionBase(resolved)) {
|
|
66383
66688
|
return {
|
|
66384
66689
|
type: 26 /* NSAction */,
|
|
66385
66690
|
required: false,
|
|
66386
|
-
argumentTypes: resolved.argumentTypes
|
|
66387
|
-
const { name, ...typeInfo } = argument2;
|
|
66388
|
-
void name;
|
|
66389
|
-
return typeInfo;
|
|
66390
|
-
})
|
|
66691
|
+
argumentTypes: unnamedArgumentTypes(resolved.argumentTypes)
|
|
66391
66692
|
};
|
|
66392
66693
|
}
|
|
66393
66694
|
if (isMemberListBase(resolved) || isMemberDictionaryBase(resolved)) {
|
|
@@ -66399,7 +66700,8 @@ function resolveMemberDeclaredTypeInfoInternal(member, members, seen, ownerClass
|
|
|
66399
66700
|
entry,
|
|
66400
66701
|
members,
|
|
66401
66702
|
nextSeen,
|
|
66402
|
-
ownerClass
|
|
66703
|
+
ownerClass,
|
|
66704
|
+
env
|
|
66403
66705
|
);
|
|
66404
66706
|
if (entryTypeInfo === null) return null;
|
|
66405
66707
|
return {
|
|
@@ -66419,37 +66721,47 @@ function resolveMemberDeclaredTypeInfoInternal(member, members, seen, ownerClass
|
|
|
66419
66721
|
collection,
|
|
66420
66722
|
members,
|
|
66421
66723
|
nextSeen,
|
|
66422
|
-
ownerClass
|
|
66724
|
+
ownerClass,
|
|
66725
|
+
env
|
|
66423
66726
|
);
|
|
66424
66727
|
});
|
|
66425
66728
|
}
|
|
66426
66729
|
if (resolved.kind === 9 /* Lookup */) return null;
|
|
66427
66730
|
if (!memberKindSupportsStorage(resolved.kind)) return null;
|
|
66428
66731
|
if (isMemberGenericBase(resolved)) {
|
|
66429
|
-
|
|
66430
|
-
|
|
66431
|
-
|
|
66732
|
+
return genericParamTypeInfo(
|
|
66733
|
+
ownerClass,
|
|
66734
|
+
resolved.genericParamId,
|
|
66735
|
+
isRequiredMember(resolved)
|
|
66432
66736
|
);
|
|
66433
|
-
if (declaration === void 0) return null;
|
|
66434
|
-
return {
|
|
66435
|
-
type: 21 /* Generic */,
|
|
66436
|
-
required: isRequiredMember(resolved),
|
|
66437
|
-
ownerClassId: ownerClass.id,
|
|
66438
|
-
genericParamId: declaration.id
|
|
66439
|
-
};
|
|
66440
66737
|
}
|
|
66441
66738
|
return {
|
|
66442
66739
|
type: resolved.kind,
|
|
66443
66740
|
required: isRequiredMember(resolved)
|
|
66444
66741
|
};
|
|
66445
66742
|
}
|
|
66743
|
+
function genericParamTypeInfo(ownerClass, genericParamId, required2) {
|
|
66744
|
+
if (ownerClass === null) return null;
|
|
66745
|
+
const declaration = ownerClass.genericParams?.find(
|
|
66746
|
+
(parameter4) => parameter4.id === genericParamId
|
|
66747
|
+
);
|
|
66748
|
+
if (declaration === void 0) return null;
|
|
66749
|
+
return {
|
|
66750
|
+
type: 21 /* Generic */,
|
|
66751
|
+
required: required2,
|
|
66752
|
+
ownerClassId: ownerClass.id,
|
|
66753
|
+
genericParamId: declaration.id
|
|
66754
|
+
};
|
|
66755
|
+
}
|
|
66446
66756
|
var init_member_declared_type_info = __esm({
|
|
66447
66757
|
"../packages/neoscript-runtime/src/values/member-declared-type-info.ts"() {
|
|
66448
66758
|
"use strict";
|
|
66449
66759
|
init_members();
|
|
66450
66760
|
init_lookup_declared_type();
|
|
66451
66761
|
init_classes();
|
|
66762
|
+
init_generics();
|
|
66452
66763
|
init_inheritance();
|
|
66764
|
+
init_parameter_defaults();
|
|
66453
66765
|
init_core();
|
|
66454
66766
|
}
|
|
66455
66767
|
});
|
|
@@ -66622,9 +66934,6 @@ function attachConstructorSignature(type, environment) {
|
|
|
66622
66934
|
type.id,
|
|
66623
66935
|
environment
|
|
66624
66936
|
);
|
|
66625
|
-
for (const binding of genericEnvironment.values()) {
|
|
66626
|
-
if (binding.kind === "unbound") return type;
|
|
66627
|
-
}
|
|
66628
66937
|
return {
|
|
66629
66938
|
...type,
|
|
66630
66939
|
...buildNeoScriptConstructionSignatures(
|
|
@@ -66637,7 +66946,7 @@ function attachConstructorSignature(type, environment) {
|
|
|
66637
66946
|
environment
|
|
66638
66947
|
);
|
|
66639
66948
|
return member ? {
|
|
66640
|
-
required: boolean2(member.required, `member ${memberId}.required`),
|
|
66949
|
+
required: member.kind === "generic" || boolean2(member.required, `member ${memberId}.required`),
|
|
66641
66950
|
defaultValue: member.defaultValue,
|
|
66642
66951
|
immutable: declaredStorage(
|
|
66643
66952
|
environment.members.get(memberId),
|
|
@@ -68703,9 +69012,6 @@ function classToLanguageType(schemaClass2, context) {
|
|
|
68703
69012
|
}
|
|
68704
69013
|
function constructorSignature(schemaClass2, members, context, genericEnvironment) {
|
|
68705
69014
|
if (isAbstractClass(schemaClass2)) return {};
|
|
68706
|
-
if (!isClosedClass(schemaClass2.id, context.vm.classes)) {
|
|
68707
|
-
return {};
|
|
68708
|
-
}
|
|
68709
69015
|
return buildNeoScriptConstructionSignatures(
|
|
68710
69016
|
schemaClass2.id,
|
|
68711
69017
|
members,
|
|
@@ -68713,14 +69019,16 @@ function constructorSignature(schemaClass2, members, context, genericEnvironment
|
|
|
68713
69019
|
const record7 = analyzerMemberById(context, memberId);
|
|
68714
69020
|
if (!record7) return null;
|
|
68715
69021
|
try {
|
|
68716
|
-
const
|
|
69022
|
+
const declared = resolveAnalyzerMember(context, record7);
|
|
69023
|
+
const open = isMemberGenericBase(declared) && genericEnvironment.get(declared.genericParamId)?.kind === "unbound";
|
|
69024
|
+
const resolved = open ? declared : substituteMember(
|
|
68717
69025
|
record7,
|
|
68718
69026
|
genericEnvironment,
|
|
68719
69027
|
context.vm.members,
|
|
68720
|
-
|
|
69028
|
+
declared
|
|
68721
69029
|
);
|
|
68722
69030
|
return {
|
|
68723
|
-
required: isRequiredMember(resolved),
|
|
69031
|
+
required: open || isRequiredMember(resolved),
|
|
68724
69032
|
defaultValue: "defaultValue" in resolved ? resolved.defaultValue : void 0,
|
|
68725
69033
|
immutable: declaredMemberStorage(record7.id, context.vm.members) === 1 /* Immutable */
|
|
68726
69034
|
};
|
|
@@ -69961,25 +70269,33 @@ function compileNSInitializer(code, ctx) {
|
|
|
69961
70269
|
);
|
|
69962
70270
|
}
|
|
69963
70271
|
try {
|
|
69964
|
-
const { lexicalThisClass, ...compilerContext } = ctx;
|
|
70272
|
+
const { lexicalThisClass, declaringClass, ...compilerContext } = ctx;
|
|
70273
|
+
const context = createContext(
|
|
70274
|
+
{
|
|
70275
|
+
...compilerContext,
|
|
70276
|
+
thisClass: lexicalThisClass ?? null,
|
|
70277
|
+
implicitMemberAccess: lexicalThisClass !== null,
|
|
70278
|
+
staticMember: false
|
|
70279
|
+
},
|
|
70280
|
+
{
|
|
70281
|
+
scriptKind: "initializer",
|
|
70282
|
+
returnTypeInfo: ctx.returnTypeInfo,
|
|
70283
|
+
...ctx.argumentTypes === void 0 ? {} : { functionArguments: ctx.argumentTypes },
|
|
70284
|
+
...ctx.initializerName === void 0 ? {} : { functionName: ctx.initializerName },
|
|
70285
|
+
dialogueContext: null
|
|
70286
|
+
}
|
|
70287
|
+
);
|
|
69965
70288
|
return compileStrict(
|
|
69966
70289
|
`return
|
|
69967
70290
|
${code};`,
|
|
69968
|
-
|
|
69969
|
-
|
|
69970
|
-
|
|
69971
|
-
|
|
69972
|
-
|
|
69973
|
-
|
|
69974
|
-
},
|
|
69975
|
-
{
|
|
69976
|
-
scriptKind: "initializer",
|
|
69977
|
-
returnTypeInfo: ctx.returnTypeInfo,
|
|
69978
|
-
...ctx.argumentTypes === void 0 ? {} : { functionArguments: ctx.argumentTypes },
|
|
69979
|
-
...ctx.initializerName === void 0 ? {} : { functionName: ctx.initializerName },
|
|
69980
|
-
dialogueContext: null
|
|
70291
|
+
declaringClass ? {
|
|
70292
|
+
...context,
|
|
70293
|
+
declaringType: {
|
|
70294
|
+
kind: "named",
|
|
70295
|
+
typeId: declaringClass.id,
|
|
70296
|
+
nullable: false
|
|
69981
70297
|
}
|
|
69982
|
-
|
|
70298
|
+
} : context
|
|
69983
70299
|
);
|
|
69984
70300
|
} catch (error) {
|
|
69985
70301
|
throw withInitializerSourcePosition(error);
|
|
@@ -70427,6 +70743,7 @@ function compileMemberInitializerBody(args) {
|
|
|
70427
70743
|
`Member "${args.member.name}" has an initializer but no resolvable declared type.`
|
|
70428
70744
|
);
|
|
70429
70745
|
}
|
|
70746
|
+
const instanceClass = isStaticMember(args.member) ? null : args.thisClass;
|
|
70430
70747
|
let compiled;
|
|
70431
70748
|
try {
|
|
70432
70749
|
compiled = compileUnit2(
|
|
@@ -70438,8 +70755,10 @@ function compileMemberInitializerBody(args) {
|
|
|
70438
70755
|
variantFolders: args.variantFolders ?? [],
|
|
70439
70756
|
returnTypeInfo,
|
|
70440
70757
|
initializerName: args.member.name,
|
|
70758
|
+
lexicalThisClass: parseExpression(defaultValue.init.code).kind === "lambda" ? instanceClass : null,
|
|
70759
|
+
declaringClass: instanceClass,
|
|
70441
70760
|
argumentTypes: initializerArgumentTypes(
|
|
70442
|
-
|
|
70761
|
+
instanceClass,
|
|
70443
70762
|
args.constructors ?? []
|
|
70444
70763
|
)
|
|
70445
70764
|
})
|
|
@@ -70484,6 +70803,7 @@ function compileValueRowInitializerBody(args) {
|
|
|
70484
70803
|
returnTypeInfo,
|
|
70485
70804
|
initializerName: args.member.name,
|
|
70486
70805
|
lexicalThisClass: args.lexicalThisClass ?? null,
|
|
70806
|
+
declaringClass: args.initializerOwnerClass,
|
|
70487
70807
|
argumentTypes: initializerArgumentTypes(
|
|
70488
70808
|
args.initializerOwnerClass,
|
|
70489
70809
|
args.constructors ?? []
|
|
@@ -70529,18 +70849,23 @@ function compileAuthoredMemberBodies(args) {
|
|
|
70529
70849
|
compileMemberDelegateDefault(args);
|
|
70530
70850
|
}
|
|
70531
70851
|
function compileMemberDelegateDefault(args) {
|
|
70532
|
-
if (
|
|
70533
|
-
const defaultValue = args.member
|
|
70534
|
-
if (
|
|
70852
|
+
if (args.member.kind !== 25 /* NSDelegate */) return;
|
|
70853
|
+
const defaultValue = getField(args.member, "defaultValue");
|
|
70854
|
+
if (!isLiteralValueContent(defaultValue) || !isNSDelegateClosureValueDraft(defaultValue.value)) {
|
|
70535
70855
|
return;
|
|
70536
70856
|
}
|
|
70857
|
+
const signature = resolveNSDelegateSignature(args.member, args.members);
|
|
70858
|
+
if (signature === null) {
|
|
70859
|
+
throw new Error(
|
|
70860
|
+
`NeoDelegate "${args.member.name}" has no signature in its override chain.`
|
|
70861
|
+
);
|
|
70862
|
+
}
|
|
70537
70863
|
const code = defaultValue.value.code;
|
|
70538
70864
|
try {
|
|
70539
70865
|
defaultValue.value = compileDelegateClosureValue(code, {
|
|
70540
70866
|
...args,
|
|
70541
70867
|
staticMember: isStaticMember(args.member),
|
|
70542
|
-
|
|
70543
|
-
argumentTypes: args.member.argumentTypes,
|
|
70868
|
+
...signature,
|
|
70544
70869
|
name: args.member.name
|
|
70545
70870
|
});
|
|
70546
70871
|
} catch (error) {
|
|
@@ -70636,6 +70961,7 @@ function compileConstructorBaseInitializerFields(args, owner) {
|
|
|
70636
70961
|
args.classes,
|
|
70637
70962
|
args.members
|
|
70638
70963
|
);
|
|
70964
|
+
const ownerEnv = resolveGenericEnv(owner.id, args.classes);
|
|
70639
70965
|
const compiledBaseInitializerFields = fields.map((field) => {
|
|
70640
70966
|
const entry = baseSchema.find(
|
|
70641
70967
|
(candidate) => candidate.schemaKey === field.name
|
|
@@ -70658,12 +70984,24 @@ function compileConstructorBaseInitializerFields(args, owner) {
|
|
|
70658
70984
|
`Constructor "${args.constructor.id}" settles Immutable base member "${field.name}"; runtime construction cannot supply Immutable fields.`
|
|
70659
70985
|
);
|
|
70660
70986
|
}
|
|
70661
|
-
const
|
|
70662
|
-
|
|
70987
|
+
const declaredTypeInfo = resolveMemberDeclaredTypeInfo(
|
|
70988
|
+
member,
|
|
70989
|
+
args.members,
|
|
70990
|
+
args.classes.find(
|
|
70991
|
+
(schemaClass2) => schemaClass2.id === entry.ownerClassId
|
|
70992
|
+
) ?? null
|
|
70993
|
+
);
|
|
70994
|
+
if (declaredTypeInfo === null) {
|
|
70663
70995
|
throw new Error(
|
|
70664
70996
|
`Constructor "${args.constructor.id}" settles base member "${field.name}", which has no resolvable declared type.`
|
|
70665
70997
|
);
|
|
70666
70998
|
}
|
|
70999
|
+
const returnTypeInfo = substituteInheritedCallableTypeInfo(
|
|
71000
|
+
declaredTypeInfo,
|
|
71001
|
+
ownerEnv,
|
|
71002
|
+
args.classes,
|
|
71003
|
+
args.members
|
|
71004
|
+
);
|
|
70667
71005
|
return compileUnit2(
|
|
70668
71006
|
"getter",
|
|
70669
71007
|
() => compileNSInitializer(field.code, {
|
|
@@ -70777,14 +71115,10 @@ function resolveNSFunctionSignature(memberId, members) {
|
|
|
70777
71115
|
memberId,
|
|
70778
71116
|
members,
|
|
70779
71117
|
(member) => {
|
|
70780
|
-
const
|
|
70781
|
-
|
|
70782
|
-
if (!isNSFunctionReturnTypeInfo(returnTypeInfo)) return void 0;
|
|
70783
|
-
if (!Array.isArray(argumentTypes)) return void 0;
|
|
70784
|
-
if (!argumentTypes.every(isNSFunctionArgumentTypeInfo)) return void 0;
|
|
71118
|
+
const signature = declaredCallableSignature(member);
|
|
71119
|
+
if (signature === void 0) return void 0;
|
|
70785
71120
|
return {
|
|
70786
|
-
|
|
70787
|
-
argumentTypes,
|
|
71121
|
+
...signature,
|
|
70788
71122
|
// Compiler IR still uses a boolean because this is a transient
|
|
70789
71123
|
// callable signature, while persisted members use optional dispatch.
|
|
70790
71124
|
deferred: isAsynchronousFunctionMember(member)
|
|
@@ -70794,6 +71128,27 @@ function resolveNSFunctionSignature(memberId, members) {
|
|
|
70794
71128
|
);
|
|
70795
71129
|
return found ?? null;
|
|
70796
71130
|
}
|
|
71131
|
+
function resolveNSDelegateSignature(member, members) {
|
|
71132
|
+
const declared = declaredCallableSignature(member);
|
|
71133
|
+
if (declared !== void 0) return declared;
|
|
71134
|
+
const extendsMemberId = getOptionalString(member, "extendsMemberId");
|
|
71135
|
+
if (extendsMemberId === void 0) return null;
|
|
71136
|
+
const found = walkExtendsMemberChain(
|
|
71137
|
+
extendsMemberId,
|
|
71138
|
+
members,
|
|
71139
|
+
declaredCallableSignature,
|
|
71140
|
+
{ requireKind: 25 /* NSDelegate */ }
|
|
71141
|
+
);
|
|
71142
|
+
return found ?? null;
|
|
71143
|
+
}
|
|
71144
|
+
function declaredCallableSignature(member) {
|
|
71145
|
+
const returnTypeInfo = getField(member, "returnTypeInfo");
|
|
71146
|
+
const argumentTypes = getField(member, "argumentTypes");
|
|
71147
|
+
if (!isNSFunctionReturnTypeInfo(returnTypeInfo)) return void 0;
|
|
71148
|
+
if (!Array.isArray(argumentTypes)) return void 0;
|
|
71149
|
+
if (!argumentTypes.every(isNSFunctionArgumentTypeInfo)) return void 0;
|
|
71150
|
+
return { returnTypeInfo, argumentTypes };
|
|
71151
|
+
}
|
|
70797
71152
|
function resolveNSPropertyReturnTypeInfo(memberId, members) {
|
|
70798
71153
|
const found = walkExtendsMemberChain(
|
|
70799
71154
|
memberId,
|
|
@@ -70863,6 +71218,7 @@ var init_compile_ns_property = __esm({
|
|
|
70863
71218
|
init_compile_delegate_closure();
|
|
70864
71219
|
init_compiler_adapter();
|
|
70865
71220
|
init_compiler_adapter();
|
|
71221
|
+
init_executable_parser();
|
|
70866
71222
|
NeoScriptBodyCompileError = class extends Error {
|
|
70867
71223
|
memberId;
|
|
70868
71224
|
memberName;
|
|
@@ -71726,15 +72082,12 @@ function initializerOwnerContext(document, valueId, rootOwners, valuesById, reco
|
|
|
71726
72082
|
currentId = sourceValueId;
|
|
71727
72083
|
lexicalRoot = rootOwners.get(sourceValueId) ?? lexicalRoot;
|
|
71728
72084
|
}
|
|
71729
|
-
if (lexicalRoot === void 0) {
|
|
72085
|
+
if (lexicalRoot === void 0 || isStaticMember(lexicalRoot)) {
|
|
71730
72086
|
return { ownerClass: null, lexicalThisClass: null };
|
|
71731
72087
|
}
|
|
71732
72088
|
const lexicalRootId = getField(lexicalRoot, "id");
|
|
71733
72089
|
const ownerClass = typeof lexicalRootId === "string" ? findSchemaPlacement(lexicalRootId, document.classes)?.ownerClass ?? null : null;
|
|
71734
|
-
return {
|
|
71735
|
-
ownerClass,
|
|
71736
|
-
lexicalThisClass: isStaticMember(lexicalRoot) === true ? null : ownerClass
|
|
71737
|
-
};
|
|
72090
|
+
return { ownerClass, lexicalThisClass: ownerClass };
|
|
71738
72091
|
}
|
|
71739
72092
|
function isRecordValue(value) {
|
|
71740
72093
|
if (value === null) return false;
|
|
@@ -78604,6 +78957,7 @@ function runtimeGenericEnvForValueRow(row, ctx, visited = /* @__PURE__ */ new Se
|
|
|
78604
78957
|
);
|
|
78605
78958
|
overlayConcreteGenericEntries(env, parentEnv);
|
|
78606
78959
|
overlayConcreteGenericEntries(env, envFromStamp(row.genericBindings));
|
|
78960
|
+
closeForwardedGenericParams(env);
|
|
78607
78961
|
return env;
|
|
78608
78962
|
}
|
|
78609
78963
|
function runtimeParentGenericEnv(row, ctx, visited, readRow) {
|
|
@@ -78844,6 +79198,18 @@ function runtimeTypeInfoForMember(rawMember, env, ctx, seen) {
|
|
|
78844
79198
|
ctx
|
|
78845
79199
|
);
|
|
78846
79200
|
}
|
|
79201
|
+
if (isMemberDelegateBase(member)) {
|
|
79202
|
+
return substituteRuntimeTypeInfo(
|
|
79203
|
+
{
|
|
79204
|
+
type: 25 /* NSDelegate */,
|
|
79205
|
+
required: required2,
|
|
79206
|
+
returnTypeInfo: member.returnTypeInfo,
|
|
79207
|
+
argumentTypes: unnamedArgumentTypes(member.argumentTypes)
|
|
79208
|
+
},
|
|
79209
|
+
env,
|
|
79210
|
+
ctx
|
|
79211
|
+
);
|
|
79212
|
+
}
|
|
78847
79213
|
if (member.kind === 13 /* Function */ || member.kind === 23 /* NSFunction */ || member.kind === 22 /* Interface */) {
|
|
78848
79214
|
throw new NSGetterRuntimeError(
|
|
78849
79215
|
`Member '${member.name}' cannot be used as a concrete generic value type.`
|
|
@@ -79349,8 +79715,17 @@ function dispatchSchemaMember(receiver, schemaKey, ctx) {
|
|
|
79349
79715
|
return { kind: "ok", value: null };
|
|
79350
79716
|
case "declaration": {
|
|
79351
79717
|
const value = readDeclarationDefault(member, ctx);
|
|
79352
|
-
if (value.matched) return { kind: "
|
|
79353
|
-
|
|
79718
|
+
if (!value.matched) return { kind: "no-info", matchedMember: true };
|
|
79719
|
+
if (!isNSDelegateClosureValue(value.value))
|
|
79720
|
+
return { kind: "ok", value: value.value };
|
|
79721
|
+
return {
|
|
79722
|
+
kind: "ok",
|
|
79723
|
+
value: {
|
|
79724
|
+
...value.value,
|
|
79725
|
+
[DELEGATE_LEXICAL_THIS]: receiver,
|
|
79726
|
+
[DELEGATE_LEXICAL_ROOT]: ctx.rootValue
|
|
79727
|
+
}
|
|
79728
|
+
};
|
|
79354
79729
|
}
|
|
79355
79730
|
case "missing":
|
|
79356
79731
|
return { kind: "no-info", matchedMember: true };
|
|
@@ -81488,8 +81863,9 @@ function validateClassConstructorDescriptor(info, ctx, requireEveryRequiredField
|
|
|
81488
81863
|
}
|
|
81489
81864
|
const genericSlot = ctx.__constructionGenericSlots?.toReversed().find((slot) => slot.classId === classId) ?? ctx.__storedConstructionReplaySlot;
|
|
81490
81865
|
const slotArguments = genericSlot?.classId === classId ? genericSlot.classArguments : void 0;
|
|
81866
|
+
const typeArguments = slotArguments === void 0 ? receiverClosedTypeArguments(info.schemaClassInfo.typeArguments, ctx) : void 0;
|
|
81491
81867
|
const descriptorCache = evaluatorValueGeneration(ctx).constructorDescriptors;
|
|
81492
|
-
const descriptorCacheKey = `${requireEveryRequiredField}:${ctx.storedConstructionReplay === true}:${JSON.stringify(slotArguments ??
|
|
81868
|
+
const descriptorCacheKey = `${requireEveryRequiredField}:${ctx.storedConstructionReplay === true}:${JSON.stringify(slotArguments ?? typeArguments ?? null)}`;
|
|
81493
81869
|
const cachedDescriptor = descriptorCache.get(info)?.get(descriptorCacheKey);
|
|
81494
81870
|
if (cachedDescriptor !== void 0) return cachedDescriptor;
|
|
81495
81871
|
const constructionDocument = {
|
|
@@ -81500,10 +81876,7 @@ function validateClassConstructorDescriptor(info, ctx, requireEveryRequiredField
|
|
|
81500
81876
|
valueById: ctx.vm.databaseVM?.defaultValueById ?? ctx.vm.databaseVM?.valueById,
|
|
81501
81877
|
memberById: evaluatorDefaultValueDocument(ctx).memberById
|
|
81502
81878
|
};
|
|
81503
|
-
const classArguments2 = slotArguments ?? resolveConstructionTypeArguments(
|
|
81504
|
-
info.schemaClassInfo.typeArguments,
|
|
81505
|
-
constructionDocument
|
|
81506
|
-
);
|
|
81879
|
+
const classArguments2 = slotArguments ?? resolveConstructionTypeArguments(typeArguments, constructionDocument);
|
|
81507
81880
|
const cacheDescriptor = (descriptor) => {
|
|
81508
81881
|
const complete2 = {
|
|
81509
81882
|
...descriptor,
|
|
@@ -81615,6 +81988,33 @@ function validateClassConstructorDescriptor(info, ctx, requireEveryRequiredField
|
|
|
81615
81988
|
}
|
|
81616
81989
|
return cacheDescriptor({ schemaClass: schemaClass2, fields, instanceEnv, classArguments: classArguments2 });
|
|
81617
81990
|
}
|
|
81991
|
+
function receiverClosedTypeArguments(typeArguments, ctx) {
|
|
81992
|
+
if (typeArguments === void 0) return void 0;
|
|
81993
|
+
let env = null;
|
|
81994
|
+
let closed = null;
|
|
81995
|
+
for (const [parameterId, typeInfo] of Object.entries(typeArguments)) {
|
|
81996
|
+
if (!typeInfoContainsGeneric(typeInfo)) continue;
|
|
81997
|
+
if (env === null) {
|
|
81998
|
+
const row = ctx.thisValueRowId ? readNeoScriptRuntimeRow(ctx, ctx.thisValueRowId) : trackedRowForValueReference(ctx.thisValue, ctx);
|
|
81999
|
+
if (row) {
|
|
82000
|
+
env = runtimeGenericEnvForValueRow(row, ctx, /* @__PURE__ */ new Set());
|
|
82001
|
+
} else if (ctx.__initializerGenericEnv !== void 0) {
|
|
82002
|
+
env = ctx.__initializerGenericEnv;
|
|
82003
|
+
} else {
|
|
82004
|
+
throw new NSGetterRuntimeError(
|
|
82005
|
+
"Cannot close a generic construction's type arguments without its Class receiver."
|
|
82006
|
+
);
|
|
82007
|
+
}
|
|
82008
|
+
}
|
|
82009
|
+
closed ??= { ...typeArguments };
|
|
82010
|
+
closed[parameterId] = substituteRuntimeTypeInfo(
|
|
82011
|
+
typeInfo,
|
|
82012
|
+
env,
|
|
82013
|
+
ctx
|
|
82014
|
+
);
|
|
82015
|
+
}
|
|
82016
|
+
return closed ?? typeArguments;
|
|
82017
|
+
}
|
|
81618
82018
|
function validateConstructorFieldSlot(args) {
|
|
81619
82019
|
const { schemaKey, ctx } = args;
|
|
81620
82020
|
const rawMember = evalMemberById(ctx.vm, args.memberId);
|
|
@@ -81841,8 +82241,7 @@ function applyConstructorFields(args) {
|
|
|
81841
82241
|
const existingId = rootRecord[schemaKey];
|
|
81842
82242
|
const existing = typeof existingId === "string" ? createdById.get(existingId) : void 0;
|
|
81843
82243
|
if (existing !== void 0 && isLiteralValueContent(existing) && !isMemberClassBase(member) && !isMemberListBase(member) && !isMemberDictionaryBase(member)) {
|
|
81844
|
-
existing
|
|
81845
|
-
existing.updatedAt = Date.now();
|
|
82244
|
+
overwriteConstructedLiteral(existing, value, ctx);
|
|
81846
82245
|
continue;
|
|
81847
82246
|
}
|
|
81848
82247
|
const materialized = materializeConstructorArgumentValue({
|
|
@@ -81857,6 +82256,14 @@ function applyConstructorFields(args) {
|
|
|
81857
82256
|
rootRecord[schemaKey] = materialized.id;
|
|
81858
82257
|
}
|
|
81859
82258
|
}
|
|
82259
|
+
function overwriteConstructedLiteral(row, value, ctx) {
|
|
82260
|
+
const references = ctx.__indexes?.rowByValueReference;
|
|
82261
|
+
if (typeof row.value === "object" && row.value !== null)
|
|
82262
|
+
references?.delete(row.value);
|
|
82263
|
+
if (typeof value === "object" && value !== null) references?.set(value, row);
|
|
82264
|
+
row.value = value;
|
|
82265
|
+
row.updatedAt = Date.now();
|
|
82266
|
+
}
|
|
81860
82267
|
function applyExplicitNullConstructorField(args) {
|
|
81861
82268
|
const { schemaKey, member } = args.validated;
|
|
81862
82269
|
if (isRequiredMember(member)) {
|
|
@@ -81867,8 +82274,7 @@ function applyExplicitNullConstructorField(args) {
|
|
|
81867
82274
|
const existingId = args.rootRecord[schemaKey];
|
|
81868
82275
|
const existing = typeof existingId === "string" ? args.createdById.get(existingId) : void 0;
|
|
81869
82276
|
if (existing !== void 0 && isLiteralValueContent(existing) && !isMemberClassBase(member) && !isMemberListBase(member) && !isMemberDictionaryBase(member)) {
|
|
81870
|
-
existing
|
|
81871
|
-
existing.updatedAt = Date.now();
|
|
82277
|
+
overwriteConstructedLiteral(existing, null, args.ctx);
|
|
81872
82278
|
return;
|
|
81873
82279
|
}
|
|
81874
82280
|
const cleared = registerConstructorArgumentRow(
|
|
@@ -82774,9 +83180,11 @@ function evaluateInitializerInContext(init, member, ctx, createdValues, argument
|
|
|
82774
83180
|
compileMemberId
|
|
82775
83181
|
});
|
|
82776
83182
|
const closeFrame = pushConstructionFrame(ctx, `${member.name} initializer`);
|
|
83183
|
+
const initializerCtx = ctx.thisValue === null ? ctx : bindThisValue(ctx, null);
|
|
83184
|
+
const previousGenericEnv = initializerCtx.__initializerGenericEnv;
|
|
83185
|
+
initializerCtx.__initializerGenericEnv = genericEnv;
|
|
82777
83186
|
let result;
|
|
82778
83187
|
try {
|
|
82779
|
-
const initializerCtx = ctx.thisValue === null ? ctx : bindThisValue(ctx, null);
|
|
82780
83188
|
result = evaluateNSGetterWithEffects(
|
|
82781
83189
|
compiled,
|
|
82782
83190
|
initializerCtx,
|
|
@@ -82792,6 +83200,7 @@ function evaluateInitializerInContext(init, member, ctx, createdValues, argument
|
|
|
82792
83200
|
error.sourceOwnerId ??= ownerId;
|
|
82793
83201
|
throw error;
|
|
82794
83202
|
} finally {
|
|
83203
|
+
initializerCtx.__initializerGenericEnv = previousGenericEnv;
|
|
82795
83204
|
closeFrame();
|
|
82796
83205
|
}
|
|
82797
83206
|
const created = result.createdSessionValues ?? [];
|
|
@@ -82991,6 +83400,21 @@ function retargetConstructorGroupDependencies(provisionalRootId, replacementRoot
|
|
|
82991
83400
|
replacementDependencies.add(dependencyRootId);
|
|
82992
83401
|
}
|
|
82993
83402
|
}
|
|
83403
|
+
function settledConstructorParameterMember(classId, parameterName, constructorId, ctx) {
|
|
83404
|
+
const cache = evaluatorResolutionCache(ctx);
|
|
83405
|
+
cache.constructorSettlement ??= createConstructorSettlementResolver({
|
|
83406
|
+
classes: ctx.vm.classes,
|
|
83407
|
+
constructors: ctx.vm.constructors,
|
|
83408
|
+
members: ctx.vm.members
|
|
83409
|
+
});
|
|
83410
|
+
const settled = cache.constructorSettlement(
|
|
83411
|
+
classId,
|
|
83412
|
+
parameterName,
|
|
83413
|
+
constructorId
|
|
83414
|
+
);
|
|
83415
|
+
if (settled === null) return void 0;
|
|
83416
|
+
return evalMemberById(ctx.vm, settled.memberId) ?? void 0;
|
|
83417
|
+
}
|
|
82994
83418
|
function encodeRequiredConstructorArgument(args) {
|
|
82995
83419
|
const trackedId = findKnownRowIdByValueReference(args.value, args.ctx);
|
|
82996
83420
|
const replayedAggregateId = trackedId === null && args.ctx.storedConstructionReplay === true && typeof args.value === "string" && evalValueById(
|
|
@@ -83036,6 +83460,14 @@ function encodeRequiredConstructorArgument(args) {
|
|
|
83036
83460
|
const aggregateId = trackedId ?? replayedAggregateId;
|
|
83037
83461
|
if (aggregateId !== null) return adoptTracked(aggregateId, "root");
|
|
83038
83462
|
const collectionType = args.typeInfo;
|
|
83463
|
+
const settled = args.member;
|
|
83464
|
+
const registerCollectionRow = (value) => {
|
|
83465
|
+
const row2 = registerRow(value);
|
|
83466
|
+
const genericBindings = settled === void 0 ? void 0 : rowGenericBindings({ ...args, member: settled });
|
|
83467
|
+
if (genericBindings !== void 0) row2.genericBindings = genericBindings;
|
|
83468
|
+
return row2;
|
|
83469
|
+
};
|
|
83470
|
+
const entryMember = settled !== void 0 && (isMemberListBase(settled) || isMemberDictionaryBase(settled)) ? evalMemberById(args.ctx.vm, settled.entryMemberId) ?? void 0 : void 0;
|
|
83039
83471
|
const registerRow = (value, containerId) => {
|
|
83040
83472
|
args.ctx.beforeValueAllocation?.();
|
|
83041
83473
|
const row2 = buildNewValue(args.ctx.vm.project.id, { value });
|
|
@@ -83067,7 +83499,8 @@ function encodeRequiredConstructorArgument(args) {
|
|
|
83067
83499
|
...args,
|
|
83068
83500
|
value,
|
|
83069
83501
|
typeInfo: entryType,
|
|
83070
|
-
parameterId: `${args.parameterId}:${suffix}
|
|
83502
|
+
parameterId: `${args.parameterId}:${suffix}`,
|
|
83503
|
+
member: entryMember
|
|
83071
83504
|
});
|
|
83072
83505
|
if (typeof nested !== "string") {
|
|
83073
83506
|
throw new NSGetterRuntimeError(
|
|
@@ -83084,7 +83517,7 @@ function encodeRequiredConstructorArgument(args) {
|
|
|
83084
83517
|
`Constructor argument '${args.parameterId}' must be a List.`
|
|
83085
83518
|
);
|
|
83086
83519
|
}
|
|
83087
|
-
const row2 =
|
|
83520
|
+
const row2 = registerCollectionRow([]);
|
|
83088
83521
|
row2.value = args.value.map(
|
|
83089
83522
|
(entry, index) => encodeEntry(entry, collectionType.entryTypeInfo, `index:${index}`)
|
|
83090
83523
|
);
|
|
@@ -83095,7 +83528,7 @@ function encodeRequiredConstructorArgument(args) {
|
|
|
83095
83528
|
`Constructor argument '${args.parameterId}' must be a Dictionary.`
|
|
83096
83529
|
);
|
|
83097
83530
|
}
|
|
83098
|
-
const row =
|
|
83531
|
+
const row = registerCollectionRow({});
|
|
83099
83532
|
row.value = Object.fromEntries(
|
|
83100
83533
|
Object.entries(args.value).map(([key, entry]) => [
|
|
83101
83534
|
key,
|
|
@@ -83928,6 +84361,14 @@ function constructDeclaredClassValueWithinFrame(descriptor, record7, info, scope
|
|
|
83928
84361
|
ownerRootId: root.id,
|
|
83929
84362
|
createdValues,
|
|
83930
84363
|
storageKeyDeclarations,
|
|
84364
|
+
// Only collection rows carry a stamp from the settled member.
|
|
84365
|
+
member: resolvedArgumentType.type === 6 /* List */ || resolvedArgumentType.type === 5 /* Dictionary */ ? settledConstructorParameterMember(
|
|
84366
|
+
classId,
|
|
84367
|
+
argumentType.name,
|
|
84368
|
+
record7.id,
|
|
84369
|
+
ctx
|
|
84370
|
+
) : void 0,
|
|
84371
|
+
genericEnv: descriptor.instanceEnv,
|
|
83931
84372
|
ctx
|
|
83932
84373
|
});
|
|
83933
84374
|
}
|
|
@@ -85272,6 +85713,7 @@ var init_evaluateNSGetter = __esm({
|
|
|
85272
85713
|
init_core();
|
|
85273
85714
|
init_listener_write_index();
|
|
85274
85715
|
init_type_info_equality();
|
|
85716
|
+
init_constructor_parameter_settlement();
|
|
85275
85717
|
init_typed_aggregate_row_references();
|
|
85276
85718
|
init_member_change_listeners();
|
|
85277
85719
|
init_project_root_members();
|
|
@@ -88646,10 +89088,20 @@ function sparsifyConstructedInstance(args) {
|
|
|
88646
89088
|
protectedValueIds.add(row.id);
|
|
88647
89089
|
}
|
|
88648
89090
|
}
|
|
89091
|
+
const protectArgument = (valueId, type) => {
|
|
89092
|
+
protectedValueIds.add(valueId);
|
|
89093
|
+
if (type.type !== 6 /* List */ && type.type !== 5 /* Dictionary */)
|
|
89094
|
+
return;
|
|
89095
|
+
const entries = materializedGraph.valuesById.get(valueId)?.value;
|
|
89096
|
+
if (typeof entries !== "object" || entries === null) return;
|
|
89097
|
+
for (const entryId of Object.values(entries))
|
|
89098
|
+
if (typeof entryId === "string")
|
|
89099
|
+
protectArgument(entryId, type.entryTypeInfo);
|
|
89100
|
+
};
|
|
88649
89101
|
for (const edge of materializedGraph.constructorEdges(
|
|
88650
89102
|
args.constructed.root
|
|
88651
89103
|
)) {
|
|
88652
|
-
|
|
89104
|
+
protectArgument(edge.targetValueId, edge.typeInfo);
|
|
88653
89105
|
}
|
|
88654
89106
|
for (const schemaKey of args.pinnedRootSchemaKeys ?? []) {
|
|
88655
89107
|
const location3 = graph.locationsByPath.get(
|
|
@@ -90438,22 +90890,25 @@ function virtualReadRecorder(reads) {
|
|
|
90438
90890
|
recordGlobalRead: reads.recordUnattributableValueRead
|
|
90439
90891
|
};
|
|
90440
90892
|
}
|
|
90441
|
-
function
|
|
90442
|
-
const databaseVM = initializerEvaluatorLookups(
|
|
90443
|
-
args.document,
|
|
90444
|
-
args.readTracking
|
|
90445
|
-
);
|
|
90893
|
+
function compileMemberInitializer(args, databaseVM = initializerEvaluatorLookups(args.document)) {
|
|
90446
90894
|
const initializerIndexes = databaseVM.constructorInitializerIndexes;
|
|
90447
90895
|
const compileMemberId = initializerIndexes?.initializerScopeMemberIds.get(args.init) ?? (args.sourceValueId === null || args.sourceValueId === void 0 ? void 0 : initializerIndexes?.initializerScopeMemberIdsByValueId.get(
|
|
90448
90896
|
args.sourceValueId
|
|
90449
90897
|
));
|
|
90450
|
-
|
|
90898
|
+
return ensureInitializerCompiled({
|
|
90451
90899
|
init: args.init,
|
|
90452
90900
|
member: args.member,
|
|
90453
90901
|
initializerCompiler: args.document.initializerCompiler,
|
|
90454
90902
|
sourceValueId: args.sourceValueId ?? null,
|
|
90455
90903
|
compileMemberId
|
|
90456
90904
|
});
|
|
90905
|
+
}
|
|
90906
|
+
function evaluateMemberInitializer(args) {
|
|
90907
|
+
const databaseVM = initializerEvaluatorLookups(
|
|
90908
|
+
args.document,
|
|
90909
|
+
args.readTracking
|
|
90910
|
+
);
|
|
90911
|
+
const compiled = compileMemberInitializer(args, databaseVM);
|
|
90457
90912
|
const ctx = {
|
|
90458
90913
|
...args.document.evaluationLimits,
|
|
90459
90914
|
debugSink: args.document.debugSink,
|
|
@@ -90821,7 +91276,7 @@ function materializeMemberDefaultValue(args) {
|
|
|
90821
91276
|
rootOwners,
|
|
90822
91277
|
valuesById,
|
|
90823
91278
|
(id2) => args.readTracking?.valueIds.add(id2)
|
|
90824
|
-
).ownerClass : typeof Reflect.get(member, "id") === "string" ? findSchemaPlacement(
|
|
91279
|
+
).ownerClass : typeof Reflect.get(member, "id") === "string" && !isStaticMember(member) ? findSchemaPlacement(
|
|
90825
91280
|
String(Reflect.get(member, "id")),
|
|
90826
91281
|
args.document.classes
|
|
90827
91282
|
)?.ownerClass ?? null : null;
|
|
@@ -93274,6 +93729,9 @@ function initializerRequiresEvaluation(index, expression, targetClassName, runti
|
|
|
93274
93729
|
if (expression.kind === "call") return !isLiteralCall(expression);
|
|
93275
93730
|
if (isEvaluatedOnlyExpression(expression)) return true;
|
|
93276
93731
|
if (expression.kind !== "new") return false;
|
|
93732
|
+
if ((expression.typeArguments?.length ?? 0) > 0 && expression.className !== "Partial" && expression.className !== targetClassName) {
|
|
93733
|
+
return true;
|
|
93734
|
+
}
|
|
93277
93735
|
const className = expression.className ?? targetClassName;
|
|
93278
93736
|
if (!declaresConstructors(index, className)) return false;
|
|
93279
93737
|
if (expression.hasArgumentList === true && expression.args.length > 0) {
|
|
@@ -93281,6 +93739,17 @@ function initializerRequiresEvaluation(index, expression, targetClassName, runti
|
|
|
93281
93739
|
}
|
|
93282
93740
|
return declaresParameterlessConstructor(index, className);
|
|
93283
93741
|
}
|
|
93742
|
+
function constructsValue(expression) {
|
|
93743
|
+
if (expression.kind === "annotated") {
|
|
93744
|
+
return constructsValue(expression.expression);
|
|
93745
|
+
}
|
|
93746
|
+
if (expression.kind === "new") {
|
|
93747
|
+
return expression.args.length > 0 || (expression.initializer?.length ?? 0) > 0;
|
|
93748
|
+
}
|
|
93749
|
+
if (expression.kind === "litList") return expression.elements.length > 0;
|
|
93750
|
+
if (expression.kind === "litDict") return expression.entries.length > 0;
|
|
93751
|
+
return false;
|
|
93752
|
+
}
|
|
93284
93753
|
function requiredConstructorParameterNames(index, className) {
|
|
93285
93754
|
if (className === null) return /* @__PURE__ */ new Set();
|
|
93286
93755
|
const required2 = index.requiredByClassName.get(className);
|
|
@@ -93304,9 +93773,8 @@ function expressionReadsRuntimeIdentifier(expression, runtimeIdentifiers) {
|
|
|
93304
93773
|
runtimeIdentifiers
|
|
93305
93774
|
);
|
|
93306
93775
|
case "new":
|
|
93307
|
-
|
|
93308
|
-
|
|
93309
|
-
);
|
|
93776
|
+
case "lambda":
|
|
93777
|
+
return collectIdentifierReads(expression, runtimeIdentifiers).length > 0;
|
|
93310
93778
|
case "call":
|
|
93311
93779
|
return expressionReadsRuntimeIdentifier(
|
|
93312
93780
|
expression.callee,
|
|
@@ -93349,8 +93817,6 @@ function expressionReadsRuntimeIdentifier(expression, runtimeIdentifiers) {
|
|
|
93349
93817
|
return expression.parts.some(
|
|
93350
93818
|
(part) => part.kind === "expr" && expressionReadsRuntimeIdentifier(part.expr, runtimeIdentifiers)
|
|
93351
93819
|
);
|
|
93352
|
-
case "lambda":
|
|
93353
|
-
return false;
|
|
93354
93820
|
case "litList":
|
|
93355
93821
|
case "litDict":
|
|
93356
93822
|
case "litNull":
|
|
@@ -93419,6 +93885,7 @@ var init_declared_constructors2 = __esm({
|
|
|
93419
93885
|
"src/project-source/declared-constructors.ts"() {
|
|
93420
93886
|
"use strict";
|
|
93421
93887
|
init_declared_constructors();
|
|
93888
|
+
init_strict_ast();
|
|
93422
93889
|
EMPTY_DECLARED_CONSTRUCTOR_INDEX = {
|
|
93423
93890
|
byClassName: /* @__PURE__ */ new Map(),
|
|
93424
93891
|
requiredByClassName: /* @__PURE__ */ new Map(),
|
|
@@ -95985,7 +96452,7 @@ function lowerDefault(context, initializer, type, ownerClass, base, memberId, st
|
|
|
95985
96452
|
return base.defaultValue;
|
|
95986
96453
|
const indexPaths = reference2 ? indexPathDefault(expression) : null;
|
|
95987
96454
|
if (indexPaths !== null) return { value: indexPaths, classId: null };
|
|
95988
|
-
if (unorderedList && expression.kind === "litList" && expression.elements.length > 0 || positionRequiresEvaluation(context, expression, type, ownerClass)) {
|
|
96455
|
+
if (unorderedList && expression.kind === "litList" && expression.elements.length > 0 || constructsValue(expression) && slotForwardsTypeParameter(context, type, ownerClass) || positionRequiresEvaluation(context, expression, type, ownerClass)) {
|
|
95989
96456
|
return {
|
|
95990
96457
|
init: {
|
|
95991
96458
|
code: context.settleInitializerReferences(
|
|
@@ -96192,6 +96659,10 @@ function lowerExpressionValue(context, expression, declaredExpected, ownerClass,
|
|
|
96192
96659
|
if (expected.name === "NeoAction") {
|
|
96193
96660
|
return lowerActionDefault(context, expression, ownerClass, path);
|
|
96194
96661
|
}
|
|
96662
|
+
if (expected.name === "NeoDelegate") {
|
|
96663
|
+
const memberId = methodGroupMemberId(context, expression, ownerClass);
|
|
96664
|
+
if (memberId !== null) return { memberId, valueId: null };
|
|
96665
|
+
}
|
|
96195
96666
|
if (expected.name === NEO_VARIANT_TYPE_NAME || expected.name === NEO_LOOKUP_VARIANT_TYPE_NAME) {
|
|
96196
96667
|
return lowerVariantDefault(context, expression, expected, path);
|
|
96197
96668
|
}
|
|
@@ -96457,12 +96928,23 @@ function lowerExpressionValue(context, expression, declaredExpected, ownerClass,
|
|
|
96457
96928
|
);
|
|
96458
96929
|
}
|
|
96459
96930
|
}
|
|
96931
|
+
function slotForwardsTypeParameter(context, type, ownerClass) {
|
|
96932
|
+
if (type.name === "List" || type.name === "Dictionary") {
|
|
96933
|
+
const entry = type.arguments.at(-1);
|
|
96934
|
+
return entry !== void 0 && slotForwardsTypeParameter(context, entry, ownerClass);
|
|
96935
|
+
}
|
|
96936
|
+
if (!context.classIdsByName.has(type.name)) return false;
|
|
96937
|
+
const parameters = context.genericParametersByClass.get(
|
|
96938
|
+
materializedId(ownerClass, "class", ownerClass.name)
|
|
96939
|
+
);
|
|
96940
|
+
if (parameters === void 0) return false;
|
|
96941
|
+
for (const argument2 of type.arguments) {
|
|
96942
|
+
if (parameters.has(argument2.name)) return true;
|
|
96943
|
+
}
|
|
96944
|
+
return false;
|
|
96945
|
+
}
|
|
96460
96946
|
function positionRequiresEvaluation(context, expression, expected, ownerClass) {
|
|
96461
|
-
|
|
96462
|
-
if (isStoredActionLiteral(expected, expression)) return false;
|
|
96463
|
-
if (isSourceMemberValueRead(context, expression, ownerClass)) return true;
|
|
96464
|
-
if (context.localValues.readsInstance(expression)) return true;
|
|
96465
|
-
return initializerRequiresEvaluation(
|
|
96947
|
+
const requiresEvaluation = () => initializerRequiresEvaluation(
|
|
96466
96948
|
context.declaredConstructors,
|
|
96467
96949
|
expression,
|
|
96468
96950
|
expected.name,
|
|
@@ -96471,6 +96953,12 @@ function positionRequiresEvaluation(context, expression, expected, ownerClass) {
|
|
|
96471
96953
|
ownerClass.name
|
|
96472
96954
|
)
|
|
96473
96955
|
);
|
|
96956
|
+
if (isStoredDelegateLiteral(expected, expression))
|
|
96957
|
+
return requiresEvaluation();
|
|
96958
|
+
if (isStoredActionLiteral(expected, expression)) return false;
|
|
96959
|
+
if (isSourceMemberValueRead(context, expression, ownerClass)) return true;
|
|
96960
|
+
if (context.localValues.readsInstance(expression)) return true;
|
|
96961
|
+
return requiresEvaluation();
|
|
96474
96962
|
}
|
|
96475
96963
|
function isSourceMemberValueRead(context, expression, ownerClass) {
|
|
96476
96964
|
let current = expression;
|
|
@@ -96479,29 +96967,68 @@ function isSourceMemberValueRead(context, expression, ownerClass) {
|
|
|
96479
96967
|
if (path === null) return false;
|
|
96480
96968
|
if (path.startsWith("root.")) return true;
|
|
96481
96969
|
const parts = path.split(".");
|
|
96482
|
-
|
|
96483
|
-
|
|
96484
|
-
|
|
96485
|
-
|
|
96486
|
-
|
|
96487
|
-
|
|
96488
|
-
}
|
|
96489
|
-
|
|
96490
|
-
|
|
96491
|
-
|
|
96492
|
-
|
|
96493
|
-
|
|
96494
|
-
|
|
96495
|
-
|
|
96496
|
-
}
|
|
96497
|
-
if (classId === void 0 || memberName === void 0) return false;
|
|
96498
|
-
const memberId = effectiveMemberIdByName(context, classId, memberName);
|
|
96970
|
+
const target = parts.length > 2 ? {
|
|
96971
|
+
classId: context.rootValueTargetsByPath.get(
|
|
96972
|
+
parts.slice(0, -1).join(".")
|
|
96973
|
+
)?.classId,
|
|
96974
|
+
memberName: parts.at(-1),
|
|
96975
|
+
requiresStatic: false
|
|
96976
|
+
} : classMemberPathTarget(context, parts, ownerClass);
|
|
96977
|
+
if (target.classId === void 0 || target.memberName === void 0)
|
|
96978
|
+
return false;
|
|
96979
|
+
const memberId = effectiveMemberIdByName(
|
|
96980
|
+
context,
|
|
96981
|
+
target.classId,
|
|
96982
|
+
target.memberName
|
|
96983
|
+
);
|
|
96499
96984
|
if (memberId === null) return false;
|
|
96985
|
+
if (isFunctionMember(context, memberId)) return false;
|
|
96986
|
+
return !target.requiresStatic || isStaticMember2(context, memberId);
|
|
96987
|
+
}
|
|
96988
|
+
function methodGroupMemberId(context, expression, ownerClass) {
|
|
96989
|
+
const parts = expressionMemberPath(expression)?.split(".");
|
|
96990
|
+
if (parts === void 0 || parts.length > 2) return null;
|
|
96991
|
+
const target = classMemberPathTarget(context, parts, ownerClass);
|
|
96992
|
+
if (target.classId === void 0 || target.memberName === void 0)
|
|
96993
|
+
return null;
|
|
96994
|
+
const memberId = effectiveMemberIdByName(
|
|
96995
|
+
context,
|
|
96996
|
+
target.classId,
|
|
96997
|
+
target.memberName
|
|
96998
|
+
);
|
|
96999
|
+
if (memberId === null || !isFunctionMember(context, memberId)) return null;
|
|
97000
|
+
if (target.requiresStatic && !isStaticMember2(context, memberId)) {
|
|
97001
|
+
throw new Error(
|
|
97002
|
+
`Delegate ${parts.join(".")} names an instance function; a default binds only Member or this.Member to its own instance.`
|
|
97003
|
+
);
|
|
97004
|
+
}
|
|
97005
|
+
return memberId;
|
|
97006
|
+
}
|
|
97007
|
+
function classMemberPathTarget(context, parts, ownerClass) {
|
|
97008
|
+
if (parts.length === 1 || parts[0] === "this") {
|
|
97009
|
+
return {
|
|
97010
|
+
classId: materializedId(ownerClass, "class", ownerClass.name),
|
|
97011
|
+
memberName: parts.at(-1),
|
|
97012
|
+
requiresStatic: false
|
|
97013
|
+
};
|
|
97014
|
+
}
|
|
97015
|
+
return {
|
|
97016
|
+
classId: context.classIdsByName.get(parts[0]),
|
|
97017
|
+
memberName: parts[1],
|
|
97018
|
+
requiresStatic: true
|
|
97019
|
+
};
|
|
97020
|
+
}
|
|
97021
|
+
function isFunctionMember(context, memberId) {
|
|
97022
|
+
const source = context.sourceMembersById.get(memberId)?.member;
|
|
97023
|
+
if (source !== void 0) return source.kind === "function";
|
|
97024
|
+
const schema = context.loweredMembers.get(memberId) ?? context.baseMembers.get(memberId);
|
|
97025
|
+
return schema?.kind === "function" || schema?.kind === "scriptFunction";
|
|
97026
|
+
}
|
|
97027
|
+
function isStaticMember2(context, memberId) {
|
|
96500
97028
|
const source = context.sourceMembersById.get(memberId)?.member;
|
|
96501
|
-
if (source
|
|
97029
|
+
if (source !== void 0) return source.modifiers.includes("static");
|
|
96502
97030
|
const schema = context.loweredMembers.get(memberId) ?? context.baseMembers.get(memberId);
|
|
96503
|
-
|
|
96504
|
-
return !requiresStatic || isStatic;
|
|
97031
|
+
return schema?.modifier === "static";
|
|
96505
97032
|
}
|
|
96506
97033
|
function isStoredDelegateLiteral(type, expression) {
|
|
96507
97034
|
if (type.name !== "NeoDelegate") return false;
|
|
@@ -96690,7 +97217,7 @@ function manifestTypeForMember(context, member) {
|
|
|
96690
97217
|
return bindingMember === void 0 ? { name: "object", nullable: false, arguments: [] } : manifestTypeForMember(context, bindingMember);
|
|
96691
97218
|
}
|
|
96692
97219
|
return {
|
|
96693
|
-
name: binding?.kind === "generic" ?
|
|
97220
|
+
name: binding?.kind === "generic" ? genericParameterName2(context, binding.genericParamId) : "object",
|
|
96694
97221
|
nullable: false,
|
|
96695
97222
|
arguments: []
|
|
96696
97223
|
};
|
|
@@ -96704,7 +97231,7 @@ function manifestTypeForMember(context, member) {
|
|
|
96704
97231
|
}
|
|
96705
97232
|
if (member.kind === "generic") {
|
|
96706
97233
|
const genericType = {
|
|
96707
|
-
name:
|
|
97234
|
+
name: genericParameterName2(context, member.genericParamId),
|
|
96708
97235
|
nullable: nullable2,
|
|
96709
97236
|
arguments: []
|
|
96710
97237
|
};
|
|
@@ -96789,7 +97316,7 @@ function manifestTypeForSchemaType(context, type) {
|
|
|
96789
97316
|
};
|
|
96790
97317
|
case "generic":
|
|
96791
97318
|
return {
|
|
96792
|
-
name:
|
|
97319
|
+
name: genericParameterName2(context, type.genericParamId),
|
|
96793
97320
|
nullable: nullable2,
|
|
96794
97321
|
arguments: []
|
|
96795
97322
|
};
|
|
@@ -96845,7 +97372,7 @@ function manifestTypeForSchemaType(context, type) {
|
|
|
96845
97372
|
};
|
|
96846
97373
|
}
|
|
96847
97374
|
}
|
|
96848
|
-
function
|
|
97375
|
+
function genericParameterName2(context, genericParamId) {
|
|
96849
97376
|
for (const parameters of context.genericParametersByClass.values()) {
|
|
96850
97377
|
for (const [name, id2] of parameters) {
|
|
96851
97378
|
if (id2 === genericParamId) return name;
|
|
@@ -97715,16 +98242,71 @@ var init_variant_selection_source = __esm({
|
|
|
97715
98242
|
}
|
|
97716
98243
|
});
|
|
97717
98244
|
|
|
98245
|
+
// src/project-source/delegate-value-source.ts
|
|
98246
|
+
function delegateValueSource(body, target) {
|
|
98247
|
+
if (!isObjectRecord2(body)) {
|
|
98248
|
+
throw new Error("NSDelegate value is not a closure or bound target.");
|
|
98249
|
+
}
|
|
98250
|
+
if (typeof body.code === "string") return body.code;
|
|
98251
|
+
if (typeof body.memberId !== "string") {
|
|
98252
|
+
throw new Error("NSDelegate bound target is missing memberId.");
|
|
98253
|
+
}
|
|
98254
|
+
if (body.valueId !== null && body.valueId !== void 0) {
|
|
98255
|
+
throw new Error(
|
|
98256
|
+
"NSDelegate instance-bound target cannot be represented by current project source."
|
|
98257
|
+
);
|
|
98258
|
+
}
|
|
98259
|
+
const { name, staticClassName } = target(body.memberId);
|
|
98260
|
+
return staticClassName === null ? name : `${staticClassName}.${name}`;
|
|
98261
|
+
}
|
|
98262
|
+
var init_delegate_value_source = __esm({
|
|
98263
|
+
"src/project-source/delegate-value-source.ts"() {
|
|
98264
|
+
"use strict";
|
|
98265
|
+
init_value_comparison();
|
|
98266
|
+
}
|
|
98267
|
+
});
|
|
98268
|
+
|
|
98269
|
+
// src/project-source/member-records.ts
|
|
98270
|
+
function memberRecordOwnerClassId(member) {
|
|
98271
|
+
const owner = isObjectRecord2(member.owner) ? member.owner : null;
|
|
98272
|
+
if (owner === null) return null;
|
|
98273
|
+
if (owner.kind !== "classMember" && owner.kind !== "sharedClassMember") {
|
|
98274
|
+
return null;
|
|
98275
|
+
}
|
|
98276
|
+
if (typeof owner.classId === "string") return owner.classId;
|
|
98277
|
+
const first = Array.isArray(owner.members) ? owner.members[0] : void 0;
|
|
98278
|
+
if (!isObjectRecord2(first)) return null;
|
|
98279
|
+
return typeof first.classId === "string" ? first.classId : null;
|
|
98280
|
+
}
|
|
98281
|
+
function memberOwnerClassIdIndex(classes) {
|
|
98282
|
+
const result = /* @__PURE__ */ new Map();
|
|
98283
|
+
for (const [classId, schemaClass2] of classes) {
|
|
98284
|
+
if (!isObjectRecord2(schemaClass2.schema)) continue;
|
|
98285
|
+
for (const memberId of Object.values(schemaClass2.schema)) {
|
|
98286
|
+
if (typeof memberId === "string") result.set(memberId, classId);
|
|
98287
|
+
}
|
|
98288
|
+
}
|
|
98289
|
+
return result;
|
|
98290
|
+
}
|
|
98291
|
+
var init_member_records = __esm({
|
|
98292
|
+
"src/project-source/member-records.ts"() {
|
|
98293
|
+
"use strict";
|
|
98294
|
+
init_value_comparison();
|
|
98295
|
+
}
|
|
98296
|
+
});
|
|
98297
|
+
|
|
97718
98298
|
// src/project-source/emitter.ts
|
|
97719
98299
|
function emitProjectSourcesV4(manifest, options = {}) {
|
|
98300
|
+
const classes = new Map(manifest.classes.map((entry) => [entry.id, entry]));
|
|
97720
98301
|
const context = {
|
|
97721
98302
|
manifest,
|
|
97722
98303
|
classBindings: /* @__PURE__ */ new Map(),
|
|
97723
|
-
classes
|
|
98304
|
+
classes,
|
|
97724
98305
|
interfaces: new Map(manifest.interfaces.map((entry) => [entry.id, entry])),
|
|
97725
98306
|
enums: new Map(manifest.enums.map((entry) => [entry.id, entry])),
|
|
97726
98307
|
dictionaryKeyOptions: /* @__PURE__ */ new Map(),
|
|
97727
98308
|
members: new Map(manifest.members.map((entry) => [entry.id, entry])),
|
|
98309
|
+
ownerClassIds: memberOwnerClassIdIndex(classes),
|
|
97728
98310
|
constructorsById: new Map(
|
|
97729
98311
|
manifest.constructors.map((entry) => [entry.id, entry])
|
|
97730
98312
|
),
|
|
@@ -98901,6 +99483,25 @@ function renderDefaultValue(context, member, wrapper, enclosingClassId) {
|
|
|
98901
99483
|
if (member.kind === "action") {
|
|
98902
99484
|
return renderActionListeners(context, member, value);
|
|
98903
99485
|
}
|
|
99486
|
+
if (member.kind === "delegate") {
|
|
99487
|
+
return delegateValueSource(value, (memberId) => {
|
|
99488
|
+
const target = required(context.members, memberId, "delegate target");
|
|
99489
|
+
if (target.kind !== "function" && target.kind !== "scriptFunction" && target.kind !== "delegate") {
|
|
99490
|
+
throw new Error(`NSDelegate target ${memberId} is not callable.`);
|
|
99491
|
+
}
|
|
99492
|
+
if (target.modifier !== "static") {
|
|
99493
|
+
return { name: target.name, staticClassName: null };
|
|
99494
|
+
}
|
|
99495
|
+
const classId = context.ownerClassIds.get(memberId);
|
|
99496
|
+
if (classId === void 0) {
|
|
99497
|
+
throw new Error(`Static NSDelegate target ${memberId} has no Class.`);
|
|
99498
|
+
}
|
|
99499
|
+
return {
|
|
99500
|
+
name: target.name,
|
|
99501
|
+
staticClassName: required(context.classes, classId, "class").name
|
|
99502
|
+
};
|
|
99503
|
+
});
|
|
99504
|
+
}
|
|
98904
99505
|
if (member.kind === "variant") {
|
|
98905
99506
|
return renderVariantSelectionV4(context, member.name, value);
|
|
98906
99507
|
}
|
|
@@ -99532,6 +100133,8 @@ var init_emitter = __esm({
|
|
|
99532
100133
|
init_members();
|
|
99533
100134
|
init_structured_leaf_source();
|
|
99534
100135
|
init_variant_selection_source();
|
|
100136
|
+
init_delegate_value_source();
|
|
100137
|
+
init_member_records();
|
|
99535
100138
|
SPECIALIZED_RELATION_PROPERTIES = /* @__PURE__ */ new Map([
|
|
99536
100139
|
["world.grid.tile-import", { property: "tileImports", collection: true }],
|
|
99537
100140
|
["world.grid.object-import", { property: "objectImports", collection: true }],
|
|
@@ -110090,10 +110693,10 @@ function compiledConstructionTypeMembers(members, bodies, projectId) {
|
|
|
110090
110693
|
} else if (type.type === 25 /* NSDelegate */) {
|
|
110091
110694
|
return {
|
|
110092
110695
|
returnTypeInfo: type.returnTypeInfo,
|
|
110093
|
-
argumentTypes: type.argumentTypes
|
|
110696
|
+
argumentTypes: namedArguments2(type.argumentTypes)
|
|
110094
110697
|
};
|
|
110095
110698
|
} else if (type.type === 26 /* NSAction */) {
|
|
110096
|
-
return { argumentTypes: type.argumentTypes };
|
|
110699
|
+
return { argumentTypes: namedArguments2(type.argumentTypes) };
|
|
110097
110700
|
} else if (type.type === 22 /* Interface */ || type.type === 9 /* Lookup */ || type.type === 18 /* DialogueLookup */) {
|
|
110098
110701
|
return null;
|
|
110099
110702
|
} else {
|
|
@@ -110124,6 +110727,12 @@ function compiledConstructionTypeMembers(members, bodies, projectId) {
|
|
|
110124
110727
|
for (const body of bodies) visit(body);
|
|
110125
110728
|
return created;
|
|
110126
110729
|
}
|
|
110730
|
+
function namedArguments2(argumentTypes) {
|
|
110731
|
+
return argumentTypes.map((type, index) => ({
|
|
110732
|
+
...type,
|
|
110733
|
+
name: `p${index + 1}`
|
|
110734
|
+
}));
|
|
110735
|
+
}
|
|
110127
110736
|
function withCompiledConstructionTypes(document, body) {
|
|
110128
110737
|
const members = document.members;
|
|
110129
110738
|
const projectId = getField(document.project, "id");
|
|
@@ -114804,6 +115413,7 @@ function materializeAuthoredValueSeeds(args) {
|
|
|
114804
115413
|
args.authoredValueSeeds
|
|
114805
115414
|
);
|
|
114806
115415
|
const consumedSeedMemberIds = /* @__PURE__ */ new Set();
|
|
115416
|
+
const sharedBindings = [];
|
|
114807
115417
|
for (let index = 0; index < args.prepared.length; index += 1) {
|
|
114808
115418
|
const change = args.prepared[index];
|
|
114809
115419
|
if (change?.recordKind !== "member" || change.operation === "delete" || change.nextData === void 0) {
|
|
@@ -114847,11 +115457,8 @@ function materializeAuthoredValueSeeds(args) {
|
|
|
114847
115457
|
}
|
|
114848
115458
|
if (change.operation === "update" && seed === void 0) continue;
|
|
114849
115459
|
if (change.operation === "create" && seed === void 0 && typeof member.valueId === "string") {
|
|
114850
|
-
if (!documentIndex.valuesById.has(member.valueId))
|
|
114851
|
-
|
|
114852
|
-
`Stored static member "${member.name}" (${member.id}) binds missing value "${member.valueId}".`
|
|
114853
|
-
);
|
|
114854
|
-
}
|
|
115460
|
+
if (!documentIndex.valuesById.has(member.valueId))
|
|
115461
|
+
sharedBindings.push({ member, valueId: member.valueId });
|
|
114855
115462
|
continue;
|
|
114856
115463
|
}
|
|
114857
115464
|
const shouldBind = isRequiredMember(member) || seed !== void 0;
|
|
@@ -114994,6 +115601,20 @@ function materializeAuthoredValueSeeds(args) {
|
|
|
114994
115601
|
});
|
|
114995
115602
|
consumedSeedMemberIds.add(seed.memberId);
|
|
114996
115603
|
}
|
|
115604
|
+
if (sharedBindings.length > 0) {
|
|
115605
|
+
const createdValueIds = /* @__PURE__ */ new Set();
|
|
115606
|
+
for (const change of args.prepared) {
|
|
115607
|
+
if (change.recordKind === "value" && change.operation === "create")
|
|
115608
|
+
createdValueIds.add(change.recordId);
|
|
115609
|
+
}
|
|
115610
|
+
for (const { member, valueId } of sharedBindings) {
|
|
115611
|
+
if (!createdValueIds.has(valueId)) {
|
|
115612
|
+
throw new Error(
|
|
115613
|
+
`Stored static member "${member.name}" (${member.id}) binds missing value "${valueId}".`
|
|
115614
|
+
);
|
|
115615
|
+
}
|
|
115616
|
+
}
|
|
115617
|
+
}
|
|
114997
115618
|
return pendingGraphValidations;
|
|
114998
115619
|
}
|
|
114999
115620
|
function materializeExistingAuthoredValueSeed(args) {
|
|
@@ -116041,9 +116662,10 @@ function commitInitEvaluator(document, createdValues) {
|
|
|
116041
116662
|
function hasAuthoredNeoScriptBody(member) {
|
|
116042
116663
|
if (member.kind === 10 /* NSProperty */) return true;
|
|
116043
116664
|
if (member.kind === 23 /* NSFunction */) return true;
|
|
116044
|
-
|
|
116665
|
+
const defaultValue = getField(member, "defaultValue");
|
|
116666
|
+
if (member.kind === 25 /* NSDelegate */ && isLiteralValueContent(defaultValue) && (isNSDelegateClosureValueDraft(defaultValue.value) || isNSDelegateClosureValue(defaultValue.value)))
|
|
116045
116667
|
return true;
|
|
116046
|
-
return isInitValueContent(
|
|
116668
|
+
return isInitValueContent(defaultValue);
|
|
116047
116669
|
}
|
|
116048
116670
|
function touchedInitializerFilter(prepared) {
|
|
116049
116671
|
const createdClassIds = /* @__PURE__ */ new Set();
|
|
@@ -116083,7 +116705,6 @@ function assertTouchedInitializersConstruct(args) {
|
|
|
116083
116705
|
);
|
|
116084
116706
|
const schemaIndex = projectSchemaIndexFor(args.document);
|
|
116085
116707
|
for (const site of sites) {
|
|
116086
|
-
if ((site.init.compiled?.parameters.length ?? 2) > 2) continue;
|
|
116087
116708
|
if (site.sourceValueId === void 0 && [
|
|
116088
116709
|
...referencedGenericParams(
|
|
116089
116710
|
resolveMember(site.member, args.document.members),
|
|
@@ -116091,6 +116712,13 @@ function assertTouchedInitializersConstruct(args) {
|
|
|
116091
116712
|
)
|
|
116092
116713
|
].some((paramId) => site.genericEnv.get(paramId)?.kind !== "member"))
|
|
116093
116714
|
continue;
|
|
116715
|
+
const compiled = compileMemberInitializer({
|
|
116716
|
+
init: site.init,
|
|
116717
|
+
member: site.member,
|
|
116718
|
+
document: args.document,
|
|
116719
|
+
sourceValueId: site.sourceValueId
|
|
116720
|
+
});
|
|
116721
|
+
if (compiled.parameters.length > 2) continue;
|
|
116094
116722
|
const createdValues = [];
|
|
116095
116723
|
const produced = evaluateMemberInitializer({
|
|
116096
116724
|
init: site.init,
|
|
@@ -120502,9 +121130,6 @@ function isOpaqueCallableMemberIdentifier(value) {
|
|
|
120502
121130
|
function isOpaqueCallableArgumentIdentifier(value) {
|
|
120503
121131
|
return isOpaqueGeneratedIdentifier(value, isValidNeoProjectBindingIdentifier) && !value.startsWith("__");
|
|
120504
121132
|
}
|
|
120505
|
-
function isOpaqueNSFunctionArgumentIdentifier(value) {
|
|
120506
|
-
return isOpaqueCallableArgumentIdentifier(value) && value !== "value";
|
|
120507
|
-
}
|
|
120508
121133
|
function isOpaqueNSTypeInfo(value, ancestors = /* @__PURE__ */ new Set()) {
|
|
120509
121134
|
if (!isRecord8(value) || typeof value.required !== "boolean") return false;
|
|
120510
121135
|
if (value.type === "Unknown") return true;
|
|
@@ -120596,11 +121221,7 @@ function isOpaqueNSFunctionReturnTypeInfo(value) {
|
|
|
120596
121221
|
}
|
|
120597
121222
|
return isOpaqueNSTypeInfo(value);
|
|
120598
121223
|
}
|
|
120599
|
-
function
|
|
120600
|
-
return isOpaqueNSTypeInfo(value) && isOpaqueNSFunctionArgumentIdentifier(value.name) && !opaqueTypeInfoContainsUnknown(value) && hasValidOpaqueParameterDefault(value);
|
|
120601
|
-
}
|
|
120602
|
-
function isOpaqueConstructorArgumentTypeInfo(value) {
|
|
120603
|
-
if (!isRecord8(value)) return false;
|
|
121224
|
+
function isOpaqueCallableArgumentTypeInfo(value) {
|
|
120604
121225
|
return isOpaqueNSTypeInfo(value) && isOpaqueCallableArgumentIdentifier(value.name) && !opaqueTypeInfoContainsUnknown(value) && hasValidOpaqueParameterDefault(value);
|
|
120605
121226
|
}
|
|
120606
121227
|
function hasValidOpaqueParameterDefault(value) {
|
|
@@ -121691,7 +122312,7 @@ function resolveOpaqueNSFunctionSignature(member, membersById) {
|
|
|
121691
122312
|
}
|
|
121692
122313
|
seen.add(cursor.id);
|
|
121693
122314
|
if (cursor.kind !== 23) return null;
|
|
121694
|
-
if (isOpaqueNSFunctionReturnTypeInfo(cursor.returnTypeInfo) && Array.isArray(cursor.argumentTypes) && cursor.argumentTypes.every(
|
|
122315
|
+
if (isOpaqueNSFunctionReturnTypeInfo(cursor.returnTypeInfo) && Array.isArray(cursor.argumentTypes) && cursor.argumentTypes.every(isOpaqueCallableArgumentTypeInfo)) {
|
|
121695
122316
|
return {
|
|
121696
122317
|
returnTypeInfo: cursor.returnTypeInfo,
|
|
121697
122318
|
argumentTypes: cursor.argumentTypes,
|
|
@@ -121957,7 +122578,7 @@ function assertOpaqueConstructorValid(declaredConstructor) {
|
|
|
121957
122578
|
);
|
|
121958
122579
|
}
|
|
121959
122580
|
const argumentTypes = declaredConstructor.argumentTypes;
|
|
121960
|
-
if (!argumentTypes.every(
|
|
122581
|
+
if (!argumentTypes.every(isOpaqueCallableArgumentTypeInfo)) {
|
|
121961
122582
|
throw new Error(
|
|
121962
122583
|
`Constructor "${declaredConstructor.id}" argumentTypes are invalid.`
|
|
121963
122584
|
);
|
|
@@ -122262,8 +122883,8 @@ function assertOpaqueNSFunctionValid(member, membersById, typeInfoInDeclaringCla
|
|
|
122262
122883
|
if (!Array.isArray(member.argumentTypes)) {
|
|
122263
122884
|
throw new Error(`NSFunction "${member.id}" argumentTypes are invalid.`);
|
|
122264
122885
|
}
|
|
122265
|
-
if (!member.argumentTypes.every(
|
|
122266
|
-
throw new Error(`NSFunction "${member.id}"
|
|
122886
|
+
if (!member.argumentTypes.every(isOpaqueCallableArgumentTypeInfo)) {
|
|
122887
|
+
throw new Error(`NSFunction "${member.id}" has an invalid argument type.`);
|
|
122267
122888
|
}
|
|
122268
122889
|
const argumentNames = /* @__PURE__ */ new Set();
|
|
122269
122890
|
for (const argument2 of member.argumentTypes) {
|
|
@@ -126829,35 +127450,6 @@ var init_lower_variants = __esm({
|
|
|
126829
127450
|
}
|
|
126830
127451
|
});
|
|
126831
127452
|
|
|
126832
|
-
// src/project-source/member-records.ts
|
|
126833
|
-
function memberRecordOwnerClassId(member) {
|
|
126834
|
-
const owner = isObjectRecord2(member.owner) ? member.owner : null;
|
|
126835
|
-
if (owner === null) return null;
|
|
126836
|
-
if (owner.kind !== "classMember" && owner.kind !== "sharedClassMember") {
|
|
126837
|
-
return null;
|
|
126838
|
-
}
|
|
126839
|
-
if (typeof owner.classId === "string") return owner.classId;
|
|
126840
|
-
const first = Array.isArray(owner.members) ? owner.members[0] : void 0;
|
|
126841
|
-
if (!isObjectRecord2(first)) return null;
|
|
126842
|
-
return typeof first.classId === "string" ? first.classId : null;
|
|
126843
|
-
}
|
|
126844
|
-
function memberOwnerClassIdIndex(classes) {
|
|
126845
|
-
const result = /* @__PURE__ */ new Map();
|
|
126846
|
-
for (const [classId, schemaClass2] of classes) {
|
|
126847
|
-
if (!isObjectRecord2(schemaClass2.schema)) continue;
|
|
126848
|
-
for (const memberId of Object.values(schemaClass2.schema)) {
|
|
126849
|
-
if (typeof memberId === "string") result.set(memberId, classId);
|
|
126850
|
-
}
|
|
126851
|
-
}
|
|
126852
|
-
return result;
|
|
126853
|
-
}
|
|
126854
|
-
var init_member_records = __esm({
|
|
126855
|
-
"src/project-source/member-records.ts"() {
|
|
126856
|
-
"use strict";
|
|
126857
|
-
init_value_comparison();
|
|
126858
|
-
}
|
|
126859
|
-
});
|
|
126860
|
-
|
|
126861
127453
|
// src/project-source/root-value-paths.ts
|
|
126862
127454
|
function rootValuePathsByValueId(records3, storedPlacements) {
|
|
126863
127455
|
const allRecords = [...records3];
|
|
@@ -126998,7 +127590,7 @@ function buildValueEmitIndexesV4(records3, manifest, localizedTextDependencies,
|
|
|
126998
127590
|
const enums = dataById(records3, "enum");
|
|
126999
127591
|
const localizedTexts = dataById(records3, "localized-text");
|
|
127000
127592
|
const dialogues = dataById(records3, "dialogue");
|
|
127001
|
-
const symbolsByValueId = staticSymbols(classes, members);
|
|
127593
|
+
const { symbolsByValueId, staticOwnerIds } = staticSymbols(classes, members);
|
|
127002
127594
|
let document;
|
|
127003
127595
|
const readDocument = () => document ??= trackPulledLocalizedTextReads(
|
|
127004
127596
|
readPulledProjectDocumentV4(records3),
|
|
@@ -127139,6 +127731,7 @@ function buildValueEmitIndexesV4(records3, manifest, localizedTextDependencies,
|
|
|
127139
127731
|
localizedTexts,
|
|
127140
127732
|
mainLocale: projectMainLocale(records3),
|
|
127141
127733
|
symbolsByValueId,
|
|
127734
|
+
staticOwnerIds,
|
|
127142
127735
|
rootPathsByValueId,
|
|
127143
127736
|
readRootIndexPaths: () => rootIndexPaths ??= indexRootIndexPaths(
|
|
127144
127737
|
values,
|
|
@@ -127190,7 +127783,8 @@ function emitStoredValueBindingSourcesV4(records3, memberIds, options) {
|
|
|
127190
127783
|
);
|
|
127191
127784
|
let initializer = emitValue(context, member, valueId, {
|
|
127192
127785
|
environment: declaringClassGenericEnvironment(context, member),
|
|
127193
|
-
|
|
127786
|
+
// A static sharing another static's row names that static (#1385).
|
|
127787
|
+
definitionSite: (context.staticOwnerIds.get(valueId) ?? memberId) === memberId,
|
|
127194
127788
|
// The row is `derivedMemberValueId(memberId)` and the declaration
|
|
127195
127789
|
// above it already carries `@id(memberId)`.
|
|
127196
127790
|
writeIdentity: false,
|
|
@@ -128433,14 +129027,8 @@ function mergedOverStoredRow(base, lowered) {
|
|
|
128433
129027
|
if (storedArgs !== null && loweredArgs !== null) {
|
|
128434
129028
|
let preserved = null;
|
|
128435
129029
|
for (const [key, argument2] of Object.entries(loweredArgs)) {
|
|
128436
|
-
|
|
128437
|
-
if (
|
|
128438
|
-
if ("action" in argument2) continue;
|
|
128439
|
-
const stored = storedArgs[key];
|
|
128440
|
-
if (!isObjectRecord2(stored)) continue;
|
|
128441
|
-
if (typeof stored.code !== "string") continue;
|
|
128442
|
-
if (!sameNeoScriptTokens(stored.code, argument2.code)) continue;
|
|
128443
|
-
if (!("action" in stored)) continue;
|
|
129030
|
+
const stored = storedCompiledClosure(storedArgs[key], argument2);
|
|
129031
|
+
if (stored === null) continue;
|
|
128444
129032
|
preserved ??= { ...loweredArgs };
|
|
128445
129033
|
preserved[key] = stored;
|
|
128446
129034
|
}
|
|
@@ -128472,6 +129060,13 @@ function mergedOverStoredRow(base, lowered) {
|
|
|
128472
129060
|
void _instanceVariantRowValueId;
|
|
128473
129061
|
return initializer;
|
|
128474
129062
|
}
|
|
129063
|
+
function storedCompiledClosure(stored, lowered) {
|
|
129064
|
+
if (!isNSDelegateClosureValueDraft(lowered)) return null;
|
|
129065
|
+
if (!isObjectRecord2(stored)) return null;
|
|
129066
|
+
if (typeof stored.code !== "string") return null;
|
|
129067
|
+
if (!("action" in stored)) return null;
|
|
129068
|
+
return sameNeoScriptTokens(stored.code, lowered.code) ? stored : null;
|
|
129069
|
+
}
|
|
128475
129070
|
function variantRowFields(row) {
|
|
128476
129071
|
return { id: row.id, ...encodeStoredValueRowFields(row) };
|
|
128477
129072
|
}
|
|
@@ -128696,6 +129291,15 @@ function lowerMemberDefaultSourcesV4(state, analysis, manifest, options = {}) {
|
|
|
128696
129291
|
}
|
|
128697
129292
|
continue;
|
|
128698
129293
|
}
|
|
129294
|
+
const loweredDefault = member.defaultValue;
|
|
129295
|
+
const storedClosure = loweredDefault !== null && "value" in loweredDefault ? storedCompiledClosure(storedDefault?.value, loweredDefault.value) : null;
|
|
129296
|
+
if (storedClosure !== null) {
|
|
129297
|
+
memberDefaultValues.set(memberId, {
|
|
129298
|
+
value: storedClosure,
|
|
129299
|
+
classId: null
|
|
129300
|
+
});
|
|
129301
|
+
continue;
|
|
129302
|
+
}
|
|
128699
129303
|
if (!defaultRequiresOwnedRows(context, member, expression, binding)) {
|
|
128700
129304
|
if (member.kind === "lookup" || member.kind === "dialogueLookup") {
|
|
128701
129305
|
const entries = expression.kind === "litList" ? expression.elements : [expression];
|
|
@@ -129397,7 +130001,7 @@ function memberInitializerRequiresEvaluation(context, member, expression, source
|
|
|
129397
130001
|
return false;
|
|
129398
130002
|
}
|
|
129399
130003
|
const unorderedDefault = source.purpose === "memberDefault" && member.id === source.memberId && member.kind === "list" && member.listKind === "unordered" && expression.kind === "litList" && expression.elements.length > 0;
|
|
129400
|
-
const requiresEvaluation = unorderedDefault || context.localValues.readsInstance(expression) || isSchemaMemberValueRead(context, expression, source) || isUnresolvedLiteralName(context, member, expression) || initializerRequiresEvaluation(
|
|
130004
|
+
const requiresEvaluation = unorderedDefault || source.purpose === "memberDefault" && member.id === source.memberId && constructsValue(expression) && slotForwardsTypeParameter2(context, member, source.ownerClassId) || context.localValues.readsInstance(expression) || isSchemaMemberValueRead(context, expression, source) || isUnresolvedLiteralName(context, member, expression) || initializerRequiresEvaluation(
|
|
129401
130005
|
context.declaredConstructors,
|
|
129402
130006
|
expression,
|
|
129403
130007
|
memberClassName(context, member),
|
|
@@ -129405,6 +130009,20 @@ function memberInitializerRequiresEvaluation(context, member, expression, source
|
|
|
129405
130009
|
);
|
|
129406
130010
|
return requiresEvaluation;
|
|
129407
130011
|
}
|
|
130012
|
+
function slotForwardsTypeParameter2(context, member, ownerClassId) {
|
|
130013
|
+
if (member.kind === "list" || member.kind === "dictionary") {
|
|
130014
|
+
const entry = context.members.get(member.entryMemberId);
|
|
130015
|
+
return entry !== void 0 && slotForwardsTypeParameter2(context, entry, ownerClassId);
|
|
130016
|
+
}
|
|
130017
|
+
if (member.kind !== "class") return false;
|
|
130018
|
+
let bindings;
|
|
130019
|
+
for (const argument2 of Object.values(member.classArguments ?? {})) {
|
|
130020
|
+
if (argument2.kind !== "generic") continue;
|
|
130021
|
+
bindings ??= ownerClassId === void 0 ? /* @__PURE__ */ new Map() : classGenericBindings(context.classes, ownerClassId);
|
|
130022
|
+
if (bindings.get(argument2.genericParamId)?.kind !== "member") return true;
|
|
130023
|
+
}
|
|
130024
|
+
return false;
|
|
130025
|
+
}
|
|
129408
130026
|
function isIndexPathReferenceValue(sourceExpression) {
|
|
129409
130027
|
const expression = annotatedValue(sourceExpression).expression;
|
|
129410
130028
|
const elements = expression.kind === "litList" ? expression.elements : [expression];
|
|
@@ -129432,7 +130050,7 @@ function isSchemaMemberValueRead(context, expression, source) {
|
|
|
129432
130050
|
if (classId === void 0) return false;
|
|
129433
130051
|
const memberId = classSchemaMemberId(context, classId, name);
|
|
129434
130052
|
const member = memberId === null ? void 0 : context.members.get(memberId);
|
|
129435
|
-
return member !== void 0 && member.kind !== "function" && (staticClass === void 0 || member.modifier === "static");
|
|
130053
|
+
return member !== void 0 && member.kind !== "function" && member.kind !== "scriptFunction" && (staticClass === void 0 || member.modifier === "static");
|
|
129436
130054
|
}
|
|
129437
130055
|
function isUnresolvedLiteralName(context, member, sourceExpression) {
|
|
129438
130056
|
const expression = annotatedValue(sourceExpression).expression;
|
|
@@ -129657,6 +130275,7 @@ function lowerRowBackedDefault(context, member, backed, baseData3, binding) {
|
|
|
129657
130275
|
schemaClass2,
|
|
129658
130276
|
expression,
|
|
129659
130277
|
environment,
|
|
130278
|
+
member.classArguments,
|
|
129660
130279
|
binding.label
|
|
129661
130280
|
);
|
|
129662
130281
|
const baseBody = retainedStoredClassBody(
|
|
@@ -129837,6 +130456,18 @@ function lowerRowBackedDefault(context, member, backed, baseData3, binding) {
|
|
|
129837
130456
|
`Default value ${binding.label} does not match its persisted ${member.kind} container shape.`
|
|
129838
130457
|
);
|
|
129839
130458
|
}
|
|
130459
|
+
function foreignDelegateCopy(context, member, expression, binding) {
|
|
130460
|
+
if (member.kind !== "delegate") return null;
|
|
130461
|
+
const path = memberPath2(annotatedValue(expression).expression);
|
|
130462
|
+
const parts = path?.split(".");
|
|
130463
|
+
if (path === null || parts?.length !== 2) return null;
|
|
130464
|
+
const owner = context.classesByName.get(parts[0]);
|
|
130465
|
+
if (owner === void 0 || owner.id === binding.ownerClassId) return null;
|
|
130466
|
+
const targetId = classSchemaMemberId(context, owner.id, parts[1]);
|
|
130467
|
+
if (targetId === null) return null;
|
|
130468
|
+
const target = context.members.get(targetId);
|
|
130469
|
+
return target?.kind === "delegate" && target.modifier === "static" ? path : null;
|
|
130470
|
+
}
|
|
129840
130471
|
function lowerStoredBinding(context, binding, memberValueIds, seeds) {
|
|
129841
130472
|
const member = context.members.get(binding.memberId);
|
|
129842
130473
|
if (member === void 0) {
|
|
@@ -129860,7 +130491,19 @@ function lowerStoredBinding(context, binding, memberValueIds, seeds) {
|
|
|
129860
130491
|
binding.initializer
|
|
129861
130492
|
);
|
|
129862
130493
|
const currentValueId = typeof memberData?.valueId === "string" ? memberData.valueId : null;
|
|
129863
|
-
const
|
|
130494
|
+
const foreign = foreignDelegateCopy(context, member, expression, binding);
|
|
130495
|
+
if (foreign !== null) {
|
|
130496
|
+
context.loweringFailures.push({
|
|
130497
|
+
message: `Static delegate ${member.name} cannot copy ${foreign} from another Class; write () => ${foreign}() instead.`,
|
|
130498
|
+
site: referenceSite(binding, expression)
|
|
130499
|
+
});
|
|
130500
|
+
memberValueIds.set(
|
|
130501
|
+
binding.memberId,
|
|
130502
|
+
currentValueId ?? memberValueId(binding.memberId)
|
|
130503
|
+
);
|
|
130504
|
+
return;
|
|
130505
|
+
}
|
|
130506
|
+
const referenced = member.kind === "class" || member.kind === "list" || member.kind === "dictionary" ? sourceValueSymbol(context, expression) : null;
|
|
129864
130507
|
if (referenced !== null) {
|
|
129865
130508
|
const listeners = context.listenerBindings.get(
|
|
129866
130509
|
`${binding.purpose}:${binding.memberId}`
|
|
@@ -130267,7 +130910,12 @@ function lowerSeedRow(context, member, sourceExpression, source, valueId, path,
|
|
|
130267
130910
|
authoredSlice
|
|
130268
130911
|
);
|
|
130269
130912
|
}
|
|
130270
|
-
if (!isStoredCallableLiteral(
|
|
130913
|
+
if (!isStoredCallableLiteral(
|
|
130914
|
+
context,
|
|
130915
|
+
resolvedMember.kind,
|
|
130916
|
+
expression,
|
|
130917
|
+
source
|
|
130918
|
+
) && memberInitializerRequiresEvaluation(
|
|
130271
130919
|
context,
|
|
130272
130920
|
resolvedMember,
|
|
130273
130921
|
expression,
|
|
@@ -130395,6 +131043,7 @@ function lowerSeedRow(context, member, sourceExpression, source, valueId, path,
|
|
|
130395
131043
|
effectiveClass,
|
|
130396
131044
|
expression,
|
|
130397
131045
|
environment,
|
|
131046
|
+
resolvedMember.classArguments,
|
|
130398
131047
|
path
|
|
130399
131048
|
);
|
|
130400
131049
|
}
|
|
@@ -131154,7 +131803,12 @@ function lowerValueRow(context, member, sourceExpression, expectedValueId, sourc
|
|
|
131154
131803
|
member,
|
|
131155
131804
|
environment
|
|
131156
131805
|
);
|
|
131157
|
-
if (!isStoredCallableLiteral(
|
|
131806
|
+
if (!isStoredCallableLiteral(
|
|
131807
|
+
context,
|
|
131808
|
+
resolvedMember.kind,
|
|
131809
|
+
expression,
|
|
131810
|
+
source
|
|
131811
|
+
) && memberInitializerRequiresEvaluation(
|
|
131158
131812
|
context,
|
|
131159
131813
|
resolvedMember,
|
|
131160
131814
|
expression,
|
|
@@ -131347,8 +132001,8 @@ function lowerValueBody(context, member, expression, base, source, environment,
|
|
|
131347
132001
|
case "delegate": {
|
|
131348
132002
|
const value = lowerDelegateValue(
|
|
131349
132003
|
context,
|
|
132004
|
+
source,
|
|
131350
132005
|
expression,
|
|
131351
|
-
source.ownerClassId,
|
|
131352
132006
|
authoredSlice
|
|
131353
132007
|
);
|
|
131354
132008
|
if (isObjectRecord2(value) && typeof value.code === "string" && typeof base.id === "string")
|
|
@@ -131472,6 +132126,7 @@ function lowerClassValue(context, member, expression, base, source, outerEnviron
|
|
|
131472
132126
|
schemaClass2,
|
|
131473
132127
|
expression,
|
|
131474
132128
|
environment,
|
|
132129
|
+
member.classArguments,
|
|
131475
132130
|
String(base.id ?? member.name)
|
|
131476
132131
|
);
|
|
131477
132132
|
}
|
|
@@ -132184,7 +132839,7 @@ function genericBindingClassId(context, bindingMemberId) {
|
|
|
132184
132839
|
const rawBinding = stateData(context, "member", bindingMemberId);
|
|
132185
132840
|
return rawBinding?.kind === 7 && typeof rawBinding.classId === "string" ? rawBinding.classId : null;
|
|
132186
132841
|
}
|
|
132187
|
-
function validateConstructedGenericArguments(context, schemaClass2, expression, environment, path) {
|
|
132842
|
+
function validateConstructedGenericArguments(context, schemaClass2, expression, environment, slotArguments, path) {
|
|
132188
132843
|
const actual = expression.className === "Partial" ? [] : expression.typeArguments ?? [];
|
|
132189
132844
|
const expected = schemaClass2.genericParameters;
|
|
132190
132845
|
if (expected.length === 0) {
|
|
@@ -132206,12 +132861,15 @@ function validateConstructedGenericArguments(context, schemaClass2, expression,
|
|
|
132206
132861
|
`Class ${schemaClass2.name} requires ${expected.length} type argument${expected.length === 1 ? "" : "s"} (${path}).`
|
|
132207
132862
|
);
|
|
132208
132863
|
}
|
|
132864
|
+
let forwarded;
|
|
132209
132865
|
for (let index = 0; index < expected.length; index++) {
|
|
132210
132866
|
const parameter4 = expected[index];
|
|
132211
132867
|
const bindingMemberId = environment.get(parameter4.id);
|
|
132212
132868
|
const inferredClassId = inferredGenericClassId(bindingMemberId);
|
|
132213
132869
|
const bindingMember = inferredClassId === null && bindingMemberId ? context.members.get(bindingMemberId) : void 0;
|
|
132214
|
-
const
|
|
132870
|
+
const closedName = inferredClassId ? context.classes.get(inferredClassId)?.name ?? null : bindingMember ? lowerSchemaMemberTypeName(context, bindingMember) : bindingMemberId ? lowerRawMemberTypeName(context, bindingMemberId) : null;
|
|
132871
|
+
forwarded ??= closedName === null ? forwardedParameterNames(context, schemaClass2.id, slotArguments) : void 0;
|
|
132872
|
+
const expectedName = closedName ?? forwarded?.get(parameter4.id) ?? null;
|
|
132215
132873
|
const actualName = actual[index] ? astTypeNameV4(actual[index]) : null;
|
|
132216
132874
|
if (expectedName === null || actualName !== expectedName) {
|
|
132217
132875
|
throw new Error(
|
|
@@ -132220,20 +132878,65 @@ function validateConstructedGenericArguments(context, schemaClass2, expression,
|
|
|
132220
132878
|
}
|
|
132221
132879
|
}
|
|
132222
132880
|
}
|
|
132881
|
+
function forwardedParameterNames(context, classId, slotArguments) {
|
|
132882
|
+
const names = /* @__PURE__ */ new Map();
|
|
132883
|
+
const bindings = classGenericBindings(context.classes, classId);
|
|
132884
|
+
for (const [genericParamId, argument2] of Object.entries(slotArguments)) {
|
|
132885
|
+
if (argument2.kind === "member") continue;
|
|
132886
|
+
const terminal2 = bindings.get(genericParamId);
|
|
132887
|
+
if (terminal2?.kind === "member") continue;
|
|
132888
|
+
const name = genericParameterName3(context.classes, argument2.genericParamId);
|
|
132889
|
+
if (terminal2 !== void 0 && name !== void 0) {
|
|
132890
|
+
names.set(terminal2.genericParamId, name);
|
|
132891
|
+
}
|
|
132892
|
+
}
|
|
132893
|
+
return names;
|
|
132894
|
+
}
|
|
132895
|
+
function genericParameterName3(classes, genericParamId) {
|
|
132896
|
+
let names = genericParameterNamesByClasses.get(classes);
|
|
132897
|
+
if (names === void 0) {
|
|
132898
|
+
const built = /* @__PURE__ */ new Map();
|
|
132899
|
+
for (const schemaClass2 of classes.values()) {
|
|
132900
|
+
for (const parameter4 of schemaClass2.genericParameters) {
|
|
132901
|
+
built.set(parameter4.id, parameter4.name);
|
|
132902
|
+
}
|
|
132903
|
+
}
|
|
132904
|
+
genericParameterNamesByClasses.set(classes, built);
|
|
132905
|
+
names = built;
|
|
132906
|
+
}
|
|
132907
|
+
return names.get(genericParamId);
|
|
132908
|
+
}
|
|
132223
132909
|
function lowerRawMemberTypeName(context, memberId) {
|
|
132224
132910
|
const member = stateData(context, "member", memberId);
|
|
132225
132911
|
if (!member) return null;
|
|
132226
|
-
if (member.kind === 7 && typeof member.classId === "string") {
|
|
132912
|
+
if (member.kind === 7 /* Class */ && typeof member.classId === "string") {
|
|
132227
132913
|
return context.classes.get(member.classId)?.name ?? null;
|
|
132228
132914
|
}
|
|
132915
|
+
if (member.kind === 8 /* Enum */ && typeof member.enumId === "string") {
|
|
132916
|
+
return context.enumNames.get(member.enumId) ?? null;
|
|
132917
|
+
}
|
|
132918
|
+
if (member.kind === 6 /* List */) return "List";
|
|
132919
|
+
if (member.kind === 5 /* Dictionary */) return "Dictionary";
|
|
132920
|
+
if (member.kind === 25 /* NSDelegate */) return "NeoDelegate";
|
|
132229
132921
|
return typeof member.kind === "number" ? fixedSourceTypeNameForKindNumber(member.kind) : null;
|
|
132230
132922
|
}
|
|
132231
132923
|
function lowerSchemaMemberTypeName(context, member) {
|
|
132232
|
-
|
|
132233
|
-
|
|
132924
|
+
switch (member.kind) {
|
|
132925
|
+
case "class":
|
|
132926
|
+
return context.classes.get(member.classId)?.name ?? null;
|
|
132927
|
+
case "enum":
|
|
132928
|
+
return context.enumNames.get(member.enumId) ?? null;
|
|
132929
|
+
case "list":
|
|
132930
|
+
return "List";
|
|
132931
|
+
case "dictionary":
|
|
132932
|
+
return "Dictionary";
|
|
132933
|
+
case "delegate":
|
|
132934
|
+
return "NeoDelegate";
|
|
132935
|
+
case "generic":
|
|
132936
|
+
return null;
|
|
132937
|
+
default:
|
|
132938
|
+
return fixedSourceTypeNameForKind(member.kind) ?? member.kind;
|
|
132234
132939
|
}
|
|
132235
|
-
if (member.kind === "generic") return null;
|
|
132236
|
-
return fixedSourceTypeNameForKind(member.kind) ?? member.kind;
|
|
132237
132940
|
}
|
|
132238
132941
|
function constructedClass(context, member, expression, currentClassId, path) {
|
|
132239
132942
|
if (member.partial === true) {
|
|
@@ -133711,9 +134414,16 @@ function lowerFunctionReference(context, expression, ownerClassId) {
|
|
|
133711
134414
|
}
|
|
133712
134415
|
return { functionMemberId: target.id };
|
|
133713
134416
|
}
|
|
133714
|
-
function isStoredCallableLiteral(kind, expression) {
|
|
134417
|
+
function isStoredCallableLiteral(context, kind, expression, source) {
|
|
134418
|
+
if (kind === "delegate" && expression.kind === "lambda")
|
|
134419
|
+
return !initializerRequiresEvaluation(
|
|
134420
|
+
context.declaredConstructors,
|
|
134421
|
+
expression,
|
|
134422
|
+
null,
|
|
134423
|
+
bindingRuntimeIdentifiers(context, source)
|
|
134424
|
+
);
|
|
133715
134425
|
if (kind === "delegate")
|
|
133716
|
-
return expression
|
|
134426
|
+
return memberPath2(expression) !== null && !isSchemaMemberValueRead(context, expression, source);
|
|
133717
134427
|
if (kind !== "action") return false;
|
|
133718
134428
|
return expression.kind === "litList";
|
|
133719
134429
|
}
|
|
@@ -133788,7 +134498,7 @@ function lowerActionListener2(context, element, ownerClassId, index) {
|
|
|
133788
134498
|
}
|
|
133789
134499
|
return { memberId: target.id, valueId };
|
|
133790
134500
|
}
|
|
133791
|
-
function lowerDelegateValue(context,
|
|
134501
|
+
function lowerDelegateValue(context, source, expression, authoredSlice) {
|
|
133792
134502
|
if (expression.kind === "lambda") {
|
|
133793
134503
|
const code = initializerExpressionSlice(authoredSlice);
|
|
133794
134504
|
if (code === void 0) {
|
|
@@ -133798,25 +134508,60 @@ function lowerDelegateValue(context, expression, ownerClassId, authoredSlice) {
|
|
|
133798
134508
|
}
|
|
133799
134509
|
return { code };
|
|
133800
134510
|
}
|
|
133801
|
-
const
|
|
133802
|
-
|
|
133803
|
-
|
|
133804
|
-
|
|
133805
|
-
|
|
133806
|
-
);
|
|
134511
|
+
const target = methodGroupTarget(context, expression, source.ownerClassId);
|
|
134512
|
+
if ("failure" in target) {
|
|
134513
|
+
context.loweringFailures.push({
|
|
134514
|
+
message: target.failure,
|
|
134515
|
+
site: referenceSite(source, expression)
|
|
134516
|
+
});
|
|
134517
|
+
return null;
|
|
133807
134518
|
}
|
|
133808
|
-
|
|
133809
|
-
|
|
133810
|
-
|
|
133811
|
-
|
|
134519
|
+
return { memberId: target.memberId, valueId: null };
|
|
134520
|
+
}
|
|
134521
|
+
function methodGroupTarget(context, expression, ownerClassId) {
|
|
134522
|
+
const path = memberPath2(expression)?.split(".");
|
|
134523
|
+
if (path === void 0 || path.length > 2) {
|
|
134524
|
+
return {
|
|
134525
|
+
failure: "Delegate method groups name a member, this.Member, or Class.Member."
|
|
134526
|
+
};
|
|
133812
134527
|
}
|
|
133813
|
-
const
|
|
133814
|
-
|
|
133815
|
-
|
|
133816
|
-
|
|
133817
|
-
)
|
|
134528
|
+
const symbol = path.at(-1);
|
|
134529
|
+
const qualifier = path.length === 2 && path[0] !== "this" ? path[0] : null;
|
|
134530
|
+
let classId;
|
|
134531
|
+
if (qualifier === null) {
|
|
134532
|
+
if (ownerClassId === void 0) {
|
|
134533
|
+
throw new Error(
|
|
134534
|
+
`Delegate ${symbol} cannot be resolved without its owning Class.`
|
|
134535
|
+
);
|
|
134536
|
+
}
|
|
134537
|
+
classId = ownerClassId;
|
|
134538
|
+
} else {
|
|
134539
|
+
const named = context.classesByName.get(qualifier);
|
|
134540
|
+
if (named === void 0) {
|
|
134541
|
+
return {
|
|
134542
|
+
failure: `Delegate ${qualifier}.${symbol} names no Class ${qualifier}.`
|
|
134543
|
+
};
|
|
134544
|
+
}
|
|
134545
|
+
classId = named.id;
|
|
134546
|
+
}
|
|
134547
|
+
const targetId = classMemberIdByName(context, classId, symbol);
|
|
134548
|
+
if (targetId === null) {
|
|
134549
|
+
return {
|
|
134550
|
+
failure: `Delegate ${path.join(".")} names no member of Class ${context.classes.get(classId)?.name ?? classId}.`
|
|
134551
|
+
};
|
|
133818
134552
|
}
|
|
133819
|
-
|
|
134553
|
+
const target = requiredMember(context, targetId);
|
|
134554
|
+
if (target.kind !== "function" && target.kind !== "scriptFunction") {
|
|
134555
|
+
return {
|
|
134556
|
+
failure: `Delegate ${path.join(".")} does not name a function or NSFunction member.`
|
|
134557
|
+
};
|
|
134558
|
+
}
|
|
134559
|
+
if (qualifier !== null && target.modifier !== "static") {
|
|
134560
|
+
return {
|
|
134561
|
+
failure: `Delegate ${qualifier}.${symbol} names an instance function; a default binds only Member or this.Member to its own instance.`
|
|
134562
|
+
};
|
|
134563
|
+
}
|
|
134564
|
+
return { memberId: target.id };
|
|
133820
134565
|
}
|
|
133821
134566
|
function fileTargetId(context, expression, registry) {
|
|
133822
134567
|
const path = memberPath2(expression);
|
|
@@ -134712,18 +135457,20 @@ function materializedValueSubgraphsEqual(context, currentGraph, replayGraph, cur
|
|
|
134712
135457
|
if (!isAnyMemberBase(resolvedMember))
|
|
134713
135458
|
throw new Error("Settle comparison has an invalid member descriptor.");
|
|
134714
135459
|
const document = context.readDocument();
|
|
135460
|
+
const genericEnv = /* @__PURE__ */ new Map();
|
|
135461
|
+
for (const [id2, memberId] of environment)
|
|
135462
|
+
genericEnv.set(id2, { kind: "member", memberId });
|
|
134715
135463
|
const typeInfo = resolveMemberDeclaredTypeInfo(
|
|
134716
135464
|
resolvedMember,
|
|
134717
|
-
document.members
|
|
135465
|
+
document.members,
|
|
135466
|
+
null,
|
|
135467
|
+
genericEnv
|
|
134718
135468
|
);
|
|
134719
135469
|
if (typeInfo === null) {
|
|
134720
135470
|
throw new Error(
|
|
134721
135471
|
`Stored member ${String(member.name ?? member.id)} has no declared type for materialized settle comparison.`
|
|
134722
135472
|
);
|
|
134723
135473
|
}
|
|
134724
|
-
const genericEnv = /* @__PURE__ */ new Map();
|
|
134725
|
-
for (const [id2, memberId] of environment)
|
|
134726
|
-
genericEnv.set(id2, { kind: "member", memberId });
|
|
134727
135474
|
return context.compareEffectiveValues(
|
|
134728
135475
|
currentGraph.normalizeTypedRow(
|
|
134729
135476
|
currentId,
|
|
@@ -134740,7 +135487,7 @@ function materializedValueSubgraphsEqual(context, currentGraph, replayGraph, cur
|
|
|
134740
135487
|
)
|
|
134741
135488
|
) === 0;
|
|
134742
135489
|
}
|
|
134743
|
-
function firstRequiredConstructorParameterKey(context, classId) {
|
|
135490
|
+
function firstRequiredConstructorParameterKey(context, classId, environment) {
|
|
134744
135491
|
const seen = /* @__PURE__ */ new Set();
|
|
134745
135492
|
let cursor = classId;
|
|
134746
135493
|
while (cursor !== void 0 && !seen.has(cursor)) {
|
|
@@ -134764,7 +135511,7 @@ function firstRequiredConstructorParameterKey(context, classId) {
|
|
|
134764
135511
|
continue;
|
|
134765
135512
|
}
|
|
134766
135513
|
if (constructorParameterIsRequired(
|
|
134767
|
-
isRequiredMember(member),
|
|
135514
|
+
kind === 21 /* Generic */ ? genericSlotIsRequired(context, member, environment) : isRequiredMember(member),
|
|
134768
135515
|
member.defaultValue
|
|
134769
135516
|
)) {
|
|
134770
135517
|
return schemaKey;
|
|
@@ -134775,6 +135522,11 @@ function firstRequiredConstructorParameterKey(context, classId) {
|
|
|
134775
135522
|
}
|
|
134776
135523
|
return null;
|
|
134777
135524
|
}
|
|
135525
|
+
function genericSlotIsRequired(context, member, environment) {
|
|
135526
|
+
const bindingId = environment.get(stringField2(member, "genericParamId"));
|
|
135527
|
+
const binding = bindingId === void 0 ? void 0 : context.members.get(bindingId);
|
|
135528
|
+
return binding === void 0 || isRequiredMember(binding);
|
|
135529
|
+
}
|
|
134778
135530
|
function storedConstructorCallSource(context, schemaClass2, value, className, environment, visited, targetTyped, cloneAggregateArguments = false) {
|
|
134779
135531
|
const constructorArgs2 = value.constructorArgs;
|
|
134780
135532
|
if (!isObjectRecord2(constructorArgs2)) return null;
|
|
@@ -134790,7 +135542,8 @@ function storedConstructorCallSource(context, schemaClass2, value, className, en
|
|
|
134790
135542
|
}
|
|
134791
135543
|
if (firstRequiredConstructorParameterKey(
|
|
134792
135544
|
context,
|
|
134793
|
-
stringField2(schemaClass2, "id")
|
|
135545
|
+
stringField2(schemaClass2, "id"),
|
|
135546
|
+
environment
|
|
134794
135547
|
) !== null) {
|
|
134795
135548
|
return null;
|
|
134796
135549
|
}
|
|
@@ -135318,13 +136071,16 @@ function storedSchemaTypeName(context, type, environment, valueId) {
|
|
|
135318
136071
|
}
|
|
135319
136072
|
case "generic": {
|
|
135320
136073
|
const memberId = environment.get(type.genericParamId);
|
|
135321
|
-
|
|
135322
|
-
if (member === void 0) {
|
|
136074
|
+
if (memberId === void 0) {
|
|
135323
136075
|
throw new Error(
|
|
135324
136076
|
`Stored Generic constructor argument has no concrete binding for ${type.genericParamId}.`
|
|
135325
136077
|
);
|
|
135326
136078
|
}
|
|
135327
|
-
return
|
|
136079
|
+
return storedSchemaTypeName(
|
|
136080
|
+
context,
|
|
136081
|
+
schemaTypeForBindingMember(context, memberId, environment),
|
|
136082
|
+
environment
|
|
136083
|
+
);
|
|
135328
136084
|
}
|
|
135329
136085
|
case "list":
|
|
135330
136086
|
return `List<${storedTypeArgumentName(context, type.entryType, environment)}>`;
|
|
@@ -135359,7 +136115,12 @@ function storedSchemaTypeName(context, type, environment, valueId) {
|
|
|
135359
136115
|
case "dialogueLookup":
|
|
135360
136116
|
return "NeoDialogueReference";
|
|
135361
136117
|
case "delegate":
|
|
135362
|
-
return
|
|
136118
|
+
return `NeoDelegate<${[
|
|
136119
|
+
type.returnType.kind === "void" ? "void" : storedTypeArgumentName(context, type.returnType, environment),
|
|
136120
|
+
...type.argumentTypes.map(
|
|
136121
|
+
(argument2) => storedTypeArgumentName(context, argument2, environment)
|
|
136122
|
+
)
|
|
136123
|
+
].join(", ")}>`;
|
|
135363
136124
|
case "action":
|
|
135364
136125
|
return "object";
|
|
135365
136126
|
case "null":
|
|
@@ -135562,51 +136323,19 @@ function classValueTypeName(context, classId, member, environment) {
|
|
|
135562
136323
|
if (inferredClassId !== null) {
|
|
135563
136324
|
return context.manifestClasses.get(inferredClassId)?.name ?? stringField2(context.classes.get(inferredClassId) ?? {}, "name");
|
|
135564
136325
|
}
|
|
135565
|
-
|
|
135566
|
-
if (bindingMember === void 0) {
|
|
136326
|
+
if (bindingMemberId === void 0) {
|
|
135567
136327
|
throw new Error(
|
|
135568
136328
|
`Stored Class member ${String(member.name ?? member.id)} has no concrete ${parameter4.name} binding.`
|
|
135569
136329
|
);
|
|
135570
136330
|
}
|
|
135571
|
-
return
|
|
136331
|
+
return storedTypeArgumentName(
|
|
136332
|
+
context,
|
|
136333
|
+
schemaTypeForBindingMember(context, bindingMemberId, environment),
|
|
136334
|
+
environment
|
|
136335
|
+
);
|
|
135572
136336
|
});
|
|
135573
136337
|
return `${name}<${argumentsValue.join(", ")}>`;
|
|
135574
136338
|
}
|
|
135575
|
-
function typeArgumentName(context, member) {
|
|
135576
|
-
return `${manifestMemberTypeName(context, member)}${member.required ? "" : "?"}`;
|
|
135577
|
-
}
|
|
135578
|
-
function manifestMemberTypeName(context, member) {
|
|
135579
|
-
if (member.kind === "class") {
|
|
135580
|
-
const schemaClass2 = context.manifestClasses.get(member.classId);
|
|
135581
|
-
if (schemaClass2 === void 0) {
|
|
135582
|
-
throw new Error(`Stored Class type ${member.classId} was not pulled.`);
|
|
135583
|
-
}
|
|
135584
|
-
if (schemaClass2.genericParameters.length === 0) return schemaClass2.name;
|
|
135585
|
-
const argumentsValue = schemaClass2.genericParameters.map((parameter4) => {
|
|
135586
|
-
const binding = member.classArguments[parameter4.id];
|
|
135587
|
-
if (binding?.kind !== "member") {
|
|
135588
|
-
throw new Error(
|
|
135589
|
-
`Stored Class member ${member.name} has no concrete ${parameter4.name} binding.`
|
|
135590
|
-
);
|
|
135591
|
-
}
|
|
135592
|
-
const argument2 = context.manifestMembers.get(binding.memberId);
|
|
135593
|
-
if (argument2 === void 0) {
|
|
135594
|
-
throw new Error(
|
|
135595
|
-
`Stored generic binding ${binding.memberId} was not pulled.`
|
|
135596
|
-
);
|
|
135597
|
-
}
|
|
135598
|
-
return typeArgumentName(context, argument2);
|
|
135599
|
-
});
|
|
135600
|
-
return `${schemaClass2.name}<${argumentsValue.join(", ")}>`;
|
|
135601
|
-
}
|
|
135602
|
-
if (member.kind === "generic") {
|
|
135603
|
-
throw new Error(`Stored Generic member ${member.name} is not closed.`);
|
|
135604
|
-
}
|
|
135605
|
-
if (member.kind === "scriptFunction" || member.kind === "function") {
|
|
135606
|
-
return "FunctionRef";
|
|
135607
|
-
}
|
|
135608
|
-
return fixedSourceTypeNameForKind(member.kind) ?? member.kind;
|
|
135609
|
-
}
|
|
135610
136339
|
function constructorProjectionSource(context, classId, body, visited, environment) {
|
|
135611
136340
|
const projections2 = effectiveConstructorProjections(
|
|
135612
136341
|
context.manifestClasses,
|
|
@@ -136086,27 +136815,38 @@ function functionReferenceValue(context, body) {
|
|
|
136086
136815
|
return target.name;
|
|
136087
136816
|
}
|
|
136088
136817
|
function delegateValue(context, body) {
|
|
136089
|
-
|
|
136090
|
-
|
|
136091
|
-
|
|
136092
|
-
|
|
136093
|
-
|
|
136094
|
-
|
|
136095
|
-
|
|
136096
|
-
|
|
136097
|
-
|
|
136098
|
-
|
|
136099
|
-
|
|
136100
|
-
|
|
136101
|
-
|
|
136102
|
-
|
|
136103
|
-
|
|
136104
|
-
|
|
136105
|
-
|
|
136106
|
-
|
|
136107
|
-
|
|
136108
|
-
|
|
136109
|
-
|
|
136818
|
+
return delegateValueSource(body, (memberId) => {
|
|
136819
|
+
const target = context.members.get(memberId);
|
|
136820
|
+
if (target === void 0) {
|
|
136821
|
+
throw new Error(`NSDelegate target ${memberId} was not pulled.`);
|
|
136822
|
+
}
|
|
136823
|
+
if (typeof target.name !== "string") {
|
|
136824
|
+
throw new Error(`NSDelegate target ${memberId} has no name.`);
|
|
136825
|
+
}
|
|
136826
|
+
const kind = numberField(target, "kind");
|
|
136827
|
+
if (kind !== 10 && kind !== 23 && kind !== 25) {
|
|
136828
|
+
throw new Error(`NSDelegate target ${memberId} is not callable.`);
|
|
136829
|
+
}
|
|
136830
|
+
if (target.modifier !== 3 /* Static */) {
|
|
136831
|
+
return { name: target.name, staticClassName: null };
|
|
136832
|
+
}
|
|
136833
|
+
const classId = context.ownerClassIds.get(memberId);
|
|
136834
|
+
if (classId === void 0) {
|
|
136835
|
+
throw new Error(`Static NSDelegate target ${memberId} has no Class.`);
|
|
136836
|
+
}
|
|
136837
|
+
const owner = context.classes.get(classId);
|
|
136838
|
+
if (owner === void 0) {
|
|
136839
|
+
throw new Error(
|
|
136840
|
+
`Static NSDelegate target ${memberId} Class ${classId} was not pulled.`
|
|
136841
|
+
);
|
|
136842
|
+
}
|
|
136843
|
+
if (typeof owner.name !== "string") {
|
|
136844
|
+
throw new Error(
|
|
136845
|
+
`Static NSDelegate target ${memberId} Class ${classId} has no name.`
|
|
136846
|
+
);
|
|
136847
|
+
}
|
|
136848
|
+
return { name: target.name, staticClassName: owner.name };
|
|
136849
|
+
});
|
|
136110
136850
|
}
|
|
136111
136851
|
function actionValue(context, body) {
|
|
136112
136852
|
if (!isObjectRecord2(body)) {
|
|
@@ -136230,19 +136970,26 @@ function localizedString(context, member, body) {
|
|
|
136230
136970
|
return isObjectRecord2(main2) && typeof main2.value === "string" ? main2.value : "";
|
|
136231
136971
|
}
|
|
136232
136972
|
function staticSymbols(classes, members) {
|
|
136233
|
-
const
|
|
136973
|
+
const symbolsByValueId = /* @__PURE__ */ new Map();
|
|
136974
|
+
const staticOwnerIds = /* @__PURE__ */ new Map();
|
|
136234
136975
|
for (const schemaClass2 of classes.values()) {
|
|
136235
136976
|
if (typeof schemaClass2.name !== "string" || !isObjectRecord2(schemaClass2.schema))
|
|
136236
136977
|
continue;
|
|
136237
136978
|
for (const memberId of Object.values(schemaClass2.schema)) {
|
|
136238
136979
|
if (typeof memberId !== "string") continue;
|
|
136239
136980
|
const member = members.get(memberId);
|
|
136240
|
-
if (member?.modifier === 3 && typeof member.name === "string" && typeof member.valueId === "string"
|
|
136241
|
-
|
|
136981
|
+
if (member?.modifier === 3 && typeof member.name === "string" && typeof member.valueId === "string" && // A static naming another static shares its row. The member the row
|
|
136982
|
+
// derives from owns it; otherwise the first keeps it.
|
|
136983
|
+
(!staticOwnerIds.has(member.valueId) || member.valueId === memberValueId(memberId))) {
|
|
136984
|
+
symbolsByValueId.set(
|
|
136985
|
+
member.valueId,
|
|
136986
|
+
`${schemaClass2.name}.${member.name}`
|
|
136987
|
+
);
|
|
136988
|
+
staticOwnerIds.set(member.valueId, memberId);
|
|
136242
136989
|
}
|
|
136243
136990
|
}
|
|
136244
136991
|
}
|
|
136245
|
-
return
|
|
136992
|
+
return { symbolsByValueId, staticOwnerIds };
|
|
136246
136993
|
}
|
|
136247
136994
|
function projectFileSymbols(records3) {
|
|
136248
136995
|
const files = [...records3.values()].flatMap((record7) => {
|
|
@@ -136378,7 +137125,7 @@ function memberDefaultBody(member) {
|
|
|
136378
137125
|
if (!("value" in defaultValue)) return null;
|
|
136379
137126
|
return defaultValue.value;
|
|
136380
137127
|
}
|
|
136381
|
-
var INFERRED_GENERIC_CLASS_PREFIX, MEMBER_KIND_DICTIONARY2, MEMBER_KIND_LIST2, MEMBER_KIND_CLASS2, LEADING_AUTHORED_ROW_ID, INITIALIZER_KEY_PLACEHOLDER, MissingStoredMemberError, CANONICAL_CONSTRUCTOR_INLINE_WIDTH;
|
|
137128
|
+
var INFERRED_GENERIC_CLASS_PREFIX, MEMBER_KIND_DICTIONARY2, MEMBER_KIND_LIST2, MEMBER_KIND_CLASS2, LEADING_AUTHORED_ROW_ID, genericParameterNamesByClasses, INITIALIZER_KEY_PLACEHOLDER, MissingStoredMemberError, CANONICAL_CONSTRUCTOR_INLINE_WIDTH;
|
|
136382
137129
|
var init_value_sources = __esm({
|
|
136383
137130
|
"src/project-source/value-sources.ts"() {
|
|
136384
137131
|
"use strict";
|
|
@@ -136435,11 +137182,13 @@ var init_value_sources = __esm({
|
|
|
136435
137182
|
init_stored_value_placements();
|
|
136436
137183
|
init_structured_leaf_source();
|
|
136437
137184
|
init_variant_selection_source();
|
|
137185
|
+
init_delegate_value_source();
|
|
136438
137186
|
INFERRED_GENERIC_CLASS_PREFIX = "__inferred_class__:";
|
|
136439
137187
|
MEMBER_KIND_DICTIONARY2 = 5;
|
|
136440
137188
|
MEMBER_KIND_LIST2 = 6;
|
|
136441
137189
|
MEMBER_KIND_CLASS2 = 7;
|
|
136442
137190
|
LEADING_AUTHORED_ROW_ID = /^@id\(\s*"((?:[^"\\]|\\.)*)"\s*\)/;
|
|
137191
|
+
genericParameterNamesByClasses = /* @__PURE__ */ new WeakMap();
|
|
136443
137192
|
INITIALIZER_KEY_PLACEHOLDER = new RegExp(
|
|
136444
137193
|
`${PENDING_ID_PREFIX}reference-key:init:\\d+`,
|
|
136445
137194
|
"g"
|
|
@@ -196295,7 +197044,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
|
|
|
196295
197044
|
async function main() {
|
|
196296
197045
|
const args = parseArgs(process.argv.slice(2));
|
|
196297
197046
|
if (args.command === "--version") {
|
|
196298
|
-
console.log("0.77.
|
|
197047
|
+
console.log("0.77.1");
|
|
196299
197048
|
return;
|
|
196300
197049
|
}
|
|
196301
197050
|
if (args.command === null || args.command === "help" || args.command === "--help" || args.command === "-h") {
|