Skip to content

PHP 7.4 fn closure - tokenizer issue with ternary #2713

@michalbundyra

Description

@michalbundyra

Example:

$fn = fn ($x) => fn ($y) => $x ? $y : false;

// example calls:
var_dump($fn(1)(2)); // result int(2)
var_dump($fn(0)(2)); // result bool(false) 

tokeniser:

        Process token 0 on line 1 [col:1;len:5;lvl:0;]: T_OPEN_TAG => <?php\n
        Process token 1 on line 2 [col:1;len:0;lvl:0;]: T_WHITESPACE => \n
        Process token 2 on line 3 [col:1;len:3;lvl:0;]: T_VARIABLE => $fn
        Process token 3 on line 3 [col:4;len:1;lvl:0;]: T_WHITESPACE => ·
        Process token 4 on line 3 [col:5;len:1;lvl:0;]: T_EQUAL => =
        Process token 5 on line 3 [col:6;len:1;lvl:0;]: T_WHITESPACE => ·
        Process token 6 on line 3 [col:7;len:2;lvl:0;]: T_FN => fn
        Process token 7 on line 3 [col:9;len:1;lvl:0;]: T_WHITESPACE => ·
        Process token 8 on line 3 [col:10;len:1;lvl:0;]: T_OPEN_PARENTHESIS => (
        Process token 9 on line 3 [col:11;len:2;lvl:0;]: T_VARIABLE => $x
        Process token 10 on line 3 [col:13;len:1;lvl:0;]: T_CLOSE_PARENTHESIS => )
        Process token 11 on line 3 [col:14;len:1;lvl:0;]: T_WHITESPACE => ·
        Process token 12 on line 3 [col:15;len:2;lvl:0;]: T_DOUBLE_ARROW => =>
        Process token 13 on line 3 [col:17;len:1;lvl:0;]: T_WHITESPACE => ·
        Process token 14 on line 3 [col:18;len:2;lvl:0;]: T_FN => fn
        Process token 15 on line 3 [col:20;len:1;lvl:0;]: T_WHITESPACE => ·
        Process token 16 on line 3 [col:21;len:1;lvl:0;]: T_OPEN_PARENTHESIS => (
        Process token 17 on line 3 [col:22;len:2;lvl:0;]: T_VARIABLE => $y
        Process token 18 on line 3 [col:24;len:1;lvl:0;]: T_CLOSE_PARENTHESIS => )
        Process token 19 on line 3 [col:25;len:1;lvl:0;]: T_WHITESPACE => ·
        Process token 20 on line 3 [col:26;len:2;lvl:0;]: T_DOUBLE_ARROW => =>
        Process token 21 on line 3 [col:28;len:1;lvl:0;]: T_WHITESPACE => ·
        Process token 22 on line 3 [col:29;len:2;lvl:0;]: T_VARIABLE => $x
        Process token 23 on line 3 [col:31;len:1;lvl:0;]: T_WHITESPACE => ·
        Process token 24 on line 3 [col:32;len:1;lvl:0;]: T_NULLABLE => ?   // <!-- should be T_INLINE_THEN
        Process token 25 on line 3 [col:33;len:1;lvl:0;]: T_WHITESPACE => ·
        Process token 26 on line 3 [col:34;len:2;lvl:0;]: T_VARIABLE => $y
        Process token 27 on line 3 [col:36;len:1;lvl:0;]: T_WHITESPACE => ·
        Process token 28 on line 3 [col:37;len:1;lvl:0;]: T_COLON => :   // <!-- should be T_INLINE_ELSE
        Process token 29 on line 3 [col:38;len:1;lvl:0;]: T_WHITESPACE => ·
        Process token 30 on line 3 [col:39;len:5;lvl:0;]: T_FALSE => false
        Process token 31 on line 3 [col:44;len:1;lvl:0;]: T_SEMICOLON => ;
        Process token 32 on line 3 [col:45;len:0;lvl:0;]: T_WHITESPACE => \n

Related to #2523

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions