Comments in attributes (e.g. for an array item) are weirdly moved to somewhere completely else
Various comments inside attributes are moved to really weird places instead of staying where they were. The example below is not the only one where something like this happens. There are a few other scenarios like e..g for a parameter etc.
Prettier 2.88.0 (but also tried the latest)
PHP Plugin 0.19.6 (but also tried the latest)
# Options (if any):
--no-options
Input:
<?php declare(strict_types=1);
namespace App\Controller\General;
use App\Dto\BarDto;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class EnrollmentController extends AbstractController
{
#[Route(path: '/foo', name: 'app.foo', methods: [
Request::METHOD_GET, // GET is required for third party app.
Request::METHOD_POST,
])]
public function save(): Response
{
return $this->json(['foo']);
}
}
Output:
<?php declare(strict_types=1);
namespace App\Controller\General;
use App\Dto\BarDto;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class EnrollmentController extends AbstractController // GET is required for third party app.
{
#[Route(path: '/foo', name: 'app.foo', methods: [Request::METHOD_GET, Request::METHOD_POST])]
public function save(): Response
{
return $this->json(['foo']);
}
}
Expected behavior:
Output should keep the comment where it was. IT definitely should not be moved to the class:
<?php declare(strict_types=1);
namespace App\Controller\General;
use App\Dto\BarDto;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class EnrollmentController extends AbstractController
{
#[Route(path: '/foo', name: 'app.foo', methods: [
Request::METHOD_GET, // GET is required for third party app.
Request::METHOD_POST
])]
public function save(): Response
{
return $this->json(['foo']);
}
}
This seems to be the case for quite some time as even the old version on the playground shows the issue: Link to playground
Got the same thing happenning, but instead of only moving, it also duplicates.
I got that simple thing with a PHPDoc so my IDE doesn't tell me my var is undefined (I know I could work around it but I just find this easier for now)
Input:
<footer>
© •••••• -- All rights reserved.
</footer>
<?php /** @var Script[] $scripts */
if (isset($scripts)) {
foreach ($scripts as $script) {
echo $script;
}
}
Output:
<footer>
© Grapes -- All rights reserved.
</footer>
/** @var Script[] $scripts */<?php
/** @var Script[] $scripts */
if (isset($scripts)) {
foreach ($scripts as $script) {
echo $script;
}
}
What's even weirder is, when I format using Prettier again:
<footer>
© Grapes -- All rights reserved.
</footer>
/** @var Script[] $scripts */<?php /** @var Script[] $scripts */
if (isset($scripts)) {
foreach ($scripts as $script) {
echo $script;
}
}
And again:
<footer>
© Grapes -- All rights reserved.
</footer>
/** @var Script[] $scripts */ /** @var Script[] $scripts */<?php
/** @var Script[] $scripts */
if (isset($scripts)) {
foreach ($scripts as $script) {
echo $script;
}
}
And then it just keeps repeating the comment every two times I format:
<footer>
© Grapes -- All rights reserved.
</footer>
/** @var Script[] $scripts */ /** @var Script[] $scripts */ /** @var Script[] $scripts */ /** @var Script[] $scripts */ /** @var Script[] $scripts */ /** @var Script[] $scripts */<?php /** @var Script[] $scripts */
if (isset($scripts)) {
foreach ($scripts as $script) {
echo $script;
}
}
After testing on Playground, it only occurs when there's a line about the <?php for example:
This:
<?php /** @var Script[] $scripts */
if (isset($scripts)) {
foreach ($scripts as $script) {
echo $script;
}
}
doesn't change.
But this :
// empty line
<?php /** @var Script[] $scripts */
if (isset($scripts)) {
foreach ($scripts as $script) {
echo $script;
}
}
turns into this :
// empty line
/** @var Script[] $scripts */<?php
/** @var Script[] $scripts */
if (isset($scripts)) {
foreach ($scripts as $script) {
echo $script;
}
}