Skip to content

Commit

Permalink
[AutoImport] Do not add cast on valid Integer type on Name Node on au…
Browse files Browse the repository at this point in the history
…to import enabled (#6236)

* [AutoImport] Do not add cast on valid Integer type on Name Node on auto import enabled

* add ClassConstFetchTypeResolver

* Fix phpstan

* Fix phpstan

* typo fix

* add failing fixture on static call

* fix

* clean up
  • Loading branch information
samsonasik committed Aug 16, 2024
1 parent 3ed476b commit 174adf1
Show file tree
Hide file tree
Showing 7 changed files with 147 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/DependencyInjection/LazyContainerFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
use Rector\NodeTypeResolver\NodeTypeResolver;
use Rector\NodeTypeResolver\NodeTypeResolver\CastTypeResolver;
use Rector\NodeTypeResolver\NodeTypeResolver\ClassAndInterfaceTypeResolver;
use Rector\NodeTypeResolver\NodeTypeResolver\ClassConstFetchTypeResolver;
use Rector\NodeTypeResolver\NodeTypeResolver\ClassMethodOrClassConstTypeResolver;
use Rector\NodeTypeResolver\NodeTypeResolver\IdentifierTypeResolver;
use Rector\NodeTypeResolver\NodeTypeResolver\NameTypeResolver;
Expand Down Expand Up @@ -345,6 +346,7 @@ final class LazyContainerFactory
NewTypeResolver::class,
ParamTypeResolver::class,
PropertyFetchTypeResolver::class,
ClassConstFetchTypeResolver::class,
PropertyTypeResolver::class,
ScalarTypeResolver::class,
TraitTypeResolver::class,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

declare(strict_types=1);

namespace Rector\NodeTypeResolver\NodeTypeResolver;

use PhpParser\Node;
use PhpParser\Node\Expr\ClassConstFetch;
use PhpParser\Node\Name;
use PhpParser\Node\Name\FullyQualified;
use PHPStan\Analyser\Scope;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use Rector\NodeTypeResolver\Contract\NodeTypeResolverInterface;
use Rector\NodeTypeResolver\Node\AttributeKey;

/**
* @implements NodeTypeResolverInterface<ClassConstFetch>
*/
final class ClassConstFetchTypeResolver implements NodeTypeResolverInterface
{
/**
* @return array<class-string<Node>>
*/
public function getNodeClasses(): array
{
return [ClassConstFetch::class];
}

/**
* @param ClassConstFetch $node
*/
public function resolve(Node $node): Type
{
$scope = $node->getAttribute(AttributeKey::SCOPE);

if (! $scope instanceof Scope) {
return new MixedType();
}

if ($node->class instanceof FullyQualified) {
return $scope->getType($node);
}

if ($node->class instanceof Name && $node->class->hasAttribute(AttributeKey::NAMESPACED_NAME)) {
$newNode = clone $node;
$newNode->class = new FullyQualified($node->class->getAttribute(AttributeKey::NAMESPACED_NAME));

return $scope->getType($newNode);
}

return $scope->getType($node);
}
}
5 changes: 5 additions & 0 deletions src/NodeTypeResolver/NodeTypeResolver/NameTypeResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ public function getNodeClasses(): array
*/
public function resolve(Node $node): Type
{
// not instanceof FullyQualified means it is a Name
if (! $node instanceof FullyQualified && $node->hasAttribute(AttributeKey::NAMESPACED_NAME)) {
return $this->resolve(new FullyQualified($node->getAttribute(AttributeKey::NAMESPACED_NAME)));
}

if ($node->toString() === ObjectReference::PARENT) {
return $this->resolveParent($node);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace Rector\Tests\Issues\AutoImport\Fixture;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class DoNotAddCastValidIntTypeFromName extends Command
{
private ?OutputInterface $outputInterface = null;

protected function execute(InputInterface $input, OutputInterface $output): int
{
return Command::SUCCESS;
}
}

?>
-----
<?php

namespace Rector\Tests\Issues\AutoImport\Fixture;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class DoNotAddCastValidIntTypeFromName extends Command
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
return Command::SUCCESS;
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

namespace Rector\Tests\Issues\AutoImport\Fixture;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Rector\Tests\Issues\AutoImport\Source\SomeClass;

class DoNotAddCastValidIntTypeFromName2 extends Command
{
private ?OutputInterface $outputInterface = null;

protected function execute(InputInterface $input, OutputInterface $output): int
{
return SomeClass::zero();
}
}

?>
-----
<?php

namespace Rector\Tests\Issues\AutoImport\Fixture;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Rector\Tests\Issues\AutoImport\Source\SomeClass;

class DoNotAddCastValidIntTypeFromName2 extends Command
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
return SomeClass::zero();
}
}

?>
4 changes: 4 additions & 0 deletions tests/Issues/AutoImport/Source/SomeClass.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,8 @@

class SomeClass
{
public static function zero(): int
{
return 0;
}
}
6 changes: 6 additions & 0 deletions tests/Issues/AutoImport/config/configured_rule.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
use Rector\Php80\Rector\Class_\AnnotationToAttributeRector;
use Rector\Php80\ValueObject\AnnotationToAttribute;
use Rector\Renaming\Rector\Name\RenameClassRector;
use Rector\DeadCode\Rector\Property\RemoveUnusedPrivatePropertyRector;
use Rector\Symfony\Symfony44\Rector\ClassMethod\ConsoleExecuteReturnIntRector;

return static function (RectorConfig $rectorConfig): void {
$rectorConfig->importNames();
Expand All @@ -18,4 +20,8 @@
$rectorConfig->ruleWithConfiguration(AnnotationToAttributeRector::class, [
new AnnotationToAttribute('Doctrine\ORM\Mapping\Entity'),
]);
$rectorConfig->rules([
ConsoleExecuteReturnIntRector::class,
RemoveUnusedPrivatePropertyRector::class,
]);
};

0 comments on commit 174adf1

Please sign in to comment.