fix RemoveUnusedAliasRector for doc vs class concurency (#2183)

fix RemoveUnusedAliasRector for doc vs class concurency
This commit is contained in:
Tomáš Votruba 2019-10-19 14:35:12 +02:00 committed by GitHub
commit 37ff104bb8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 76 additions and 0 deletions

View File

@ -157,6 +157,19 @@ final class PhpDocInfo
return $this->staticTypeMapper->mapPHPStanPhpDocTypeToPHPStanType($paramTagValue, $this->node); return $this->staticTypeMapper->mapPHPStanPhpDocTypeToPHPStanType($paramTagValue, $this->node);
} }
/**
* @return Type[]
*/
public function getParamTypes(): array
{
$paramTypes = [];
foreach ($this->getParamTagValues() as $paramTagValue) {
$paramTypes[] = $this->staticTypeMapper->mapPHPStanPhpDocTypeToPHPStanType($paramTagValue, $this->node);
}
return $paramTypes;
}
public function getVarType(): Type public function getVarType(): Type
{ {
$varTagValue = $this->getVarTagValue(); $varTagValue = $this->getVarTagValue();

View File

@ -18,10 +18,12 @@ use PhpParser\Node\Stmt\TraitUse;
use PhpParser\Node\Stmt\Use_; use PhpParser\Node\Stmt\Use_;
use PhpParser\Node\Stmt\UseUse; use PhpParser\Node\Stmt\UseUse;
use PhpParser\NodeVisitor\NameResolver; use PhpParser\NodeVisitor\NameResolver;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\CodingStyle\Imports\ShortNameResolver; use Rector\CodingStyle\Imports\ShortNameResolver;
use Rector\CodingStyle\Naming\ClassNaming; use Rector\CodingStyle\Naming\ClassNaming;
use Rector\Exception\ShouldNotHappenException; use Rector\Exception\ShouldNotHappenException;
use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\PHPStan\Type\AliasedObjectType;
use Rector\Rector\AbstractRector; use Rector\Rector\AbstractRector;
use Rector\RectorDefinition\CodeSample; use Rector\RectorDefinition\CodeSample;
use Rector\RectorDefinition\RectorDefinition; use Rector\RectorDefinition\RectorDefinition;
@ -306,6 +308,27 @@ PHP
return; return;
} }
/** @var PhpDocInfo $phpDocInfo */
$phpDocInfo = $this->getPhpDocInfo($node);
if ($phpDocInfo->getVarType()) {
$varType = $phpDocInfo->getVarType();
if ($varType instanceof AliasedObjectType) {
$possibleDocAliases[] = $varType->getClassName();
}
$returnType = $phpDocInfo->getReturnType();
if ($returnType instanceof AliasedObjectType) {
$possibleDocAliases[] = $returnType->getClassName();
}
foreach ($phpDocInfo->getParamTypes() as $paramType) {
if ($paramType instanceof AliasedObjectType) {
$possibleDocAliases[] = $paramType->getClassName();
}
}
}
// e.g. "use Dotrine\ORM\Mapping as ORM" etc.
$matches = Strings::matchAll($node->getDocComment()->getText(), '#\@(?<possible_alias>\w+)(\\\\)?#s'); $matches = Strings::matchAll($node->getDocComment()->getText(), '#\@(?<possible_alias>\w+)(\\\\)?#s');
foreach ($matches as $match) { foreach ($matches as $match) {
$possibleDocAliases[] = $match['possible_alias']; $possibleDocAliases[] = $match['possible_alias'];
@ -336,6 +359,10 @@ PHP
$shortNames = $this->shortNameResolver->resolveForNode($use); $shortNames = $this->shortNameResolver->resolveForNode($use);
foreach ($shortNames as $alias => $useImport) { foreach ($shortNames as $alias => $useImport) {
$shortName = $this->classNaming->getShortName($useImport); $shortName = $this->classNaming->getShortName($useImport);
if ($shortName === $alias) {
continue;
}
$useNamesAliasToName[$shortName][] = $alias; $useNamesAliasToName[$shortName][] = $alias;
} }

View File

@ -0,0 +1,17 @@
<?php
namespace Rector\CodingStyle\Tests\Rector\Use_\RemoveUnusedAliasRector\Fixture;
use SplFileInfo as NativeSplFileInfo;
use Symfony\Component\Finder\SplFileInfo;
final class KeepUsedDocParam
{
/**
* @param SplFileInfo $type
*/
public function run($type): void
{
$splFileInfo = new NativeSplFileInfo('tests/Posts/Year2018/Exceptions/Source/some_file.txt');
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace Rector\CodingStyle\Tests\Rector\Use_\RemoveUnusedAliasRector\Fixture;
use SplFileInfo as NativeSplFileInfo;
use Symfony\Component\Finder\SplFileInfo;
final class KeepUsedSplFileInfo
{
public function testSplFileInfo(): void
{
$splFileInfo = new NativeSplFileInfo('tests/Posts/Year2018/Exceptions/Source/some_file.txt');
/** @var SplFileInfo $file */
$file = array_pop($files);
}
}

View File

@ -22,6 +22,8 @@ final class RemoveUnusedAliasRectorTest extends AbstractRectorTestCase
{ {
yield [__DIR__ . '/Fixture/fixture.php.inc']; yield [__DIR__ . '/Fixture/fixture.php.inc'];
yield [__DIR__ . '/Fixture/used.php.inc']; yield [__DIR__ . '/Fixture/used.php.inc'];
yield [__DIR__ . '/Fixture/keep_used_spl_file_info.php.inc'];
yield [__DIR__ . '/Fixture/keep_used_doc_param.php.inc'];
yield [__DIR__ . '/Fixture/class_name.php.inc']; yield [__DIR__ . '/Fixture/class_name.php.inc'];
yield [__DIR__ . '/Fixture/no_namespace.php.inc']; yield [__DIR__ . '/Fixture/no_namespace.php.inc'];
yield [__DIR__ . '/Fixture/no_namespace_class_name.php.inc']; yield [__DIR__ . '/Fixture/no_namespace_class_name.php.inc'];