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,
+ ]);
+};