diff --git a/README.md b/README.md
index 4f54f3fe..48c2ebd1 100644
--- a/README.md
+++ b/README.md
@@ -145,6 +145,22 @@ Fixes @param, @return, `@var` and inline `@var` annotations broken formats
+## RemovePropertyVariableNameDescriptionFixer
+
+Remove docblock descriptions which duplicate their property name
+
+- class: [`Symplify\CodingStandard\Fixer\Annotation\RemovePropertyVariableNameDescriptionFixer`](../src/Fixer/Annotation/RemovePropertyVariableNameDescriptionFixer.php)
+
+```diff
+ /**
+- * @var string $name
++ * @var string
+ */
+ private $name;
+```
+
+
+
## RemoveMethodNameDuplicateDescriptionFixer
Remove docblock descriptions which duplicate their method name
diff --git a/config/symplify.php b/config/symplify.php
index 4867109f..e4ea86d1 100644
--- a/config/symplify.php
+++ b/config/symplify.php
@@ -3,8 +3,9 @@
declare(strict_types=1);
use PhpCsFixer\Fixer\Phpdoc\GeneralPhpdocAnnotationRemoveFixer;
-use Symplify\CodingStandard\Fixer\Annotation\RemovePHPStormAnnotationFixer;
use Symplify\CodingStandard\Fixer\Annotation\RemoveMethodNameDuplicateDescriptionFixer;
+use Symplify\CodingStandard\Fixer\Annotation\RemovePHPStormAnnotationFixer;
+use Symplify\CodingStandard\Fixer\Annotation\RemovePropertyVariableNameDescriptionFixer;
use Symplify\CodingStandard\Fixer\ArrayNotation\ArrayListItemNewlineFixer;
use Symplify\CodingStandard\Fixer\ArrayNotation\ArrayOpenerAndCloserNewlineFixer;
use Symplify\CodingStandard\Fixer\Commenting\ParamReturnAndVarTagMalformsFixer;
@@ -23,6 +24,7 @@
ParamReturnAndVarTagMalformsFixer::class,
RemoveUselessDefaultCommentFixer::class,
RemoveMethodNameDuplicateDescriptionFixer::class,
+ RemovePropertyVariableNameDescriptionFixer::class,
// arrays
ArrayListItemNewlineFixer::class,
diff --git a/src/Fixer/Annotation/RemoveMethodNameDuplicateDescriptionFixer.php b/src/Fixer/Annotation/RemoveMethodNameDuplicateDescriptionFixer.php
index 1eab3b34..bfc9adea 100644
--- a/src/Fixer/Annotation/RemoveMethodNameDuplicateDescriptionFixer.php
+++ b/src/Fixer/Annotation/RemoveMethodNameDuplicateDescriptionFixer.php
@@ -62,7 +62,7 @@ public function fix(SplFileInfo $fileInfo, Tokens $tokens): void
}
$methodName = $this->methodNameResolver->resolve($tokens, $index);
- if (is_null($methodName)) {
+ if ($methodName === null) {
continue;
}
diff --git a/src/Fixer/Annotation/RemovePropertyVariableNameDescriptionFixer.php b/src/Fixer/Annotation/RemovePropertyVariableNameDescriptionFixer.php
new file mode 100644
index 00000000..12290276
--- /dev/null
+++ b/src/Fixer/Annotation/RemovePropertyVariableNameDescriptionFixer.php
@@ -0,0 +1,94 @@
+propertyNameResolver = new PropertyNameResolver();
+ }
+
+ public function getDefinition(): FixerDefinitionInterface
+ {
+ return new FixerDefinition(self::ERROR_MESSAGE, []);
+ }
+
+ /**
+ * @param Tokens $tokens
+ */
+ public function isCandidate(Tokens $tokens): bool
+ {
+ if (! $tokens->isTokenKindFound(T_VARIABLE)) {
+ 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;
+ }
+
+ $propertyName = $this->propertyNameResolver->resolve($tokens, $index);
+ if ($propertyName === null) {
+ continue;
+ }
+
+ // skip if not setter or getter
+ $originalDocContent = $token->getContent();
+
+ $hasChanged = false;
+
+ $docblockLines = explode("\n", $originalDocContent);
+ foreach ($docblockLines as $key => $docblockLine) {
+ if (! str_ends_with($docblockLine, ' ' . $propertyName)) {
+ continue;
+ }
+
+ // remove last x characters
+ $docblockLine = Strings::substring($docblockLine, 0, -strlen(' ' . $propertyName));
+
+ $hasChanged = true;
+ $docblockLines[$key] = rtrim($docblockLine);
+ }
+
+ 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
index 62378c93..57a96c88 100644
--- a/src/Fixer/Naming/MethodNameResolver.php
+++ b/src/Fixer/Naming/MethodNameResolver.php
@@ -6,7 +6,6 @@
use PhpCsFixer\Tokenizer\Token;
use PhpCsFixer\Tokenizer\Tokens;
-use SplFileInfo;
final class MethodNameResolver
{
diff --git a/src/Fixer/Naming/PropertyNameResolver.php b/src/Fixer/Naming/PropertyNameResolver.php
new file mode 100644
index 00000000..954eb334
--- /dev/null
+++ b/src/Fixer/Naming/PropertyNameResolver.php
@@ -0,0 +1,31 @@
+ $tokens
+ */
+ public function resolve(Tokens $tokens, int $currentPosition): ?string
+ {
+ foreach ($tokens as $position => $token) {
+ if ($position <= $currentPosition) {
+ continue;
+ }
+
+ if (! $token->isGivenKind([T_VARIABLE])) {
+ continue;
+ }
+
+ return $token->getContent();
+ }
+
+ return null;
+ }
+}
diff --git a/tests/Fixer/Annotation/RemovePropertyVariableNameDescriptionFixer/Fixture/simple_annotation.php.inc b/tests/Fixer/Annotation/RemovePropertyVariableNameDescriptionFixer/Fixture/simple_annotation.php.inc
new file mode 100644
index 00000000..54ef1f78
--- /dev/null
+++ b/tests/Fixer/Annotation/RemovePropertyVariableNameDescriptionFixer/Fixture/simple_annotation.php.inc
@@ -0,0 +1,27 @@
+
+-----
+
diff --git a/tests/Fixer/Annotation/RemovePropertyVariableNameDescriptionFixer/Fixture/skip_name_in_the_middle.php.inc b/tests/Fixer/Annotation/RemovePropertyVariableNameDescriptionFixer/Fixture/skip_name_in_the_middle.php.inc
new file mode 100644
index 00000000..967c0849
--- /dev/null
+++ b/tests/Fixer/Annotation/RemovePropertyVariableNameDescriptionFixer/Fixture/skip_name_in_the_middle.php.inc
@@ -0,0 +1,11 @@
+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/RemovePropertyVariableNameDescriptionFixer/config/configured_rule.php b/tests/Fixer/Annotation/RemovePropertyVariableNameDescriptionFixer/config/configured_rule.php
new file mode 100644
index 00000000..8c880480
--- /dev/null
+++ b/tests/Fixer/Annotation/RemovePropertyVariableNameDescriptionFixer/config/configured_rule.php
@@ -0,0 +1,12 @@
+rules([
+ RemovePropertyVariableNameDescriptionFixer::class,
+ ]);
+};