Skip to content

Latest commit

 

History

History
497 lines (389 loc) · 11.7 KB

File metadata and controls

497 lines (389 loc) · 11.7 KB

13 Rules Overview


Categories


Array

SimplifyListIndexRector

Simplify list index

 /** @noinspection ALL */
-[0 => 'foo', 1 => 'bar', 2 => 'baz'];
-[0 => 'foo', 'bar', 2 => 'baz'];
+['foo', 'bar', 'baz'];
+['foo', 'bar', 'baz'];

SortListItemOfSameScalarTypeRector

Sort list item of same scalar type

🔧 configure it!

 /** @noinspection ALL */
 [
-    'c',
-    'b',
+    'A',
+    'C',
     'a',
-    'a10',
     'a8',
     'a9',
-    'C',
-    'A',
+    'a10',
+    'b',
+    'c',
 ];

UpdateRectorCodeSamplesFromFixturesRector

Update rector code samples from fixtures

 /** @noinspection ALL */
 namespace Guanguans\RectorRules\Rector\Array_;

 use Guanguans\RectorRules\Rector\AbstractRector;
 use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;

 final class SimplifyListIndexRector extends AbstractRector
 {
     protected function codeSamples(): array
     {
         return [
             new CodeSample(
                 <<<'PHP'
                 /** @noinspection ALL */
                 [0 => 'foo', 1 => 'bar', 2 => 'baz'];
-                // [0 => 'foo', 'bar', 2 => 'baz'];
+                [0 => 'foo', 'bar', 2 => 'baz'];
                 PHP,
                 <<<'PHP'
                 /** @noinspection ALL */
                 ['foo', 'bar', 'baz'];
-                // ['foo', 'bar', 'baz'];
+                ['foo', 'bar', 'baz'];
                 PHP,
             ),
         ];
     }
 }

Class

UpdatePHPStanMethodNodeParamDocblockFromNodeTypesRector

Update p h p stan method node param docblock from node types

 /** @noinspection ALL */
 namespace Guanguans\PHPStanRules\Rule\File;

 use Guanguans\PHPStanRules\Rule\AbstractRule;
 use PhpParser\Node;
 use PHPStan\Analyser\Scope;
 use PHPStan\Node\FileNode;

 final class ForbiddenSideEffectsRule extends AbstractRule
 {
     public function getNodeType(): string
     {
         return FileNode::class;
     }

+    /**
+     * @param \PHPStan\Node\FileNode $node
+     */
     public function processNode(Node $node, Scope $scope): array
     {
         return [];
     }
 }

UpdateRectorMethodNodeParamDocblockFromNodeTypesRector

Update rector method node param docblock from node types

 /** @noinspection ALL */
 namespace Guanguans\RectorRules\Rector\Class_;

 use Guanguans\RectorRules\Rector\AbstractRector;
 use PhpParser\Node;
 use PhpParser\Node\Stmt\Class_;

 final class UpdateRectorMethodNodeParamDocblockFromNodeTypesRector extends AbstractRector
 {
     public function getNodeTypes(): array
     {
         return [
             Class_::class,
         ];
     }

+    /**
+     * @param \PhpParser\Node\Stmt\Class_ $node
+     */
     public function refactor(Node $node): ?Node
     {
         return null;
     }
 }

ClassMethod

PrivateToProtectedVisibilityForTraitRector

Private to protected visibility for trait

 /** @noinspection ALL */
 trait Foo
 {
-    private function run(): void
+    protected function run(): void
     {
     }
 }

File

AddNoinspectionDocblockToFileFirstStmtRector

Add noinspection docblock to file first stmt

🔧 configure it!

 /** @noinspection AnonymousFunctionStaticInspection */
+/** @noinspection NullPointerExceptionInspection */
+/** @noinspection PhpPossiblePolymorphicInvocationInspection */
+/** @noinspection PhpUndefinedClassInspection */
+/** @noinspection PhpUnhandledExceptionInspection */
+/** @noinspection PhpVoidFunctionResultUsedInspection */
 /** @noinspection StaticClosureCanBeUsedInspection */
 /** @noinspection ALL */
 /** @noinspection PhpUnusedAliasInspection */
 declare(strict_types=1);

SortFileFirstStmtDocblockRector

Sort file first stmt docblock

 /** @noinspection ALL */
-
+/** @noinspection NullPointerExceptionInspection */
+/** @noinspection PhpPossiblePolymorphicInvocationInspection */
+/** @noinspection StaticClosureCanBeUsedInspection */
 /**
  * Copyright (c) 2025-2026 guanguans<ityaozm@gmail.com>
  *
  * For the full copyright and license information, please view
  * the LICENSE file that was distributed with this source code.
  *
  * @see https://github.com/guanguans/rector-rules
  */
-
-/** @noinspection StaticClosureCanBeUsedInspection */
-/** @noinspection NullPointerExceptionInspection */
-/** @noinspection PhpPossiblePolymorphicInvocationInspection */
 declare(strict_types=1);

SortFileFunctionStmtRector

Sort file function stmt

 /** @noinspection ALL */
 namespace Guanguans\RectorRulesTests\Rector\File\SortFileFunctionStmtRector\Fixture;

-function c(): void {}
+function a(): void {}

 function b(): void {}

-function a(): void {}
+function c(): void {}

FuncCall

RenameAppFunctionToResolveFunctionRector

Rename app function to resolve function

 /** @noinspection ALL */
 app();
-app('request');
-app(\Illuminate\Http\Request::class);
-app(\Illuminate\Log\Logger::class, [
+resolve('request');
+resolve(\Illuminate\Http\Request::class);
+resolve(\Illuminate\Log\Logger::class, [
     'logger' => new \Psr\Log\NullLogger(),
 ]);

FunctionLike

RenameGarbageParamNameRector

Rename garbage param name

 /** @noinspection ALL */
-collect($array)->filter(static function (string $value, int $key): bool {
+collect($array)->filter(static function (string $_, int $key): bool {
     return 2 === $key;
 });

 /**
- * @param mixed $value
+ * @param mixed $_
  */
-function filter($value, $key): bool
+function filter($_, $key): bool
 {
     return 2 === $key;
 }

 /**
  * @param mixed $key
  */
-function filter($value, $key): bool
+function filter($_, $key): bool
 {
     return 2 === $key;
 }

 function array_is_list(array $array): bool
 {
     $nextKey = -1;

-    foreach ($array as $key => $value) {
+    foreach ($array as $key => $_) {
         if ($key !== ++$nextKey) {
             return false;
         }
     }

     return true;
 }

Name

RenameToConventionalCaseNameRector

Rename to conventional case name

🔧 configure it!

 /** @noinspection ALL */
 // @formatter:off
 // phpcs:ignoreFile

 // lower snake
-use function functionName;
-function functionName(){}
-functionName();
-call_user_func('functionName');
-call_user_func_array('functionName', []);
-function_exists('functionName');
+use function function_name;
+function function_name(){}
+\function_name();
+call_user_func('function_name');
+call_user_func_array('function_name', []);
+function_exists('function_name');

 // ucfirst camel
 // #[attribute_name()]
-class class_name{}
+class ClassName{}
 // enum enum_name{}
 // enum Enum{case case_name;}
-interface interface_name{}
-trait trait_name{}
-class Foo extends class_name implements interface_name{}
-class_name::$property;
-class_name::CONST;
-class_name::method();
+interface InterfaceName{}
+trait TraitName{}
+class Foo extends \ClassName implements \InterfaceName{}
+\ClassName::$property;
+\ClassName::CONST;
+\ClassName::method();
 // enum Enum implements interface_name{}
-use class_name;
-use trait_name;
-class_alias('class_name', 'alias_class_name');
-class_alias($className, 'alias_class_name');
-class_exists('class_name');
-class_implements('class_name');
-class_parents('class_name');
-class_uses('class_name');
-enum_exists('enum_name');
-get_class_methods('class_name');
-get_class_vars('class_name');
-get_parent_class('class_name');
-interface_exists('interface_name');
-is_subclass_of('class_name', 'parent_class_name');
-is_subclass_of($className, 'parent_class_name');
-trait_exists('trait_name', true);
+use ClassName;
+use TraitName;
+class_alias('ClassName', 'AliasClassName');
+class_alias($className, 'AliasClassName');
+class_exists('ClassName');
+class_implements('ClassName');
+class_parents('ClassName');
+class_uses('ClassName');
+enum_exists('EnumName');
+get_class_methods('ClassName');
+get_class_vars('ClassName');
+get_parent_class('ClassName');
+interface_exists('InterfaceName');
+is_subclass_of('ClassName', 'ParentClassName');
+is_subclass_of($className, 'ParentClassName');
+trait_exists('TraitName', true);

 // upper snake
-use const constName;
-class Foo{public const constName = 'const';}
-Foo::constName;
-define('constName', 'const');
-defined('constName');
-constant('constName');
-constant('Foo::constName');
-constName;
+use const CONST_NAME;
+class Foo{public const CONST_NAME = 'const';}
+Foo::CONST_NAME;
+define('CONST_NAME', 'const');
+defined('CONST_NAME');
+constant('CONST_NAME');
+constant('Foo::CONST_NAME');
+\CONST_NAME;

 // lcfirst camel
-$var_name;
-$object->method_name();
-$object->property_name;
-call_user_method('method_name', $object);
-call_user_method_array('method_name', $object);
-class Foo{public $property_name;}
-class Foo{public function method_name(){}}
-class Foo{public int $property_name;}
-Foo::$property_name;
-Foo::method_name();
-method_exists($object, 'method_name');
-property_exists($object, 'property_name');
+$varName;
+$object->methodName();
+$object->propertyName;
+call_user_method('methodName', $object);
+call_user_method_array('methodName', $object);
+class Foo{public $propertyName;}
+class Foo{public function methodName(){}}
+class Foo{public int $propertyName;}
+Foo::$propertyName;
+Foo::methodName();
+method_exists($object, 'methodName');
+property_exists($object, 'propertyName');

Namespace

RemoveNamespaceRector

Remove namespace

 /** @noinspection ALL */
-namespace Guanguans\RectorRulesTests\Rector\Namespace_\RemoveNamespaceRector\Fixture;

 it('is true', function (): void {
     expect(true)->toBeTrue();
 });