Updated Rector to commit 36ac5305f1b7b1007e4cbf6260695d2ae16fef5f

36ac5305f1 [DX] Use own path normalizer (#2881)
This commit is contained in:
Tomas Votruba 2022-09-01 11:48:21 +00:00
parent 0bff8e99f4
commit d82c31f345
11 changed files with 115 additions and 57 deletions

View File

@ -55,10 +55,6 @@ use RectorPrefix202209\Symplify\PackageBuilder\Reflection\ClassLikeExistenceChec
use RectorPrefix202209\Symplify\PackageBuilder\Reflection\PrivatesAccessor;
use RectorPrefix202209\Symplify\PackageBuilder\Reflection\PrivatesCaller;
use RectorPrefix202209\Symplify\PackageBuilder\Yaml\ParametersMerger;
use RectorPrefix202209\Symplify\SmartFileSystem\FileSystemFilter;
use RectorPrefix202209\Symplify\SmartFileSystem\FileSystemGuard;
use RectorPrefix202209\Symplify\SmartFileSystem\Finder\FinderSanitizer;
use RectorPrefix202209\Symplify\SmartFileSystem\Normalizer\PathNormalizer;
return static function (RectorConfig $rectorConfig) : void {
// make use of https://github.com/symplify/easy-parallel
$rectorConfig->import(EasyParallelConfig::FILE_PATH);
@ -123,11 +119,8 @@ return static function (RectorConfig $rectorConfig) : void {
$services->set(Parser::class)->factory([service(PHPStanServicesFactory::class), 'createPHPStanParser']);
$services->set(Lexer::class)->factory([service(PHPStanServicesFactory::class), 'createEmulativeLexer']);
// symplify/package-builder
$services->set(FileSystemGuard::class);
$services->set(PrivatesAccessor::class);
$services->set(PrivatesCaller::class);
$services->set(FinderSanitizer::class);
$services->set(FileSystemFilter::class);
$services->set(ParameterProvider::class)->arg('$container', service('service_container'));
$services->set(InflectorFactory::class);
$services->set(Inflector::class)->factory([service(InflectorFactory::class), 'build']);
@ -162,5 +155,4 @@ return static function (RectorConfig $rectorConfig) : void {
$services->set(ConstExprParser::class);
// skipper
$services->set(ClassLikeExistenceChecker::class);
$services->set(PathNormalizer::class);
};

View File

@ -4,8 +4,8 @@ declare (strict_types=1);
namespace Rector\Skipper\SkipCriteriaResolver;
use Rector\Core\Configuration\Option;
use Rector\Core\FileSystem\FilePathHelper;
use RectorPrefix202209\Symplify\PackageBuilder\Parameter\ParameterProvider;
use RectorPrefix202209\Symplify\SmartFileSystem\Normalizer\PathNormalizer;
/**
* @see \Rector\Tests\Skipper\SkipCriteriaResolver\SkippedPathsResolver\SkippedPathsResolverTest
*/
@ -22,13 +22,13 @@ final class SkippedPathsResolver
private $parameterProvider;
/**
* @readonly
* @var \Symplify\SmartFileSystem\Normalizer\PathNormalizer
* @var \Rector\Core\FileSystem\FilePathHelper
*/
private $pathNormalizer;
public function __construct(ParameterProvider $parameterProvider, PathNormalizer $pathNormalizer)
private $filePathHelper;
public function __construct(ParameterProvider $parameterProvider, FilePathHelper $filePathHelper)
{
$this->parameterProvider = $parameterProvider;
$this->pathNormalizer = $pathNormalizer;
$this->filePathHelper = $filePathHelper;
}
/**
* @return string[]
@ -44,12 +44,11 @@ final class SkippedPathsResolver
continue;
}
if (\file_exists($value)) {
$this->skippedPaths[] = $this->pathNormalizer->normalizePath($value);
$this->skippedPaths[] = $this->filePathHelper->normalizePathAndSchema($value);
continue;
}
if (\strpos((string) $value, '*') !== \false) {
$this->skippedPaths[] = $this->pathNormalizer->normalizePath($value);
continue;
$this->skippedPaths[] = $this->filePathHelper->normalizePathAndSchema($value);
}
}
return $this->skippedPaths;

View File

@ -5,10 +5,10 @@ namespace Rector\VendorLocker\NodeVendorLocker;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\FileSystem\FilePathHelper;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer;
use Rector\NodeNameResolver\NodeNameResolver;
use RectorPrefix202209\Symplify\SmartFileSystem\Normalizer\PathNormalizer;
final class ClassMethodParamVendorLockResolver
{
/**
@ -16,11 +16,6 @@ final class ClassMethodParamVendorLockResolver
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Symplify\SmartFileSystem\Normalizer\PathNormalizer
*/
private $pathNormalizer;
/**
* @readonly
* @var \Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer
@ -31,12 +26,17 @@ final class ClassMethodParamVendorLockResolver
* @var \Rector\Core\Reflection\ReflectionResolver
*/
private $reflectionResolver;
public function __construct(NodeNameResolver $nodeNameResolver, PathNormalizer $pathNormalizer, FamilyRelationsAnalyzer $familyRelationsAnalyzer, ReflectionResolver $reflectionResolver)
/**
* @readonly
* @var \Rector\Core\FileSystem\FilePathHelper
*/
private $filePathHelper;
public function __construct(NodeNameResolver $nodeNameResolver, FamilyRelationsAnalyzer $familyRelationsAnalyzer, ReflectionResolver $reflectionResolver, FilePathHelper $filePathHelper)
{
$this->nodeNameResolver = $nodeNameResolver;
$this->pathNormalizer = $pathNormalizer;
$this->familyRelationsAnalyzer = $familyRelationsAnalyzer;
$this->reflectionResolver = $reflectionResolver;
$this->filePathHelper = $filePathHelper;
}
/**
* Includes non-vendor classes
@ -121,7 +121,7 @@ final class ClassMethodParamVendorLockResolver
if ($filePathPartName === '') {
return \true;
}
$normalizedFileName = $this->pathNormalizer->normalizePath($fileName);
$normalizedFileName = $this->filePathHelper->normalizePathAndSchema($fileName);
if (\strpos($normalizedFileName, $filePathPartName) !== \false) {
return \true;
}

View File

@ -10,6 +10,7 @@ use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use Rector\Core\FileSystem\FilePathHelper;
use Rector\Core\PhpParser\AstResolver;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\Core\ValueObject\MethodName;
@ -17,7 +18,6 @@ use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\TypeComparator\TypeComparator;
use Rector\StaticTypeMapper\StaticTypeMapper;
use Rector\TypeDeclaration\TypeInferer\ParamTypeInferer;
use RectorPrefix202209\Symplify\SmartFileSystem\Normalizer\PathNormalizer;
final class ParentClassMethodTypeOverrideGuard
{
/**
@ -25,11 +25,6 @@ final class ParentClassMethodTypeOverrideGuard
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Symplify\SmartFileSystem\Normalizer\PathNormalizer
*/
private $pathNormalizer;
/**
* @readonly
* @var \Rector\Core\PhpParser\AstResolver
@ -55,15 +50,20 @@ final class ParentClassMethodTypeOverrideGuard
* @var \Rector\StaticTypeMapper\StaticTypeMapper
*/
private $staticTypeMapper;
public function __construct(NodeNameResolver $nodeNameResolver, PathNormalizer $pathNormalizer, AstResolver $astResolver, ParamTypeInferer $paramTypeInferer, ReflectionResolver $reflectionResolver, TypeComparator $typeComparator, StaticTypeMapper $staticTypeMapper)
/**
* @readonly
* @var \Rector\Core\FileSystem\FilePathHelper
*/
private $filePathHelper;
public function __construct(NodeNameResolver $nodeNameResolver, AstResolver $astResolver, ParamTypeInferer $paramTypeInferer, ReflectionResolver $reflectionResolver, TypeComparator $typeComparator, StaticTypeMapper $staticTypeMapper, FilePathHelper $filePathHelper)
{
$this->nodeNameResolver = $nodeNameResolver;
$this->pathNormalizer = $pathNormalizer;
$this->astResolver = $astResolver;
$this->paramTypeInferer = $paramTypeInferer;
$this->reflectionResolver = $reflectionResolver;
$this->typeComparator = $typeComparator;
$this->staticTypeMapper = $staticTypeMapper;
$this->filePathHelper = $filePathHelper;
}
public function isReturnTypeChangeAllowed(ClassMethod $classMethod) : bool
{
@ -103,10 +103,10 @@ final class ParentClassMethodTypeOverrideGuard
/** @var string $currentFileName */
$currentFileName = $currentClassReflection->getFileName();
// child (current)
$normalizedCurrentFileName = $this->pathNormalizer->normalizePath($currentFileName);
$normalizedCurrentFileName = $this->filePathHelper->normalizePathAndSchema($currentFileName);
$isCurrentInVendor = \strpos($normalizedCurrentFileName, '/vendor/') !== \false;
// parent
$normalizedFileName = $this->pathNormalizer->normalizePath($fileName);
$normalizedFileName = $this->filePathHelper->normalizePathAndSchema($fileName);
$isParentInVendor = \strpos($normalizedFileName, '/vendor/') !== \false;
return $isCurrentInVendor && $isParentInVendor || !$isCurrentInVendor && !$isParentInVendor;
}

View File

@ -4,17 +4,17 @@ declare (strict_types=1);
namespace Rector\CodingStyle\Reflection;
use PHPStan\Reflection\MethodReflection;
use RectorPrefix202209\Symplify\SmartFileSystem\Normalizer\PathNormalizer;
use Rector\Core\FileSystem\FilePathHelper;
final class VendorLocationDetector
{
/**
* @readonly
* @var \Symplify\SmartFileSystem\Normalizer\PathNormalizer
* @var \Rector\Core\FileSystem\FilePathHelper
*/
private $pathNormalizer;
public function __construct(PathNormalizer $pathNormalizer)
private $filePathHelper;
public function __construct(FilePathHelper $filePathHelper)
{
$this->pathNormalizer = $pathNormalizer;
$this->filePathHelper = $filePathHelper;
}
public function detectMethodReflection(MethodReflection $methodReflection) : bool
{
@ -24,7 +24,7 @@ final class VendorLocationDetector
if ($fileName === null) {
return \false;
}
$normalizedFileName = $this->pathNormalizer->normalizePath($fileName);
$normalizedFileName = $this->filePathHelper->normalizePathAndSchema($fileName);
return \strpos($normalizedFileName, '/vendor/') !== \false;
}
}

View File

@ -50,7 +50,7 @@ class SomeClass
}
CODE_SAMPLE
, <<<'CODE_SAMPLE'
use Symplify\SmartFileSystem\SmartFileSystem;
use App\Custom\SmartFileSystem;
class SomeClass
{
@ -70,7 +70,7 @@ class SomeClass
}
}
CODE_SAMPLE
, [new StaticCallToMethodCall('Nette\\Utils\\FileSystem', 'write', 'Symplify\\SmartFileSystem\\SmartFileSystem', 'dumpFile')])]);
, [new StaticCallToMethodCall('Nette\\Utils\\FileSystem', 'write', 'App\\Custom\\SmartFileSystem', 'dumpFile')])]);
}
/**
* @return array<class-string<Node>>

View File

@ -17,12 +17,12 @@ final class VersionResolver
* @api
* @var string
*/
public const PACKAGE_VERSION = 'a80c361c217599c8c1b8b552d650b92039a9cad8';
public const PACKAGE_VERSION = '36ac5305f1b7b1007e4cbf6260695d2ae16fef5f';
/**
* @api
* @var string
*/
public const RELEASE_DATE = '2022-09-01 13:21:47';
public const RELEASE_DATE = '2022-09-01 11:43:47';
/**
* @var int
*/

View File

@ -3,10 +3,28 @@
declare (strict_types=1);
namespace Rector\Core\FileSystem;
use RectorPrefix202209\Nette\Utils\Strings;
use RectorPrefix202209\Symfony\Component\Filesystem\Filesystem;
use RectorPrefix202209\Webmozart\Assert\Assert;
/**
* @see \Rector\Core\Tests\FileSystem\FilePathHelperTest
*/
final class FilePathHelper
{
/**
* @see https://regex101.com/r/d4F5Fm/1
* @var string
*/
private const SCHEME_PATH_REGEX = '#^([a-z]+)\\:\\/\\/(.+)#';
/**
* @see https://regex101.com/r/no28vw/1
* @var string
*/
private const TWO_AND_MORE_SLASHES_REGEX = '#/{2,}#';
/**
* @var string
*/
private const SCHEME_UNDEFINED = 'undefined';
/**
* @readonly
* @var \Symfony\Component\Filesystem\Filesystem
@ -33,8 +51,57 @@ final class FilePathHelper
$relativeFilePath = $this->filesystem->makePathRelative($normalizedFileRealPath, $directory);
return \rtrim($relativeFilePath, '/');
}
/**
* Used from
* https://github.com/phpstan/phpstan-src/blob/02425e61aa48f0668b4efb3e73d52ad544048f65/src/File/FileHelper.php#L40, with custom modifications
*/
public function normalizePathAndSchema(string $originalPath) : string
{
$directorySeparator = \DIRECTORY_SEPARATOR;
$matches = Strings::match($originalPath, self::SCHEME_PATH_REGEX);
if ($matches !== null) {
[, $scheme, $path] = $matches;
} else {
$scheme = self::SCHEME_UNDEFINED;
$path = $originalPath;
}
$normalizedPath = \str_replace('\\', '/', (string) $path);
$path = Strings::replace($normalizedPath, self::TWO_AND_MORE_SLASHES_REGEX, '/');
$pathRoot = \strncmp($path, '/', \strlen('/')) === 0 ? $directorySeparator : '';
$pathParts = \explode('/', \trim($path, '/'));
$normalizedPathParts = $this->normalizePathParts($pathParts, $scheme);
$pathStart = $scheme !== self::SCHEME_UNDEFINED ? $scheme . '://' : '';
return $pathStart . $pathRoot . \implode($directorySeparator, $normalizedPathParts);
}
private function normalizePath(string $filePath) : string
{
return \str_replace('\\', '/', $filePath);
}
/**
* @param string[] $pathParts
* @return string[]
*/
private function normalizePathParts(array $pathParts, string $scheme) : array
{
$normalizedPathParts = [];
foreach ($pathParts as $pathPart) {
if ($pathPart === '.') {
continue;
}
if ($pathPart !== '..') {
$normalizedPathParts[] = $pathPart;
continue;
}
/** @var string $removedPart */
$removedPart = \array_pop($normalizedPathParts);
if ($scheme !== 'phar') {
continue;
}
if (\substr_compare($removedPart, '.phar', -\strlen('.phar')) !== 0) {
continue;
}
$scheme = self::SCHEME_UNDEFINED;
}
return $normalizedPathParts;
}
}

2
vendor/autoload.php vendored
View File

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

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInit16f503294ee2a523888913eeb55d415a
class ComposerAutoloaderInit987a820e4ab42f95f863b0dee1fe6a26
{
private static $loader;
@ -22,19 +22,19 @@ class ComposerAutoloaderInit16f503294ee2a523888913eeb55d415a
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInit16f503294ee2a523888913eeb55d415a', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInit987a820e4ab42f95f863b0dee1fe6a26', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInit16f503294ee2a523888913eeb55d415a', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInit987a820e4ab42f95f863b0dee1fe6a26', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit16f503294ee2a523888913eeb55d415a::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInit987a820e4ab42f95f863b0dee1fe6a26::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$includeFiles = \Composer\Autoload\ComposerStaticInit16f503294ee2a523888913eeb55d415a::$files;
$includeFiles = \Composer\Autoload\ComposerStaticInit987a820e4ab42f95f863b0dee1fe6a26::$files;
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire16f503294ee2a523888913eeb55d415a($fileIdentifier, $file);
composerRequire987a820e4ab42f95f863b0dee1fe6a26($fileIdentifier, $file);
}
return $loader;
@ -46,7 +46,7 @@ class ComposerAutoloaderInit16f503294ee2a523888913eeb55d415a
* @param string $file
* @return void
*/
function composerRequire16f503294ee2a523888913eeb55d415a($fileIdentifier, $file)
function composerRequire987a820e4ab42f95f863b0dee1fe6a26($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 ComposerStaticInit16f503294ee2a523888913eeb55d415a
class ComposerStaticInit987a820e4ab42f95f863b0dee1fe6a26
{
public static $files = array (
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
@ -3139,9 +3139,9 @@ class ComposerStaticInit16f503294ee2a523888913eeb55d415a
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit16f503294ee2a523888913eeb55d415a::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit16f503294ee2a523888913eeb55d415a::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit16f503294ee2a523888913eeb55d415a::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInit987a820e4ab42f95f863b0dee1fe6a26::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit987a820e4ab42f95f863b0dee1fe6a26::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit987a820e4ab42f95f863b0dee1fe6a26::$classMap;
}, null, ClassLoader::class);
}