123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949 |
- <?php
- declare(strict_types=1);
- /*
- * This file is part of PHP CS Fixer.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- * Dariusz Rumiński <dariusz.ruminski@gmail.com>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
- namespace PhpCsFixer\Tests\Fixer\Phpdoc;
- use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
- /**
- * @author Ceeram <ceeram@cakephp.org>
- *
- * @internal
- *
- * @covers \PhpCsFixer\Fixer\Phpdoc\PhpdocToCommentFixer
- *
- * @extends AbstractFixerTestCase<\PhpCsFixer\Fixer\Phpdoc\PhpdocToCommentFixer>
- *
- * @phpstan-import-type _AutogeneratedInputConfiguration from \PhpCsFixer\Fixer\Phpdoc\PhpdocToCommentFixer
- */
- final class PhpdocToCommentFixerTest extends AbstractFixerTestCase
- {
- /**
- * @param _AutogeneratedInputConfiguration $config
- *
- * @dataProvider provideFixCases
- */
- public function testFix(string $expected, ?string $input = null, array $config = []): void
- {
- $this->fixer->configure($config);
- $this->doTest($expected, $input);
- }
- public static function provideFixCases(): iterable
- {
- yield [
- '<?php
- /**
- * Do not convert this
- */
- namespace Docs;
- /**
- * Do not convert this
- */
- class DocBlocks
- {
- /**
- * Do not convert this
- */
- use TestTrait;
- /**
- * Do not convert this
- */
- const STRUCTURAL = true;
- /**
- * Do not convert this
- */
- protected $indent = false;
- /**
- * Do not convert this
- */
- var $oldPublicStyle;
- /**
- * Do not convert this
- */
- public function test() {}
- /**
- * Do not convert this
- */
- private function testPrivate() {}
- /**
- * Do not convert this
- */
- function testNoVisibility() {}
- }',
- ];
- yield [
- '<?php namespace Docs;
- /**
- * Do not convert this
- */
- /**
- * Do not convert this
- */
- class DocBlocks{}
- ',
- ];
- yield [
- '<?php
- /**
- * Do not convert this
- */
- namespace Foo;
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /**
- * Do not convert this
- */
- abstract class DocBlocks
- {
- /**
- * Do not convert this
- */
- abstract public function test();
- }',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /**
- * Do not convert this
- */
- interface DocBlocks
- {
- public function test();
- }',
- ];
- yield [
- '<?php
- namespace NS;
- /**
- * Do not
- */
- final class Foo
- {
- }',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /**
- * Do not convert this
- */
- require "require.php";
- /**
- * Do not convert this
- */
- require_once "require_once.php";
- /**
- * Do not convert this
- */
- include "include.php";
- /**
- * Do not convert this
- */
- include_once "include_once.php";
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /**
- * Do not convert this
- *
- * @var int
- */
- $a = require "require.php";
- /**
- * Do not convert this
- *
- * @var int
- */
- $b = require_once "require_once.php";
- /**
- * Do not convert this
- *
- * @var int
- */
- $c = include "include.php";
- /**
- * Do not convert this
- *
- * @var int
- */
- $d = include_once "include_once.php";
- /**
- * @var Composer\Autoload\ClassLoader $loader
- */
- $loader = require_once __DIR__."/vendor/autoload.php";
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /**
- * @var ClassLoader $loader
- */
- $loader = require_once __DIR__."/../app/autoload.php";
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /**
- * Do not convert this
- *
- * @var Foo
- */
- $foo = createFoo();
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /**
- * Do not convert this
- *
- * @var bool $local
- */
- $local = true;
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /**
- * Comment
- */
- $local = true;
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** @var \Sqlite3 $sqlite */
- foreach($connections as $sqlite) {
- $sqlite->open($path);
- }',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** @var \Sqlite3 $sqlite */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** @var int $key */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /* This should not be a docblock */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }',
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** This should not be a docblock */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /* there should be no docblock here */
- $sqlite1->open($path);
- ',
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** there should be no docblock here */
- $sqlite1->open($path);
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /* there should be no docblock here */
- $i++;
- ',
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** there should be no docblock here */
- $i++;
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** @var int $index */
- $index = $a[\'number\'];
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** @var string $two */
- list($one, $two) = explode("," , $csvLines);
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /* This should be a comment */
- list($one, $two) = explode("," , $csvLines);
- ',
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** This should be a comment */
- list($one, $two) = explode("," , $csvLines);
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** @var int $index */
- foreach ($foo->getPairs($c->bar(), $bar) as $index => list($a, $b)) {
- // Do something with $index, $a and $b
- }
- /** @var \Closure $value */
- if (!$value = $this->getValue()) {
- return false;
- }
- /** @var string $name */
- switch ($name = $this->getName()) {
- case "John":
- return false;
- case "Jane":
- return true;
- }
- /** @var string $content */
- while ($content = $this->getContent()) {
- $name .= $content;
- }
- /** @var int $size */
- for($i = 0, $size = count($people); $i < $size; ++$i) {
- $people[$i][\'salt\'] = mt_rand(000000, 999999);
- }',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /* @var int $wrong */
- foreach ($foo->getPairs($c->bar(), $bar) as $index => list($a, $b)) {
- // Do something with $index, $a and $b
- }
- /* @var \Closure $notValue */
- if (!$value = $this->getValue()) {
- return false;
- }
- /* @var string $notName */
- switch ($name = $this->getName()) {
- case "John":
- return false;
- case "Jane":
- return true;
- }
- /* @var string $notContent */
- while ($content = $this->getContent()) {
- $name .= $content;
- }
- /* @var int $notSize */
- for($i = 0, $size = count($people); $i < $size; ++$i) {
- $people[$i][\'salt\'] = mt_rand(000000, 999999);
- }',
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** @var int $wrong */
- foreach ($foo->getPairs($c->bar(), $bar) as $index => list($a, $b)) {
- // Do something with $index, $a and $b
- }
- /** @var \Closure $notValue */
- if (!$value = $this->getValue()) {
- return false;
- }
- /** @var string $notName */
- switch ($name = $this->getName()) {
- case "John":
- return false;
- case "Jane":
- return true;
- }
- /** @var string $notContent */
- while ($content = $this->getContent()) {
- $name .= $content;
- }
- /** @var int $notSize */
- for($i = 0, $size = count($people); $i < $size; ++$i) {
- $people[$i][\'salt\'] = mt_rand(000000, 999999);
- }',
- ];
- yield [
- '<?php
- /* This should be a comment */
- ',
- '<?php
- /** This should be a comment */
- ',
- ];
- yield [
- '<?php
- /**
- * This is a page level docblock should stay untouched
- */
- echo "Some string";
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** @var \NumberFormatter $formatter */
- static $formatter;
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- function getNumberFormatter()
- {
- /** @var \NumberFormatter $formatter */
- static $formatter;
- }
- ',
- ];
- yield [
- '<?php
- class A
- {
- public function b()
- {
- /** @var int $c */
- print($c = 0);
- }
- }
- ',
- ];
- yield ['<?php
- /** header */
- echo 123;
- /** @var int $bar1 */
- (print($bar1 = 0));
- ',
- ];
- yield [
- '<?php
- /** header */
- echo 123;
- /** @var ClassLoader $loader */
- $loader = require __DIR__.\'/../vendor/autoload.php\';
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** @todo Do not convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }',
- null,
- ['ignored_tags' => ['todo']],
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /* Convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }
- /** @todo Do not convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }',
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** Convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }
- /** @todo Do not convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }',
- ['ignored_tags' => ['todo']],
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /* Convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }
- /** @fix-me Do not convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }',
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** Convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }
- /** @fix-me Do not convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }',
- ['ignored_tags' => ['fix-me']],
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /* @todoNot Convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }
- /** @TODO Do not convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }',
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** @todoNot Convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }
- /** @TODO Do not convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }',
- ['ignored_tags' => ['todo']],
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /* Convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }
- /**
- * @deprecated This tag is not in the list but the next one is
- * @todo This should be a PHPDoc as the tag is on "ignored_tags" list
- */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }',
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** Convert this */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }
- /**
- * @deprecated This tag is not in the list but the next one is
- * @todo This should be a PHPDoc as the tag is on "ignored_tags" list
- */
- foreach($connections as $key => $sqlite) {
- $sqlite->open($path);
- }',
- ['ignored_tags' => ['todo']],
- ];
- yield 'do not convert before fn' => [
- '<?php // needed because by default first comment is never fixed
- /** @param int $x */
- fn ($x) => $x + 42;
- ',
- ];
- yield 'convert before return without option' => [
- '<?php
- function doSomething()
- {
- /* @var void */
- return;
- }
- ',
- '<?php
- function doSomething()
- {
- /** @var void */
- return;
- }
- ',
- ['allow_before_return_statement' => false],
- ];
- yield 'do not convert before return with option' => [
- '<?php
- function doSomething()
- {
- /** @var void */
- return;
- }
- ',
- null,
- ['allow_before_return_statement' => true],
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /**
- * Do not convert this
- */
- trait DocBlocks
- {
- public function test() {}
- }',
- ];
- yield [
- '<?php
- /** header */
- echo 123;
- /** @var User $bar3 */
- ($bar3 = tmp())->doSomething();
- /** @var Session $session */ # test
- $session = new Session();
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** @var int $a */
- [$a] = $b;
- /* @var int $c */
- [$a] = $c;
- ',
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /** @var int $a */
- [$a] = $b;
- /** @var int $c */
- [$a] = $c;
- ',
- ];
- yield [
- '<?php
- $first = true;// needed because by default first docblock is never fixed.
- /**
- * @var int $a
- */
- [$a] = $b;
- ',
- ];
- yield [
- '<?php
- class Foo {
- /**
- * Do not convert this
- */
- private int $foo;
- }',
- ];
- yield [
- '<?php
- class Foo {
- /**
- * Do not convert this
- */
- protected ?string $foo;
- }',
- ];
- yield [
- '<?php
- class Foo {
- /**
- * Do not convert this
- */
- public ? float $foo;
- }',
- ];
- yield [
- '<?php
- class Foo {
- /**
- * Do not convert this
- */
- var ? Foo\Bar $foo;
- }',
- ];
- yield [
- '<?php
- class Foo {
- /**
- * Do not convert this
- */
- var ? array $foo;
- }',
- ];
- }
- /**
- * @dataProvider provideFix80Cases
- *
- * @requires PHP 8.0
- */
- public function testFix80(string $expected, ?string $input = null): void
- {
- $this->doTest($expected, $input);
- }
- /**
- * @return iterable<array{0: string, 1?: string}>
- */
- public static function provideFix80Cases(): iterable
- {
- yield [
- '<?php
- /**
- * @Annotation
- */
- #[CustomAnnotationA]
- Class MyAnnotation3
- {
- /**
- * @Annotation
- */
- #[CustomAnnotationB]
- #[CustomAnnotationC]
- public function foo() {}
- /**
- * @Annotation
- */
- #[CustomAnnotationD]
- public $var;
- /*
- * end of class
- */
- }',
- '<?php
- /**
- * @Annotation
- */
- #[CustomAnnotationA]
- Class MyAnnotation3
- {
- /**
- * @Annotation
- */
- #[CustomAnnotationB]
- #[CustomAnnotationC]
- public function foo() {}
- /**
- * @Annotation
- */
- #[CustomAnnotationD]
- public $var;
- /**
- * end of class
- */
- }',
- ];
- yield [
- '<?php
- class Foo
- {
- public function __construct(
- /** @var string Do not convert this */
- public string $bar
- ) {
- }
- }
- ',
- ];
- }
- /**
- * @dataProvider provideFix81Cases
- *
- * @requires PHP 8.1
- */
- public function testFix81(string $expected): void
- {
- $this->doTest($expected);
- }
- /**
- * @return iterable<string, array{string}>
- */
- public static function provideFix81Cases(): iterable
- {
- yield 'enum' => [
- '<?php
- declare(strict_types=1);
- namespace PhpCsFixer\Tests\Tokenizer\Analyzer;
- /** Before enum */
- enum Foo {
- //
- }',
- ];
- yield 'phpDoc over enum case' => [
- '<?php
- enum Foo: int
- {
- /**
- * @deprecated do not convert this
- */
- case BAR = 1;
- }
- ',
- ];
- }
- }
|