Skip to content

Commit fd0ade1

Browse files
committed
Add pipe operator support
1 parent 10aec65 commit fd0ade1

File tree

6 files changed

+15
-5
lines changed

6 files changed

+15
-5
lines changed

TOLERANT_TODO.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ Recommended sample inputs for AST diffs (update as new fixtures are added):
7575
| Dynamic class const fetch | `tests/samples/dynamic_class_const.php` | 8.3 | `php ~/phan/tools/dump_ast.php --json …` | `php tools/PrintTolerantAst.php …` + `php ~/phan/internal/dump_fallback_ast.php --php-ast …` |
7676
| Property hooks | `tests/samples/property_hooks.php` | 8.4 | (run after `sudo newphp 84`) | same as above |
7777
| Asymmetric visibility props | (add fixture) | 8.4 |||
78-
| Pipe operator | (add fixture once implemented) | 8.5 | | |
78+
| Pipe operator | `tests/samples/pipe_operator.php` | 8.5 | `php ~/phan/tools/dump_ast.php --json …` | `php tools/PrintTolerantAst.php …`, `php ~/phan/internal/dump_fallback_ast.php --php-ast …` |
7979
| `clone with` expressions | (add fixture) | 8.5 |||
8080

8181
## Next Steps

src/Parser.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2303,11 +2303,14 @@ private function parseBinaryExpressionOrHigher($precedence, $parentNode) {
23032303
TokenKind::QuestionToken => [10, Associativity::Left],
23042304
// TokenKind::ColonToken => [9, Associativity::Left],
23052305

2306-
// TODO coalesce-expression (R)
2307-
TokenKind::QuestionQuestionToken => [9, Associativity::Right],
2306+
// TODO coalesce-expression (R)
2307+
TokenKind::QuestionQuestionToken => [9, Associativity::Right],
23082308

2309-
//logical-inc-OR-expression-1 (L)
2310-
TokenKind::BarBarToken => [12, Associativity::Left],
2309+
// pipe-expression (L)
2310+
TokenKind::PipeToken => [11, Associativity::Left],
2311+
2312+
//logical-inc-OR-expression-1 (L)
2313+
TokenKind::BarBarToken => [12, Associativity::Left],
23112314

23122315
// logical-AND-expression-1 (L)
23132316
TokenKind::AmpersandAmpersandToken => [13, Associativity::Left],

src/PhpTokenizer.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
define(__NAMESPACE__ . '\T_MATCH', defined('T_MATCH') ? constant('T_MATCH') : 'T_MATCH');
1515
define(__NAMESPACE__ . '\T_NULLSAFE_OBJECT_OPERATOR', defined('T_NULLSAFE_OBJECT_OPERATOR') ? constant('T_NULLSAFE_OBJECT_OPERATOR') : 'T_NULLSAFE_OBJECT_OPERATOR');
1616
define(__NAMESPACE__ . '\T_ATTRIBUTE', defined('T_ATTRIBUTE') ? constant('T_ATTRIBUTE') : 'T_ATTRIBUTE');
17+
define(__NAMESPACE__ . '\T_PIPE', defined('T_PIPE') ? constant('T_PIPE') : 'T_PIPE');
1718
// If this predates PHP 8.1, T_ENUM is unavailable. The replacement value is arbitrary - it just has to be different from other values of token constants.
1819
define(__NAMESPACE__ . '\T_ENUM', defined('T_ENUM') ? constant('T_ENUM') : 'T_ENUM');
1920
define(__NAMESPACE__ . '\T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', defined('T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG') ? constant('T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG') : 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG');
@@ -346,6 +347,7 @@ protected static function tokenGetAll(string $content, $parseContext): array
346347
T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG => TokenKind::AmpersandToken,
347348
T_BOOLEAN_AND => TokenKind::AmpersandAmpersandToken,
348349
T_BOOLEAN_OR => TokenKind::BarBarToken,
350+
T_PIPE => TokenKind::PipeToken,
349351
":" => TokenKind::ColonToken,
350352
";" => TokenKind::SemicolonToken,
351353
"=" => TokenKind::EqualsToken,

src/TokenKind.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ class TokenKind {
156156
const QuestionQuestionEqualsToken = 262;
157157
const QuestionArrowToken = 263;
158158
const AttributeToken = 264;
159+
const PipeToken = 265;
159160

160161
const DecimalLiteralToken = 301;
161162
const OctalLiteralToken = 302;

src/TokenStringMaps.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ class TokenStringMaps {
169169
"?->" => TokenKind::QuestionArrowToken,
170170
"??" => TokenKind::QuestionQuestionToken,
171171
"??=" => TokenKind::QuestionQuestionEqualsToken,
172+
"|>" => TokenKind::PipeToken,
172173
"<=>" => TokenKind::LessThanEqualsGreaterThanToken,
173174
"<>" => TokenKind::LessThanGreaterThanToken,
174175
"..." => TokenKind::DotDotDotToken,

tests/samples/pipe_operator.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<?php
2+
3+
$result = 1 |> fn($x) => $x + 1;

0 commit comments

Comments
 (0)