Skip to content

Commit 507fa1b

Browse files
authored
fix: Fix scoping of new statement with the new parent not being a name (#1115)
1 parent ad79baf commit 507fa1b

File tree

2 files changed

+90
-5
lines changed

2 files changed

+90
-5
lines changed

specs/string-literal/new.php

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,4 +180,90 @@ class Ya_1
180180

181181
PHP,
182182
),
183+
184+
'new parent is a class name' => <<<'PHP'
185+
<?php
186+
namespace Acme;
187+
188+
class BplaaYai {}
189+
190+
new BplaaYai('abc');
191+
192+
----
193+
<?php
194+
195+
namespace Humbug\Acme;
196+
197+
class BplaaYai
198+
{
199+
}
200+
new BplaaYai('abc');
201+
202+
PHP,
203+
204+
'new parent is a variable' => <<<'PHP'
205+
<?php
206+
namespace Acme;
207+
208+
class BplaaYai {}
209+
210+
$class = '\Acme\BplaaYai';
211+
new $class('abc');
212+
213+
----
214+
<?php
215+
216+
namespace Humbug\Acme;
217+
218+
class BplaaYai
219+
{
220+
}
221+
$class = 'Humbug\Acme\BplaaYai';
222+
new $class('abc');
223+
224+
PHP,
225+
226+
'new parent is an expression (variable)' => <<<'PHP'
227+
<?php
228+
namespace Acme;
229+
230+
class BplaaYai {}
231+
232+
$class = '\Acme\BplaaYai';
233+
new $class('abc');
234+
235+
----
236+
<?php
237+
238+
namespace Humbug\Acme;
239+
240+
class BplaaYai
241+
{
242+
}
243+
$class = 'Humbug\Acme\BplaaYai';
244+
new $class('abc');
245+
246+
PHP,
247+
248+
'new parent is an anonymous class' => <<<'PHP'
249+
<?php
250+
namespace Acme;
251+
252+
class BplaaYai {}
253+
254+
new class('abc') {};
255+
256+
----
257+
<?php
258+
259+
namespace Humbug\Acme;
260+
261+
class BplaaYai
262+
{
263+
}
264+
new class('abc')
265+
{
266+
};
267+
268+
PHP,
183269
];

src/PhpParser/NodeVisitor/StringScalarPrefixer.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -212,11 +212,10 @@ private function prefixNewStringArg(String_ $string, New_ $newNode): String_
212212
{
213213
$class = $newNode->class;
214214

215-
if (!($class instanceof Name)) {
216-
throw UnexpectedParsingScenario::create();
217-
}
218-
219-
if (in_array(strtolower($class->toString()), self::DATETIME_CLASSES, true)) {
215+
if ($class instanceof Name
216+
&& in_array(strtolower($class->toString()), self::DATETIME_CLASSES, true)
217+
) {
218+
// Value cannot be a class name, hence we should not try to prefix it.
220219
return $string;
221220
}
222221

0 commit comments

Comments
 (0)