Skip to content

Commit 5ad295a

Browse files
authored
Add cast kinds for bool, int, string (#1098)
1 parent 63114fe commit 5ad295a

File tree

9 files changed

+140
-9
lines changed

9 files changed

+140
-9
lines changed

grammar/php.y

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,15 +1103,24 @@ expr:
11031103
| T_EVAL '(' expr ')' { $$ = Expr\Eval_[$3]; }
11041104
| T_REQUIRE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE]; }
11051105
| T_REQUIRE_ONCE expr { $$ = Expr\Include_[$2, Expr\Include_::TYPE_REQUIRE_ONCE]; }
1106-
| T_INT_CAST expr { $$ = Expr\Cast\Int_ [$2]; }
1106+
| T_INT_CAST expr
1107+
{ $attrs = attributes();
1108+
$attrs['kind'] = $this->getIntCastKind($1);
1109+
$$ = new Expr\Cast\Int_($2, $attrs); }
11071110
| T_DOUBLE_CAST expr
11081111
{ $attrs = attributes();
11091112
$attrs['kind'] = $this->getFloatCastKind($1);
11101113
$$ = new Expr\Cast\Double($2, $attrs); }
1111-
| T_STRING_CAST expr { $$ = Expr\Cast\String_ [$2]; }
1114+
| T_STRING_CAST expr
1115+
{ $attrs = attributes();
1116+
$attrs['kind'] = $this->getStringCastKind($1);
1117+
$$ = new Expr\Cast\String_($2, $attrs); }
11121118
| T_ARRAY_CAST expr { $$ = Expr\Cast\Array_ [$2]; }
11131119
| T_OBJECT_CAST expr { $$ = Expr\Cast\Object_ [$2]; }
1114-
| T_BOOL_CAST expr { $$ = Expr\Cast\Bool_ [$2]; }
1120+
| T_BOOL_CAST expr
1121+
{ $attrs = attributes();
1122+
$attrs['kind'] = $this->getBoolCastKind($1);
1123+
$$ = new Expr\Cast\Bool_($2, $attrs); }
11151124
| T_UNSET_CAST expr { $$ = Expr\Cast\Unset_ [$2]; }
11161125
| T_VOID_CAST expr { $$ = Expr\Cast\Void_ [$2]; }
11171126
| T_EXIT ctor_arguments

lib/PhpParser/Node/Expr/Cast/Bool_.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
use PhpParser\Node\Expr\Cast;
66

77
class Bool_ extends Cast {
8+
// For use in "kind" attribute
9+
public const KIND_BOOL = 1; // "bool" syntax
10+
public const KIND_BOOLEAN = 2; // "boolean" syntax
11+
812
public function getType(): string {
913
return 'Expr_Cast_Bool';
1014
}

lib/PhpParser/Node/Expr/Cast/Int_.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
use PhpParser\Node\Expr\Cast;
66

77
class Int_ extends Cast {
8+
// For use in "kind" attribute
9+
public const KIND_INT = 1; // "int" syntax
10+
public const KIND_INTEGER = 2; // "integer" syntax
11+
812
public function getType(): string {
913
return 'Expr_Cast_Int';
1014
}

lib/PhpParser/Node/Expr/Cast/String_.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
use PhpParser\Node\Expr\Cast;
66

77
class String_ extends Cast {
8+
// For use in "kind" attribute
9+
public const KIND_STRING = 1; // "string" syntax
10+
public const KIND_BINARY = 2; // "binary" syntax
11+
812
public function getType(): string {
913
return 'Expr_Cast_String';
1014
}

lib/PhpParser/Parser/Php7.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2478,15 +2478,19 @@ protected function initReduceCallbacks(): void {
24782478
$self->semValue = new Expr\Include_($self->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));
24792479
},
24802480
487 => static function ($self, $stackPos) {
2481-
$self->semValue = new Expr\Cast\Int_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));
2481+
$attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);
2482+
$attrs['kind'] = $self->getIntCastKind($self->semStack[$stackPos-(2-1)]);
2483+
$self->semValue = new Expr\Cast\Int_($self->semStack[$stackPos-(2-2)], $attrs);
24822484
},
24832485
488 => static function ($self, $stackPos) {
24842486
$attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);
24852487
$attrs['kind'] = $self->getFloatCastKind($self->semStack[$stackPos-(2-1)]);
24862488
$self->semValue = new Expr\Cast\Double($self->semStack[$stackPos-(2-2)], $attrs);
24872489
},
24882490
489 => static function ($self, $stackPos) {
2489-
$self->semValue = new Expr\Cast\String_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));
2491+
$attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);
2492+
$attrs['kind'] = $self->getStringCastKind($self->semStack[$stackPos-(2-1)]);
2493+
$self->semValue = new Expr\Cast\String_($self->semStack[$stackPos-(2-2)], $attrs);
24902494
},
24912495
490 => static function ($self, $stackPos) {
24922496
$self->semValue = new Expr\Cast\Array_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));
@@ -2495,7 +2499,9 @@ protected function initReduceCallbacks(): void {
24952499
$self->semValue = new Expr\Cast\Object_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));
24962500
},
24972501
492 => static function ($self, $stackPos) {
2498-
$self->semValue = new Expr\Cast\Bool_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));
2502+
$attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);
2503+
$attrs['kind'] = $self->getBoolCastKind($self->semStack[$stackPos-(2-1)]);
2504+
$self->semValue = new Expr\Cast\Bool_($self->semStack[$stackPos-(2-2)], $attrs);
24992505
},
25002506
493 => static function ($self, $stackPos) {
25012507
$self->semValue = new Expr\Cast\Unset_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));

lib/PhpParser/Parser/Php8.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2479,15 +2479,19 @@ protected function initReduceCallbacks(): void {
24792479
$self->semValue = new Expr\Include_($self->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));
24802480
},
24812481
490 => static function ($self, $stackPos) {
2482-
$self->semValue = new Expr\Cast\Int_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));
2482+
$attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);
2483+
$attrs['kind'] = $self->getIntCastKind($self->semStack[$stackPos-(2-1)]);
2484+
$self->semValue = new Expr\Cast\Int_($self->semStack[$stackPos-(2-2)], $attrs);
24832485
},
24842486
491 => static function ($self, $stackPos) {
24852487
$attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);
24862488
$attrs['kind'] = $self->getFloatCastKind($self->semStack[$stackPos-(2-1)]);
24872489
$self->semValue = new Expr\Cast\Double($self->semStack[$stackPos-(2-2)], $attrs);
24882490
},
24892491
492 => static function ($self, $stackPos) {
2490-
$self->semValue = new Expr\Cast\String_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));
2492+
$attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);
2493+
$attrs['kind'] = $self->getStringCastKind($self->semStack[$stackPos-(2-1)]);
2494+
$self->semValue = new Expr\Cast\String_($self->semStack[$stackPos-(2-2)], $attrs);
24912495
},
24922496
493 => static function ($self, $stackPos) {
24932497
$self->semValue = new Expr\Cast\Array_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));
@@ -2496,7 +2500,9 @@ protected function initReduceCallbacks(): void {
24962500
$self->semValue = new Expr\Cast\Object_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));
24972501
},
24982502
495 => static function ($self, $stackPos) {
2499-
$self->semValue = new Expr\Cast\Bool_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));
2503+
$attrs = $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]);
2504+
$attrs['kind'] = $self->getBoolCastKind($self->semStack[$stackPos-(2-1)]);
2505+
$self->semValue = new Expr\Cast\Bool_($self->semStack[$stackPos-(2-2)], $attrs);
25002506
},
25012507
496 => static function ($self, $stackPos) {
25022508
$self->semValue = new Expr\Cast\Unset_($self->semStack[$stackPos-(2-2)], $self->getAttributes($self->tokenStartStack[$stackPos-(2-1)], $self->tokenEndStack[$stackPos]));

lib/PhpParser/ParserAbstract.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,33 @@ protected function getFloatCastKind(string $cast): int {
736736
return Double::KIND_DOUBLE;
737737
}
738738

739+
protected function getIntCastKind(string $cast): int {
740+
$cast = strtolower($cast);
741+
if (strpos($cast, 'integer') !== false) {
742+
return Expr\Cast\Int_::KIND_INTEGER;
743+
}
744+
745+
return Expr\Cast\Int_::KIND_INT;
746+
}
747+
748+
protected function getBoolCastKind(string $cast): int {
749+
$cast = strtolower($cast);
750+
if (strpos($cast, 'boolean') !== false) {
751+
return Expr\Cast\Bool_::KIND_BOOLEAN;
752+
}
753+
754+
return Expr\Cast\Bool_::KIND_BOOL;
755+
}
756+
757+
protected function getStringCastKind(string $cast): int {
758+
$cast = strtolower($cast);
759+
if (strpos($cast, 'binary') !== false) {
760+
return Expr\Cast\String_::KIND_BINARY;
761+
}
762+
763+
return Expr\Cast\String_::KIND_STRING;
764+
}
765+
739766
/** @param array<string, mixed> $attributes */
740767
protected function parseLNumber(string $str, array $attributes, bool $allowInvalidOctal = false): Int_ {
741768
try {

test/code/parser/formattingAttributes.test

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@ array();
4343
[];
4444
list($x) = $y;
4545
[$x] = $y;
46+
(int) $int;
47+
(integer) $integer;
48+
(bool) $bool;
49+
(boolean) $boolean;
50+
(string) $string;
51+
(binary) $binary;
4652
-----
4753
!!attributes
4854
array(
@@ -301,4 +307,52 @@ array(
301307
)
302308
)
303309
)
310+
24: Stmt_Expression(
311+
expr: Expr_Cast_Int(
312+
expr: Expr_Variable(
313+
name: int
314+
)
315+
kind: 1
316+
)
317+
)
318+
25: Stmt_Expression(
319+
expr: Expr_Cast_Int(
320+
expr: Expr_Variable(
321+
name: integer
322+
)
323+
kind: 2
324+
)
325+
)
326+
26: Stmt_Expression(
327+
expr: Expr_Cast_Bool(
328+
expr: Expr_Variable(
329+
name: bool
330+
)
331+
kind: 1
332+
)
333+
)
334+
27: Stmt_Expression(
335+
expr: Expr_Cast_Bool(
336+
expr: Expr_Variable(
337+
name: boolean
338+
)
339+
kind: 2
340+
)
341+
)
342+
28: Stmt_Expression(
343+
expr: Expr_Cast_String(
344+
expr: Expr_Variable(
345+
name: string
346+
)
347+
kind: 1
348+
)
349+
)
350+
29: Stmt_Expression(
351+
expr: Expr_Cast_String(
352+
expr: Expr_Variable(
353+
name: binary
354+
)
355+
kind: 2
356+
)
357+
)
304358
)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
Casts
2+
-----
3+
<?php
4+
5+
$int = (int) $int;
6+
$integer = (integer) $integer;
7+
$bool = (bool) $bool;
8+
$boolean = (boolean) $boolean;
9+
$string = (string) $string;
10+
$binary = (binary) $binary;
11+
-----
12+
$int = (int) $int;
13+
$integer = (int) $integer;
14+
$bool = (bool) $bool;
15+
$boolean = (bool) $boolean;
16+
$string = (string) $string;
17+
$binary = (string) $binary;

0 commit comments

Comments
 (0)