/// <reference path="fourslash.ts" />

////// valid
////    (         )           =>    1  ;/*1*/
////    (        arg )           =>    2  ;/*2*/
////        arg       =>    2  ;/*3*/
////      (        arg     = 1 )           =>    3  ;/*4*/
////    (        arg    ?        )           =>    4  ;/*5*/
////    (        arg    :    number )           =>    5  ;/*6*/
////      (        arg    :    number     = 0 )           =>    6  ;/*7*/
////    (        arg        ?                  :    number )           =>    7  ;/*8*/
////    (                 ...     arg    :    number   [      ]    )           =>    8  ;/*9*/
////      (        arg1   ,    arg2 )           =>    12  ;/*10*/
////    (        arg1     = 1   ,    arg2     =3 )           =>    13  ;/*11*/
////      (        arg1    ?          ,    arg2    ?        )           =>    14  ;/*12*/
////    (        arg1    :    number   ,    arg2    :    number )           =>    15  ;/*13*/
////    (        arg1    :    number     = 0   ,    arg2    :    number     = 1 )           =>    16  ;/*14*/
////      (        arg1    ?           :    number   ,    arg2    ?           :    number )           =>    17  ;/*15*/
////    (        arg1   ,             ...     arg2    :    number   [      ]    )           =>    18  ;/*16*/
////      (        arg1   ,    arg2    ?           :    number )           =>    19  ;/*17*/
////
////// in paren
////    (            (         )           =>    21 )      ;/*18*/
////    (            (        arg )           =>    22 )      ;/*19*/
////    (            (        arg     = 1 )           =>    23 )      ;/*20*/
////    (            (        arg    ?        )           =>    24 )      ;/*21*/
////    (            (        arg    :    number )           =>    25 )      ;/*22*/
////    (            (        arg    :    number     = 0 )           =>    26 )      ;/*23*/
////    (            (        arg    ?           :    number )           =>    27 )      ;/*24*/
////    (            (                 ...     arg    :    number   [      ]    )           =>    28 )      ;/*25*/
////
////// in multiple paren
////    (            (            (            (            (        arg )           =>    { return 32  ;    } )     )     )     )      ;/*26*/
////
////// in ternary exression
////      false        ?            (         )           =>    41     :    null  ;/*27*/
////   false        ?            (        arg )           =>    42     :    null  ;/*28*/
////    false        ?            (        arg     = 1 )           =>    43     :    null  ;/*29*/
////      false        ?            (        arg    ?        )           =>    44     :    null  ;/*30*/
////    false        ?            (        arg    :    number )           =>    45     :    null  ;/*31*/
////   false        ?            (        arg    ?           :    number )           =>    46     :    null  ;/*32*/
////      false        ?            (        arg    ?           :    number     = 0 )           =>    47     :    null  ;/*33*/
////   false        ?            (                 ...     arg    :    number   [      ]    )           =>    48     :    null  ;/*34*/
////
////// in ternary exression within paren
////   false        ?            (            (         )           =>    51 )         :    null  ;/*35*/
////    false        ?            (            (        arg )           =>    52 )         :    null  ;/*36*/
////    false        ?            (            (        arg     = 1 )           =>    53 )         :    null  ;/*37*/
////      false        ?            (            (        arg    ?        )           =>    54 )         :    null  ;/*38*/
////    false        ?            (            (        arg    :    number )           =>    55 )         :    null  ;/*39*/
////      false        ?            (            (        arg    ?           :    number )           =>    56 )         :    null  ;/*40*/
////    false        ?            (            (        arg    ?           :    number     = 0 )           =>    57 )         :    null  ;/*41*/
////   false        ?            (            (                 ...     arg    :    number   [      ]    )           =>    58 )         :    null  ;/*42*/
////
////// ternary exression's else clause
////   false        ?        null     :        (         )           =>    61  ;/*43*/
////        false        ?        null     :        (        arg )           =>    62  ;/*44*/
////   false        ?        null     :        (        arg     = 1 )           =>    63  ;/*45*/
////      false        ?        null     :        (        arg    ?        )           =>    64  ;/*46*/
////   false        ?        null     :        (        arg    :    number )           =>    65  ;/*47*/
////    false        ?        null     :        (        arg    ?           :    number )           =>    66  ;/*48*/
////        false        ?        null     :        (        arg    ?           :    number     = 0 )           =>    67  ;/*49*/
////    false        ?        null     :        (                 ...     arg    :    number   [      ]    )           =>    68  ;/*50*/
////
////
////// nested ternary expressions
////    ((        a    ?        )           =>    { return a  ;    })     ?            (        b    ?         )           =>    { return b  ;    }     :        (        c    ?         )           =>    { return c  ;    }  ;/*51*/
////
//////multiple levels
////    ((        a    ?        )           =>    { return a  ;    })     ?            (        b )          =>       (        c )          =>   81     :        (        c )          =>       (        d )          =>   82  ;/*52*/
////
////
////// In Expressions
////    (            (        arg )           =>    90 )     instanceof Function  ;/*53*/
////      (            (        arg     = 1 )           =>    91 )     instanceof Function  ;/*54*/
////        (            (        arg    ?         )           =>    92 )     instanceof Function  ;/*55*/
////      (            (        arg    :    number )           =>    93 )     instanceof Function  ;/*56*/
////    (            (        arg    :    number     = 1 )           =>    94 )     instanceof Function  ;/*57*/
////        (            (        arg    ?           :    number )           =>    95 )     instanceof Function  ;/*58*/
////      (            (                 ...     arg    :    number   [      ]    )           =>    96 )     instanceof Function  ;/*59*/
////
////''    +        ((        arg )           =>    100)  ;/*60*/
////        (            (        arg )           =>    0 )        +    ''    +        ((        arg )           =>    101)  ;/*61*/
////          (            (        arg     = 1 )           =>    0 )        +    ''    +        ((        arg     = 2 )           =>    102)  ;/*62*/
////    (            (        arg    ?        )           =>    0 )        +    ''    +        ((        arg    ?        )           =>    103)  ;/*63*/
////      (            (        arg    :   number )           =>    0 )        +    ''    +        ((        arg    :   number )           =>    104)  ;/*64*/
////        (            (        arg    :   number     = 1 )           =>    0 )        +    ''    +        ((        arg    :   number     = 2 )           =>    105)  ;/*65*/
////    (            (        arg    ?           :   number     )           =>    0 )        +    ''    +        ((        arg    ?           :   number     )           =>    106)  ;/*66*/
////      (            (                 ...     arg    :   number   [      ]    )           =>    0 )        +    ''    +        ((                 ...     arg    :   number   [      ]    )           =>    107)  ;/*67*/
////    (            (        arg1   ,    arg2    ?        )           =>    0 )        +    ''    +        ((        arg1   ,   arg2    ?        )           =>    108)  ;/*68*/
////      (            (        arg1   ,             ...     arg2    :   number   [      ]    )           =>    0 )        +    ''    +        ((        arg1   ,             ...     arg2    :   number   [      ]    )           =>    108)  ;/*69*/
////
////
////// Function Parameters
/////*70*/function foo    (                 ...     arg    :    any   [      ]    )     { }
////
/////*71*/foo    (
/////*72*/        (        a )           =>    110   ,
/////*73*/        (            (        a )           =>    111 )       ,
/////*74*/        (        a )           =>    {
////        return /*75*/112  ;
/////*76*/    }   ,
/////*77*/        (        a    ?         )           =>    113   ,
/////*78*/        (        a   ,    b    ?         )           =>    114   ,
/////*79*/        (        a    :    number )           =>    115   ,
/////*80*/        (        a    :    number     = 0 )           =>    116   ,
/////*81*/        (        a     = 0 )           =>    117   ,
/////*82*/        (        a               :    number     = 0 )           =>    118   ,
/////*83*/        (        a    ?    ,   b   ?          :    number      )           =>    118   ,
/////*84*/        (                 ...     a    :    number   [      ]    )           =>    119   ,
/////*85*/        (        a   ,    b                = 0   ,             ...     c    :    number   [      ]    )           =>    120   ,
/////*86*/        (        a )           =>        (        b )           =>        (        c )           =>    121   ,
/////*87*/        false       ?            (        a )           =>    0     :        (        b )           =>    122
//// /*88*/)      ;
format.document();
goTo.marker("1");
verify.currentLineContentIs("() => 1;");
goTo.marker("2");
verify.currentLineContentIs("(arg) => 2;");
goTo.marker("3");
verify.currentLineContentIs("arg       => 2;");
goTo.marker("4");
verify.currentLineContentIs("(arg     = 1) => 3;");
goTo.marker("5");
verify.currentLineContentIs("(arg?) => 4;");
goTo.marker("6");
verify.currentLineContentIs("(arg: number) => 5;");
goTo.marker("7");
verify.currentLineContentIs("(arg: number     = 0) => 6;");
goTo.marker("8");
verify.currentLineContentIs("(arg?: number) => 7;");
goTo.marker("9");
verify.currentLineContentIs("(...arg: number[]) => 8;");
goTo.marker("10");
verify.currentLineContentIs("(arg1, arg2) => 12;");
goTo.marker("11");
verify.currentLineContentIs("(arg1     = 1, arg2     = 3) => 13;");
goTo.marker("12");
verify.currentLineContentIs("(arg1?, arg2?) => 14;");
goTo.marker("13");
verify.currentLineContentIs("(arg1: number, arg2: number) => 15;");
goTo.marker("14");
verify.currentLineContentIs("(arg1: number     = 0, arg2: number     = 1) => 16;");
goTo.marker("15");
verify.currentLineContentIs("(arg1?: number, arg2?: number) => 17;");
goTo.marker("16");
verify.currentLineContentIs("(arg1, ...arg2: number[]) => 18;");
goTo.marker("17");
verify.currentLineContentIs("(arg1, arg2?: number) => 19;");
goTo.marker("18");
verify.currentLineContentIs("(() => 21);");
goTo.marker("19");
verify.currentLineContentIs("((arg) => 22);");
goTo.marker("20");
verify.currentLineContentIs("((arg     = 1) => 23);");
goTo.marker("21");
verify.currentLineContentIs("((arg?) => 24);");
goTo.marker("22");
verify.currentLineContentIs("((arg: number) => 25);");
goTo.marker("23");
verify.currentLineContentIs("((arg: number     = 0) => 26);");
goTo.marker("24");
verify.currentLineContentIs("((arg?: number) => 27);");
goTo.marker("25");
verify.currentLineContentIs("((...arg: number[]) => 28);");
goTo.marker("26");
verify.currentLineContentIs("(((((arg) => { return 32; }))));");
goTo.marker("27");
verify.currentLineContentIs("false ? () => 41 : null;");
goTo.marker("28");
verify.currentLineContentIs("false ? (arg) => 42 : null;");
goTo.marker("29");
verify.currentLineContentIs("false ? (arg     = 1) => 43 : null;");
goTo.marker("30");
verify.currentLineContentIs("false ? (arg?) => 44 : null;");
goTo.marker("31");
verify.currentLineContentIs("false ? (arg: number) => 45 : null;");
goTo.marker("32");
verify.currentLineContentIs("false ? (arg?: number) => 46 : null;");
goTo.marker("33");
verify.currentLineContentIs("false ? (arg?: number     = 0) => 47 : null;");
goTo.marker("34");
verify.currentLineContentIs("false ? (...arg: number[]) => 48 : null;");
goTo.marker("35");
verify.currentLineContentIs("false ? (() => 51) : null;");
goTo.marker("36");
verify.currentLineContentIs("false ? ((arg) => 52) : null;");
goTo.marker("37");
verify.currentLineContentIs("false ? ((arg     = 1) => 53) : null;");
goTo.marker("38");
verify.currentLineContentIs("false ? ((arg?) => 54) : null;");
goTo.marker("39");
verify.currentLineContentIs("false ? ((arg: number) => 55) : null;");
goTo.marker("40");
verify.currentLineContentIs("false ? ((arg?: number) => 56) : null;");
goTo.marker("41");
verify.currentLineContentIs("false ? ((arg?: number     = 0) => 57) : null;");
goTo.marker("42");
verify.currentLineContentIs("false ? ((...arg: number[]) => 58) : null;");
goTo.marker("43");
verify.currentLineContentIs("false ? null : () => 61;");
goTo.marker("44");
verify.currentLineContentIs("false ? null : (arg) => 62;");
goTo.marker("45");
verify.currentLineContentIs("false ? null : (arg     = 1) => 63;");
goTo.marker("46");
verify.currentLineContentIs("false ? null : (arg?) => 64;");
goTo.marker("47");
verify.currentLineContentIs("false ? null : (arg: number) => 65;");
goTo.marker("48");
verify.currentLineContentIs("false ? null : (arg?: number) => 66;");
goTo.marker("49");
verify.currentLineContentIs("false ? null : (arg?: number     = 0) => 67;");
goTo.marker("50");
verify.currentLineContentIs("false ? null : (...arg: number[]) => 68;");
goTo.marker("51");
verify.currentLineContentIs("((a?) => { return a; }) ? (b?) => { return b; } : (c?) => { return c; };");
goTo.marker("52");
verify.currentLineContentIs("((a?) => { return a; }) ? (b) => (c) => 81 : (c) => (d) => 82;");
goTo.marker("53");
verify.currentLineContentIs("((arg) => 90) instanceof Function;");
goTo.marker("54");
verify.currentLineContentIs("((arg     = 1) => 91) instanceof Function;");
goTo.marker("55");
verify.currentLineContentIs("((arg?) => 92) instanceof Function;");
goTo.marker("56");
verify.currentLineContentIs("((arg: number) => 93) instanceof Function;");
goTo.marker("57");
verify.currentLineContentIs("((arg: number     = 1) => 94) instanceof Function;");
goTo.marker("58");
verify.currentLineContentIs("((arg?: number) => 95) instanceof Function;");
goTo.marker("59");
verify.currentLineContentIs("((...arg: number[]) => 96) instanceof Function;");
goTo.marker("60");
verify.currentLineContentIs("'' + ((arg) => 100);");

goTo.marker("61");
verify.currentLineContentIs("((arg) => 0) + '' + ((arg) => 101);");
goTo.marker("62");
verify.currentLineContentIs("((arg     = 1) => 0) + '' + ((arg     = 2) => 102);");
goTo.marker("63");
verify.currentLineContentIs("((arg?) => 0) + '' + ((arg?) => 103);");
goTo.marker("64");
verify.currentLineContentIs("((arg: number) => 0) + '' + ((arg: number) => 104);");
goTo.marker("65");
verify.currentLineContentIs("((arg: number     = 1) => 0) + '' + ((arg: number     = 2) => 105);");
goTo.marker("66");
verify.currentLineContentIs("((arg?: number) => 0) + '' + ((arg?: number) => 106);");
goTo.marker("67");
verify.currentLineContentIs("((...arg: number[]) => 0) + '' + ((...arg: number[]) => 107);");
goTo.marker("68");
verify.currentLineContentIs("((arg1, arg2?) => 0) + '' + ((arg1, arg2?) => 108);");
goTo.marker("69");
verify.currentLineContentIs("((arg1, ...arg2: number[]) => 0) + '' + ((arg1, ...arg2: number[]) => 108);");
goTo.marker("70");
verify.currentLineContentIs("function foo(...arg: any[]) { }");
goTo.marker("71");
verify.currentLineContentIs("foo(");
goTo.marker("72");
verify.currentLineContentIs("    (a) => 110,");
goTo.marker("73");
verify.currentLineContentIs("    ((a) => 111),");
goTo.marker("74");
verify.currentLineContentIs("    (a) => {");
goTo.marker("75");
verify.currentLineContentIs("        return 112;");
goTo.marker("76");
verify.currentLineContentIs("    },");
goTo.marker("77");
verify.currentLineContentIs("    (a?) => 113,");
goTo.marker("78");
verify.currentLineContentIs("    (a, b?) => 114,");
goTo.marker("79");
verify.currentLineContentIs("    (a: number) => 115,");
goTo.marker("80");
verify.currentLineContentIs("    (a: number     = 0) => 116,");
goTo.marker("81");
verify.currentLineContentIs("    (a     = 0) => 117,");
goTo.marker("82");
verify.currentLineContentIs("    (a: number     = 0) => 118,");
goTo.marker("83");
verify.currentLineContentIs("    (a?, b?: number) => 118,");
goTo.marker("84");
verify.currentLineContentIs("    (...a: number[]) => 119,");
goTo.marker("85");
verify.currentLineContentIs("    (a, b                = 0, ...c: number[]) => 120,");
goTo.marker("86");
verify.currentLineContentIs("    (a) => (b) => (c) => 121,");
goTo.marker("87");
verify.currentLineContentIs("    false ? (a) => 0 : (b) => 122");
