decouple RegexPatternDetector

This commit is contained in:
TomasVotruba 2020-02-13 11:09:51 +01:00
parent 11f401daf9
commit 6072707458
3 changed files with 41 additions and 21 deletions

View File

@ -12,9 +12,15 @@ use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\Interface_;
use PhpParser\Node\Stmt\Trait_;
use Rector\NodeNameResolver\Contract\NodeNameResolverInterface;
use Rector\NodeNameResolver\Regex\RegexPatternDetector;
final class NodeNameResolver
{
/**
* @var RegexPatternDetector
*/
private $regexPatternDetector;
/**
* @var NodeNameResolverInterface[]
*/
@ -23,8 +29,9 @@ final class NodeNameResolver
/**
* @param NodeNameResolverInterface[] $nodeNameResolvers
*/
public function __construct(array $nodeNameResolvers = [])
public function __construct(RegexPatternDetector $regexPatternDetector, array $nodeNameResolvers = [])
{
$this->regexPatternDetector = $regexPatternDetector;
$this->nodeNameResolvers = $nodeNameResolvers;
}
@ -59,7 +66,7 @@ final class NodeNameResolver
}
// is probably regex pattern
if ($this->isRegexPattern($name)) {
if ($this->regexPatternDetector->isRegexPattern($name)) {
return (bool) Strings::match($resolvedName, $name);
}
@ -108,24 +115,6 @@ final class NodeNameResolver
return $this->getName($firstNode) === $this->getName($secondNode);
}
private function isRegexPattern(string $name): bool
{
if (Strings::length($name) <= 2) {
return false;
}
$firstChar = $name[0];
$lastChar = $name[strlen($name) - 1];
if ($firstChar !== $lastChar) {
return false;
}
// this prevents miss matching like "aMethoda"
$possibleDelimiters = ['#', '~', '/'];
return in_array($firstChar, $possibleDelimiters, true);
}
/**
* @param Interface_|Trait_ $classLike
*/

View File

@ -0,0 +1,28 @@
<?php
declare(strict_types=1);
namespace Rector\NodeNameResolver\Regex;
use Nette\Utils\Strings;
final class RegexPatternDetector
{
public function isRegexPattern(string $name): bool
{
if (Strings::length($name) <= 2) {
return false;
}
$firstChar = $name[0];
$lastChar = $name[strlen($name) - 1];
if ($firstChar !== $lastChar) {
return false;
}
// this prevents miss matching like "aMethoda"
$possibleDelimiters = ['#', '~', '/'];
return in_array($firstChar, $possibleDelimiters, true);
}
}

View File

@ -11,6 +11,7 @@ use PhpParser\NodeVisitor\NameResolver;
use Rector\CodingStyle\Naming\ClassNaming;
use Rector\Core\Testing\PHPUnit\AbstractNodeVisitorTestCase;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeNameResolver\Regex\RegexPatternDetector;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\NodeTypeResolver\NodeVisitor\FunctionMethodAndClassNodeVisitor;
@ -36,7 +37,9 @@ final class FunctionMethodAndClassNodeVisitorTest extends AbstractNodeVisitorTes
{
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new NameResolver());
$nodeTraverser->addVisitor(new FunctionMethodAndClassNodeVisitor(new ClassNaming(new NodeNameResolver())));
$nodeTraverser->addVisitor(
new FunctionMethodAndClassNodeVisitor(new ClassNaming(new NodeNameResolver(new RegexPatternDetector())))
);
$nodeTraverser->traverse($nodes);
}