5
5
use lang \ast \MapType ;
6
6
use lang \ast \Node ;
7
7
use lang \ast \UnionType ;
8
+ use lang \ast \nodes \Assignment ;
8
9
use lang \ast \nodes \BinaryExpression ;
10
+ use lang \ast \nodes \Braced ;
9
11
use lang \ast \nodes \InstanceOfExpression ;
10
12
use lang \ast \nodes \InvokeExpression ;
11
13
use lang \ast \nodes \Literal ;
14
+ use lang \ast \nodes \Variable ;
12
15
use lang \ast \syntax \Extension ;
13
16
14
17
class IsOperator implements Extension {
@@ -22,7 +25,7 @@ public function setup($language, $emitter) {
22
25
return $ node ;
23
26
});
24
27
25
- $ test = function ($ literal , $ expr ) {
28
+ $ test = function ($ literal , $ expr, $ temp ) {
26
29
static $ is = [
27
30
'string ' => true ,
28
31
'int ' => true ,
@@ -36,9 +39,9 @@ public function setup($language, $emitter) {
36
39
// PHP 7.0 compatibility, is_iterable() doesn't exist there
37
40
if ('iterable ' === $ literal ) {
38
41
return new BinaryExpression (
39
- new InstanceOfExpression ($ expr , '\Traversable ' ),
42
+ new InstanceOfExpression ($ temp ? new Braced ( new Assignment ( $ temp , ' = ' , $ expr )) : $ expr , '\Traversable ' ),
40
43
'|| ' ,
41
- new InvokeExpression (new Literal ('is_array ' ), [$ expr ])
44
+ new InvokeExpression (new Literal ('is_array ' ), [$ temp ])
42
45
);
43
46
} else if (isset ($ is [$ literal ])) {
44
47
return new InvokeExpression (new Literal ('is_ ' .$ literal ), [$ expr ]);
@@ -58,14 +61,15 @@ public function setup($language, $emitter) {
58
61
return new InvokeExpression (new Literal ('is ' ), [new Literal ('" ' .$ t ->name ().'" ' ), $ node ->expression ]);
59
62
} else {
60
63
$ literal = $ t ->literal ();
64
+ $ temp = new Variable ($ codegen ->symbol ());
61
65
if ('? ' === $ literal [0 ]) {
62
66
return new BinaryExpression (
63
- new BinaryExpression (new Literal ('null ' ), '=== ' , $ node ->expression ),
67
+ new BinaryExpression (new Literal ('null ' ), '=== ' , new Braced ( new Assignment ( $ temp , ' = ' , $ node ->expression )) ),
64
68
'|| ' ,
65
- $ test (substr ($ literal , 1 ), $ node -> expression )
69
+ $ test (substr ($ literal , 1 ), $ temp , null )
66
70
);
67
71
} else {
68
- return $ test ($ literal , $ node ->expression );
72
+ return $ test ($ literal , $ node ->expression , $ temp );
69
73
}
70
74
}
71
75
});
0 commit comments