Updated Rector to commit 7f5acb613b

7f5acb613b [Core] Add BetterNodeFinder::findFirstInlinedPrevious() (#2238)
This commit is contained in:
Tomas Votruba 2022-05-05 13:58:33 +00:00
parent 29c4bbb97a
commit 7242caf99b
12 changed files with 97 additions and 52 deletions

View File

@ -134,9 +134,9 @@ CODE_SAMPLE
}
private function changeToAssign(\PhpParser\Node\Stmt\Switch_ $switch, \PhpParser\Node\Expr\Match_ $match, \PhpParser\Node\Expr $assignExpr) : \PhpParser\Node\Expr\Assign
{
$prevInitializedAssign = $this->betterNodeFinder->findFirstPrevious($switch, function (\PhpParser\Node $node) use($assignExpr) : bool {
$prevInitializedAssign = $this->betterNodeFinder->findFirstInlinedPrevious($switch, function (\PhpParser\Node $node) use($assignExpr) : bool {
return $node instanceof \PhpParser\Node\Expr\Assign && $this->nodeComparator->areNodesEqual($node->var, $assignExpr);
}, \false);
});
$assign = new \PhpParser\Node\Expr\Assign($assignExpr, $match);
if (!$prevInitializedAssign instanceof \PhpParser\Node\Expr\Assign) {
return $assign;

View File

@ -16,11 +16,11 @@ final class VersionResolver
/**
* @var string
*/
public const PACKAGE_VERSION = 'aa6524e8423b91079f941d8225e830b964c0a8d3';
public const PACKAGE_VERSION = '7f5acb613bb4dc72aef2a8aef14fb16d8281c4e5';
/**
* @var string
*/
public const RELEASE_DATE = '2022-05-05 10:11:58';
public const RELEASE_DATE = '2022-05-05 16:50:51';
/**
* @var string
*/

View File

@ -260,29 +260,41 @@ final class BetterNodeFinder
});
}
/**
* Only search in previous Node/Stmt
*
* @param callable(Node $node): bool $filter
*/
public function findFirstPrevious(\PhpParser\Node $node, callable $filter, bool $lookupParent = \true) : ?\PhpParser\Node
public function findFirstInlinedPrevious(\PhpParser\Node $node, callable $filter) : ?\PhpParser\Node
{
// move to previous Node
$previousNode = $node->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::PREVIOUS_NODE);
if ($previousNode instanceof \PhpParser\Node) {
$foundNode = $this->findFirst($previousNode, $filter);
// we found what we need
if ($foundNode instanceof \PhpParser\Node) {
return $foundNode;
}
return $this->findFirstPrevious($previousNode, $filter, $lookupParent);
}
if (!$lookupParent) {
if (!$previousNode instanceof \PhpParser\Node) {
return null;
}
$foundNode = $this->findFirst($previousNode, $filter);
// we found what we need
if ($foundNode instanceof \PhpParser\Node) {
return $foundNode;
}
return $this->findFirstInlinedPrevious($previousNode, $filter);
}
/**
* Search in previous Node/Stmt, when no Node found, lookup previous Stmt of Parent Node
*
* @param callable(Node $node): bool $filter
*/
public function findFirstPrevious(\PhpParser\Node $node, callable $filter) : ?\PhpParser\Node
{
$foundNode = $this->findFirstInlinedPrevious($node, $filter);
// we found what we need
if ($foundNode instanceof \PhpParser\Node) {
return $foundNode;
}
$parent = $node->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::PARENT_NODE);
if ($parent instanceof \PhpParser\Node\FunctionLike) {
return null;
}
if ($parent instanceof \PhpParser\Node) {
return $this->findFirstPrevious($parent, $filter, $lookupParent);
return $this->findFirstPrevious($parent, $filter);
}
return null;
}

2
vendor/autoload.php vendored
View File

@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) {
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit7aec7320e7d538bcbe4cccc189ae6409::getLoader();
return ComposerAutoloaderInitef39b644032afdd2cee5c7b0290dc06d::getLoader();

View File

@ -55,6 +55,7 @@ return array(
'PHPStan\\PhpDocParser\\Ast\\Type\\IdentifierTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php',
'PHPStan\\PhpDocParser\\Ast\\Type\\IntersectionTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php',
'PHPStan\\PhpDocParser\\Ast\\Type\\NullableTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php',
'PHPStan\\PhpDocParser\\Ast\\Type\\OffsetAccessTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php',
'PHPStan\\PhpDocParser\\Ast\\Type\\ThisTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php',
'PHPStan\\PhpDocParser\\Ast\\Type\\TypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php',
'PHPStan\\PhpDocParser\\Ast\\Type\\UnionTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php',

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInit7aec7320e7d538bcbe4cccc189ae6409
class ComposerAutoloaderInitef39b644032afdd2cee5c7b0290dc06d
{
private static $loader;
@ -22,19 +22,19 @@ class ComposerAutoloaderInit7aec7320e7d538bcbe4cccc189ae6409
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInit7aec7320e7d538bcbe4cccc189ae6409', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInitef39b644032afdd2cee5c7b0290dc06d', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInit7aec7320e7d538bcbe4cccc189ae6409', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInitef39b644032afdd2cee5c7b0290dc06d', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit7aec7320e7d538bcbe4cccc189ae6409::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInitef39b644032afdd2cee5c7b0290dc06d::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$includeFiles = \Composer\Autoload\ComposerStaticInit7aec7320e7d538bcbe4cccc189ae6409::$files;
$includeFiles = \Composer\Autoload\ComposerStaticInitef39b644032afdd2cee5c7b0290dc06d::$files;
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire7aec7320e7d538bcbe4cccc189ae6409($fileIdentifier, $file);
composerRequireef39b644032afdd2cee5c7b0290dc06d($fileIdentifier, $file);
}
return $loader;
@ -46,7 +46,7 @@ class ComposerAutoloaderInit7aec7320e7d538bcbe4cccc189ae6409
* @param string $file
* @return void
*/
function composerRequire7aec7320e7d538bcbe4cccc189ae6409($fileIdentifier, $file)
function composerRequireef39b644032afdd2cee5c7b0290dc06d($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInit7aec7320e7d538bcbe4cccc189ae6409
class ComposerStaticInitef39b644032afdd2cee5c7b0290dc06d
{
public static $files = array (
'320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
@ -424,6 +424,7 @@ class ComposerStaticInit7aec7320e7d538bcbe4cccc189ae6409
'PHPStan\\PhpDocParser\\Ast\\Type\\IdentifierTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php',
'PHPStan\\PhpDocParser\\Ast\\Type\\IntersectionTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php',
'PHPStan\\PhpDocParser\\Ast\\Type\\NullableTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php',
'PHPStan\\PhpDocParser\\Ast\\Type\\OffsetAccessTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php',
'PHPStan\\PhpDocParser\\Ast\\Type\\ThisTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php',
'PHPStan\\PhpDocParser\\Ast\\Type\\TypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php',
'PHPStan\\PhpDocParser\\Ast\\Type\\UnionTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php',
@ -3882,9 +3883,9 @@ class ComposerStaticInit7aec7320e7d538bcbe4cccc189ae6409
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit7aec7320e7d538bcbe4cccc189ae6409::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit7aec7320e7d538bcbe4cccc189ae6409::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit7aec7320e7d538bcbe4cccc189ae6409::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInitef39b644032afdd2cee5c7b0290dc06d::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitef39b644032afdd2cee5c7b0290dc06d::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitef39b644032afdd2cee5c7b0290dc06d::$classMap;
}, null, ClassLoader::class);
}

View File

@ -1036,17 +1036,17 @@
},
{
"name": "phpstan\/phpdoc-parser",
"version": "1.5.0",
"version_normalized": "1.5.0.0",
"version": "1.5.1",
"version_normalized": "1.5.1.0",
"source": {
"type": "git",
"url": "https:\/\/github.com\/phpstan\/phpdoc-parser.git",
"reference": "6cafed9212aa56aaa3aaf3b67c0fd1e5de53f50c"
"reference": "981cc368a216c988e862a75e526b6076987d1b50"
},
"dist": {
"type": "zip",
"url": "https:\/\/api.github.com\/repos\/phpstan\/phpdoc-parser\/zipball\/6cafed9212aa56aaa3aaf3b67c0fd1e5de53f50c",
"reference": "6cafed9212aa56aaa3aaf3b67c0fd1e5de53f50c",
"url": "https:\/\/api.github.com\/repos\/phpstan\/phpdoc-parser\/zipball\/981cc368a216c988e862a75e526b6076987d1b50",
"reference": "981cc368a216c988e862a75e526b6076987d1b50",
"shasum": ""
},
"require": {
@ -1060,7 +1060,7 @@
"phpunit\/phpunit": "^9.5",
"symfony\/process": "^5.2"
},
"time": "2022-05-04T07:46:54+00:00",
"time": "2022-05-05T11:32:40+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -1077,7 +1077,7 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https:\/\/github.com\/phpstan\/phpdoc-parser\/issues",
"source": "https:\/\/github.com\/phpstan\/phpdoc-parser\/tree\/1.5.0"
"source": "https:\/\/github.com\/phpstan\/phpdoc-parser\/tree\/1.5.1"
},
"install-path": "..\/phpstan\/phpdoc-parser"
},

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,23 @@
<?php
declare (strict_types=1);
namespace PHPStan\PhpDocParser\Ast\Type;
use PHPStan\PhpDocParser\Ast\NodeAttributes;
class OffsetAccessTypeNode implements \PHPStan\PhpDocParser\Ast\Type\TypeNode
{
use NodeAttributes;
/** @var TypeNode */
public $type;
/** @var TypeNode */
public $offset;
public function __construct(\PHPStan\PhpDocParser\Ast\Type\TypeNode $type, \PHPStan\PhpDocParser\Ast\Type\TypeNode $offset)
{
$this->type = $type;
$this->offset = $offset;
}
public function __toString() : string
{
return $this->type . '[' . $this->offset . ']';
}
}

View File

@ -62,14 +62,14 @@ class TypeParser
$tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_PHPDOC_EOL);
$tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_PARENTHESES);
if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
return $this->tryParseArray($tokens, $type);
return $this->tryParseArrayOrOffsetAccess($tokens, $type);
}
return $type;
}
if ($tokens->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_THIS_VARIABLE)) {
$type = new \PHPStan\PhpDocParser\Ast\Type\ThisTypeNode();
if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
return $this->tryParseArray($tokens, $type);
return $this->tryParseArrayOrOffsetAccess($tokens, $type);
}
return $type;
}
@ -90,16 +90,16 @@ class TypeParser
}
$type = $this->parseGeneric($tokens, $type);
if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
$type = $this->tryParseArray($tokens, $type);
$type = $this->tryParseArrayOrOffsetAccess($tokens, $type);
}
} elseif ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_PARENTHESES)) {
$type = $this->tryParseCallable($tokens, $type);
} elseif ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
$type = $this->tryParseArray($tokens, $type);
$type = $this->tryParseArrayOrOffsetAccess($tokens, $type);
} elseif ($type->name === 'array' && $tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
$type = $this->parseArrayShape($tokens, $type);
if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
$type = $this->tryParseArray($tokens, $type);
$type = $this->tryParseArrayOrOffsetAccess($tokens, $type);
}
}
return $type;
@ -218,7 +218,7 @@ class TypeParser
$type = $this->parseArrayShape($tokens, $type);
}
if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
$type = $this->tryParseArray($tokens, $type);
$type = $this->tryParseArrayOrOffsetAccess($tokens, $type);
}
return new \PHPStan\PhpDocParser\Ast\Type\NullableTypeNode($type);
}
@ -318,7 +318,7 @@ class TypeParser
}
}
if ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
$type = $this->tryParseArray($tokens, $type);
$type = $this->tryParseArrayOrOffsetAccess($tokens, $type);
}
return $type;
}
@ -336,15 +336,23 @@ class TypeParser
return $type;
}
/** @phpstan-impure */
private function tryParseArray(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, \PHPStan\PhpDocParser\Ast\Type\TypeNode $type) : \PHPStan\PhpDocParser\Ast\Type\TypeNode
private function tryParseArrayOrOffsetAccess(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, \PHPStan\PhpDocParser\Ast\Type\TypeNode $type) : \PHPStan\PhpDocParser\Ast\Type\TypeNode
{
try {
while ($tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
$tokens->pushSavePoint();
$canBeOffsetAccessType = !$tokens->isPrecededByHorizontalWhitespace();
$tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_OPEN_SQUARE_BRACKET);
$tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_SQUARE_BRACKET);
$tokens->dropSavePoint();
$type = new \PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode($type);
if ($canBeOffsetAccessType && !$tokens->isCurrentTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_SQUARE_BRACKET)) {
$offset = $this->parse($tokens);
$tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_SQUARE_BRACKET);
$tokens->dropSavePoint();
$type = new \PHPStan\PhpDocParser\Ast\Type\OffsetAccessTypeNode($type, $offset);
} else {
$tokens->consumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_SQUARE_BRACKET);
$tokens->dropSavePoint();
$type = new \PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode($type);
}
}
} catch (\PHPStan\PhpDocParser\Parser\ParserException $e) {
$tokens->rollback();

View File

@ -9,8 +9,8 @@ $loader = require_once __DIR__.'/autoload.php';
if (!class_exists('AutoloadIncluder', false) && !interface_exists('AutoloadIncluder', false) && !trait_exists('AutoloadIncluder', false)) {
spl_autoload_call('RectorPrefix20220505\AutoloadIncluder');
}
if (!class_exists('ComposerAutoloaderInit7aec7320e7d538bcbe4cccc189ae6409', false) && !interface_exists('ComposerAutoloaderInit7aec7320e7d538bcbe4cccc189ae6409', false) && !trait_exists('ComposerAutoloaderInit7aec7320e7d538bcbe4cccc189ae6409', false)) {
spl_autoload_call('RectorPrefix20220505\ComposerAutoloaderInit7aec7320e7d538bcbe4cccc189ae6409');
if (!class_exists('ComposerAutoloaderInitef39b644032afdd2cee5c7b0290dc06d', false) && !interface_exists('ComposerAutoloaderInitef39b644032afdd2cee5c7b0290dc06d', false) && !trait_exists('ComposerAutoloaderInitef39b644032afdd2cee5c7b0290dc06d', false)) {
spl_autoload_call('RectorPrefix20220505\ComposerAutoloaderInitef39b644032afdd2cee5c7b0290dc06d');
}
if (!class_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !interface_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !trait_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false)) {
spl_autoload_call('RectorPrefix20220505\Helmich\TypoScriptParser\Parser\AST\Statement');
@ -59,9 +59,9 @@ if (!function_exists('print_node')) {
return \RectorPrefix20220505\print_node(...func_get_args());
}
}
if (!function_exists('composerRequire7aec7320e7d538bcbe4cccc189ae6409')) {
function composerRequire7aec7320e7d538bcbe4cccc189ae6409() {
return \RectorPrefix20220505\composerRequire7aec7320e7d538bcbe4cccc189ae6409(...func_get_args());
if (!function_exists('composerRequireef39b644032afdd2cee5c7b0290dc06d')) {
function composerRequireef39b644032afdd2cee5c7b0290dc06d() {
return \RectorPrefix20220505\composerRequireef39b644032afdd2cee5c7b0290dc06d(...func_get_args());
}
}
if (!function_exists('scanPath')) {