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