diff --git a/packages/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php b/packages/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php index 53fc510b048..8d63763cb4c 100644 --- a/packages/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php +++ b/packages/BetterPhpDocParser/Printer/PhpDocInfoPrinter.php @@ -177,7 +177,7 @@ private function printPhpDocNode(PhpDocNode $phpDocNode): string if (StringUtils::isMatch( $output, self::OPENING_DOCBLOCK_REGEX - ) && $output && ! StringUtils::isMatch($output, self::CLOSING_DOCBLOCK_REGEX)) { + ) && ! StringUtils::isMatch($output, self::CLOSING_DOCBLOCK_REGEX)) { $output .= ' */'; } @@ -247,7 +247,12 @@ private function printEnd(string $output): string { $lastTokenPosition = $this->getCurrentPhpDocInfo() ->getPhpDocNode() - ->getAttribute(PhpDocAttributeKey::LAST_PHP_DOC_TOKEN_POSITION) ?: $this->currentTokenPosition; + ->getAttribute(PhpDocAttributeKey::LAST_PHP_DOC_TOKEN_POSITION); + + if ($lastTokenPosition === null) { + $lastTokenPosition = $this->currentTokenPosition; + } + if ($lastTokenPosition === 0) { $lastTokenPosition = 1; } diff --git a/packages/Caching/Config/FileHashComputer.php b/packages/Caching/Config/FileHashComputer.php index bb121e6e93c..f984fcc1f3d 100644 --- a/packages/Caching/Config/FileHashComputer.php +++ b/packages/Caching/Config/FileHashComputer.php @@ -56,7 +56,7 @@ private function createFileLoader(string $filePath, ContainerBuilder $containerB $loaderResolver = new LoaderResolver($fileLoaders); $loader = $loaderResolver->resolve($filePath); - if (! $loader) { + if ($loader === false) { throw new ShouldNotHappenException(); } diff --git a/packages/ChangesReporting/Output/ConsoleOutputFormatter.php b/packages/ChangesReporting/Output/ConsoleOutputFormatter.php index 178cd80ef68..e9c6188c1d0 100644 --- a/packages/ChangesReporting/Output/ConsoleOutputFormatter.php +++ b/packages/ChangesReporting/Output/ConsoleOutputFormatter.php @@ -82,7 +82,7 @@ private function reportFileDiffs(array $fileDiffs): void $message = sprintf('%d) %s', ++$i, $relativeFilePath); $this->outputStyle->writeln($message); - $this->outputStyle->newLine(); + $this->outputStyle->newline(); $this->outputStyle->writeln($fileDiff->getDiffConsoleFormatted()); $rectorsChangelogsLines = $this->createRectorChangelogLines($fileDiff); diff --git a/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php b/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php index 8d826ec1c29..a29015877cc 100644 --- a/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php +++ b/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php @@ -5,6 +5,7 @@ namespace Rector\NodeTypeResolver\NodeTypeResolver; use PhpParser\Node; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Param; use PHPStan\Analyser\Scope; @@ -17,6 +18,8 @@ /** * @see \Rector\Tests\NodeTypeResolver\PerNodeTypeResolver\VariableTypeResolver\VariableTypeResolverTest + * + * @implements NodeTypeResolverInterface */ final class VariableTypeResolver implements NodeTypeResolverInterface { @@ -27,7 +30,7 @@ public function __construct( } /** - * @return array> + * @return array> */ public function getNodeClasses(): array { diff --git a/packages/NodeTypeResolver/PHPStan/Type/StaticTypeAnalyzer.php b/packages/NodeTypeResolver/PHPStan/Type/StaticTypeAnalyzer.php index 1d73740bdb5..55216c91c61 100644 --- a/packages/NodeTypeResolver/PHPStan/Type/StaticTypeAnalyzer.php +++ b/packages/NodeTypeResolver/PHPStan/Type/StaticTypeAnalyzer.php @@ -86,6 +86,10 @@ private function isAlwaysTruableUnionType(Type $type): bool private function isAlwaysTruableArrayType(ArrayType $arrayType): bool { $itemType = $arrayType->getItemType(); - return $itemType instanceof ConstantScalarType && $itemType->getValue(); + if (! $itemType instanceof ConstantScalarType) { + return false; + } + + return (bool) $itemType->getValue(); } } diff --git a/packages/NodeTypeResolver/Reflection/BetterReflection/SourceLocatorProvider/DynamicSourceLocatorProvider.php b/packages/NodeTypeResolver/Reflection/BetterReflection/SourceLocatorProvider/DynamicSourceLocatorProvider.php index d8515fdeefd..aac81324426 100644 --- a/packages/NodeTypeResolver/Reflection/BetterReflection/SourceLocatorProvider/DynamicSourceLocatorProvider.php +++ b/packages/NodeTypeResolver/Reflection/BetterReflection/SourceLocatorProvider/DynamicSourceLocatorProvider.php @@ -52,7 +52,7 @@ public function provide(): SourceLocator // do not cache for PHPUnit, as in test every fixture is different $isPHPUnitRun = StaticPHPUnitEnvironment::isPHPUnitRun(); - if ($this->aggregateSourceLocator && ! $isPHPUnitRun) { + if ($this->aggregateSourceLocator instanceof AggregateSourceLocator && ! $isPHPUnitRun) { return $this->aggregateSourceLocator; } diff --git a/packages/Parallel/Application/ParallelFileProcessor.php b/packages/Parallel/Application/ParallelFileProcessor.php index 66b8eef034e..3fe27693f62 100644 --- a/packages/Parallel/Application/ParallelFileProcessor.php +++ b/packages/Parallel/Application/ParallelFileProcessor.php @@ -179,10 +179,7 @@ function (array $json) use ( $fileDiffs[] = FileDiff::decode($jsonError); } - // @todo why there is a null check? - if ($postFileCallback !== null) { - $postFileCallback($json[Bridge::FILES_COUNT]); - } + $postFileCallback($json[Bridge::FILES_COUNT]); $systemErrorsCount += $json[Bridge::SYSTEM_ERRORS_COUNT]; if ($systemErrorsCount >= self::SYSTEM_ERROR_COUNT_LIMIT) { diff --git a/packages/ReadWrite/Contract/ReadNodeAnalyzerInterface.php b/packages/ReadWrite/Contract/ReadNodeAnalyzerInterface.php index a00f86ead5a..276e9b3cccf 100644 --- a/packages/ReadWrite/Contract/ReadNodeAnalyzerInterface.php +++ b/packages/ReadWrite/Contract/ReadNodeAnalyzerInterface.php @@ -4,11 +4,17 @@ namespace Rector\ReadWrite\Contract; -use PhpParser\Node; +use PhpParser\Node\Expr; +/** + * @template TExpr as Expr + */ interface ReadNodeAnalyzerInterface { - public function supports(Node $node): bool; + public function supports(Expr $expr): bool; - public function isRead(Node $node): bool; + /** + * @param TExpr $expr + */ + public function isRead(Expr $expr): bool; } diff --git a/packages/ReadWrite/ReadNodeAnalyzer/LocalPropertyFetchReadNodeAnalyzer.php b/packages/ReadWrite/ReadNodeAnalyzer/LocalPropertyFetchReadNodeAnalyzer.php index 7085c9121a8..61fb572519d 100644 --- a/packages/ReadWrite/ReadNodeAnalyzer/LocalPropertyFetchReadNodeAnalyzer.php +++ b/packages/ReadWrite/ReadNodeAnalyzer/LocalPropertyFetchReadNodeAnalyzer.php @@ -5,6 +5,7 @@ namespace Rector\ReadWrite\ReadNodeAnalyzer; use PhpParser\Node; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Stmt\Class_; @@ -13,6 +14,9 @@ use Rector\NodeNameResolver\NodeNameResolver; use Rector\ReadWrite\Contract\ReadNodeAnalyzerInterface; +/** + * @implements ReadNodeAnalyzerInterface + */ final class LocalPropertyFetchReadNodeAnalyzer implements ReadNodeAnalyzerInterface { public function __construct( @@ -23,23 +27,20 @@ public function __construct( ) { } - public function supports(Node $node): bool + public function supports(Expr $expr): bool { - return $node instanceof PropertyFetch || $node instanceof StaticPropertyFetch; + return $expr instanceof PropertyFetch || $expr instanceof StaticPropertyFetch; } - /** - * @param PropertyFetch $node - */ - public function isRead(Node $node): bool + public function isRead(Expr $expr): bool { - $class = $this->betterNodeFinder->findParentType($node, Class_::class); + $class = $this->betterNodeFinder->findParentType($expr, Class_::class); if (! $class instanceof Class_) { // assume worse to keep node protected return true; } - $propertyName = $this->nodeNameResolver->getName($node->name); + $propertyName = $this->nodeNameResolver->getName($expr->name); if ($propertyName === null) { // assume worse to keep node protected return true; diff --git a/packages/ReadWrite/ReadNodeAnalyzer/VariableReadNodeAnalyzer.php b/packages/ReadWrite/ReadNodeAnalyzer/VariableReadNodeAnalyzer.php index 66ae1954e24..b9aa9e95413 100644 --- a/packages/ReadWrite/ReadNodeAnalyzer/VariableReadNodeAnalyzer.php +++ b/packages/ReadWrite/ReadNodeAnalyzer/VariableReadNodeAnalyzer.php @@ -4,12 +4,15 @@ namespace Rector\ReadWrite\ReadNodeAnalyzer; -use PhpParser\Node; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\Variable; use Rector\NodeNestingScope\ParentScopeFinder; use Rector\ReadWrite\Contract\ReadNodeAnalyzerInterface; use Rector\ReadWrite\NodeFinder\NodeUsageFinder; +/** + * @implements ReadNodeAnalyzerInterface + */ final class VariableReadNodeAnalyzer implements ReadNodeAnalyzerInterface { public function __construct( @@ -19,22 +22,22 @@ public function __construct( ) { } - public function supports(Node $node): bool + public function supports(Expr $expr): bool { - return $node instanceof Variable; + return $expr instanceof Variable; } /** - * @param Variable $node + * @param Variable $expr */ - public function isRead(Node $node): bool + public function isRead(Expr $expr): bool { - $parentScope = $this->parentScopeFinder->find($node); + $parentScope = $this->parentScopeFinder->find($expr); if ($parentScope === null) { return false; } - $variableUsages = $this->nodeUsageFinder->findVariableUsages((array) $parentScope->stmts, $node); + $variableUsages = $this->nodeUsageFinder->findVariableUsages((array) $parentScope->stmts, $expr); foreach ($variableUsages as $variableUsage) { if ($this->justReadExprAnalyzer->isReadContext($variableUsage)) { return true; diff --git a/packages/StaticTypeMapper/Contract/PhpDocParser/PhpDocTypeMapperInterface.php b/packages/StaticTypeMapper/Contract/PhpDocParser/PhpDocTypeMapperInterface.php index 905174fd5d7..baa48cecc8a 100644 --- a/packages/StaticTypeMapper/Contract/PhpDocParser/PhpDocTypeMapperInterface.php +++ b/packages/StaticTypeMapper/Contract/PhpDocParser/PhpDocTypeMapperInterface.php @@ -9,12 +9,18 @@ use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\Type\Type; +/** + * @template TTypeNode as TypeNode + */ interface PhpDocTypeMapperInterface { /** - * @return class-string + * @return class-string */ public function getNodeType(): string; + /** + * @param TTypeNode $typeNode + */ public function mapToPHPStanType(TypeNode $typeNode, Node $node, NameScope $nameScope): Type; } diff --git a/packages/StaticTypeMapper/Naming/NameScopeFactory.php b/packages/StaticTypeMapper/Naming/NameScopeFactory.php index 53ed1856a94..758ffff824b 100644 --- a/packages/StaticTypeMapper/Naming/NameScopeFactory.php +++ b/packages/StaticTypeMapper/Naming/NameScopeFactory.php @@ -14,7 +14,6 @@ use PHPStan\Type\Generic\TemplateTypeMap; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\StaticTypeMapper\StaticTypeMapper; @@ -96,15 +95,10 @@ private function resolveUseNamesByAlias(array $useNodes): array $aliasName = $useUse->getAlias() ->name; - $useName = $useUse->name->toString(); - if (! is_string($useName)) { - throw new ShouldNotHappenException(); - } - // uses must be lowercase, as PHPStan lowercases it $lowercasedAliasName = strtolower($aliasName); - $useNamesByAlias[$lowercasedAliasName] = $useName; + $useNamesByAlias[$lowercasedAliasName] = $useUse->name->toString(); } } diff --git a/packages/StaticTypeMapper/PhpDocParser/IdentifierTypeMapper.php b/packages/StaticTypeMapper/PhpDocParser/IdentifierTypeMapper.php index e5636bc2f58..5b76f2410d6 100644 --- a/packages/StaticTypeMapper/PhpDocParser/IdentifierTypeMapper.php +++ b/packages/StaticTypeMapper/PhpDocParser/IdentifierTypeMapper.php @@ -27,6 +27,9 @@ use Rector\StaticTypeMapper\ValueObject\Type\SelfObjectType; use Rector\TypeDeclaration\PHPStan\Type\ObjectTypeSpecifier; +/** + * @implements PhpDocTypeMapperInterface + */ final class IdentifierTypeMapper implements PhpDocTypeMapperInterface { public function __construct( @@ -38,9 +41,6 @@ public function __construct( ) { } - /** - * @return class-string - */ public function getNodeType(): string { return IdentifierTypeNode::class; diff --git a/packages/StaticTypeMapper/PhpDocParser/IntersectionTypeMapper.php b/packages/StaticTypeMapper/PhpDocParser/IntersectionTypeMapper.php index df00973b49c..d0e0e7e437b 100644 --- a/packages/StaticTypeMapper/PhpDocParser/IntersectionTypeMapper.php +++ b/packages/StaticTypeMapper/PhpDocParser/IntersectionTypeMapper.php @@ -14,13 +14,13 @@ use Rector\StaticTypeMapper\PhpDoc\PhpDocTypeMapper; use Symfony\Contracts\Service\Attribute\Required; +/** + * @implements PhpDocTypeMapperInterface + */ final class IntersectionTypeMapper implements PhpDocTypeMapperInterface { private PhpDocTypeMapper $phpDocTypeMapper; - /** - * @return class-string - */ public function getNodeType(): string { return IntersectionTypeNode::class; diff --git a/packages/StaticTypeMapper/PhpDocParser/NullableTypeMapper.php b/packages/StaticTypeMapper/PhpDocParser/NullableTypeMapper.php index cfb4c7559f3..8c694409621 100644 --- a/packages/StaticTypeMapper/PhpDocParser/NullableTypeMapper.php +++ b/packages/StaticTypeMapper/PhpDocParser/NullableTypeMapper.php @@ -15,6 +15,9 @@ use PHPStan\Type\UnionType; use Rector\StaticTypeMapper\Contract\PhpDocParser\PhpDocTypeMapperInterface; +/** + * @implements PhpDocTypeMapperInterface + */ final class NullableTypeMapper implements PhpDocTypeMapperInterface { public function __construct( @@ -23,17 +26,11 @@ public function __construct( ) { } - /** - * @return class-string - */ public function getNodeType(): string { return NullableTypeNode::class; } - /** - * @param NullableTypeNode $typeNode - */ public function mapToPHPStanType(TypeNode $typeNode, Node $node, NameScope $nameScope): Type { $type = $typeNode->type; diff --git a/packages/StaticTypeMapper/PhpDocParser/UnionTypeMapper.php b/packages/StaticTypeMapper/PhpDocParser/UnionTypeMapper.php index 0aff5dc2dd4..08a9b0c7afa 100644 --- a/packages/StaticTypeMapper/PhpDocParser/UnionTypeMapper.php +++ b/packages/StaticTypeMapper/PhpDocParser/UnionTypeMapper.php @@ -14,6 +14,9 @@ use Rector\StaticTypeMapper\PhpDoc\PhpDocTypeMapper; use Symfony\Contracts\Service\Attribute\Required; +/** + * @implements PhpDocTypeMapperInterface + */ final class UnionTypeMapper implements PhpDocTypeMapperInterface { private PhpDocTypeMapper $phpDocTypeMapper; @@ -23,9 +26,6 @@ public function __construct( ) { } - /** - * @return class-string - */ public function getNodeType(): string { return UnionTypeNode::class; diff --git a/packages/StaticTypeMapper/PhpParser/ExprNodeMapper.php b/packages/StaticTypeMapper/PhpParser/ExprNodeMapper.php index aafcb8de633..3a7b34962b8 100644 --- a/packages/StaticTypeMapper/PhpParser/ExprNodeMapper.php +++ b/packages/StaticTypeMapper/PhpParser/ExprNodeMapper.php @@ -17,9 +17,6 @@ */ final class ExprNodeMapper implements PhpParserNodeMapperInterface { - /** - * @return class-string - */ public function getNodeType(): string { return Expr::class; diff --git a/packages/StaticTypeMapper/PhpParser/FullyQualifiedNodeMapper.php b/packages/StaticTypeMapper/PhpParser/FullyQualifiedNodeMapper.php index b1a44b33e6d..9da2f9bc3fe 100644 --- a/packages/StaticTypeMapper/PhpParser/FullyQualifiedNodeMapper.php +++ b/packages/StaticTypeMapper/PhpParser/FullyQualifiedNodeMapper.php @@ -28,9 +28,6 @@ public function __construct( ) { } - /** - * @return class-string - */ public function getNodeType(): string { return FullyQualified::class; diff --git a/packages/StaticTypeMapper/PhpParser/IdentifierNodeMapper.php b/packages/StaticTypeMapper/PhpParser/IdentifierNodeMapper.php index 604d89319ce..c16fddbbf96 100644 --- a/packages/StaticTypeMapper/PhpParser/IdentifierNodeMapper.php +++ b/packages/StaticTypeMapper/PhpParser/IdentifierNodeMapper.php @@ -20,9 +20,6 @@ public function __construct( ) { } - /** - * @return class-string - */ public function getNodeType(): string { return Identifier::class; diff --git a/packages/StaticTypeMapper/PhpParser/NameNodeMapper.php b/packages/StaticTypeMapper/PhpParser/NameNodeMapper.php index cb38087a37f..7436208ca7f 100644 --- a/packages/StaticTypeMapper/PhpParser/NameNodeMapper.php +++ b/packages/StaticTypeMapper/PhpParser/NameNodeMapper.php @@ -42,9 +42,6 @@ public function __construct( ) { } - /** - * @return class-string - */ public function getNodeType(): string { return Name::class; diff --git a/packages/StaticTypeMapper/PhpParser/StringNodeMapper.php b/packages/StaticTypeMapper/PhpParser/StringNodeMapper.php index 797eabbc2cf..496e238c7f6 100644 --- a/packages/StaticTypeMapper/PhpParser/StringNodeMapper.php +++ b/packages/StaticTypeMapper/PhpParser/StringNodeMapper.php @@ -15,9 +15,6 @@ */ final class StringNodeMapper implements PhpParserNodeMapperInterface { - /** - * @return class-string - */ public function getNodeType(): string { return String_::class; diff --git a/phpstan.neon b/phpstan.neon index d0c2371a0d4..6ae68c66d01 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -590,3 +590,12 @@ parameters: - message: '#Strict comparison using \!\=\= between null and null will always evaluate to false#' path: rules/Renaming/Rector/FileWithoutNamespace/PseudoNamespaceToNamespaceRector.php + + # stricter child type on purpose + - '#Parameter \#1 \$tokenIterator \(Rector\\BetterPhpDocParser\\ValueObject\\Parser\\BetterTokenIterator\) of method Rector\\BetterPhpDocParser\\PhpDocParser\\BetterPhpDocParser\:\:parseTagValue\(\) should be contravariant with parameter \$tokens \(PHPStan\\PhpDocParser\\Parser\\TokenIterator\) of method PHPStan\\PhpDocParser\\Parser\\PhpDocParser\:\:parseTagValue\(\)#' + + # on purpose + - '#Instead of "instanceof/is_a\(\)" use ReflectionProvider service or "\(new ObjectType\(\)\)\-\>isSuperTypeOf\(\)" for static reflection to work#' + + # stricter child type on purpose + - '#Parameter \#1 \$tokenIterator \(Rector\\BetterPhpDocParser\\ValueObject\\Parser\\BetterTokenIterator\) of method Rector\\BetterPhpDocParser\\PhpDocParser\\BetterPhpDocParser\:\:parseTagValue\(\) should be contravariant with parameter \$tokens \(PHPStan\\PhpDocParser\\Parser\\TokenIterator\) of method PHPStan\\PhpDocParser\\Parser\\PhpDocParser\:\:parseTagValue\(\)#' diff --git a/rules/Arguments/Rector/FuncCall/SwapFuncCallArgumentsRector.php b/rules/Arguments/Rector/FuncCall/SwapFuncCallArgumentsRector.php index c8a7ba8dbb7..926195e87d0 100644 --- a/rules/Arguments/Rector/FuncCall/SwapFuncCallArgumentsRector.php +++ b/rules/Arguments/Rector/FuncCall/SwapFuncCallArgumentsRector.php @@ -78,7 +78,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?FuncCall { - $isJustSwapped = $node->getAttribute(self::JUST_SWAPPED); + $isJustSwapped = (bool) $node->getAttribute(self::JUST_SWAPPED, false); if ($isJustSwapped) { return null; } diff --git a/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php b/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php index 4e9aca131a3..18fe5915a70 100644 --- a/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php +++ b/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php @@ -110,7 +110,7 @@ public function refactor(Node $node): ?Node $classReflection = $this->reflectionProvider->getClass($propertyFetchVarType->getClassName()); - if (! $classReflection->hasProperty($propertyFetchName) || $classReflection->isBuiltIn()) { + if (! $classReflection->hasProperty($propertyFetchName) || $classReflection->isBuiltin()) { $newNodes[] = $this->replaceToPropertyExistsWithNullCheck( $issetVar->var, $propertyFetchName, diff --git a/rules/CodingStyle/Application/UseImportsAdder.php b/rules/CodingStyle/Application/UseImportsAdder.php index cf1873813a4..468adfa16b3 100644 --- a/rules/CodingStyle/Application/UseImportsAdder.php +++ b/rules/CodingStyle/Application/UseImportsAdder.php @@ -152,7 +152,7 @@ private function getNamespaceName(Namespace_ $namespace): ?string private function isCurrentNamespace(string $namespaceName, ObjectType $objectType): bool { $afterCurrentNamespace = Strings::after($objectType->getClassName(), $namespaceName . '\\'); - if (! $afterCurrentNamespace) { + if ($afterCurrentNamespace === null) { return false; } diff --git a/rules/CodingStyle/ClassNameImport/ShortNameResolver.php b/rules/CodingStyle/ClassNameImport/ShortNameResolver.php index bfa025f45bb..fccebe16aa5 100644 --- a/rules/CodingStyle/ClassNameImport/ShortNameResolver.php +++ b/rules/CodingStyle/ClassNameImport/ShortNameResolver.php @@ -219,10 +219,14 @@ private function fqnizeShortNames(array $shortNames, ?ReflectionClass $reflectio $shortNamesToFullyQualifiedNames = []; foreach ($shortNames as $shortName) { + $stmtsMatchedName = $this->useImportNameMatcher->matchNameWithStmts($shortName, $stmts); + if ($reflectionClass instanceof ReflectionClass) { $fullyQualifiedName = Reflection::expandClassName($shortName, $reflectionClass); + } elseif (is_string($stmtsMatchedName)) { + $fullyQualifiedName = $stmtsMatchedName; } else { - $fullyQualifiedName = $this->useImportNameMatcher->matchNameWithStmts($shortName, $stmts) ?: $shortName; + $fullyQualifiedName = $shortName; } $shortNamesToFullyQualifiedNames[$shortName] = $fullyQualifiedName; diff --git a/rules/CodingStyle/Naming/ClassNaming.php b/rules/CodingStyle/Naming/ClassNaming.php index 939606a4988..834761d7a9f 100644 --- a/rules/CodingStyle/Naming/ClassNaming.php +++ b/rules/CodingStyle/Naming/ClassNaming.php @@ -43,7 +43,12 @@ public function getShortName(string | Name | Identifier | ClassLike $name): stri $name = trim($name, '\\'); - return Strings::after($name, '\\', -1) ?: $name; + $shortName = Strings::after($name, '\\', -1); + if (is_string($shortName)) { + return $shortName; + } + + return $name; } public function getNamespace(string $fullyQualifiedName): ?string diff --git a/rules/CodingStyle/Node/NameImporter.php b/rules/CodingStyle/Node/NameImporter.php index bfb3c527240..33f2e409210 100644 --- a/rules/CodingStyle/Node/NameImporter.php +++ b/rules/CodingStyle/Node/NameImporter.php @@ -92,8 +92,8 @@ private function shouldSkipName(Name $name): bool // Importing root namespace classes (like \DateTime) is optional if (! $this->parameterProvider->provideBoolParameter(Option::IMPORT_SHORT_CLASSES)) { - $name = $this->nodeNameResolver->getName($name); - if ($name !== null && substr_count($name, '\\') === 0) { + $stringName = $this->nodeNameResolver->getName($name); + if ($stringName !== null && substr_count($stringName, '\\') === 0) { return true; } } @@ -161,7 +161,7 @@ private function isFunctionOrConstantImportWithSingleName(Name $name): bool $fullName = $name->toString(); - $autoImportNames = $this->parameterProvider->provideParameter(Option::AUTO_IMPORT_NAMES); + $autoImportNames = $this->parameterProvider->provideBoolParameter(Option::AUTO_IMPORT_NAMES); if ($autoImportNames && ! $parentNode instanceof Node && ! \str_contains( $fullName, '\\' diff --git a/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php b/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php index 3461ede6813..fa50dcedcc8 100644 --- a/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php +++ b/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php @@ -96,7 +96,7 @@ public function refactor(Node $node): ?Node foreach ($node->parts as $part) { if ($part instanceof EncapsedStringPart) { $this->collectEncapsedStringPart($part); - } elseif ($part instanceof Expr) { + } else { $this->collectExpr($part); } } diff --git a/rules/DowngradePhp72/NodeAnalyzer/BuiltInMethodAnalyzer.php b/rules/DowngradePhp72/NodeAnalyzer/BuiltInMethodAnalyzer.php index 273cf56005c..11bc4d4b7e6 100644 --- a/rules/DowngradePhp72/NodeAnalyzer/BuiltInMethodAnalyzer.php +++ b/rules/DowngradePhp72/NodeAnalyzer/BuiltInMethodAnalyzer.php @@ -29,7 +29,7 @@ public function isImplementsBuiltInInterface(ClassReflection $classReflection, C } foreach ($classReflection->getInterfaces() as $interfaceReflection) { - if (! $interfaceReflection->isBuiltIn()) { + if (! $interfaceReflection->isBuiltin()) { continue; } diff --git a/rules/Naming/ExpectedNameResolver/InflectorSingularResolver.php b/rules/Naming/ExpectedNameResolver/InflectorSingularResolver.php index 5f7c496373f..5b70c526255 100644 --- a/rules/Naming/ExpectedNameResolver/InflectorSingularResolver.php +++ b/rules/Naming/ExpectedNameResolver/InflectorSingularResolver.php @@ -50,7 +50,7 @@ public function __construct( public function resolve(string $currentName): string { $matchBy = Strings::match($currentName, self::BY_MIDDLE_REGEX); - if ($matchBy) { + if ($matchBy !== null) { return Strings::substring($currentName, 0, -strlen($matchBy['by'])); } diff --git a/rules/Php73/Rector/BooleanOr/IsCountableRector.php b/rules/Php73/Rector/BooleanOr/IsCountableRector.php index c9d1dc6adb2..af4416bedf3 100644 --- a/rules/Php73/Rector/BooleanOr/IsCountableRector.php +++ b/rules/Php73/Rector/BooleanOr/IsCountableRector.php @@ -61,7 +61,7 @@ public function refactor(Node $node): ?Node return null; } - return $this->isArrayAndDualCheckToAble->processBooleanOr($node, 'Countable', 'is_countable') ?: $node; + return $this->isArrayAndDualCheckToAble->processBooleanOr($node, 'Countable', 'is_countable'); } public function provideMinPhpVersion(): int diff --git a/rules/Php74/Rector/MethodCall/ChangeReflectionTypeToStringToGetNameRector.php b/rules/Php74/Rector/MethodCall/ChangeReflectionTypeToStringToGetNameRector.php index d6e29ff127f..142431cb06d 100644 --- a/rules/Php74/Rector/MethodCall/ChangeReflectionTypeToStringToGetNameRector.php +++ b/rules/Php74/Rector/MethodCall/ChangeReflectionTypeToStringToGetNameRector.php @@ -192,7 +192,7 @@ private function collectCallByVariable(MethodCall $methodCall): void return; } - if (! $methodName) { + if (! is_string($methodName)) { return; } diff --git a/rules/Privatization/NodeAnalyzer/PropertyFetchByMethodAnalyzer.php b/rules/Privatization/NodeAnalyzer/PropertyFetchByMethodAnalyzer.php index 27a9137da30..d6b000a176f 100644 --- a/rules/Privatization/NodeAnalyzer/PropertyFetchByMethodAnalyzer.php +++ b/rules/Privatization/NodeAnalyzer/PropertyFetchByMethodAnalyzer.php @@ -5,6 +5,7 @@ namespace Rector\Privatization\NodeAnalyzer; use PhpParser\Node; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Stmt; @@ -45,7 +46,7 @@ public function collectPropertyFetchByMethods(Class_ $class, array $propertyName $propertyUsageByMethods = []; foreach ($propertyNames as $propertyName) { - if ($this->isPropertyHasDefaultValue($class, $propertyName)) { + if ($this->isPropertyWithDefaultValue($class, $propertyName)) { continue; } @@ -85,10 +86,14 @@ private function isContainsLocalPropertyFetchNameOrPropertyChangingInMultipleMet return $this->isPropertyChangingInMultipleMethodCalls($classMethod, $propertyName); } - private function isPropertyHasDefaultValue(Class_ $class, string $propertyName): bool + private function isPropertyWithDefaultValue(Class_ $class, string $propertyName): bool { $property = $class->getProperty($propertyName); - return $property instanceof Property && $property->props[0]->default; + if (! $property instanceof Property) { + return false; + } + + return $property->props[0]->default instanceof Expr; } private function isInConstructWithPropertyChanging(ClassMethod $classMethod, string $propertyName): bool @@ -149,7 +154,7 @@ function (Node $node) use ( private function verifyPropertyReadInIf(?bool $isPropertyReadInIf, Node $node, string $propertyName): ?bool { if ($node instanceof If_) { - $isPropertyReadInIf = $this->refactorIf($node, $propertyName); + return $this->refactorIf($node, $propertyName); } return $isPropertyReadInIf; diff --git a/rules/Renaming/NodeManipulator/ClassRenamer.php b/rules/Renaming/NodeManipulator/ClassRenamer.php index 5e909e40aa4..3bf0a533681 100644 --- a/rules/Renaming/NodeManipulator/ClassRenamer.php +++ b/rules/Renaming/NodeManipulator/ClassRenamer.php @@ -340,7 +340,7 @@ private function renameClassImplements(ClassLike $classLike, array $oldToNewClas $classLike->implements = array_unique($classLike->implements); foreach ($classLike->implements as $key => $implementName) { - $virtualNode = $implementName->getAttribute(AttributeKey::VIRTUAL_NODE); + $virtualNode = (bool) $implementName->getAttribute(AttributeKey::VIRTUAL_NODE, false); if (! $virtualNode) { continue; }