Skip to content

Commit 1be4196

Browse files
committed
Hotfix: detecting end of statement with PHP 7.4 fn closure
Fixes #2748
1 parent 2ecd8dc commit 1be4196

File tree

3 files changed

+30
-4
lines changed

3 files changed

+30
-4
lines changed

src/Files/File.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2356,10 +2356,12 @@ public function findEndOfStatement($start, $ignore=null)
23562356
&& ($i === $this->tokens[$i]['scope_opener']
23572357
|| $i === $this->tokens[$i]['scope_condition'])
23582358
) {
2359-
if ($i === $start
2360-
&& (isset(Util\Tokens::$scopeOpeners[$this->tokens[$i]['code']]) === true
2361-
|| $this->tokens[$i]['code'] === T_FN)
2362-
) {
2359+
if ($this->tokens[$i]['code'] === T_FN) {
2360+
$i = ($this->tokens[$i]['scope_closer'] - 1);
2361+
continue;
2362+
}
2363+
2364+
if ($i === $start && isset(Util\Tokens::$scopeOpeners[$this->tokens[$i]['code']]) === true) {
23632365
return $this->tokens[$i]['scope_closer'];
23642366
}
23652367

tests/Core/Tokenizer/BackfillFnTokenTest.inc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,8 @@ fn(callable $a) : callable => $a;
6969

7070
/* testTernary */
7171
$fn = fn($a) => $a ? /* testTernaryThen */ fn() : string => 'a' : /* testTernaryElse */ fn() : string => 'b';
72+
73+
/* testEndOfStatement */
74+
static fn ($a) => $a;
75+
76+
return 0;

tests/Core/Tokenizer/BackfillFnTokenTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,4 +594,23 @@ private function backfillHelper($token)
594594
}//end backfillHelper()
595595

596596

597+
/**
598+
* Test end of statement for fn closure.
599+
*
600+
* @return void
601+
*/
602+
public function testEndOfStatement()
603+
{
604+
$token = $this->getTargetToken('/* testEndOfStatement */', T_FN);
605+
$this->backfillHelper($token);
606+
607+
$static = self::$phpcsFile->findPrevious(T_STATIC, ($token - 1));
608+
$endOfStatementStatic = self::$phpcsFile->findEndOfStatement($static);
609+
$endOfStatementFn = self::$phpcsFile->findEndOfStatement($token);
610+
611+
$this->assertSame($endOfStatementFn, $endOfStatementStatic);
612+
613+
}//end testEndOfStatement()
614+
615+
597616
}//end class

0 commit comments

Comments
 (0)