diff --git a/README.md b/README.md index 75ae80e2..f4ee7707 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,25 @@ Fixes @param, @return, `@var` and inline `@var` annotations broken formats
+## RemoveSetterGetterDocblockFixer + +Remove docblock description from getter/setter methods, that only repeats the method name + +- class: [`Symplify\CodingStandard\Fixer\Annotation\RemoveSetterGetterDocblockFixer`](../src/Fixer/Annotation/RemoveSetterGetterDocblockFixer.php) + +```diff + /** +- * Get name + * + * @return string + */ + function getName() + { + } +``` + +
+ ## RemovePHPStormAnnotationFixer Remove "Created by PhpStorm" annotations diff --git a/composer.json b/composer.json index ac6b2d65..c1423c98 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "require": { "php": ">=8.2", "nette/utils": "^4.0", - "friendsofphp/php-cs-fixer": "^3.73.1" + "friendsofphp/php-cs-fixer": "^3.75.0" }, "require-dev": { "symplify/easy-coding-standard": "^12.5", @@ -13,7 +13,7 @@ "phpunit/phpunit": "^11.5", "phpstan/extension-installer": "^1.4", "phpstan/phpstan": "^2.1", - "rector/rector": "^2.0", + "rector/rector": "^2.0.13", "symplify/phpstan-extensions": "^12.0", "tomasvotruba/class-leak": "^2.0", "tracy/tracy": "^2.10" diff --git a/config/symplify.php b/config/symplify.php index 56e3659a..5ab61277 100644 --- a/config/symplify.php +++ b/config/symplify.php @@ -4,6 +4,7 @@ use PhpCsFixer\Fixer\Phpdoc\GeneralPhpdocAnnotationRemoveFixer; use Symplify\CodingStandard\Fixer\Annotation\RemovePHPStormAnnotationFixer; +use Symplify\CodingStandard\Fixer\Annotation\RemoveSetterGetterDocblockFixer; use Symplify\CodingStandard\Fixer\ArrayNotation\ArrayListItemNewlineFixer; use Symplify\CodingStandard\Fixer\ArrayNotation\ArrayOpenerAndCloserNewlineFixer; use Symplify\CodingStandard\Fixer\Commenting\ParamReturnAndVarTagMalformsFixer; @@ -21,6 +22,7 @@ RemovePHPStormAnnotationFixer::class, ParamReturnAndVarTagMalformsFixer::class, RemoveUselessDefaultCommentFixer::class, + RemoveSetterGetterDocblockFixer::class, // arrays ArrayListItemNewlineFixer::class, diff --git a/rector.php b/rector.php index 7c36316c..117979ed 100644 --- a/rector.php +++ b/rector.php @@ -6,10 +6,10 @@ return RectorConfig::configure() ->withPaths([__DIR__ . '/config', __DIR__ . '/src', __DIR__ . '/tests']) - ->withPhpSets() ->withRootFiles() + ->withPhpSets() ->withPreparedSets(codeQuality: true, codingStyle: true, naming: true, earlyReturn: true, privatization: true) - ->withImportNames(removeUnusedImports: true) + ->withImportNames() ->withSkip([ '*/Source/*', '*/Fixture/*', diff --git a/src/Fixer/Annotation/RemoveSetterGetterDocblockFixer.php b/src/Fixer/Annotation/RemoveSetterGetterDocblockFixer.php new file mode 100644 index 00000000..484b1cf2 --- /dev/null +++ b/src/Fixer/Annotation/RemoveSetterGetterDocblockFixer.php @@ -0,0 +1,92 @@ +methodNameResolver = new MethodNameResolver(); + } + + public function getDefinition(): FixerDefinitionInterface + { + return new FixerDefinition(self::ERROR_MESSAGE, []); + } + + /** + * @param Tokens $tokens + */ + public function isCandidate(Tokens $tokens): bool + { + if (! $tokens->isTokenKindFound(T_FUNCTION)) { + return false; + } + + return $tokens->isAnyTokenKindsFound([T_DOC_COMMENT, T_COMMENT]); + } + + /** + * @param Tokens $tokens + */ + public function fix(SplFileInfo $fileInfo, Tokens $tokens): void + { + $reversedTokens = $this->tokenReverser->reverse($tokens); + + foreach ($reversedTokens as $index => $token) { + if (! $token->isGivenKind([T_DOC_COMMENT, T_COMMENT])) { + continue; + } + + $methodName = $this->methodNameResolver->resolve($tokens, $index); + if (is_null($methodName)) { + continue; + } + + // skip if not setter or getter + $originalDocContent = $token->getContent(); + + $hasChanged = false; + + $docblockLines = explode("\n", $originalDocContent); + foreach ($docblockLines as $key => $docblockLine) { + $spacelessDocblockLine = Strings::replace($docblockLine, '#[\s\n]+#', ''); + if (strtolower($spacelessDocblockLine) !== strtolower('*' . $methodName)) { + continue; + } + + $hasChanged = true; + unset($docblockLines[$key]); + } + + if (! $hasChanged) { + continue; + } + + $tokens[$index] = new Token([T_DOC_COMMENT, implode("\n", $docblockLines)]); + } + } +} diff --git a/src/Fixer/Naming/MethodNameResolver.php b/src/Fixer/Naming/MethodNameResolver.php new file mode 100644 index 00000000..62378c93 --- /dev/null +++ b/src/Fixer/Naming/MethodNameResolver.php @@ -0,0 +1,40 @@ + $tokens + */ + public function resolve(Tokens $tokens, int $currentPosition): ?string + { + foreach ($tokens as $position => $token) { + if ($position <= $currentPosition) { + continue; + } + + if (! $token->isGivenKind([T_FUNCTION])) { + continue; + } + + $nextNextMeaningfulTokenIndex = $tokens->getNextMeaningfulToken($position + 1); + $nextNextMeaningfulToken = $tokens[$nextNextMeaningfulTokenIndex]; + + // skip anonymous functions + if (! $nextNextMeaningfulToken->isGivenKind(T_STRING)) { + continue; + } + + return $nextNextMeaningfulToken->getContent(); + } + + return null; + } +} diff --git a/tests/Fixer/Annotation/RemoveSetterGetterDocblockFixer/Fixture/simple_annotation.php.inc b/tests/Fixer/Annotation/RemoveSetterGetterDocblockFixer/Fixture/simple_annotation.php.inc new file mode 100644 index 00000000..71c8bd67 --- /dev/null +++ b/tests/Fixer/Annotation/RemoveSetterGetterDocblockFixer/Fixture/simple_annotation.php.inc @@ -0,0 +1,30 @@ + +----- + diff --git a/tests/Fixer/Annotation/RemoveSetterGetterDocblockFixer/Fixture/with_return_date_time.php.inc b/tests/Fixer/Annotation/RemoveSetterGetterDocblockFixer/Fixture/with_return_date_time.php.inc new file mode 100644 index 00000000..bccb313d --- /dev/null +++ b/tests/Fixer/Annotation/RemoveSetterGetterDocblockFixer/Fixture/with_return_date_time.php.inc @@ -0,0 +1,34 @@ + +----- + diff --git a/tests/Fixer/Annotation/RemoveSetterGetterDocblockFixer/RemoveSetterGetterDocblockFixerTest.php b/tests/Fixer/Annotation/RemoveSetterGetterDocblockFixer/RemoveSetterGetterDocblockFixerTest.php new file mode 100644 index 00000000..17c81f1f --- /dev/null +++ b/tests/Fixer/Annotation/RemoveSetterGetterDocblockFixer/RemoveSetterGetterDocblockFixerTest.php @@ -0,0 +1,28 @@ +doTestFile($filePath); + } + + public static function provideData(): Iterator + { + return self::yieldFiles(__DIR__ . '/Fixture'); + } + + public function provideConfig(): string + { + return __DIR__ . '/config/configured_rule.php'; + } +} diff --git a/tests/Fixer/Annotation/RemoveSetterGetterDocblockFixer/config/configured_rule.php b/tests/Fixer/Annotation/RemoveSetterGetterDocblockFixer/config/configured_rule.php new file mode 100644 index 00000000..1ce60e22 --- /dev/null +++ b/tests/Fixer/Annotation/RemoveSetterGetterDocblockFixer/config/configured_rule.php @@ -0,0 +1,12 @@ +rules([ + RemoveSetterGetterDocblockFixer::class, + ]); +};