CFA branches=50

Control-flow graph construction and narrowing analysis.

tsz is 2.9x faster 313 lines 9 KB

Timing

tsz
172.26ms
tsgo
505.94ms

Files

// Control flow analysis stress test
// Tests type narrowing with many branches

type Status = 'pending' | 'active' | 'completed' | 'failed' | 'cancelled';

interface BaseEntity {
    id: string;
    status: Status;
}

type Entity =
    | { kind: 'type0'; data0: string; common: number }
    | { kind: 'type1'; data1: string; common: number }
    | { kind: 'type2'; data2: string; common: number }
    | { kind: 'type3'; data3: string; common: number }
    | { kind: 'type4'; data4: string; common: number }
    | { kind: 'type5'; data5: string; common: number }
    | { kind: 'type6'; data6: string; common: number }
    | { kind: 'type7'; data7: string; common: number }
    | { kind: 'type8'; data8: string; common: number }
    | { kind: 'type9'; data9: string; common: number }
    | { kind: 'type10'; data10: string; common: number }
    | { kind: 'type11'; data11: string; common: number }
    | { kind: 'type12'; data12: string; common: number }
    | { kind: 'type13'; data13: string; common: number }
    | { kind: 'type14'; data14: string; common: number }
    | { kind: 'type15'; data15: string; common: number }
    | { kind: 'type16'; data16: string; common: number }
    | { kind: 'type17'; data17: string; common: number }
    | { kind: 'type18'; data18: string; common: number }
    | { kind: 'type19'; data19: string; common: number }
    | { kind: 'type20'; data20: string; common: number }
    | { kind: 'type21'; data21: string; common: number }
    | { kind: 'type22'; data22: string; common: number }
    | { kind: 'type23'; data23: string; common: number }
    | { kind: 'type24'; data24: string; common: number }
    | { kind: 'type25'; data25: string; common: number }
    | { kind: 'type26'; data26: string; common: number }
    | { kind: 'type27'; data27: string; common: number }
    | { kind: 'type28'; data28: string; common: number }
    | { kind: 'type29'; data29: string; common: number }
    | { kind: 'type30'; data30: string; common: number }
    | { kind: 'type31'; data31: string; common: number }
    | { kind: 'type32'; data32: string; common: number }
    | { kind: 'type33'; data33: string; common: number }
    | { kind: 'type34'; data34: string; common: number }
    | { kind: 'type35'; data35: string; common: number }
    | { kind: 'type36'; data36: string; common: number }
    | { kind: 'type37'; data37: string; common: number }
    | { kind: 'type38'; data38: string; common: number }
    | { kind: 'type39'; data39: string; common: number }
    | { kind: 'type40'; data40: string; common: number }
    | { kind: 'type41'; data41: string; common: number }
    | { kind: 'type42'; data42: string; common: number }
    | { kind: 'type43'; data43: string; common: number }
    | { kind: 'type44'; data44: string; common: number }
    | { kind: 'type45'; data45: string; common: number }
    | { kind: 'type46'; data46: string; common: number }
    | { kind: 'type47'; data47: string; common: number }
    | { kind: 'type48'; data48: string; common: number }
    | { kind: 'type49'; data49: string; common: number };

function processEntity(e: Entity): string {
    switch (e.kind) {
        case 'type0': return e.data0;
        case 'type1': return e.data1;
        case 'type2': return e.data2;
        case 'type3': return e.data3;
        case 'type4': return e.data4;
        case 'type5': return e.data5;
        case 'type6': return e.data6;
        case 'type7': return e.data7;
        case 'type8': return e.data8;
        case 'type9': return e.data9;
        case 'type10': return e.data10;
        case 'type11': return e.data11;
        case 'type12': return e.data12;
        case 'type13': return e.data13;
        case 'type14': return e.data14;
        case 'type15': return e.data15;
        case 'type16': return e.data16;
        case 'type17': return e.data17;
        case 'type18': return e.data18;
        case 'type19': return e.data19;
        case 'type20': return e.data20;
        case 'type21': return e.data21;
        case 'type22': return e.data22;
        case 'type23': return e.data23;
        case 'type24': return e.data24;
        case 'type25': return e.data25;
        case 'type26': return e.data26;
        case 'type27': return e.data27;
        case 'type28': return e.data28;
        case 'type29': return e.data29;
        case 'type30': return e.data30;
        case 'type31': return e.data31;
        case 'type32': return e.data32;
        case 'type33': return e.data33;
        case 'type34': return e.data34;
        case 'type35': return e.data35;
        case 'type36': return e.data36;
        case 'type37': return e.data37;
        case 'type38': return e.data38;
        case 'type39': return e.data39;
        case 'type40': return e.data40;
        case 'type41': return e.data41;
        case 'type42': return e.data42;
        case 'type43': return e.data43;
        case 'type44': return e.data44;
        case 'type45': return e.data45;
        case 'type46': return e.data46;
        case 'type47': return e.data47;
        case 'type48': return e.data48;
        case 'type49': return e.data49;
        default:
            throw new Error('unreachable');
    }
}

function processWithIf(e: Entity): string {
    if (e.kind === 'type0') {
        return e.data0;
    }
    if (e.kind === 'type1') {
        return e.data1;
    }
    if (e.kind === 'type2') {
        return e.data2;
    }
    if (e.kind === 'type3') {
        return e.data3;
    }
    if (e.kind === 'type4') {
        return e.data4;
    }
    if (e.kind === 'type5') {
        return e.data5;
    }
    if (e.kind === 'type6') {
        return e.data6;
    }
    if (e.kind === 'type7') {
        return e.data7;
    }
    if (e.kind === 'type8') {
        return e.data8;
    }
    if (e.kind === 'type9') {
        return e.data9;
    }
    if (e.kind === 'type10') {
        return e.data10;
    }
    if (e.kind === 'type11') {
        return e.data11;
    }
    if (e.kind === 'type12') {
        return e.data12;
    }
    if (e.kind === 'type13') {
        return e.data13;
    }
    if (e.kind === 'type14') {
        return e.data14;
    }
    if (e.kind === 'type15') {
        return e.data15;
    }
    if (e.kind === 'type16') {
        return e.data16;
    }
    if (e.kind === 'type17') {
        return e.data17;
    }
    if (e.kind === 'type18') {
        return e.data18;
    }
    if (e.kind === 'type19') {
        return e.data19;
    }
    if (e.kind === 'type20') {
        return e.data20;
    }
    if (e.kind === 'type21') {
        return e.data21;
    }
    if (e.kind === 'type22') {
        return e.data22;
    }
    if (e.kind === 'type23') {
        return e.data23;
    }
    if (e.kind === 'type24') {
        return e.data24;
    }
    if (e.kind === 'type25') {
        return e.data25;
    }
    if (e.kind === 'type26') {
        return e.data26;
    }
    if (e.kind === 'type27') {
        return e.data27;
    }
    if (e.kind === 'type28') {
        return e.data28;
    }
    if (e.kind === 'type29') {
        return e.data29;
    }
    if (e.kind === 'type30') {
        return e.data30;
    }
    if (e.kind === 'type31') {
        return e.data31;
    }
    if (e.kind === 'type32') {
        return e.data32;
    }
    if (e.kind === 'type33') {
        return e.data33;
    }
    if (e.kind === 'type34') {
        return e.data34;
    }
    if (e.kind === 'type35') {
        return e.data35;
    }
    if (e.kind === 'type36') {
        return e.data36;
    }
    if (e.kind === 'type37') {
        return e.data37;
    }
    if (e.kind === 'type38') {
        return e.data38;
    }
    if (e.kind === 'type39') {
        return e.data39;
    }
    if (e.kind === 'type40') {
        return e.data40;
    }
    if (e.kind === 'type41') {
        return e.data41;
    }
    if (e.kind === 'type42') {
        return e.data42;
    }
    if (e.kind === 'type43') {
        return e.data43;
    }
    if (e.kind === 'type44') {
        return e.data44;
    }
    if (e.kind === 'type45') {
        return e.data45;
    }
    if (e.kind === 'type46') {
        return e.data46;
    }
    if (e.kind === 'type47') {
        return e.data47;
    }
    if (e.kind === 'type48') {
        return e.data48;
    }
    if (e.kind === 'type49') {
        return e.data49;
    }
    return processEntity(e);
}

function isType0(e: Entity): e is Extract<Entity, { kind: 'type0' }> {
    return e.kind === 'type0';
}

function isType5(e: Entity): e is Extract<Entity, { kind: 'type5' }> {
    return e.kind === 'type5';
}

function isType10(e: Entity): e is Extract<Entity, { kind: 'type10' }> {
    return e.kind === 'type10';
}

function isType15(e: Entity): e is Extract<Entity, { kind: 'type15' }> {
    return e.kind === 'type15';
}

function isType20(e: Entity): e is Extract<Entity, { kind: 'type20' }> {
    return e.kind === 'type20';
}

function isType25(e: Entity): e is Extract<Entity, { kind: 'type25' }> {
    return e.kind === 'type25';
}

function isType30(e: Entity): e is Extract<Entity, { kind: 'type30' }> {
    return e.kind === 'type30';
}

function isType35(e: Entity): e is Extract<Entity, { kind: 'type35' }> {
    return e.kind === 'type35';
}

function isType40(e: Entity): e is Extract<Entity, { kind: 'type40' }> {
    return e.kind === 'type40';
}

function isType45(e: Entity): e is Extract<Entity, { kind: 'type45' }> {
    return e.kind === 'type45';
}