@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/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__ */ ((MemberKind12) => {
126
- MemberKind12[MemberKind12["Null"] = 0] = "Null";
127
- MemberKind12[MemberKind12["Bool"] = 1] = "Bool";
128
- MemberKind12[MemberKind12["Int"] = 2] = "Int";
129
- MemberKind12[MemberKind12["String"] = 3] = "String";
130
- MemberKind12[MemberKind12["Float"] = 4] = "Float";
131
- MemberKind12[MemberKind12["Dictionary"] = 5] = "Dictionary";
132
- MemberKind12[MemberKind12["List"] = 6] = "List";
133
- MemberKind12[MemberKind12["Class"] = 7] = "Class";
134
- MemberKind12[MemberKind12["Enum"] = 8] = "Enum";
135
- MemberKind12[MemberKind12["Lookup"] = 9] = "Lookup";
136
- MemberKind12[MemberKind12["NSProperty"] = 10] = "NSProperty";
137
- MemberKind12[MemberKind12["Sprite"] = 11] = "Sprite";
138
- MemberKind12[MemberKind12["Audio"] = 12] = "Audio";
139
- MemberKind12[MemberKind12["Function"] = 13] = "Function";
140
- MemberKind12[MemberKind12["Vector2"] = 14] = "Vector2";
141
- MemberKind12[MemberKind12["Vector2Int"] = 15] = "Vector2Int";
142
- MemberKind12[MemberKind12["Vector3"] = 16] = "Vector3";
143
- MemberKind12[MemberKind12["Vector3Int"] = 17] = "Vector3Int";
144
- MemberKind12[MemberKind12["DialogueLookup"] = 18] = "DialogueLookup";
145
- MemberKind12[MemberKind12["Color"] = 19] = "Color";
146
- MemberKind12[MemberKind12["Decimal"] = 20] = "Decimal";
147
- MemberKind12[MemberKind12["Generic"] = 21] = "Generic";
148
- MemberKind12[MemberKind12["Interface"] = 22] = "Interface";
149
- MemberKind12[MemberKind12["NSFunction"] = 23] = "NSFunction";
150
- MemberKind12[MemberKind12["FunctionRef"] = 24] = "FunctionRef";
151
- MemberKind12[MemberKind12["NSDelegate"] = 25] = "NSDelegate";
152
- MemberKind12[MemberKind12["NSAction"] = 26] = "NSAction";
153
- MemberKind12[MemberKind12["Variant"] = 27] = "Variant";
154
- return MemberKind12;
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 "${parameterId}" has no matching type descriptor in the document.`
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
- signature.parameters,
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
- open ? `Cannot construct open generic Class '${className}'; construct a closed named descendant.` : `Class '${className}' does not expose a generated public constructor.`,
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 = signature.parameters.map((parameter4) => ({
37377
- ...parameter4,
37378
- valueType: substituteTypeParameters(
37379
- parameter4.valueType,
37380
- targetType,
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
- return {
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
- listenerResolvers: /* @__PURE__ */ new Map(),
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 declaring = environment.projectIndex.typeByName.get(
46539
- scope.get("this")?.name ?? ""
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 memberWritability(annotations) {
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
- const allowed = (namedAllowed ?? positionalAllowed)?.text;
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
- for (const argument2 of type.typeArguments) {
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.0",
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)) return [];
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.map((argument2) => {
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.map((argument2) => {
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
- if (ownerClass === null) return null;
66430
- const declaration = ownerClass.genericParams?.find(
66431
- (parameter4) => parameter4.id === resolved.genericParamId
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 resolved = substituteMember(
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
- resolveAnalyzerMember(context, record7)
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
- createContext(
69969
- {
69970
- ...compilerContext,
69971
- thisClass: lexicalThisClass ?? null,
69972
- implicitMemberAccess: lexicalThisClass !== null,
69973
- staticMember: false
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
- args.thisClass,
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 (!isMemberDelegateBase(args.member)) return;
70533
- const defaultValue = args.member.defaultValue;
70534
- if (defaultValue === void 0 || !isLiteralValueContent(defaultValue) || !isNSDelegateClosureValueDraft(defaultValue.value)) {
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
- returnTypeInfo: args.member.returnTypeInfo,
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 returnTypeInfo = resolveMemberDeclaredTypeInfo(member, args.members);
70662
- if (returnTypeInfo === null) {
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 returnTypeInfo = getField(member, "returnTypeInfo");
70781
- const argumentTypes = getField(member, "argumentTypes");
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
- returnTypeInfo,
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: "ok", value: value.value };
79353
- return { kind: "no-info", matchedMember: true };
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 ?? info.schemaClassInfo.typeArguments ?? null)}`;
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.value = value;
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.value = null;
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 = registerRow([]);
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 = registerRow({});
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
- protectedValueIds.add(edge.targetValueId);
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 evaluateMemberInitializer(args) {
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
- const compiled = ensureInitializerCompiled({
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
- return expression.args.some(
93308
- (argument2) => expressionReadsRuntimeIdentifier(argument2, runtimeIdentifiers)
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
- if (isStoredDelegateLiteral(expected, expression)) return false;
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
- let classId;
96483
- let memberName;
96484
- let requiresStatic = false;
96485
- if (parts.length === 1 || parts.length === 2 && parts[0] === "this") {
96486
- classId = materializedId(ownerClass, "class", ownerClass.name);
96487
- memberName = parts.at(-1);
96488
- } else if (parts.length === 2) {
96489
- classId = context.classIdsByName.get(parts[0]);
96490
- memberName = parts[1];
96491
- requiresStatic = true;
96492
- } else {
96493
- const receiverPath = parts.slice(0, -1).join(".");
96494
- classId = context.rootValueTargetsByPath.get(receiverPath)?.classId;
96495
- memberName = parts.at(-1);
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?.kind === "function") return false;
97029
+ if (source !== void 0) return source.modifiers.includes("static");
96502
97030
  const schema = context.loweredMembers.get(memberId) ?? context.baseMembers.get(memberId);
96503
- const isStatic = source?.modifiers.includes("static") ?? schema?.modifier === "static";
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" ? genericParameterName(context, binding.genericParamId) : "object",
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: genericParameterName(context, member.genericParamId),
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: genericParameterName(context, type.genericParamId),
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 genericParameterName(context, genericParamId) {
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: new Map(manifest.classes.map((entry) => [entry.id, entry])),
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
- throw new Error(
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
- if (isMemberDelegateBase(member) && isLiteralValueContent(member.defaultValue) && (isNSDelegateClosureValueDraft(member.defaultValue.value) || isNSDelegateClosureValue(member.defaultValue.value)))
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(member.defaultValue);
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 isOpaqueNSFunctionArgumentTypeInfo(value) {
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(isOpaqueNSFunctionArgumentTypeInfo)) {
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(isOpaqueConstructorArgumentTypeInfo)) {
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(isOpaqueNSFunctionArgumentTypeInfo)) {
122266
- throw new Error(`NSFunction "${member.id}" argumentTypes are invalid.`);
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
- definitionSite: true,
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
- if (!isObjectRecord2(argument2)) continue;
128437
- if (typeof argument2.code !== "string") continue;
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 referenced = sourceValueSymbol(context, expression);
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(resolvedMember.kind, expression) && memberInitializerRequiresEvaluation(
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(resolvedMember.kind, expression) && memberInitializerRequiresEvaluation(
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 expectedName = inferredClassId ? context.classes.get(inferredClassId)?.name ?? null : bindingMember ? lowerSchemaMemberTypeName(context, bindingMember) : bindingMemberId ? lowerRawMemberTypeName(context, bindingMemberId) : null;
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
- if (member.kind === "class") {
132233
- return context.classes.get(member.classId)?.name ?? null;
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.kind === "lambda" || memberPath2(expression) !== null;
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, expression, ownerClassId, authoredSlice) {
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 path = memberPath2(expression);
133802
- const symbol = path?.startsWith("this.") ? path.slice("this.".length) : path;
133803
- if (symbol === null || symbol === void 0 || symbol.includes(".")) {
133804
- throw new Error(
133805
- "Delegate method groups require a function, NSFunction, or NSDelegate member on the current Class."
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
- if (ownerClassId === void 0) {
133809
- throw new Error(
133810
- `Delegate ${symbol} cannot be resolved without its owning Class.`
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 target = classMemberByName(context, ownerClassId, symbol);
133814
- if (target.kind !== "function" && target.kind !== "scriptFunction" && target.kind !== "delegate") {
133815
- throw new Error(
133816
- `Delegate ${symbol} does not resolve to a function, NSFunction, or NSDelegate member.`
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
- return { memberId: target.id, valueId: null };
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
- const member = memberId === void 0 ? void 0 : context.manifestMembers.get(memberId);
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 manifestMemberTypeName(context, member);
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 "object";
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
- const bindingMember = bindingMemberId ? context.manifestMembers.get(bindingMemberId) : void 0;
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 typeArgumentName(context, bindingMember);
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
- if (!isObjectRecord2(body)) {
136090
- throw new Error("NSDelegate value is not a closure or bound target.");
136091
- }
136092
- if (typeof body.code === "string") return body.code;
136093
- if (typeof body.memberId !== "string") {
136094
- throw new Error("NSDelegate bound target is missing memberId.");
136095
- }
136096
- if (body.valueId !== null && body.valueId !== void 0) {
136097
- throw new Error(
136098
- "NSDelegate instance-bound target cannot be represented by current project source."
136099
- );
136100
- }
136101
- const target = context.members.get(body.memberId);
136102
- if (target === void 0 || typeof target.name !== "string") {
136103
- throw new Error(`NSDelegate target ${body.memberId} was not pulled.`);
136104
- }
136105
- const kind = numberField(target, "kind");
136106
- if (kind !== 10 && kind !== 23 && kind !== 25) {
136107
- throw new Error(`NSDelegate target ${body.memberId} is not callable.`);
136108
- }
136109
- return target.name;
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 result = /* @__PURE__ */ new Map();
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
- result.set(member.valueId, `${schemaClass2.name}.${member.name}`);
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 result;
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.0");
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") {