647
nodePath: id,
648
});
649
} else {
650
- lowerValueToTemporary(builder, {
651
- kind: "DeclareLocal",
652
- lvalue: {
653
- kind,
654
- place: {
655
- effect: Effect.Unknown,
656
- identifier,
657
- kind: "Identifier",
658
- loc: id.node.loc ?? GeneratedSource,
659
- },
660
- },
650
+ const place: Place = {
651
+ effect: Effect.Unknown,
652
+ identifier,
653
+ kind: "Identifier",
654
loc: id.node.loc ?? GeneratedSource,
662
- });
655
+ };
656
+ if (builder.isContextIdentifier(id)) {
657
+ if (kind === InstructionKind.Const) {
658
+ builder.errors.push({
659
+ reason: `(BuildHIR::lowerAssignment) Invalid declaration kind (const) for variable later reassigned.`,
660
+ severity: ErrorSeverity.InvalidInput,
661
+ nodePath: id,
662
+ });
663
+ }
664
+ lowerValueToTemporary(builder, {
665
+ kind: "DeclareContext",
666
+ lvalue: {
667
+ kind: InstructionKind.Let,
668
+ place,
669
+ },
670
+ loc: id.node.loc ?? GeneratedSource,
671
+ });
672
+ } else {
673
+ lowerValueToTemporary(builder, {
674
+ kind: "DeclareLocal",
675
+ lvalue: {
676
+ kind,
677
+ place,
678
+ },
679
+ loc: id.node.loc ?? GeneratedSource,
680
+ });
681
+ }
682
}
683
} else {
684
builder.errors.push({
2480
effect: Effect.Unknown,
2481
loc: lvalue.node.loc ?? GeneratedSource,
2482
};
2464
- const temporary = lowerValueToTemporary(builder, {
2465
- kind: getStoreKind(builder, lvalue),
2466
- lvalue: { place: { ...place }, kind },
2467
- value,
2468
- loc,
2469
- });
2483
+
2484
+ let temporary;
2485
+ if (builder.isContextIdentifier(lvalue)) {
2486
+ if (kind !== InstructionKind.Reassign) {
2487
+ if (kind === InstructionKind.Const) {
2488
+ builder.errors.push({
2489
+ reason: `(BuildHIR::lowerAssignment) Invalid declaration kind (const) for variable later reassigned.`,
2490
+ severity: ErrorSeverity.InvalidInput,
2491
+ nodePath: lvalue,
2492
+ });
2493
+ }
2494
+ lowerValueToTemporary(builder, {
2495
+ kind: "DeclareContext",
2496
+ lvalue: {
2497
+ kind: InstructionKind.Let,
2498
+ place: { ...place },
2499
+ },
2500
+ loc: place.loc,
2501
+ });
2502
+ }
2503
+
2504
+ temporary = lowerValueToTemporary(builder, {
2505
+ kind: "StoreContext",
2506
+ lvalue: { place: { ...place }, kind: InstructionKind.Reassign },
2507
+ value,
2508
+ loc,
2509
+ });
2510
+ } else {
2511
+ temporary = lowerValueToTemporary(builder, {
2512
+ kind: "StoreLocal",
2513
+ lvalue: { place: { ...place }, kind },
2514
+ value,
2515
+ loc,
2516
+ });
2517
+ }
2518
return { kind: "LoadLocal", place: temporary, loc: temporary.loc };
2519
}
2520
case "MemberExpression": {