AttributeEmptyParenthesesFixerTest.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  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\AttributeNotation;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @author HypeMC <hypemc@gmail.com>
  16. *
  17. * @internal
  18. *
  19. * @covers \PhpCsFixer\Fixer\AttributeNotation\AttributeEmptyParenthesesFixer
  20. *
  21. * @requires PHP 8.0
  22. */
  23. final class AttributeEmptyParenthesesFixerTest extends AbstractFixerTestCase
  24. {
  25. /**
  26. * @param array<string, mixed> $configuration
  27. *
  28. * @dataProvider provideFixCases
  29. */
  30. public function testFix(string $expected, ?string $input = null, array $configuration = []): void
  31. {
  32. $this->fixer->configure($configuration);
  33. $this->doTest($expected, $input);
  34. }
  35. public static function provideFixCases(): iterable
  36. {
  37. yield 'Without parentheses on various declarations' => [
  38. '<?php
  39. namespace Test;
  40. #[\A\B\Foo]
  41. #[\Bar ]
  42. #[Baz]
  43. #[\Bar, Baz]
  44. #[Corge(4, \'baz qux\')]
  45. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  46. #[\A\B\Foo, \Bar , Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  47. #[
  48. \A\B\Foo,
  49. \Bar ,
  50. Baz,
  51. Corge(4, \'baz qux\'),
  52. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  53. ]
  54. class X
  55. {
  56. #[\A\B\Foo]
  57. #[\Bar ]
  58. #[Baz]
  59. #[\Bar, Baz]
  60. #[Corge(4, \'baz qux\')]
  61. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  62. #[\A\B\Foo, \Bar , Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  63. #[
  64. \A\B\Foo,
  65. \Bar ,
  66. Baz,
  67. Corge(4, \'baz qux\'),
  68. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  69. ]
  70. const Y = 1;
  71. #[\A\B\Foo]
  72. #[\Bar ]
  73. #[Baz]
  74. #[\Bar, Baz]
  75. #[Corge(4, \'baz qux\')]
  76. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  77. #[\A\B\Foo, \Bar , Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  78. #[
  79. \A\B\Foo,
  80. \Bar ,
  81. Baz,
  82. Corge(4, \'baz qux\'),
  83. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  84. ]
  85. public $y;
  86. #[\A\B\Foo]
  87. #[\Bar ]
  88. #[Baz]
  89. #[\Bar, Baz]
  90. #[Corge(4, \'baz qux\')]
  91. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  92. #[\A\B\Foo, \Bar , Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  93. #[
  94. \A\B\Foo,
  95. \Bar ,
  96. Baz,
  97. Corge(4, \'baz qux\'),
  98. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  99. ]
  100. public function y() {}
  101. }
  102. #[\A\B\Foo]
  103. #[\Bar ]
  104. #[Baz]
  105. #[\Bar, Baz]
  106. #[Corge(4, \'baz qux\')]
  107. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  108. #[\A\B\Foo, \Bar , Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  109. #[
  110. \A\B\Foo,
  111. \Bar ,
  112. Baz,
  113. Corge(4, \'baz qux\'),
  114. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  115. ]
  116. function f(
  117. #[\A\B\Foo]
  118. #[\Bar ]
  119. #[Baz]
  120. #[\Bar, Baz]
  121. #[Corge(4, \'baz qux\')]
  122. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  123. #[\A\B\Foo, \Bar , Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  124. #[
  125. \A\B\Foo,
  126. \Bar ,
  127. Baz,
  128. Corge(4, \'baz qux\'),
  129. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  130. ]
  131. string $param,
  132. ) {}
  133. $anon = #[\A\B\Foo] #[\Bar ] #[Baz] #[Corge(4, \'baz qux\')] #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')] function () {};
  134. $short = #[\A\B\Foo] #[\Bar ] #[Baz] #[Corge(4, \'baz qux\')] #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')] fn () => null;
  135. ',
  136. '<?php
  137. namespace Test;
  138. #[\A\B\Foo()]
  139. #[\Bar( )]
  140. #[Baz]
  141. #[\Bar(), Baz()]
  142. #[Corge(4, \'baz qux\')]
  143. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  144. #[\A\B\Foo(), \Bar( ), Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  145. #[
  146. \A\B\Foo(),
  147. \Bar( ),
  148. Baz,
  149. Corge(4, \'baz qux\'),
  150. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  151. ]
  152. class X
  153. {
  154. #[\A\B\Foo()]
  155. #[\Bar( )]
  156. #[Baz]
  157. #[\Bar(), Baz()]
  158. #[Corge(4, \'baz qux\')]
  159. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  160. #[\A\B\Foo(), \Bar( ), Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  161. #[
  162. \A\B\Foo(),
  163. \Bar( ),
  164. Baz,
  165. Corge(4, \'baz qux\'),
  166. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  167. ]
  168. const Y = 1;
  169. #[\A\B\Foo()]
  170. #[\Bar( )]
  171. #[Baz]
  172. #[\Bar(), Baz()]
  173. #[Corge(4, \'baz qux\')]
  174. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  175. #[\A\B\Foo(), \Bar( ), Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  176. #[
  177. \A\B\Foo(),
  178. \Bar( ),
  179. Baz,
  180. Corge(4, \'baz qux\'),
  181. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  182. ]
  183. public $y;
  184. #[\A\B\Foo()]
  185. #[\Bar( )]
  186. #[Baz]
  187. #[\Bar(), Baz()]
  188. #[Corge(4, \'baz qux\')]
  189. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  190. #[\A\B\Foo(), \Bar( ), Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  191. #[
  192. \A\B\Foo(),
  193. \Bar( ),
  194. Baz,
  195. Corge(4, \'baz qux\'),
  196. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  197. ]
  198. public function y() {}
  199. }
  200. #[\A\B\Foo()]
  201. #[\Bar( )]
  202. #[Baz]
  203. #[\Bar(), Baz()]
  204. #[Corge(4, \'baz qux\')]
  205. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  206. #[\A\B\Foo(), \Bar( ), Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  207. #[
  208. \A\B\Foo(),
  209. \Bar( ),
  210. Baz,
  211. Corge(4, \'baz qux\'),
  212. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  213. ]
  214. function f(
  215. #[\A\B\Foo()]
  216. #[\Bar( )]
  217. #[Baz]
  218. #[\Bar(), Baz()]
  219. #[Corge(4, \'baz qux\')]
  220. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  221. #[\A\B\Foo(), \Bar( ), Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  222. #[
  223. \A\B\Foo(),
  224. \Bar( ),
  225. Baz,
  226. Corge(4, \'baz qux\'),
  227. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  228. ]
  229. string $param,
  230. ) {}
  231. $anon = #[\A\B\Foo()] #[\Bar( )] #[Baz] #[Corge(4, \'baz qux\')] #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')] function () {};
  232. $short = #[\A\B\Foo()] #[\Bar( )] #[Baz] #[Corge(4, \'baz qux\')] #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')] fn () => null;
  233. ',
  234. ];
  235. yield 'With parentheses on various declarations' => [
  236. '<?php
  237. namespace Test;
  238. #[\A\B\Foo()]
  239. #[\Bar()]
  240. #[Baz()]
  241. #[\Bar(), Baz()]
  242. #[Corge(4, \'baz qux\')]
  243. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  244. #[\A\B\Foo(), \Bar(), Baz(), Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  245. #[
  246. \A\B\Foo(),
  247. \Bar(),
  248. Baz(),
  249. Corge(4, \'baz qux\'),
  250. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  251. ]
  252. class X
  253. {
  254. #[\A\B\Foo()]
  255. #[\Bar()]
  256. #[Baz()]
  257. #[\Bar(), Baz()]
  258. #[Corge(4, \'baz qux\')]
  259. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  260. #[\A\B\Foo(), \Bar(), Baz(), Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  261. #[
  262. \A\B\Foo(),
  263. \Bar(),
  264. Baz(),
  265. Corge(4, \'baz qux\'),
  266. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  267. ]
  268. const Y = 1;
  269. #[\A\B\Foo()]
  270. #[\Bar()]
  271. #[Baz()]
  272. #[\Bar(), Baz()]
  273. #[Corge(4, \'baz qux\')]
  274. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  275. #[\A\B\Foo(), \Bar(), Baz(), Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  276. #[
  277. \A\B\Foo(),
  278. \Bar(),
  279. Baz(),
  280. Corge(4, \'baz qux\'),
  281. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  282. ]
  283. public $y;
  284. #[\A\B\Foo()]
  285. #[\Bar()]
  286. #[Baz()]
  287. #[\Bar(), Baz()]
  288. #[Corge(4, \'baz qux\')]
  289. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  290. #[\A\B\Foo(), \Bar(), Baz(), Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  291. #[
  292. \A\B\Foo(),
  293. \Bar(),
  294. Baz(),
  295. Corge(4, \'baz qux\'),
  296. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  297. ]
  298. public function y() {}
  299. }
  300. #[\A\B\Foo()]
  301. #[\Bar()]
  302. #[Baz()]
  303. #[\Bar(), Baz()]
  304. #[Corge(4, \'baz qux\')]
  305. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  306. #[\A\B\Foo(), \Bar(), Baz(), Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  307. #[
  308. \A\B\Foo(),
  309. \Bar(),
  310. Baz(),
  311. Corge(4, \'baz qux\'),
  312. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  313. ]
  314. function f(
  315. #[\A\B\Foo()]
  316. #[\Bar()]
  317. #[Baz()]
  318. #[\Bar(), Baz()]
  319. #[Corge(4, \'baz qux\')]
  320. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  321. #[\A\B\Foo(), \Bar(), Baz(), Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  322. #[
  323. \A\B\Foo(),
  324. \Bar(),
  325. Baz(),
  326. Corge(4, \'baz qux\'),
  327. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  328. ]
  329. string $param,
  330. ) {}
  331. $anon = #[\A\B\Foo()] #[\Bar()] #[Baz()] #[Corge(4, \'baz qux\')] #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')] function () {};
  332. $short = #[\A\B\Foo()] #[\Bar()] #[Baz()] #[Corge(4, \'baz qux\')] #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')] fn () => null;
  333. ',
  334. '<?php
  335. namespace Test;
  336. #[\A\B\Foo()]
  337. #[\Bar]
  338. #[Baz]
  339. #[\Bar, Baz]
  340. #[Corge(4, \'baz qux\')]
  341. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  342. #[\A\B\Foo(), \Bar, Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  343. #[
  344. \A\B\Foo(),
  345. \Bar,
  346. Baz,
  347. Corge(4, \'baz qux\'),
  348. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  349. ]
  350. class X
  351. {
  352. #[\A\B\Foo()]
  353. #[\Bar]
  354. #[Baz]
  355. #[\Bar, Baz]
  356. #[Corge(4, \'baz qux\')]
  357. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  358. #[\A\B\Foo(), \Bar, Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  359. #[
  360. \A\B\Foo(),
  361. \Bar,
  362. Baz,
  363. Corge(4, \'baz qux\'),
  364. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  365. ]
  366. const Y = 1;
  367. #[\A\B\Foo()]
  368. #[\Bar]
  369. #[Baz]
  370. #[\Bar, Baz]
  371. #[Corge(4, \'baz qux\')]
  372. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  373. #[\A\B\Foo(), \Bar, Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  374. #[
  375. \A\B\Foo(),
  376. \Bar,
  377. Baz,
  378. Corge(4, \'baz qux\'),
  379. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  380. ]
  381. public $y;
  382. #[\A\B\Foo()]
  383. #[\Bar]
  384. #[Baz]
  385. #[\Bar, Baz]
  386. #[Corge(4, \'baz qux\')]
  387. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  388. #[\A\B\Foo(), \Bar, Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  389. #[
  390. \A\B\Foo(),
  391. \Bar,
  392. Baz,
  393. Corge(4, \'baz qux\'),
  394. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  395. ]
  396. public function y() {}
  397. }
  398. #[\A\B\Foo()]
  399. #[\Bar]
  400. #[Baz]
  401. #[\Bar, Baz]
  402. #[Corge(4, \'baz qux\')]
  403. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  404. #[\A\B\Foo(), \Bar, Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  405. #[
  406. \A\B\Foo(),
  407. \Bar,
  408. Baz,
  409. Corge(4, \'baz qux\'),
  410. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  411. ]
  412. function f(
  413. #[\A\B\Foo()]
  414. #[\Bar]
  415. #[Baz]
  416. #[\Bar, Baz]
  417. #[Corge(4, \'baz qux\')]
  418. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  419. #[\A\B\Foo(), \Bar, Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')]
  420. #[
  421. \A\B\Foo(),
  422. \Bar,
  423. Baz,
  424. Corge(4, \'baz qux\'),
  425. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\'),
  426. ]
  427. string $param,
  428. ) {}
  429. $anon = #[\A\B\Foo()] #[\Bar] #[Baz] #[Corge(4, \'baz qux\')] #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')] function () {};
  430. $short = #[\A\B\Foo()] #[\Bar] #[Baz] #[Corge(4, \'baz qux\')] #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\')] fn () => null;
  431. ',
  432. ['use_parentheses' => true],
  433. ];
  434. }
  435. /**
  436. * @param array<string, mixed> $configuration
  437. *
  438. * @dataProvider provideFix81Cases
  439. *
  440. * @requires PHP 8.1
  441. */
  442. public function testFix81(string $expected, ?string $input = null, array $configuration = []): void
  443. {
  444. $this->fixer->configure($configuration);
  445. $this->doTest($expected, $input);
  446. }
  447. public static function provideFix81Cases(): iterable
  448. {
  449. yield 'Without parentheses' => [
  450. '<?php
  451. namespace Test;
  452. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\', prop4: new P\R())]
  453. #[\A\B\Foo, \Bar , Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\', prop4: new P\R())]
  454. #[
  455. \A\B\Foo,
  456. \Bar ,
  457. Baz,
  458. Corge(4, \'baz qux\'),
  459. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\', prop4: new P\R()),
  460. ]
  461. class X
  462. {}
  463. ',
  464. '<?php
  465. namespace Test;
  466. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\', prop4: new P\R())]
  467. #[\A\B\Foo(), \Bar( ), Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\', prop4: new P\R())]
  468. #[
  469. \A\B\Foo(),
  470. \Bar( ),
  471. Baz,
  472. Corge(4, \'baz qux\'),
  473. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\', prop4: new P\R()),
  474. ]
  475. class X
  476. {}
  477. ',
  478. ];
  479. yield 'With parentheses' => [
  480. '<?php
  481. namespace Test;
  482. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\', prop4: new P\R())]
  483. #[\A\B\Foo(), \Bar(), Baz(), Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\', prop4: new P\R())]
  484. #[
  485. \A\B\Foo(),
  486. \Bar(),
  487. Baz(),
  488. Corge(4, \'baz qux\'),
  489. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\', prop4: new P\R()),
  490. ]
  491. class X
  492. {}
  493. ',
  494. '<?php
  495. namespace Test;
  496. #[A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\', prop4: new P\R())]
  497. #[\A\B\Foo(), \Bar, Baz, Corge(4, \'baz qux\'), A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\', prop4: new P\R())]
  498. #[
  499. \A\B\Foo(),
  500. \Bar,
  501. Baz,
  502. Corge(4, \'baz qux\'),
  503. A\B\Qux(prop1: [1, 2, 4], prop2: true, prop3: \'foo bar\', prop4: new P\R()),
  504. ]
  505. class X
  506. {}
  507. ',
  508. ['use_parentheses' => true],
  509. ];
  510. }
  511. }