Files
scriptc/tests/corpus/nullish-assignment-values.ts
Chris Tate 08115a1d3d Support native startup caches and assignment expressions
- Share symbol-keyed global caches across statically compiled modules.
- Preserve assignment results and evaluation order for native fields, accessors, and nullish defaults.
- Read omitted options correctly in specialized JavaScript package calls.
2026-09-28 11:05:00 -05:00

40 lines
1.7 KiB
TypeScript

let calls = 0;
function supply(): number { calls++; return 7; }
let empty: number | undefined;
let zero: number | undefined = 0;
console.log(empty ??= supply(), zero ??= supply(), calls);
const values: (number | undefined)[] = [undefined, 0];
let indexes = 0;
function index(): number { indexes++; return 0; }
console.log(values[index()] ??= supply(), values[index()] ??= supply(), indexes, calls);
console.log(values[4] ??= supply(), values.length, calls);
let trace = "";
class Slot {
stored: number | null = null;
get value(): number | null { trace += "get;"; return this.stored; }
set value(value: number | null) { trace += "set;"; this.stored = value; }
}
let slot = new Slot();
const original = slot;
function receiver(): Slot { trace += "receiver;"; return slot; }
function replace(): number { trace += "rhs;"; slot = new Slot(); return 9; }
console.log(receiver().value ??= replace(), original.stored, slot.stored, trace);
trace = "";
console.log(original.value ??= replace(), trace);
const record: { value?: number } = {};
console.log(record.value ??= 4, record.value ??= 5);
let recordGets = 0;
let recordSets = 0;
let saved: string | undefined;
const accessor = {
get value(): string | undefined { recordGets++; return saved; },
set value(value: string | undefined) { recordSets++; saved = value; },
};
console.log(accessor.value ??= "kept", accessor.value ??= "unused", recordGets, recordSets);
let absent: undefined;
let nil: null = null;
function supplyUndefined(): undefined { trace += "undefined;"; return undefined; }
function supplyNull(): null { trace += "null;"; return null; }
trace = "";
console.log(absent ??= supplyUndefined(), nil ??= supplyNull(), trace);