PhpdocParamOrderFixerTest.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4. * This file is part of PHP CS Fixer.
  5. *
  6. * (c) Fabien Potencier <fabien@symfony.com>
  7. * Dariusz Rumiński <dariusz.ruminski@gmail.com>
  8. *
  9. * This source file is subject to the MIT license that is bundled
  10. * with this source code in the file LICENSE.
  11. */
  12. namespace PhpCsFixer\Tests\Fixer\Phpdoc;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @author Jonathan Gruber <gruberjonathan@gmail.com>
  16. *
  17. * @internal
  18. *
  19. * @covers \PhpCsFixer\Fixer\Phpdoc\PhpdocParamOrderFixer
  20. *
  21. * @extends AbstractFixerTestCase<\PhpCsFixer\Fixer\Phpdoc\PhpdocParamOrderFixer>
  22. */
  23. final class PhpdocParamOrderFixerTest extends AbstractFixerTestCase
  24. {
  25. public function testNoChanges(): void
  26. {
  27. $expected = <<<'EOT'
  28. <?php
  29. class C {
  30. /**
  31. * @param $a
  32. */
  33. public function m($a) {}
  34. }
  35. EOT;
  36. $this->doTest($expected);
  37. }
  38. public function testNoChangesMultiple(): void
  39. {
  40. $expected = <<<'EOT'
  41. <?php
  42. class C {
  43. /**
  44. * @param string $a
  45. * @param bool $b
  46. */
  47. public function m($a, $b) {}
  48. }
  49. EOT;
  50. $this->doTest($expected);
  51. }
  52. public function testOnlyParamsUntyped(): void
  53. {
  54. $expected = <<<'EOT'
  55. <?php
  56. class C {
  57. /**
  58. * @param $a
  59. * @param $b
  60. * @param $c
  61. * @param $d
  62. * @param $e
  63. */
  64. public function m($a, $b, $c, $d, $e) {}
  65. }
  66. EOT;
  67. $input = <<<'EOT'
  68. <?php
  69. class C {
  70. /**
  71. * @param $b
  72. * @param $e
  73. * @param $a
  74. * @param $c
  75. * @param $d
  76. */
  77. public function m($a, $b, $c, $d, $e) {}
  78. }
  79. EOT;
  80. $this->doTest($expected, $input);
  81. }
  82. public function testOnlyParamsUntypedMixed(): void
  83. {
  84. $expected = <<<'EOT'
  85. <?php
  86. class C {
  87. /**
  88. * @param int $a
  89. * @param $b
  90. * @param $c
  91. * @param bool $d
  92. * @param $e
  93. */
  94. public function m($a, $b, $c, $d, $e) {}
  95. }
  96. EOT;
  97. $input = <<<'EOT'
  98. <?php
  99. class C {
  100. /**
  101. * @param $c
  102. * @param $e
  103. * @param int $a
  104. * @param $b
  105. * @param bool $d
  106. */
  107. public function m($a, $b, $c, $d, $e) {}
  108. }
  109. EOT;
  110. $this->doTest($expected, $input);
  111. }
  112. public function testOnlyParamsTyped(): void
  113. {
  114. $expected = <<<'EOT'
  115. <?php
  116. class C {
  117. /**
  118. * @param string $a
  119. * @param bool $b
  120. * @param string $c
  121. * @param string $d
  122. * @param int $e
  123. */
  124. public function m($a, $b, $c, $d, $e) {}
  125. }
  126. EOT;
  127. $input = <<<'EOT'
  128. <?php
  129. class C {
  130. /**
  131. * @param bool $b
  132. * @param string $a
  133. * @param string $c
  134. * @param int $e
  135. * @param string $d
  136. */
  137. public function m($a, $b, $c, $d, $e) {}
  138. }
  139. EOT;
  140. $this->doTest($expected, $input);
  141. }
  142. public function testOnlyParamsUndocumented(): void
  143. {
  144. $expected = <<<'EOT'
  145. <?php
  146. class C {
  147. /**
  148. * @param $a
  149. * @param $b
  150. * @param $c
  151. * @param $d
  152. */
  153. public function m($a, $b, $c, $d, $e, $f) {}
  154. }
  155. EOT;
  156. $input = <<<'EOT'
  157. <?php
  158. class C {
  159. /**
  160. * @param $a
  161. * @param $c
  162. * @param $d
  163. * @param $b
  164. */
  165. public function m($a, $b, $c, $d, $e, $f) {}
  166. }
  167. EOT;
  168. $this->doTest($expected, $input);
  169. }
  170. public function testOnlyParamsSuperfluousAnnotation(): void
  171. {
  172. $expected = <<<'EOT'
  173. <?php
  174. class C {
  175. /**
  176. * @param $a
  177. * @param $b
  178. * @param $c
  179. * @param $superfluous
  180. */
  181. public function m($a, $b, $c) {}
  182. }
  183. EOT;
  184. $input = <<<'EOT'
  185. <?php
  186. class C {
  187. /**
  188. * @param $a
  189. * @param $superfluous
  190. * @param $b
  191. * @param $c
  192. */
  193. public function m($a, $b, $c) {}
  194. }
  195. EOT;
  196. $this->doTest($expected, $input);
  197. }
  198. public function testOnlyParamsSuperfluousAnnotations(): void
  199. {
  200. $expected = <<<'EOT'
  201. <?php
  202. class C {
  203. /**
  204. * @param $a
  205. * @param $b
  206. * @param $c
  207. * @param $superfluous2
  208. * @param $superfluous1
  209. * @param $superfluous3
  210. */
  211. public function m($a, $b, $c) {}
  212. }
  213. EOT;
  214. $input = <<<'EOT'
  215. <?php
  216. class C {
  217. /**
  218. * @param $a
  219. * @param $superfluous2
  220. * @param $b
  221. * @param $superfluous1
  222. * @param $c
  223. * @param $superfluous3
  224. */
  225. public function m($a, $b, $c) {}
  226. }
  227. EOT;
  228. $this->doTest($expected, $input);
  229. }
  230. public function testParamsUntyped(): void
  231. {
  232. $expected = <<<'EOT'
  233. <?php
  234. class C {
  235. /**
  236. * Some function
  237. *
  238. * @param $a
  239. * @param $b
  240. * @param $c
  241. *
  242. * @throws \Exception
  243. *
  244. * @return bool
  245. */
  246. public function m($a, $b, $c, $d, $e) {}
  247. }
  248. EOT;
  249. $input = <<<'EOT'
  250. <?php
  251. class C {
  252. /**
  253. * Some function
  254. *
  255. * @param $b
  256. * @param $c
  257. * @param $a
  258. *
  259. * @throws \Exception
  260. *
  261. * @return bool
  262. */
  263. public function m($a, $b, $c, $d, $e) {}
  264. }
  265. EOT;
  266. $this->doTest($expected, $input);
  267. }
  268. public function testParamsTyped(): void
  269. {
  270. $expected = <<<'EOT'
  271. <?php
  272. class C {
  273. /**
  274. * Some function
  275. *
  276. * @param Foo $a
  277. * @param int $b
  278. * @param bool $c
  279. *
  280. * @throws \Exception
  281. *
  282. * @return bool
  283. */
  284. public function m($a, $b, $c, $d, $e) {}
  285. }
  286. EOT;
  287. $input = <<<'EOT'
  288. <?php
  289. class C {
  290. /**
  291. * Some function
  292. *
  293. * @param int $b
  294. * @param bool $c
  295. * @param Foo $a
  296. *
  297. * @throws \Exception
  298. *
  299. * @return bool
  300. */
  301. public function m($a, $b, $c, $d, $e) {}
  302. }
  303. EOT;
  304. $this->doTest($expected, $input);
  305. }
  306. public function testParamsDescription(): void
  307. {
  308. $expected = <<<'EOT'
  309. <?php
  310. class C {
  311. /**
  312. * Some function
  313. *
  314. * @param Foo $a A parameter
  315. * @param int $b B parameter
  316. * @param bool $c C parameter
  317. *
  318. * @throws \Exception
  319. *
  320. * @return bool
  321. */
  322. public function m($a, $b, $c, $d, $e) {}
  323. }
  324. EOT;
  325. $input = <<<'EOT'
  326. <?php
  327. class C {
  328. /**
  329. * Some function
  330. *
  331. * @param int $b B parameter
  332. * @param bool $c C parameter
  333. * @param Foo $a A parameter
  334. *
  335. * @throws \Exception
  336. *
  337. * @return bool
  338. */
  339. public function m($a, $b, $c, $d, $e) {}
  340. }
  341. EOT;
  342. $this->doTest($expected, $input);
  343. }
  344. public function testParamsMultilineDescription(): void
  345. {
  346. $expected = <<<'EOT'
  347. <?php
  348. class C {
  349. /**
  350. * Some function
  351. *
  352. * @param Foo $a A parameter
  353. * @param int $b B parameter
  354. * @param bool $c Another multiline, longer
  355. * description of C parameter
  356. * @param bool $d Multiline description
  357. * of D parameter
  358. *
  359. * @throws \Exception
  360. *
  361. * @return bool
  362. */
  363. public function m($a, $b, $c, $d) {}
  364. }
  365. EOT;
  366. $input = <<<'EOT'
  367. <?php
  368. class C {
  369. /**
  370. * Some function
  371. *
  372. * @param int $b B parameter
  373. * @param bool $d Multiline description
  374. * of D parameter
  375. * @param bool $c Another multiline, longer
  376. * description of C parameter
  377. * @param Foo $a A parameter
  378. *
  379. * @throws \Exception
  380. *
  381. * @return bool
  382. */
  383. public function m($a, $b, $c, $d) {}
  384. }
  385. EOT;
  386. $this->doTest($expected, $input);
  387. }
  388. public function testComplexTypes(): void
  389. {
  390. $expected = <<<'EOT'
  391. <?php
  392. class C {
  393. /**
  394. * @param Foo[]|\Bar\Baz $a
  395. * @param Foo|Bar $b
  396. * @param array<int, FooInterface>|string $c
  397. * @param array<array{int, int}> $d
  398. * @param ?Foo $e
  399. * @param \Closure(( $b is Bar ? bool : int)): $this $f
  400. */
  401. public function m($a, $b, $c, $d, $e, $f) {}
  402. }
  403. EOT;
  404. $input = <<<'EOT'
  405. <?php
  406. class C {
  407. /**
  408. * @param array<int, FooInterface>|string $c
  409. * @param Foo|Bar $b
  410. * @param array<array{int, int}> $d
  411. * @param ?Foo $e
  412. * @param \Closure(( $b is Bar ? bool : int)): $this $f
  413. * @param Foo[]|\Bar\Baz $a
  414. */
  415. public function m($a, $b, $c, $d, $e, $f) {}
  416. }
  417. EOT;
  418. $this->doTest($expected, $input);
  419. }
  420. public function testVariousMethodDeclarations(): void
  421. {
  422. $expected = <<<'EOT'
  423. <?php
  424. abstract class C {
  425. /**
  426. * @param Foo $a
  427. * @param array $b
  428. * @param $c
  429. * @param mixed $d
  430. */
  431. final public static function m1(Foo $a, array $b, $c, $d) {}
  432. /**
  433. * @param array $a
  434. * @param $b
  435. * @throws Exception
  436. *
  437. * @return bool
  438. */
  439. abstract public function m2(array $a, $b);
  440. /**
  441. * Description of
  442. * method
  443. *
  444. * @param int $a
  445. * @param Foo $b
  446. * @param $c
  447. * @param Bar $d
  448. * @param string $e
  449. */
  450. protected static function m3($a, Foo $b, $c, Bar $d, $e) {}
  451. /**
  452. * @see Something
  453. *
  454. * @param callable $a
  455. * @param $b
  456. * @param array $c
  457. * @param array $d
  458. *
  459. * @return int
  460. *
  461. * Text
  462. */
  463. final protected function m4(Callable $a, $b, array $c, array $d) {}
  464. /**
  465. * @param Bar $a
  466. * @param Bar $b
  467. * @param $c
  468. * @param int $d
  469. * @param array $e
  470. * @param $f
  471. *
  472. * @return Foo|null
  473. */
  474. abstract protected function m5(Bar $a, Bar $b, $c, $d, array $e, $f);
  475. /**
  476. * @param array $a
  477. * @param $b
  478. */
  479. private function m6(array $a, $b) {}
  480. /**
  481. * @param Foo $a
  482. * @param array $b
  483. * @param mixed $c
  484. */
  485. private static function m7(Foo $a, array $b, $c) {}
  486. }
  487. EOT;
  488. $input = <<<'EOT'
  489. <?php
  490. abstract class C {
  491. /**
  492. * @param array $b
  493. * @param Foo $a
  494. * @param mixed $d
  495. * @param $c
  496. */
  497. final public static function m1(Foo $a, array $b, $c, $d) {}
  498. /**
  499. * @param $b
  500. * @param array $a
  501. * @throws Exception
  502. *
  503. * @return bool
  504. */
  505. abstract public function m2(array $a, $b);
  506. /**
  507. * Description of
  508. * method
  509. *
  510. * @param string $e
  511. * @param int $a
  512. * @param Foo $b
  513. * @param Bar $d
  514. * @param $c
  515. */
  516. protected static function m3($a, Foo $b, $c, Bar $d, $e) {}
  517. /**
  518. * @see Something
  519. *
  520. * @param $b
  521. * @param array $d
  522. * @param array $c
  523. * @param callable $a
  524. *
  525. * @return int
  526. *
  527. * Text
  528. */
  529. final protected function m4(Callable $a, $b, array $c, array $d) {}
  530. /**
  531. * @param Bar $b
  532. * @param $f
  533. * @param int $d
  534. * @param array $e
  535. * @param $c
  536. * @param Bar $a
  537. *
  538. * @return Foo|null
  539. */
  540. abstract protected function m5(Bar $a, Bar $b, $c, $d, array $e, $f);
  541. /**
  542. * @param $b
  543. * @param array $a
  544. */
  545. private function m6(array $a, $b) {}
  546. /**
  547. * @param array $b
  548. * @param mixed $c
  549. * @param Foo $a
  550. */
  551. private static function m7(Foo $a, array $b, $c) {}
  552. }
  553. EOT;
  554. $this->doTest($expected, $input);
  555. }
  556. public function testParamsWithOtherAnnotationsInBetween(): void
  557. {
  558. $expected = <<<'EOT'
  559. <?php
  560. /**
  561. * [c1] Method description
  562. * [c2] over multiple lines
  563. *
  564. * @see Baz
  565. *
  566. * @param int $a Long param
  567. * description
  568. * @param mixed $b
  569. * @param mixed $superfluous1 With text
  570. * @param int $superfluous2
  571. * @return array Long return
  572. * description
  573. * @throws Exception
  574. * @throws FooException
  575. */
  576. function foo($a, $b) {}
  577. EOT;
  578. $input = <<<'EOT'
  579. <?php
  580. /**
  581. * [c1] Method description
  582. * [c2] over multiple lines
  583. *
  584. * @see Baz
  585. *
  586. * @param mixed $b
  587. * @param mixed $superfluous1 With text
  588. * @return array Long return
  589. * description
  590. * @param int $superfluous2
  591. * @throws Exception
  592. * @param int $a Long param
  593. * description
  594. * @throws FooException
  595. */
  596. function foo($a, $b) {}
  597. EOT;
  598. $this->doTest($expected, $input);
  599. }
  600. public function testParamsBlankLines(): void
  601. {
  602. $expected = <<<'EOT'
  603. <?php
  604. class C {
  605. /**
  606. * Some function
  607. *
  608. * @param $a
  609. * @param $b
  610. *
  611. * @param $c
  612. *
  613. *
  614. * @param $d
  615. *
  616. * @param $e
  617. *
  618. * @throws \Exception
  619. *
  620. * @return bool
  621. */
  622. public function m($a, $b, $c, $d, $e) {}
  623. }
  624. EOT;
  625. $input = <<<'EOT'
  626. <?php
  627. class C {
  628. /**
  629. * Some function
  630. *
  631. * @param $b
  632. * @param $e
  633. *
  634. * @param $c
  635. *
  636. *
  637. * @param $a
  638. *
  639. * @param $d
  640. *
  641. * @throws \Exception
  642. *
  643. * @return bool
  644. */
  645. public function m($a, $b, $c, $d, $e) {}
  646. }
  647. EOT;
  648. $this->doTest($expected, $input);
  649. }
  650. public function testNestedPhpdoc(): void
  651. {
  652. $expected = <<<'EOT'
  653. <?php
  654. /**
  655. * @param string[] $array
  656. * @param callable $callback {
  657. * @param string $value
  658. * @param int $key
  659. * @param mixed $userdata
  660. * }
  661. * @param mixed $userdata
  662. *
  663. * @return bool
  664. */
  665. function string_array_walk(array &$array, callable $callback, $userdata = null) {}
  666. EOT;
  667. $input = <<<'EOT'
  668. <?php
  669. /**
  670. * @param callable $callback {
  671. * @param string $value
  672. * @param int $key
  673. * @param mixed $userdata
  674. * }
  675. * @param mixed $userdata
  676. * @param string[] $array
  677. *
  678. * @return bool
  679. */
  680. function string_array_walk(array &$array, callable $callback, $userdata = null) {}
  681. EOT;
  682. $this->doTest($expected, $input);
  683. }
  684. public function testMultiNestedPhpdoc(): void
  685. {
  686. $expected = <<<'EOT'
  687. <?php
  688. /**
  689. * @param string[] $a
  690. * @param callable $b {
  691. * @param string $a
  692. * @param callable {
  693. * @param string $d
  694. * @param int $a
  695. * @param callable $c {
  696. * $param string $e
  697. * }
  698. * }
  699. * @param mixed $b2
  700. * }
  701. * @param mixed $c
  702. * @param int $d
  703. *
  704. * @return bool
  705. */
  706. function m(array &$a, callable $b, $c = null, $d) {}
  707. EOT;
  708. $input = <<<'EOT'
  709. <?php
  710. /**
  711. * @param mixed $c
  712. * @param callable $b {
  713. * @param string $a
  714. * @param callable {
  715. * @param string $d
  716. * @param int $a
  717. * @param callable $c {
  718. * $param string $e
  719. * }
  720. * }
  721. * @param mixed $b2
  722. * }
  723. * @param int $d
  724. * @param string[] $a
  725. *
  726. * @return bool
  727. */
  728. function m(array &$a, callable $b, $c = null, $d) {}
  729. EOT;
  730. $this->doTest($expected, $input);
  731. }
  732. public function testMultipleNestedPhpdoc(): void
  733. {
  734. $expected = <<<'EOT'
  735. <?php
  736. /**
  737. * @param string[] $array
  738. * @param callable $callback {
  739. * @param string $value
  740. * @param int $key
  741. * @param mixed $userdata {
  742. * $param array $array
  743. * }
  744. * }
  745. * @param mixed $userdata
  746. * @param callable $foo {
  747. * @param callable {
  748. * @param string $inner1
  749. * @param int $inner2
  750. * }
  751. * @param mixed $userdata
  752. * }
  753. * @param $superfluous1 Superfluous
  754. * @param $superfluous2 Superfluous
  755. *
  756. * @return bool
  757. */
  758. function string_array_walk(array &$array, callable $callback, $userdata = null, $foo) {}
  759. EOT;
  760. $input = <<<'EOT'
  761. <?php
  762. /**
  763. * @param $superfluous1 Superfluous
  764. * @param callable $callback {
  765. * @param string $value
  766. * @param int $key
  767. * @param mixed $userdata {
  768. * $param array $array
  769. * }
  770. * }
  771. * @param $superfluous2 Superfluous
  772. * @param callable $foo {
  773. * @param callable {
  774. * @param string $inner1
  775. * @param int $inner2
  776. * }
  777. * @param mixed $userdata
  778. * }
  779. * @param mixed $userdata
  780. * @param string[] $array
  781. *
  782. * @return bool
  783. */
  784. function string_array_walk(array &$array, callable $callback, $userdata = null, $foo) {}
  785. EOT;
  786. $this->doTest($expected, $input);
  787. }
  788. public function testNonMatchingParamName(): void
  789. {
  790. $expected = <<<'EOT'
  791. <?php
  792. /**
  793. * @param Foo $fooBar
  794. * @param $fooSomethingNotMatchingTheName
  795. * @param OtherClassLorem $x
  796. */
  797. function f(Foo $fooBar, Payment $foo, OtherClassLoremIpsum $y) {}
  798. EOT;
  799. $input = <<<'EOT'
  800. <?php
  801. /**
  802. * @param $fooSomethingNotMatchingTheName
  803. * @param Foo $fooBar
  804. * @param OtherClassLorem $x
  805. */
  806. function f(Foo $fooBar, Payment $foo, OtherClassLoremIpsum $y) {}
  807. EOT;
  808. $this->doTest($expected, $input);
  809. }
  810. public function testPlainFunction(): void
  811. {
  812. $expected = <<<'EOT'
  813. <?php
  814. /**
  815. * A plain function
  816. *
  817. * @param $a
  818. * @param $b
  819. * @param $c
  820. * @param $d
  821. */
  822. function m($a, $b, $c, $d) {}
  823. EOT;
  824. $input = <<<'EOT'
  825. <?php
  826. /**
  827. * A plain function
  828. *
  829. * @param $c
  830. * @param $b
  831. * @param $d
  832. * @param $a
  833. */
  834. function m($a, $b, $c, $d) {}
  835. EOT;
  836. $this->doTest($expected, $input);
  837. }
  838. public function testCommentsInSignature(): void
  839. {
  840. $expected = <<<'EOT'
  841. <?php
  842. class C {
  843. /**
  844. * @param $a
  845. * @param $b
  846. * @param $c
  847. * @param $d
  848. */
  849. public/*1*/function/*2*/m/*3*/(/*4*/$a, $b,/*5*/$c, $d){}
  850. }
  851. EOT;
  852. $input = <<<'EOT'
  853. <?php
  854. class C {
  855. /**
  856. * @param $d
  857. * @param $a
  858. * @param $b
  859. * @param $c
  860. */
  861. public/*1*/function/*2*/m/*3*/(/*4*/$a, $b,/*5*/$c, $d){}
  862. }
  863. EOT;
  864. $this->doTest($expected, $input);
  865. }
  866. public function testClosure(): void
  867. {
  868. $expected = <<<'EOT'
  869. <?php
  870. /**
  871. * @param array $a
  872. * @param $b
  873. * @param Foo $c
  874. * @param int $d
  875. */
  876. $closure = function (array $a, $b, Foo $c, $d) {};
  877. EOT;
  878. $input = <<<'EOT'
  879. <?php
  880. /**
  881. * @param $b
  882. * @param int $d
  883. * @param Foo $c
  884. * @param array $a
  885. */
  886. $closure = function (array $a, $b, Foo $c, $d) {};
  887. EOT;
  888. $this->doTest($expected, $input);
  889. }
  890. public function testArrowFunction(): void
  891. {
  892. $expected = <<<'EOT'
  893. <?php
  894. /**
  895. * @param array $a
  896. * @param $b
  897. * @param Foo $c
  898. * @param int $d
  899. */
  900. $closure = fn (array $a, $b, Foo $c, $d) => null;
  901. EOT;
  902. $input = <<<'EOT'
  903. <?php
  904. /**
  905. * @param $b
  906. * @param int $d
  907. * @param Foo $c
  908. * @param array $a
  909. */
  910. $closure = fn (array $a, $b, Foo $c, $d) => null;
  911. EOT;
  912. $this->doTest($expected, $input);
  913. }
  914. public function testInterface(): void
  915. {
  916. $expected = <<<'EOT'
  917. <?php
  918. Interface I
  919. {
  920. /**
  921. * @param string $a
  922. * @param array $b
  923. * @param Foo $c
  924. *
  925. * @return int|null
  926. */
  927. public function foo($a, array $b, Foo $c);
  928. /**
  929. * @param array $a
  930. * @param $b
  931. *
  932. * @return bool
  933. */
  934. public static function bar(array $a, $b);
  935. }
  936. EOT;
  937. $input = <<<'EOT'
  938. <?php
  939. Interface I
  940. {
  941. /**
  942. * @param Foo $c
  943. * @param string $a
  944. * @param array $b
  945. *
  946. * @return int|null
  947. */
  948. public function foo($a, array $b, Foo $c);
  949. /**
  950. * @param $b
  951. * @param array $a
  952. *
  953. * @return bool
  954. */
  955. public static function bar(array $a, $b);
  956. }
  957. EOT;
  958. $this->doTest($expected, $input);
  959. }
  960. public function testPhp7ParamTypes(): void
  961. {
  962. $expected = <<<'EOT'
  963. <?php
  964. class C {
  965. /**
  966. * @param array $a
  967. * @param $b
  968. * @param bool $c
  969. */
  970. public function m(array $a, $b, bool $c) {}
  971. }
  972. EOT;
  973. $input = <<<'EOT'
  974. <?php
  975. class C {
  976. /**
  977. * @param $b
  978. * @param bool $c
  979. * @param array $a
  980. */
  981. public function m(array $a, $b, bool $c) {}
  982. }
  983. EOT;
  984. $this->doTest($expected, $input);
  985. }
  986. }