From 92dc4499a5cb2741771c6d19678955774c276efd Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sat, 24 Aug 2019 12:37:51 +0200 Subject: [PATCH] Fix fqn doc with alraedy PHP imported namespace --- .../ImportFullyQualifiedNamesRector.php | 4 ++ .../Fixture/include_used_local_class.php.inc | 49 +++++++++++++++++++ .../ImportFullyQualifiedNamesRectorTest.php | 1 + .../NodeAnalyzer/DocBlockManipulator.php | 22 +++++---- 4 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 packages/CodingStyle/tests/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/include_used_local_class.php.inc diff --git a/packages/CodingStyle/src/Rector/Namespace_/ImportFullyQualifiedNamesRector.php b/packages/CodingStyle/src/Rector/Namespace_/ImportFullyQualifiedNamesRector.php index cba3979a70a..11820d2847a 100644 --- a/packages/CodingStyle/src/Rector/Namespace_/ImportFullyQualifiedNamesRector.php +++ b/packages/CodingStyle/src/Rector/Namespace_/ImportFullyQualifiedNamesRector.php @@ -13,12 +13,16 @@ use Rector\CodingStyle\Application\UseAddingCommander; use Rector\CodingStyle\Imports\AliasUsesResolver; use Rector\CodingStyle\Imports\ShortNameResolver; use Rector\CodingStyle\Naming\ClassNaming; +use Rector\CodingStyle\Tests\Rector\Namespace_\ImportFullyQualifiedNamesRector\ImportFullyQualifiedNamesRectorTest; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer\DocBlockManipulator; use Rector\Rector\AbstractRector; use Rector\RectorDefinition\CodeSample; use Rector\RectorDefinition\RectorDefinition; +/** + * @see ImportFullyQualifiedNamesRectorTest + */ final class ImportFullyQualifiedNamesRector extends AbstractRector { /** diff --git a/packages/CodingStyle/tests/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/include_used_local_class.php.inc b/packages/CodingStyle/tests/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/include_used_local_class.php.inc new file mode 100644 index 00000000000..70c0fd208f0 --- /dev/null +++ b/packages/CodingStyle/tests/Rector/Namespace_/ImportFullyQualifiedNamesRector/Fixture/include_used_local_class.php.inc @@ -0,0 +1,49 @@ +join; + } +} + +?> +----- +join; + } +} + +?> diff --git a/packages/CodingStyle/tests/Rector/Namespace_/ImportFullyQualifiedNamesRector/ImportFullyQualifiedNamesRectorTest.php b/packages/CodingStyle/tests/Rector/Namespace_/ImportFullyQualifiedNamesRector/ImportFullyQualifiedNamesRectorTest.php index 1d537dfe1c9..968d71f8e13 100644 --- a/packages/CodingStyle/tests/Rector/Namespace_/ImportFullyQualifiedNamesRector/ImportFullyQualifiedNamesRectorTest.php +++ b/packages/CodingStyle/tests/Rector/Namespace_/ImportFullyQualifiedNamesRector/ImportFullyQualifiedNamesRectorTest.php @@ -22,6 +22,7 @@ final class ImportFullyQualifiedNamesRectorTest extends AbstractRectorTestCase // same short class with namespace yield [__DIR__ . '/Fixture/same_namespaced_class.php.inc']; yield [__DIR__ . '/Fixture/skip_same_namespaced_used_class.php.inc']; + yield [__DIR__ . '/Fixture/include_used_local_class.php.inc']; yield [__DIR__ . '/Fixture/fixture.php.inc']; yield [__DIR__ . '/Fixture/double_import.php.inc']; diff --git a/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php b/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php index 0bc95b0beb7..a626ceab742 100644 --- a/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php +++ b/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php @@ -712,13 +712,17 @@ final class DocBlockManipulator $namespaceName = $node->getAttribute(AttributeKey::NAMESPACE_NAME); // the class in the same namespace as different file can se used in this code, the short names would colide → skip - if (class_exists($namespaceName . '\\' . $shortName)) { - if ($this->isCurrentNamespaceSameShortClassAlreadyUsed( - $node, - $namespaceName . '\\' . $shortName, - $shortName - )) { - return $attributeAwareNode; + $currentNamespaceShortName = $namespaceName . '\\' . $shortName; + + if (class_exists($currentNamespaceShortName)) { + if ($currentNamespaceShortName !== $fullyQualifiedName) { + if ($this->isCurrentNamespaceSameShortClassAlreadyUsed( + $node, + $currentNamespaceShortName, + $shortName + )) { + return $attributeAwareNode; + } } } @@ -751,11 +755,11 @@ final class DocBlockManipulator $joinChar = '|'; // default if (Strings::contains($type, '|')) { // intersection - $types = explode('|', $type); $joinChar = '|'; + $types = explode($joinChar, $type); } elseif (Strings::contains($type, '&')) { // union - $types = explode('&', $type); $joinChar = '&'; + $types = explode($joinChar, $type); } else { $types = [$type]; }