mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-19 17:42:23 +00:00
Cherry picks (#1074)
This commit is contained in:
parent
edd1ebd5f6
commit
fabc27e122
|
@ -33,7 +33,7 @@ use Rector\Core\PhpParser\Parser\PhpParserLexerFactory;
|
|||
use Rector\NodeTypeResolver\DependencyInjection\PHPStanServicesFactory;
|
||||
use Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocator\IntermediateSourceLocator;
|
||||
use Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocatorProvider\DynamicSourceLocatorProvider;
|
||||
use Symfony\Component\Console\Application as SymfonyApplication;
|
||||
use Symfony\Component\Console\Application;
|
||||
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
|
||||
use function Symfony\Component\DependencyInjection\Loader\Configurator\service;
|
||||
|
@ -76,7 +76,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
|
|||
__DIR__ . '/../src/PhpParser/NodeVisitor/CreatedByRuleNodeVisitor.php',
|
||||
]);
|
||||
|
||||
$services->alias(SymfonyApplication::class, ConsoleApplication::class);
|
||||
$services->alias(Application::class, ConsoleApplication::class);
|
||||
|
||||
$services->set(FileSystemGuard::class);
|
||||
|
||||
|
|
|
@ -4,30 +4,33 @@ declare(strict_types=1);
|
|||
|
||||
namespace Rector\NodeCollector\ScopeResolver;
|
||||
|
||||
use PhpParser\Node;
|
||||
use PHPStan\Analyser\Scope;
|
||||
use PHPStan\Reflection\ClassReflection;
|
||||
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||
|
||||
final class ParentClassScopeResolver
|
||||
{
|
||||
public function resolveParentClassName(Node $node): ?string
|
||||
public function resolveParentClassName(Scope $scope): ?string
|
||||
{
|
||||
$scope = $node->getAttribute(AttributeKey::SCOPE);
|
||||
if (! $scope instanceof Scope) {
|
||||
$parentClassReflection = $this->resolveParentClassReflection($scope);
|
||||
if (! $parentClassReflection instanceof ClassReflection) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $parentClassReflection->getName();
|
||||
}
|
||||
|
||||
public function resolveParentClassReflection(Scope $scope): ?ClassReflection
|
||||
{
|
||||
$classReflection = $scope->getClassReflection();
|
||||
if (! $classReflection instanceof ClassReflection) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$parentClassReflection = $classReflection->getParentClass();
|
||||
if ($parentClassReflection === false) {
|
||||
return null;
|
||||
if ($parentClassReflection instanceof ClassReflection) {
|
||||
return $parentClassReflection;
|
||||
}
|
||||
|
||||
return $parentClassReflection->getName();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -70,7 +70,7 @@ final class IdentifierTypeMapper implements PhpDocTypeMapperInterface
|
|||
}
|
||||
|
||||
if ($loweredName === ObjectReference::PARENT()->getValue()) {
|
||||
return $this->mapParent($node, $scope);
|
||||
return $this->mapParent($scope);
|
||||
}
|
||||
|
||||
if ($loweredName === ObjectReference::STATIC()->getValue()) {
|
||||
|
@ -99,19 +99,14 @@ final class IdentifierTypeMapper implements PhpDocTypeMapperInterface
|
|||
return new SelfObjectType($className);
|
||||
}
|
||||
|
||||
private function mapParent(Node $node, Scope $scope): ParentStaticType | MixedType
|
||||
private function mapParent(Scope $scope): ParentStaticType | MixedType
|
||||
{
|
||||
$parentClassName = $this->parentClassScopeResolver->resolveParentClassName($node);
|
||||
if ($parentClassName === null) {
|
||||
$parentClassReflection = $this->parentClassScopeResolver->resolveParentClassReflection($scope);
|
||||
if (! $parentClassReflection instanceof ClassReflection) {
|
||||
return new MixedType();
|
||||
}
|
||||
|
||||
$classReflection = $scope->getClassReflection();
|
||||
if (! $classReflection instanceof ClassReflection) {
|
||||
throw new ShouldNotHappenException();
|
||||
}
|
||||
|
||||
return new ParentStaticType($classReflection);
|
||||
return new ParentStaticType($parentClassReflection);
|
||||
}
|
||||
|
||||
private function mapStatic(Node $node, Scope $scope): MixedType | StaticType
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
namespace Rector\Tests\TypeDeclaration\Rector\FunctionLike\ParamTypeDeclarationRector\Fixture;
|
||||
|
||||
class ThisClass
|
||||
final class ThisClass
|
||||
{
|
||||
/**
|
||||
* @param $this $param
|
||||
|
@ -20,7 +20,7 @@ class ThisClass
|
|||
|
||||
namespace Rector\Tests\TypeDeclaration\Rector\FunctionLike\ParamTypeDeclarationRector\Fixture;
|
||||
|
||||
class ThisClass
|
||||
final class ThisClass
|
||||
{
|
||||
/**
|
||||
* @param $this $param
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
namespace Rector\Tests\TypeDeclaration\Rector\FunctionLike\ReturnTypeDeclarationRector\Fixture;
|
||||
|
||||
class ThisClass
|
||||
final class ThisClass
|
||||
{
|
||||
/**
|
||||
* @return $this
|
||||
|
@ -19,7 +19,7 @@ class ThisClass
|
|||
|
||||
namespace Rector\Tests\TypeDeclaration\Rector\FunctionLike\ReturnTypeDeclarationRector\Fixture;
|
||||
|
||||
class ThisClass
|
||||
final class ThisClass
|
||||
{
|
||||
/**
|
||||
* @return $this
|
||||
|
|
|
@ -10,6 +10,7 @@ use PhpParser\Node\Name;
|
|||
use PhpParser\Node\Stmt\Class_;
|
||||
use PhpParser\Node\Stmt\ClassMethod;
|
||||
use PhpParser\Node\Stmt\Expression;
|
||||
use PHPStan\Reflection\ClassReflection;
|
||||
use Rector\Core\Enum\ObjectReference;
|
||||
use Rector\Core\NodeAnalyzer\ClassAnalyzer;
|
||||
use Rector\Core\NodeManipulator\ClassMethodManipulator;
|
||||
|
@ -86,8 +87,10 @@ CODE_SAMPLE
|
|||
return null;
|
||||
}
|
||||
|
||||
$parentClassName = $this->parentClassScopeResolver->resolveParentClassName($node);
|
||||
if ($parentClassName === null) {
|
||||
$scope = $node->getAttribute(AttributeKey::SCOPE);
|
||||
|
||||
$parentClassReflection = $this->parentClassScopeResolver->resolveParentClassReflection($scope);
|
||||
if (! $parentClassReflection instanceof ClassReflection) {
|
||||
$this->removeNode($node);
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -13,12 +13,12 @@ use PhpParser\Node\Name;
|
|||
use PhpParser\Node\Stmt\Class_;
|
||||
use PhpParser\Node\Stmt\ClassMethod;
|
||||
use PhpParser\Node\Stmt\Expression;
|
||||
use PHPStan\Analyser\Scope;
|
||||
use PHPStan\Reflection\ClassReflection;
|
||||
use Rector\Core\Enum\ObjectReference;
|
||||
use Rector\Core\Rector\AbstractRector;
|
||||
use Rector\Core\ValueObject\MethodName;
|
||||
use Rector\Core\ValueObject\PhpVersionFeature;
|
||||
use Rector\NodeCollector\ScopeResolver\ParentClassScopeResolver;
|
||||
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||
use Rector\Php70\NodeAnalyzer\Php4ConstructorClassMethodAnalyzer;
|
||||
use Rector\VersionBonding\Contract\MinPhpVersionInterface;
|
||||
|
@ -32,7 +32,8 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
|
|||
final class Php4ConstructorRector extends AbstractRector implements MinPhpVersionInterface
|
||||
{
|
||||
public function __construct(
|
||||
private Php4ConstructorClassMethodAnalyzer $php4ConstructorClassMethodAnalyzer
|
||||
private Php4ConstructorClassMethodAnalyzer $php4ConstructorClassMethodAnalyzer,
|
||||
private ParentClassScopeResolver $parentClassScopeResolver
|
||||
) {
|
||||
}
|
||||
|
||||
|
@ -150,10 +151,11 @@ CODE_SAMPLE
|
|||
|
||||
private function processParentPhp4ConstructCall(StaticCall $staticCall): void
|
||||
{
|
||||
$parentClassName = $this->resolveParentClassName($staticCall);
|
||||
$scope = $staticCall->getAttribute(AttributeKey::SCOPE);
|
||||
$parentClassReflection = $this->parentClassScopeResolver->resolveParentClassReflection($scope);
|
||||
|
||||
// no parent class
|
||||
if ($parentClassName === null) {
|
||||
if (! $parentClassReflection instanceof ClassReflection) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -162,7 +164,7 @@ CODE_SAMPLE
|
|||
}
|
||||
|
||||
// rename ParentClass
|
||||
if ($this->isName($staticCall->class, $parentClassName)) {
|
||||
if ($this->isName($staticCall->class, $parentClassReflection->getName())) {
|
||||
$staticCall->class = new Name(ObjectReference::PARENT()->getValue());
|
||||
}
|
||||
|
||||
|
@ -171,34 +173,13 @@ CODE_SAMPLE
|
|||
}
|
||||
|
||||
// it's not a parent PHP 4 constructor call
|
||||
if (! $this->isName($staticCall->name, $parentClassName)) {
|
||||
if (! $this->isName($staticCall->name, $parentClassReflection->getName())) {
|
||||
return;
|
||||
}
|
||||
|
||||
$staticCall->name = new Identifier(MethodName::CONSTRUCT);
|
||||
}
|
||||
|
||||
private function resolveParentClassName(StaticCall $staticCall): ?string
|
||||
{
|
||||
$scope = $staticCall->getAttribute(AttributeKey::SCOPE);
|
||||
if (! $scope instanceof Scope) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$classReflection = $scope->getClassReflection();
|
||||
|
||||
if (! $classReflection instanceof ClassReflection) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$parentClassReflection = $classReflection->getParentClass();
|
||||
if (! $parentClassReflection instanceof ClassReflection) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $parentClassReflection->getName();
|
||||
}
|
||||
|
||||
private function isLocalMethodCallNamed(Expr $expr, string $name): bool
|
||||
{
|
||||
if (! $expr instanceof MethodCall) {
|
||||
|
|
|
@ -19,6 +19,7 @@ use Rector\Core\Reflection\ReflectionResolver;
|
|||
use Rector\Core\ValueObject\PhpVersionFeature;
|
||||
use Rector\NodeCollector\ScopeResolver\ParentClassScopeResolver;
|
||||
use Rector\NodeCollector\StaticAnalyzer;
|
||||
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||
use Rector\VersionBonding\Contract\MinPhpVersionInterface;
|
||||
use ReflectionMethod;
|
||||
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
|
||||
|
@ -156,7 +157,9 @@ CODE_SAMPLE
|
|||
return true;
|
||||
}
|
||||
|
||||
$parentClassName = $this->parentClassScopeResolver->resolveParentClassName($staticCall);
|
||||
$scope = $staticCall->getAttribute(AttributeKey::SCOPE);
|
||||
|
||||
$parentClassName = $this->parentClassScopeResolver->resolveParentClassName($scope);
|
||||
return $className === $parentClassName;
|
||||
}
|
||||
|
||||
|
|
|
@ -6,9 +6,11 @@ namespace Rector\Removing\Rector\Class_;
|
|||
|
||||
use PhpParser\Node;
|
||||
use PhpParser\Node\Stmt\Class_;
|
||||
use PHPStan\Reflection\ClassReflection;
|
||||
use Rector\Core\Contract\Rector\ConfigurableRectorInterface;
|
||||
use Rector\Core\Rector\AbstractRector;
|
||||
use Rector\NodeCollector\ScopeResolver\ParentClassScopeResolver;
|
||||
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
|
||||
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
|
||||
|
||||
|
@ -69,13 +71,15 @@ CODE_SAMPLE
|
|||
*/
|
||||
public function refactor(Node $node): ?Node
|
||||
{
|
||||
$parentClassName = $this->parentClassScopeResolver->resolveParentClassName($node);
|
||||
if ($parentClassName === null) {
|
||||
$scope = $node->getAttribute(AttributeKey::SCOPE);
|
||||
|
||||
$parentClassReflection = $this->parentClassScopeResolver->resolveParentClassReflection($scope);
|
||||
if (! $parentClassReflection instanceof ClassReflection) {
|
||||
return null;
|
||||
}
|
||||
|
||||
foreach ($this->parentClassesToRemove as $parentClassToRemove) {
|
||||
if ($parentClassName !== $parentClassToRemove) {
|
||||
if ($parentClassReflection->getName() !== $parentClassToRemove) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@ use Rector\Core\Contract\Rector\ConfigurableRectorInterface;
|
|||
use Rector\Core\Rector\AbstractRector;
|
||||
use Rector\Core\ValueObject\Visibility;
|
||||
use Rector\NodeCollector\ScopeResolver\ParentClassScopeResolver;
|
||||
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||
use Rector\Visibility\ValueObject\ChangeMethodVisibility;
|
||||
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
|
||||
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
|
||||
|
@ -96,7 +97,9 @@ CODE_SAMPLE
|
|||
*/
|
||||
public function refactor(Node $node): ?Node
|
||||
{
|
||||
$parentClassName = $this->parentClassScopeResolver->resolveParentClassName($node);
|
||||
$scope = $node->getAttribute(AttributeKey::SCOPE);
|
||||
|
||||
$parentClassName = $this->parentClassScopeResolver->resolveParentClassName($scope);
|
||||
if ($parentClassName === null) {
|
||||
return null;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user