diff --git a/packages/node-type-resolver/src/PhpDoc/PhpDocTypeRenamer.php b/packages/node-type-resolver/src/PhpDoc/PhpDocTypeRenamer.php index 00a802851f3e..faca96b2a442 100644 --- a/packages/node-type-resolver/src/PhpDoc/PhpDocTypeRenamer.php +++ b/packages/node-type-resolver/src/PhpDoc/PhpDocTypeRenamer.php @@ -10,6 +10,7 @@ use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\Type\ObjectType; use Rector\BetterPhpDocParser\Ast\PhpDocNodeTraverser; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\StaticTypeMapper\StaticTypeMapper; @@ -36,6 +37,7 @@ public function __construct(PhpDocNodeTraverser $phpDocNodeTraverser, StaticType */ public function changeUnderscoreType(Node $node, string $namespacePrefix, array $excludedClasses): void { + /** @var PhpDocInfo|null $phpDocInfo */ $phpDocInfo = $node->getAttribute(AttributeKey::PHP_DOC_INFO); if ($phpDocInfo === null) { return; diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/ArrayTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/ArrayTypeMapper.php index 4ebd2f8136a9..58c004ca273b 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/ArrayTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/ArrayTypeMapper.php @@ -5,7 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; @@ -64,7 +64,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type): TypeNode */ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node { - return new Identifier('array'); + return new Name('array'); } /** diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/BooleanTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/BooleanTypeMapper.php index 3a6883a8a08a..73f54d8b55e0 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/BooleanTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/BooleanTypeMapper.php @@ -5,7 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\BooleanType; @@ -48,7 +48,7 @@ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node return null; } - return new Identifier('bool'); + return new Name('bool'); } /** diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/CallableTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/CallableTypeMapper.php index c7e395d7701d..31d4a1faf6dd 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/CallableTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/CallableTypeMapper.php @@ -5,7 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\CallableType; @@ -54,7 +54,7 @@ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node return null; } - return new Identifier('callable'); + return new Name('callable'); } public function mapToDocString(Type $type, ?Type $parentType = null): string diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/ClosureTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/ClosureTypeMapper.php index c4687b084f46..944ed234db13 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/ClosureTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/ClosureTypeMapper.php @@ -6,7 +6,7 @@ use Closure; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\ClosureType; use PHPStan\Type\Type; @@ -37,7 +37,7 @@ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node return null; } - return new Identifier('callable'); + return new Name('callable'); } public function mapToDocString(Type $type, ?Type $parentType = null): string diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/FloatTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/FloatTypeMapper.php index b6761d6d27b2..b0334b121a53 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/FloatTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/FloatTypeMapper.php @@ -5,7 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\FloatType; @@ -49,7 +49,7 @@ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node return null; } - return new Identifier('float'); + return new Name('float'); } public function mapToDocString(Type $type, ?Type $parentType = null): string diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/IntegerTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/IntegerTypeMapper.php index db41310cbb6a..649a1ca52f99 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/IntegerTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/IntegerTypeMapper.php @@ -5,7 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\IntegerType; @@ -49,7 +49,7 @@ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node return null; } - return new Identifier('int'); + return new Name('int'); } public function mapToDocString(Type $type, ?Type $parentType = null): string diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/IterableTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/IterableTypeMapper.php index b075a65f53a1..a2ca55a8fcde 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/IterableTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/IterableTypeMapper.php @@ -5,7 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; @@ -66,7 +66,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type): TypeNode */ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node { - return new Identifier('iterable'); + return new Name('iterable'); } /** diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/ObjectTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/ObjectTypeMapper.php index f15770f10be5..3ea71cc88a86 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/ObjectTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/ObjectTypeMapper.php @@ -5,7 +5,6 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; @@ -50,7 +49,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type): TypeNode public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node { if ($type instanceof SelfObjectType) { - return new Identifier('self'); + return new Name('self'); } if ($type instanceof ShortenedObjectType) { @@ -66,7 +65,7 @@ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node } if ($type instanceof GenericObjectType && $type->getClassName() === 'object') { - return new Identifier('object'); + return new Name('object'); } // fallback diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/ObjectWithoutClassTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/ObjectWithoutClassTypeMapper.php index 0fdb635a6a51..de204490b75a 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/ObjectWithoutClassTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/ObjectWithoutClassTypeMapper.php @@ -5,7 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\ObjectWithoutClassType; @@ -49,7 +49,7 @@ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node return null; } - return new Identifier('object'); + return new Name('object'); } public function mapToDocString(Type $type, ?Type $parentType = null): string diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/ParentStaticTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/ParentStaticTypeMapper.php index 6e9b42ff241a..55a849dd3859 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/ParentStaticTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/ParentStaticTypeMapper.php @@ -5,7 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\Type; @@ -33,7 +33,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type): TypeNode */ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node { - return new Identifier('parent'); + return new Name('parent'); } public function mapToDocString(Type $type, ?Type $parentType = null): string diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/SelfObjectTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/SelfObjectTypeMapper.php index d9d4f97d1b94..96e62ee5d4ad 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/SelfObjectTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/SelfObjectTypeMapper.php @@ -5,7 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\Type; @@ -33,7 +33,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type): TypeNode */ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node { - return new Identifier('self'); + return new Name('self'); } /** diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/StaticTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/StaticTypeMapper.php index d158ee9181f7..da94385373b2 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/StaticTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/StaticTypeMapper.php @@ -5,7 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\StaticType; use PHPStan\Type\ThisType; @@ -49,10 +49,10 @@ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node if ($type instanceof ThisType) { // @todo wait for PHPStan to differentiate between self/static if ($this->phpVersionProvider->isAtLeast(PhpVersionFeature::STATIC_RETURN_TYPE)) { - return new Identifier('static'); + return new Name('static'); } - return new Identifier('self'); + return new Name('self'); } return null; diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/ThisTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/ThisTypeMapper.php index 279576026fdc..649625bdee9e 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/ThisTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/ThisTypeMapper.php @@ -5,7 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\ThisType; @@ -33,7 +33,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type): TypeNode */ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node { - return new Identifier('self'); + return new Name('self'); } /** diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/TypeWithClassNameTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/TypeWithClassNameTypeMapper.php index cc10db5a62b9..2a04a2674dcc 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/TypeWithClassNameTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/TypeWithClassNameTypeMapper.php @@ -5,7 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\Type; @@ -49,7 +49,7 @@ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node return null; } - return new Identifier('string'); + return new Name('string'); } /** diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/UnionTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/UnionTypeMapper.php index ac065743926a..8b7593abcf13 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/UnionTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/UnionTypeMapper.php @@ -153,7 +153,10 @@ private function shouldSkipIterable(UnionType $unionType): bool return $unionTypeAnalysis->hasIterable() && $unionTypeAnalysis->hasArray(); } - private function matchArrayTypes(UnionType $unionType): ?Identifier + /** + * @return Name|NullableType|null + */ + private function matchArrayTypes(UnionType $unionType): ?Node { $unionTypeAnalysis = $this->unionTypeAnalyzer->analyseForNullableAndIterable($unionType); if ($unionTypeAnalysis === null) { @@ -162,10 +165,10 @@ private function matchArrayTypes(UnionType $unionType): ?Identifier $type = $unionTypeAnalysis->hasIterable() ? 'iterable' : 'array'; if ($unionTypeAnalysis->isNullableType()) { - return new Identifier('?' . $type); + return new NullableType($type); } - return new Identifier($type); + return new Name($type); } private function matchTypeForNullableUnionType(UnionType $unionType): ?Type diff --git a/packages/phpstan-static-type-mapper/src/TypeMapper/VoidTypeMapper.php b/packages/phpstan-static-type-mapper/src/TypeMapper/VoidTypeMapper.php index 8adda985b306..9089e4acff4a 100644 --- a/packages/phpstan-static-type-mapper/src/TypeMapper/VoidTypeMapper.php +++ b/packages/phpstan-static-type-mapper/src/TypeMapper/VoidTypeMapper.php @@ -5,7 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper; use PhpParser\Node; -use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\Type; @@ -57,7 +57,7 @@ public function mapToPhpParserNode(Type $type, ?string $kind = null): ?Node return null; } - return new Identifier(self::VOID); + return new Name(self::VOID); } public function mapToDocString(Type $type, ?Type $parentType = null): string diff --git a/phpstan.neon b/phpstan.neon index 966c1805f36d..b9be9c723df9 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -42,6 +42,10 @@ parameters: - utils excludes_analyse: + # phsptan bug + - utils/phpstan-extensions/src/Rule/PreventParentMethodVisibilityOverrideRule.php + - utils/phpstan-extensions/src/Rule/KeepRectorNamespaceForRectorRule.php + # generated files - 'packages/doctrine-annotation-generated/src/ConstantPreservingDocParser.php' - 'packages/doctrine-annotation-generated/src/ConstantPreservingAnnotationReader.php' diff --git a/rules/psr4/src/Composer/PSR4AutoloadPathsProvider.php b/rules/psr4/src/Composer/PSR4AutoloadPathsProvider.php index 3871b9d470f3..cd648eb4ea5b 100644 --- a/rules/psr4/src/Composer/PSR4AutoloadPathsProvider.php +++ b/rules/psr4/src/Composer/PSR4AutoloadPathsProvider.php @@ -15,7 +15,7 @@ final class PSR4AutoloadPathsProvider private $cachedComposerJsonPSR4AutoloadPaths = []; /** - * @return string[] + * @return string[]|string[][] */ public function provide(): array { diff --git a/rules/psr4/src/Rector/Namespace_/NormalizeNamespaceByPSR4ComposerAutoloadRector.php b/rules/psr4/src/Rector/Namespace_/NormalizeNamespaceByPSR4ComposerAutoloadRector.php index 9226bab1393e..094483d73de7 100644 --- a/rules/psr4/src/Rector/Namespace_/NormalizeNamespaceByPSR4ComposerAutoloadRector.php +++ b/rules/psr4/src/Rector/Namespace_/NormalizeNamespaceByPSR4ComposerAutoloadRector.php @@ -119,12 +119,17 @@ private function getExpectedNamespace(Node $node): ?string foreach ($psr4Autoloads as $namespace => $path) { // remove extra slash - $path = rtrim($path, '/'); + /** @var string[] $paths */ + $paths = is_array($path) ? $path : [$path]; - if (Strings::startsWith($smartFileInfo->getRelativeDirectoryPath(), $path)) { - $expectedNamespace = $namespace . $this->resolveExtraNamespace($smartFileInfo, $path); + foreach ($paths as $path) { + $path = rtrim($path, '/'); - return rtrim($expectedNamespace, '\\'); + if (Strings::startsWith($smartFileInfo->getRelativeDirectoryPath(), $path)) { + $expectedNamespace = $namespace . $this->resolveExtraNamespace($smartFileInfo, $path); + + return rtrim($expectedNamespace, '\\'); + } } }