From 1be4196e5219e1f4e3dabe2100cb8c7344aec1b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Bundyra?= Date: Fri, 6 Dec 2019 22:58:31 +0000 Subject: [PATCH 1/2] Hotfix: detecting end of statement with PHP 7.4 fn closure Fixes #2748 --- src/Files/File.php | 10 ++++++---- tests/Core/Tokenizer/BackfillFnTokenTest.inc | 5 +++++ tests/Core/Tokenizer/BackfillFnTokenTest.php | 19 +++++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/Files/File.php b/src/Files/File.php index 2ccd834784..dd9a245178 100644 --- a/src/Files/File.php +++ b/src/Files/File.php @@ -2356,10 +2356,12 @@ public function findEndOfStatement($start, $ignore=null) && ($i === $this->tokens[$i]['scope_opener'] || $i === $this->tokens[$i]['scope_condition']) ) { - if ($i === $start - && (isset(Util\Tokens::$scopeOpeners[$this->tokens[$i]['code']]) === true - || $this->tokens[$i]['code'] === T_FN) - ) { + if ($this->tokens[$i]['code'] === T_FN) { + $i = ($this->tokens[$i]['scope_closer'] - 1); + continue; + } + + if ($i === $start && isset(Util\Tokens::$scopeOpeners[$this->tokens[$i]['code']]) === true) { return $this->tokens[$i]['scope_closer']; } diff --git a/tests/Core/Tokenizer/BackfillFnTokenTest.inc b/tests/Core/Tokenizer/BackfillFnTokenTest.inc index 0bff299369..6a274ed6d1 100644 --- a/tests/Core/Tokenizer/BackfillFnTokenTest.inc +++ b/tests/Core/Tokenizer/BackfillFnTokenTest.inc @@ -69,3 +69,8 @@ fn(callable $a) : callable => $a; /* testTernary */ $fn = fn($a) => $a ? /* testTernaryThen */ fn() : string => 'a' : /* testTernaryElse */ fn() : string => 'b'; + +/* testEndOfStatement */ +static fn ($a) => $a; + +return 0; diff --git a/tests/Core/Tokenizer/BackfillFnTokenTest.php b/tests/Core/Tokenizer/BackfillFnTokenTest.php index 4132335680..a96b3be2fa 100644 --- a/tests/Core/Tokenizer/BackfillFnTokenTest.php +++ b/tests/Core/Tokenizer/BackfillFnTokenTest.php @@ -594,4 +594,23 @@ private function backfillHelper($token) }//end backfillHelper() + /** + * Test end of statement for fn closure. + * + * @return void + */ + public function testEndOfStatement() + { + $token = $this->getTargetToken('/* testEndOfStatement */', T_FN); + $this->backfillHelper($token); + + $static = self::$phpcsFile->findPrevious(T_STATIC, ($token - 1)); + $endOfStatementStatic = self::$phpcsFile->findEndOfStatement($static); + $endOfStatementFn = self::$phpcsFile->findEndOfStatement($token); + + $this->assertSame($endOfStatementFn, $endOfStatementStatic); + + }//end testEndOfStatement() + + }//end class From 17f5e17bc5e9afc8fb2a011c89f9291eba7bd977 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Bundyra?= Date: Sun, 8 Dec 2019 22:28:09 +0000 Subject: [PATCH 2/2] Moved test to FindEndOfStatementTest file --- tests/Core/File/FindEndOfStatementTest.inc | 5 +++++ tests/Core/File/FindEndOfStatementTest.php | 18 ++++++++++++++++++ tests/Core/Tokenizer/BackfillFnTokenTest.inc | 5 ----- tests/Core/Tokenizer/BackfillFnTokenTest.php | 19 ------------------- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/tests/Core/File/FindEndOfStatementTest.inc b/tests/Core/File/FindEndOfStatementTest.inc index 8ff59d4211..c8ec8d6ec6 100644 --- a/tests/Core/File/FindEndOfStatementTest.inc +++ b/tests/Core/File/FindEndOfStatementTest.inc @@ -35,3 +35,8 @@ $a = [ 'a' => fn() => return 1, 'b' => fn() => return 1, ]; + +/* testArrowFunctionEndOfStatement */ +static fn ($a) => $a; + +return 0; diff --git a/tests/Core/File/FindEndOfStatementTest.php b/tests/Core/File/FindEndOfStatementTest.php index 5ed3fb3874..145b2805c6 100644 --- a/tests/Core/File/FindEndOfStatementTest.php +++ b/tests/Core/File/FindEndOfStatementTest.php @@ -188,4 +188,22 @@ public function testArrowFunctionArrayValue() }//end testArrowFunctionArrayValue() + /** + * Test end of statement for fn closure. + * + * @return void + */ + public function testArrayFunctionEndOfStatement() + { + $static = (self::$phpcsFile->findNext(T_COMMENT, 0, null, false, '/* testArrowFunctionEndOfStatement */') + 2); + $fn = self::$phpcsFile->findNext(T_FN, ($static + 1)); + + $endOfStatementStatic = self::$phpcsFile->findEndOfStatement($static); + $endOfStatementFn = self::$phpcsFile->findEndOfStatement($fn); + + $this->assertSame($endOfStatementFn, $endOfStatementStatic); + + }//end testArrayFunctionEndOfStatement() + + }//end class diff --git a/tests/Core/Tokenizer/BackfillFnTokenTest.inc b/tests/Core/Tokenizer/BackfillFnTokenTest.inc index 6a274ed6d1..0bff299369 100644 --- a/tests/Core/Tokenizer/BackfillFnTokenTest.inc +++ b/tests/Core/Tokenizer/BackfillFnTokenTest.inc @@ -69,8 +69,3 @@ fn(callable $a) : callable => $a; /* testTernary */ $fn = fn($a) => $a ? /* testTernaryThen */ fn() : string => 'a' : /* testTernaryElse */ fn() : string => 'b'; - -/* testEndOfStatement */ -static fn ($a) => $a; - -return 0; diff --git a/tests/Core/Tokenizer/BackfillFnTokenTest.php b/tests/Core/Tokenizer/BackfillFnTokenTest.php index a96b3be2fa..4132335680 100644 --- a/tests/Core/Tokenizer/BackfillFnTokenTest.php +++ b/tests/Core/Tokenizer/BackfillFnTokenTest.php @@ -594,23 +594,4 @@ private function backfillHelper($token) }//end backfillHelper() - /** - * Test end of statement for fn closure. - * - * @return void - */ - public function testEndOfStatement() - { - $token = $this->getTargetToken('/* testEndOfStatement */', T_FN); - $this->backfillHelper($token); - - $static = self::$phpcsFile->findPrevious(T_STATIC, ($token - 1)); - $endOfStatementStatic = self::$phpcsFile->findEndOfStatement($static); - $endOfStatementFn = self::$phpcsFile->findEndOfStatement($token); - - $this->assertSame($endOfStatementFn, $endOfStatementStatic); - - }//end testEndOfStatement() - - }//end class