From 97f6eb43287364ab77c743aaf22e110bc602f5b1 Mon Sep 17 00:00:00 2001 From: Wouter van den Brink Date: Thu, 19 Feb 2026 17:40:01 +0100 Subject: [PATCH 1/3] Restore FnTokenEmulator As of PHP 7.4, functions can no longer be named fn, due to the new arrow function syntax. Consequently, pre-7.4, functions may be called fn. This commit restores a previously present token emulator that made this behavior possible. --- lib/PhpParser/Lexer/Emulative.php | 2 ++ .../Lexer/TokenEmulator/FnTokenEmulator.php | 19 +++++++++++++++++ test/code/parser/stmt/function/fn.test | 21 +++++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php create mode 100644 test/code/parser/stmt/function/fn.test diff --git a/lib/PhpParser/Lexer/Emulative.php b/lib/PhpParser/Lexer/Emulative.php index 3185e808ea..d363b8459e 100644 --- a/lib/PhpParser/Lexer/Emulative.php +++ b/lib/PhpParser/Lexer/Emulative.php @@ -9,6 +9,7 @@ use PhpParser\Lexer\TokenEmulator\AttributeEmulator; use PhpParser\Lexer\TokenEmulator\EnumTokenEmulator; use PhpParser\Lexer\TokenEmulator\ExplicitOctalEmulator; +use PhpParser\Lexer\TokenEmulator\FnTokenEmulator; use PhpParser\Lexer\TokenEmulator\MatchTokenEmulator; use PhpParser\Lexer\TokenEmulator\NullsafeTokenEmulator; use PhpParser\Lexer\TokenEmulator\PipeOperatorEmulator; @@ -51,6 +52,7 @@ public function __construct(?PhpVersion $phpVersion = null) { new AsymmetricVisibilityTokenEmulator(), new PipeOperatorEmulator(), new VoidCastEmulator(), + new FnTokenEmulator(), ]; // Collect emulators that are relevant for the PHP version we're running diff --git a/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php b/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php new file mode 100644 index 0000000000..3185fc517e --- /dev/null +++ b/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php @@ -0,0 +1,19 @@ + Date: Thu, 26 Feb 2026 11:54:03 +0100 Subject: [PATCH 2/3] Restore chronological order in Emulative --- lib/PhpParser/Lexer/Emulative.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/PhpParser/Lexer/Emulative.php b/lib/PhpParser/Lexer/Emulative.php index d363b8459e..442aa1fa1c 100644 --- a/lib/PhpParser/Lexer/Emulative.php +++ b/lib/PhpParser/Lexer/Emulative.php @@ -41,6 +41,7 @@ public function __construct(?PhpVersion $phpVersion = null) { $this->hostPhpVersion = PhpVersion::getHostVersion(); $emulators = [ + new FnTokenEmulator(), new MatchTokenEmulator(), new NullsafeTokenEmulator(), new AttributeEmulator(), @@ -52,7 +53,6 @@ public function __construct(?PhpVersion $phpVersion = null) { new AsymmetricVisibilityTokenEmulator(), new PipeOperatorEmulator(), new VoidCastEmulator(), - new FnTokenEmulator(), ]; // Collect emulators that are relevant for the PHP version we're running From 43b2ee0dba2ec0fe7c67de7505b64ab4195da092 Mon Sep 17 00:00:00 2001 From: Wouter van den Brink Date: Thu, 26 Feb 2026 11:54:34 +0100 Subject: [PATCH 3/3] Add explanatory comment to FnTokenEmulator --- lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php b/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php index 3185fc517e..99ebb5c9f5 100644 --- a/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php +++ b/lib/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php @@ -4,6 +4,7 @@ use PhpParser\PhpVersion; +// Retained for reverse emulation support only. final class FnTokenEmulator extends KeywordEmulator { public function getPhpVersion(): PhpVersion { return PhpVersion::fromString('7.4');