Skip to content

Commit

Permalink
[Php80] Handle Alias is used as Attribute on AnnotationToAttributeRec…
Browse files Browse the repository at this point in the history
…tor (#1511)

* [Php80] Handle Alias is used as Attribute on AnnotationToAttributeRector

* eol

* [ci-review] Rector Rectify

* Fixed 🎉

* [ci-review] Rector Rectify

Co-authored-by: GitHub Action <action@github.com>
  • Loading branch information
samsonasik and actions-user committed Dec 17, 2021
1 parent 4bac761 commit db94f7a
Show file tree
Hide file tree
Showing 6 changed files with 117 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace Rector\BetterPhpDocParser\PhpDocParser;

use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Stmt\Use_;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ReflectionProvider;
Expand Down Expand Up @@ -59,6 +60,40 @@ private function resolveFullyQualifiedClass(array $uses, Node $node, string $tag
if ($this->reflectionProvider->hasClass($namespacedTag)) {
return $namespacedTag;
}

if (! str_contains($tag, '\\')) {
return $this->resolveAsAliased($uses, $tag);
}
}
}

return $this->useImportNameMatcher->matchNameWithUses($tag, $uses) ?? $tag;
}

/**
* @param Use_[] $uses
*/
private function resolveAsAliased(array $uses, string $tag): string
{
foreach ($uses as $use) {
$useUses = $use->uses;
// skip group uses or empty
if (count($useUses) !== 1) {
continue;
}

// uses already removed
if (! isset($useUses[0])) {
continue;
}

if (! $useUses[0]->alias instanceof Identifier) {
continue;
}

$alias = $useUses[0]->alias;
if ($alias->toString() === $tag) {
return $useUses[0]->name->toString();
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

namespace Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\Fixture;

use Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\Source\UseAlias\TestOther as TestOtherAlias;
use Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\Source\UseAlias as TestFoo;

final class AliasUsed
{
/**
* @TestFoo\TestSmth
*/
private string $foo;

/**
* @TestFoo\TestOther
*/
private string $bar;

/**
* @TestOtherAlias
*/
private string $baz;

}

?>
-----
<?php

namespace Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\Fixture;

use Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\Source\UseAlias\TestOther as TestOtherAlias;
use Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\Source\UseAlias as TestFoo;

final class AliasUsed
{
#[TestFoo\TestSmth]
private string $foo;

#[TestFoo\TestOther]
private string $bar;

#[TestOtherAlias]
private string $baz;

}

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

declare(strict_types=1);

namespace Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\Source\UseAlias;

final class TestOther {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

declare(strict_types=1);

namespace Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\Source\UseAlias;

final class TestSmth {
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,13 @@
// validation
new AnnotationToAttribute('Symfony\Component\Validator\Constraints\All'),
new AnnotationToAttribute('Symfony\Component\Validator\Constraints\Length'),

// test for alias used
new AnnotationToAttribute(
'Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\Source\UseAlias\TestSmth'
),
new AnnotationToAttribute(
'Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\Source\UseAlias\TestOther'
),
]);
};
18 changes: 9 additions & 9 deletions rules/CodingStyle/NodeAnalyzer/UseImportNameMatcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,7 @@ public function matchNameWithUses(string $tag, array $uses): ?string
return null;
}

private function isUseMatchingName(string $tag, UseUse $useUse): bool
{
$shortName = $useUse->alias !== null ? $useUse->alias->name : $useUse->name->getLast();
$shortNamePattern = preg_quote($shortName, '#');
$pattern = sprintf(self::SHORT_NAME_REGEX, $shortNamePattern);
return StringUtils::isMatch($tag, $pattern);
}

private function resolveName(string $tag, UseUse $useUse): string
public function resolveName(string $tag, UseUse $useUse): string
{
if ($useUse->alias === null) {
return $useUse->name->toString();
Expand All @@ -75,4 +67,12 @@ private function resolveName(string $tag, UseUse $useUse): string

return $useUse->name . '\\' . $unaliasedShortClass;
}

private function isUseMatchingName(string $tag, UseUse $useUse): bool
{
$shortName = $useUse->alias !== null ? $useUse->alias->name : $useUse->name->getLast();
$shortNamePattern = preg_quote($shortName, '#');
$pattern = sprintf(self::SHORT_NAME_REGEX, $shortNamePattern);
return StringUtils::isMatch($tag, $pattern);
}
}

0 comments on commit db94f7a

Please sign in to comment.