PhpdocTypesOrderFixerTest.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  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. * @internal
  16. *
  17. * @covers \PhpCsFixer\Fixer\Phpdoc\PhpdocTypesOrderFixer
  18. */
  19. final class PhpdocTypesOrderFixerTest extends AbstractFixerTestCase
  20. {
  21. /**
  22. * @dataProvider provideFixWithAlphaAlgorithmAndNullAlwaysFirstCases
  23. */
  24. public function testFix(string $expected, ?string $input = null): void
  25. {
  26. $this->doTest($expected, $input);
  27. }
  28. /**
  29. * @dataProvider provideFixCases
  30. */
  31. public function testFixWithNullFirst(string $expected, ?string $input = null): void
  32. {
  33. $this->fixer->configure([
  34. 'sort_algorithm' => 'none',
  35. 'null_adjustment' => 'always_first',
  36. ]);
  37. $this->doTest($expected, $input);
  38. }
  39. public static function provideFixCases(): array
  40. {
  41. return [
  42. [
  43. '<?php /** @var null|string */',
  44. '<?php /** @var string|null */',
  45. ],
  46. [
  47. '<?php /** @param null|string $foo */',
  48. '<?php /** @param string|null $foo */',
  49. ],
  50. [
  51. '<?php /** @property null|string $foo */',
  52. '<?php /** @property string|null $foo */',
  53. ],
  54. [
  55. '<?php /** @property-read null|string $foo */',
  56. '<?php /** @property-read string|null $foo */',
  57. ],
  58. [
  59. '<?php /** @property-write null|string $foo */',
  60. '<?php /** @property-write string|null $foo */',
  61. ],
  62. [
  63. '<?php /** @method null|string foo(null|int $foo, null|string $bar) */',
  64. '<?php /** @method string|null foo(int|null $foo, string|null $bar) */',
  65. ],
  66. [
  67. '<?php /** @return null|string */',
  68. '<?php /** @return string|null */',
  69. ],
  70. [
  71. '<?php /** @var null|string[]|resource|false|object|Foo|Bar\Baz|bool[]|string|array|int */',
  72. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  73. ],
  74. [
  75. '<?php /** @var null|array<int, string> Foo */',
  76. '<?php /** @var array<int, string>|null Foo */',
  77. ],
  78. [
  79. '<?php /** @var null|array<int, array<string>> Foo */',
  80. '<?php /** @var array<int, array<string>>|null Foo */',
  81. ],
  82. [
  83. '<?php /** @var NULL|string */',
  84. '<?php /** @var string|NULL */',
  85. ],
  86. [
  87. '<?php /** @var Foo|?Bar */',
  88. ],
  89. [
  90. '<?php /** @var ?Foo|Bar */',
  91. ],
  92. [
  93. '<?php /** @var array<null|string> */',
  94. '<?php /** @var array<string|null> */',
  95. ],
  96. [
  97. '<?php /** @var array<int, null|string> */',
  98. '<?php /** @var array<int, string|null> */',
  99. ],
  100. [
  101. '<?php /** @var array<int, array<null|int|string>> */',
  102. '<?php /** @var array<int, array<int|string|null>> */',
  103. ],
  104. [
  105. '<?php /** @var null|null */',
  106. ],
  107. [
  108. '<?php /** @var null|\null */',
  109. ],
  110. [
  111. '<?php /** @var \null|null */',
  112. ],
  113. [
  114. '<?php /** @var \null|\null */',
  115. ],
  116. [
  117. '<?php /** @var \null|int */',
  118. '<?php /** @var int|\null */',
  119. ],
  120. [
  121. '<?php /** @var array<\null|int> */',
  122. '<?php /** @var array<int|\null> */',
  123. ],
  124. [
  125. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  126. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  127. ],
  128. [
  129. '<?php /** @var null|Foo[]|Foo|Foo\Bar|Foo_Bar */',
  130. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  131. ],
  132. [
  133. '<?php /** @method void bar(null|string $delimiter = \',<br/>\') */',
  134. '<?php /** @method void bar(string|null $delimiter = \',<br/>\') */',
  135. ],
  136. [
  137. '<?php /** @var array<array<int, int>, OutputInterface> */',
  138. ],
  139. [
  140. '<?php /** @var iterable<array{names:array<string>, surname:string}> */',
  141. ],
  142. [
  143. '<?php /** @var iterable<array{surname:string, names:array<string>}> */',
  144. ],
  145. [
  146. '<?php /** @return array<array{level:string, message:string, context:array<mixed>}> */',
  147. ],
  148. [
  149. '<?php /** @return Data<array{enabled: string[], all: array<string, string>}> */',
  150. ],
  151. [
  152. '<?php /** @return array<int, callable(array<string, null|string> , DateTime): bool> */',
  153. ],
  154. [
  155. '<?php /** @param null|callable(array<string>): array<string, T> $callback */',
  156. ],
  157. [
  158. '<?php /** @return array<int, callable(array<string, null|string> , DateTime): bool> */',
  159. ],
  160. [
  161. '<?php /** @return Closure(Iterator<TKey, T>): Generator<int, array<TKey, T>> */',
  162. ],
  163. [
  164. '<?php /** @var Closure(Iterator<TKey, T>): Generator<int, array<TKey, T>> $pipe */',
  165. ],
  166. [
  167. '<?php /** @return Generator<int, Promise<mixed>, mixed, Identity> */',
  168. ],
  169. [
  170. '<?php /** @param null|callable(null|foo, null|bar): array<string, T> $callback */',
  171. '<?php /** @param null|callable(foo|null, bar|null): array<string, T> $callback */',
  172. ],
  173. [
  174. '<?php /** @param null|string$foo */',
  175. '<?php /** @param string|null$foo */',
  176. ],
  177. ];
  178. }
  179. /**
  180. * @dataProvider provideFixWithNullLastCases
  181. */
  182. public function testFixWithNullLast(string $expected, ?string $input = null): void
  183. {
  184. $this->fixer->configure([
  185. 'sort_algorithm' => 'none',
  186. 'null_adjustment' => 'always_last',
  187. ]);
  188. $this->doTest($expected, $input);
  189. }
  190. public static function provideFixWithNullLastCases(): array
  191. {
  192. return [
  193. [
  194. '<?php /** @var string|null */',
  195. '<?php /** @var null|string */',
  196. ],
  197. [
  198. '<?php /** @param string|null $foo */',
  199. '<?php /** @param null|string $foo */',
  200. ],
  201. [
  202. '<?php /** @property string|null $foo */',
  203. '<?php /** @property null|string $foo */',
  204. ],
  205. [
  206. '<?php /** @property-read string|null $foo */',
  207. '<?php /** @property-read null|string $foo */',
  208. ],
  209. [
  210. '<?php /** @property-write string|null $foo */',
  211. '<?php /** @property-write null|string $foo */',
  212. ],
  213. [
  214. '<?php /** @method string|null foo(int|null $foo, string|null $bar) */',
  215. '<?php /** @method null|string foo(null|int $foo, null|string $bar) */',
  216. ],
  217. [
  218. '<?php /** @return string|null */',
  219. '<?php /** @return null|string */',
  220. ],
  221. [
  222. '<?php /** @var string[]|resource|false|object|Foo|Bar\Baz|bool[]|string|array|int|null */',
  223. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  224. ],
  225. [
  226. '<?php /** @var array<int, string>|null Foo */',
  227. '<?php /** @var null|array<int, string> Foo */',
  228. ],
  229. [
  230. '<?php /** @var array<int, array<string>>|null Foo */',
  231. '<?php /** @var null|array<int, array<string>> Foo */',
  232. ],
  233. [
  234. '<?php /** @var string|NULL */',
  235. '<?php /** @var NULL|string */',
  236. ],
  237. [
  238. '<?php /** @var Foo|?Bar */',
  239. ],
  240. [
  241. '<?php /** @var ?Foo|Bar */',
  242. ],
  243. [
  244. '<?php /** @var Foo|?\Bar */',
  245. ],
  246. [
  247. '<?php /** @var ?\Foo|Bar */',
  248. ],
  249. [
  250. '<?php /** @var array<string|null> */',
  251. '<?php /** @var array<null|string> */',
  252. ],
  253. [
  254. '<?php /** @var array<int, string|null> */',
  255. '<?php /** @var array<int, null|string> */',
  256. ],
  257. [
  258. '<?php /** @var array<int, array<int|string|null>> */',
  259. '<?php /** @var array<int, array<null|int|string>> */',
  260. ],
  261. [
  262. '<?php /** @var null|null */',
  263. ],
  264. [
  265. '<?php /** @var null|\null */',
  266. ],
  267. [
  268. '<?php /** @var \null|null */',
  269. ],
  270. [
  271. '<?php /** @var \null|\null */',
  272. ],
  273. [
  274. '<?php /** @var int|\null */',
  275. '<?php /** @var \null|int */',
  276. ],
  277. [
  278. '<?php /** @var array<int|\null> */',
  279. '<?php /** @var array<\null|int> */',
  280. ],
  281. [
  282. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  283. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  284. ],
  285. [
  286. '<?php /** @var Foo[]|Foo|Foo\Bar|Foo_Bar|null */',
  287. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  288. ],
  289. [
  290. '<?php /** @return array<int, callable(array<string, string|null> , DateTime): bool> */',
  291. '<?php /** @return array<int, callable(array<string, null|string> , DateTime): bool> */',
  292. ],
  293. ];
  294. }
  295. /**
  296. * @dataProvider provideFixWithAlphaAlgorithmCases
  297. */
  298. public function testFixWithAlphaAlgorithm(string $expected, ?string $input = null): void
  299. {
  300. $this->fixer->configure([
  301. 'sort_algorithm' => 'alpha',
  302. 'null_adjustment' => 'none',
  303. ]);
  304. $this->doTest($expected, $input);
  305. }
  306. public static function provideFixWithAlphaAlgorithmCases(): array
  307. {
  308. return [
  309. [
  310. '<?php /** @var int|null|string */',
  311. '<?php /** @var string|int|null */',
  312. ],
  313. [
  314. '<?php /** @param Bar|\Foo */',
  315. '<?php /** @param \Foo|Bar */',
  316. ],
  317. [
  318. '<?php /** @property-read \Bar|Foo */',
  319. '<?php /** @property-read Foo|\Bar */',
  320. ],
  321. [
  322. '<?php /** @property-write bar|Foo */',
  323. '<?php /** @property-write Foo|bar */',
  324. ],
  325. [
  326. '<?php /** @return Bar|foo */',
  327. '<?php /** @return foo|Bar */',
  328. ],
  329. [
  330. '<?php /** @method \Bar|Foo foo(\Bar|Foo $foo, \Bar|Foo $bar) */',
  331. '<?php /** @method Foo|\Bar foo(Foo|\Bar $foo, Foo|\Bar $bar) */',
  332. ],
  333. [
  334. '<?php /** @var array|Bar\Baz|bool[]|false|Foo|int|null|object|resource|string|string[] */',
  335. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  336. ],
  337. [
  338. '<?php /** @var array<int, string>|null Foo */',
  339. '<?php /** @var null|array<int, string> Foo */',
  340. ],
  341. [
  342. '<?php /** @var array<int, array<string>>|null Foo */',
  343. '<?php /** @var null|array<int, array<string>> Foo */',
  344. ],
  345. [
  346. '<?php /** @var ?Bar|Foo */',
  347. '<?php /** @var Foo|?Bar */',
  348. ],
  349. [
  350. '<?php /** @var Bar|?Foo */',
  351. '<?php /** @var ?Foo|Bar */',
  352. ],
  353. [
  354. '<?php /** @var ?\Bar|Foo */',
  355. '<?php /** @var Foo|?\Bar */',
  356. ],
  357. [
  358. '<?php /** @var Bar|?\Foo */',
  359. '<?php /** @var ?\Foo|Bar */',
  360. ],
  361. [
  362. '<?php /** @var array<null|string> */',
  363. '<?php /** @var array<string|null> */',
  364. ],
  365. [
  366. '<?php /** @var array<int|string, null|string> */',
  367. '<?php /** @var array<string|int, string|null> */',
  368. ],
  369. [
  370. '<?php /** @var array<int|string, array<int|string, null|string>> */',
  371. '<?php /** @var array<string|int, array<string|int, string|null>> */',
  372. ],
  373. [
  374. '<?php /** @var null|null */',
  375. ],
  376. [
  377. '<?php /** @var null|\null */',
  378. ],
  379. [
  380. '<?php /** @var \null|null */',
  381. ],
  382. [
  383. '<?php /** @var \null|\null */',
  384. ],
  385. [
  386. '<?php /** @var int|\null|string */',
  387. '<?php /** @var string|\null|int */',
  388. ],
  389. [
  390. '<?php /** @var array<int|\null|string> */',
  391. '<?php /** @var array<string|\null|int> */',
  392. ],
  393. [
  394. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  395. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  396. ],
  397. [
  398. '<?php /** @var Foo|Foo[]|Foo\Bar|Foo_Bar|null */',
  399. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  400. ],
  401. [
  402. '<?php /** @return array<int, callable(array<string, null|string> , DateTime): bool> */',
  403. ],
  404. [
  405. '<?php /** @return A&B&C */',
  406. '<?php /** @return A&C&B */',
  407. ],
  408. [
  409. '<?php /** @return array<A&B&C> */',
  410. '<?php /** @return array<A&C&B> */',
  411. ],
  412. [
  413. '<?php /** @return array<A&B&C>|bool|string */',
  414. '<?php /** @return bool|array<A&B&C>|string */',
  415. ],
  416. [
  417. '<?php /** @return A&B<X|Y|Z>&C&D */',
  418. '<?php /** @return A&D&B<X|Y|Z>&C */',
  419. ],
  420. ];
  421. }
  422. /**
  423. * @dataProvider provideFixWithAlphaAlgorithmAndNullAlwaysFirstCases
  424. */
  425. public function testFixWithAlphaAlgorithmAndNullAlwaysFirst(string $expected, ?string $input = null): void
  426. {
  427. $this->fixer->configure([
  428. 'sort_algorithm' => 'alpha',
  429. 'null_adjustment' => 'always_first',
  430. ]);
  431. $this->doTest($expected, $input);
  432. }
  433. public static function provideFixWithAlphaAlgorithmAndNullAlwaysFirstCases(): array
  434. {
  435. return [
  436. [
  437. '<?php /** @var null|int|string */',
  438. '<?php /** @var string|int|null */',
  439. ],
  440. [
  441. '<?php /** @param Bar|\Foo */',
  442. '<?php /** @param \Foo|Bar */',
  443. ],
  444. [
  445. '<?php /** @property-read \Bar|Foo */',
  446. '<?php /** @property-read Foo|\Bar */',
  447. ],
  448. [
  449. '<?php /** @property-write bar|Foo */',
  450. '<?php /** @property-write Foo|bar */',
  451. ],
  452. [
  453. '<?php /** @return Bar|foo */',
  454. '<?php /** @return foo|Bar */',
  455. ],
  456. [
  457. '<?php /** @method \Bar|Foo foo(\Bar|Foo $foo, \Bar|Foo $bar) */',
  458. '<?php /** @method Foo|\Bar foo(Foo|\Bar $foo, Foo|\Bar $bar) */',
  459. ],
  460. [
  461. '<?php /** @var null|array|Bar\Baz|bool[]|false|Foo|int|object|resource|string|string[] */',
  462. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  463. ],
  464. [
  465. '<?php /** @var null|array<int, string> Foo */',
  466. ],
  467. [
  468. '<?php /** @var null|array<int, array<string>> Foo */',
  469. ],
  470. [
  471. '<?php /** @var NULL|int|string */',
  472. '<?php /** @var string|int|NULL */',
  473. ],
  474. [
  475. '<?php /** @var ?Bar|Foo */',
  476. '<?php /** @var Foo|?Bar */',
  477. ],
  478. [
  479. '<?php /** @var Bar|?Foo */',
  480. '<?php /** @var ?Foo|Bar */',
  481. ],
  482. [
  483. '<?php /** @var ?\Bar|Foo */',
  484. '<?php /** @var Foo|?\Bar */',
  485. ],
  486. [
  487. '<?php /** @var Bar|?\Foo */',
  488. '<?php /** @var ?\Foo|Bar */',
  489. ],
  490. [
  491. '<?php /** @var array<null|int|string> */',
  492. '<?php /** @var array<string|int|null> */',
  493. ],
  494. [
  495. '<?php /** @var array<int|string, null|int|string> */',
  496. '<?php /** @var array<string|int, string|int|null> */',
  497. ],
  498. [
  499. '<?php /** @var array<int|string, array<int|string, null|int|string>> */',
  500. '<?php /** @var array<string|int, array<string|int, string|int|null>> */',
  501. ],
  502. [
  503. '<?php /** @var null|null */',
  504. ],
  505. [
  506. '<?php /** @var null|\null */',
  507. ],
  508. [
  509. '<?php /** @var \null|null */',
  510. ],
  511. [
  512. '<?php /** @var \null|\null */',
  513. ],
  514. [
  515. '<?php /** @var array<\null|int|string> */',
  516. '<?php /** @var array<string|\null|int> */',
  517. ],
  518. [
  519. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  520. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  521. ],
  522. [
  523. '<?php /** @var null|Foo|Foo[]|Foo\Bar|Foo_Bar */',
  524. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  525. ],
  526. [
  527. '<?php /** @return array<array<string, int>> */',
  528. ],
  529. [
  530. '<?php /** @return array<int, callable(array<string, null|string> , DateTime): bool> */',
  531. ],
  532. ];
  533. }
  534. /**
  535. * @dataProvider provideFixWithAlphaAlgorithmAndNullAlwaysLastCases
  536. */
  537. public function testFixWithAlphaAlgorithmAndNullAlwaysLast(string $expected, ?string $input = null): void
  538. {
  539. $this->fixer->configure([
  540. 'sort_algorithm' => 'alpha',
  541. 'null_adjustment' => 'always_last',
  542. ]);
  543. $this->doTest($expected, $input);
  544. }
  545. public static function provideFixWithAlphaAlgorithmAndNullAlwaysLastCases(): array
  546. {
  547. return [
  548. [
  549. '<?php /** @var int|string|null */',
  550. '<?php /** @var string|int|null */',
  551. ],
  552. [
  553. '<?php /** @param Bar|\Foo */',
  554. '<?php /** @param \Foo|Bar */',
  555. ],
  556. [
  557. '<?php /** @property-read \Bar|Foo */',
  558. '<?php /** @property-read Foo|\Bar */',
  559. ],
  560. [
  561. '<?php /** @property-write bar|Foo */',
  562. '<?php /** @property-write Foo|bar */',
  563. ],
  564. [
  565. '<?php /** @return Bar|foo */',
  566. '<?php /** @return foo|Bar */',
  567. ],
  568. [
  569. '<?php /** @method \Bar|Foo foo(\Bar|Foo $foo, \Bar|Foo $bar) */',
  570. '<?php /** @method Foo|\Bar foo(Foo|\Bar $foo, Foo|\Bar $bar) */',
  571. ],
  572. [
  573. '<?php /** @var array|Bar\Baz|bool[]|false|Foo|int|object|resource|string|string[]|null */',
  574. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  575. ],
  576. [
  577. '<?php /** @var array<int, string>|null Foo */',
  578. '<?php /** @var null|array<int, string> Foo */',
  579. ],
  580. [
  581. '<?php /** @var array<int, array<string>>|null Foo */',
  582. '<?php /** @var null|array<int, array<string>> Foo */',
  583. ],
  584. [
  585. '<?php /** @var int|string|NULL */',
  586. '<?php /** @var string|int|NULL */',
  587. ],
  588. [
  589. '<?php /** @var ?Bar|Foo */',
  590. '<?php /** @var Foo|?Bar */',
  591. ],
  592. [
  593. '<?php /** @var Bar|?Foo */',
  594. '<?php /** @var ?Foo|Bar */',
  595. ],
  596. [
  597. '<?php /** @var ?\Bar|Foo */',
  598. '<?php /** @var Foo|?\Bar */',
  599. ],
  600. [
  601. '<?php /** @var Bar|?\Foo */',
  602. '<?php /** @var ?\Foo|Bar */',
  603. ],
  604. [
  605. '<?php /** @var array<int|string|null> */',
  606. '<?php /** @var array<string|int|null> */',
  607. ],
  608. [
  609. '<?php /** @var array<int|string, int|string|null> */',
  610. '<?php /** @var array<string|int, string|int|null> */',
  611. ],
  612. [
  613. '<?php /** @var array<int|string, array<int|string, int|string|null>> */',
  614. '<?php /** @var array<string|int, array<string|int, string|int|null>> */',
  615. ],
  616. [
  617. '<?php /** @var null|null */',
  618. ],
  619. [
  620. '<?php /** @var null|\null */',
  621. ],
  622. [
  623. '<?php /** @var \null|null */',
  624. ],
  625. [
  626. '<?php /** @var \null|\null */',
  627. ],
  628. [
  629. '<?php /** @var array<int|string|\null> */',
  630. '<?php /** @var array<string|\null|int> */',
  631. ],
  632. [
  633. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  634. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  635. ],
  636. [
  637. '<?php /** @var Foo|Foo[]|Foo\Bar|Foo_Bar|null */',
  638. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  639. ],
  640. [
  641. '<?php /** @return array<int, callable(array<string, string|null> , DateTime): bool> */',
  642. '<?php /** @return array<int, callable(array<string, null|string> , DateTime): bool> */',
  643. ],
  644. [
  645. '<?php /** @var ?Deferred<TestLocations> */',
  646. ],
  647. ];
  648. }
  649. }