fix(compiler): resolve __METHOD__ in ordinary functions (#125) --skip-tests
* fix(compiler): resolve __METHOD__ in ordinary functions * fix(compiler): preserve lexical magic names in closuresmaster
parent
63a4793e0c
commit
1425499588
6 changed files with 149 additions and 2 deletions
@ -0,0 +1,98 @@ |
|||||||
|
--TEST-- |
||||||
|
Closure and arrow function magic names preserve their lexical context |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
namespace MagicClosureNames { |
||||||
|
function outer(): void { |
||||||
|
$closure = function (): void { |
||||||
|
echo __FUNCTION__, "\n", __METHOD__, "\n"; |
||||||
|
static $name = __METHOD__; |
||||||
|
echo $name, "\n"; |
||||||
|
$nested = fn(): string => __METHOD__; |
||||||
|
echo $nested(), "\n"; |
||||||
|
}; |
||||||
|
$closure(); |
||||||
|
$arrow = fn(): string => __METHOD__; |
||||||
|
echo $arrow(), "\n"; |
||||||
|
echo __METHOD__, "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
function dynamicClosure(): \Closure { |
||||||
|
return function (): string { return __METHOD__; }; |
||||||
|
} |
||||||
|
|
||||||
|
function dynamicArrow(): \Closure { |
||||||
|
return fn(): string => __FUNCTION__; |
||||||
|
} |
||||||
|
|
||||||
|
function generatorClosure(): void { |
||||||
|
$generator = function () { |
||||||
|
yield __METHOD__; |
||||||
|
$nested = fn(): string => __METHOD__; |
||||||
|
yield $nested(); |
||||||
|
}; |
||||||
|
foreach ($generator() as $name) { |
||||||
|
echo $name, "\n"; |
||||||
|
} |
||||||
|
echo __METHOD__, "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
trait Names { |
||||||
|
public function original(): void { |
||||||
|
$closure = fn(): string => __METHOD__; |
||||||
|
echo $closure(), "\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class UsesNames { |
||||||
|
use Names { original as renamed; } |
||||||
|
} |
||||||
|
|
||||||
|
class Example { |
||||||
|
public static function method(): void { |
||||||
|
$closure = function (): string { return __METHOD__; }; |
||||||
|
echo $closure(), "\n"; |
||||||
|
$arrow = fn(): string => __FUNCTION__; |
||||||
|
echo $arrow(), "\n"; |
||||||
|
echo __METHOD__, "\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
namespace { |
||||||
|
function globalOuter(): void { |
||||||
|
$closure = function (): string { return __METHOD__; }; |
||||||
|
echo $closure(), "\n"; |
||||||
|
$arrow = fn(): string => __METHOD__; |
||||||
|
echo $arrow(), "\n"; |
||||||
|
} |
||||||
|
function main(): void { |
||||||
|
\MagicClosureNames\outer(); |
||||||
|
\MagicClosureNames\Example::method(); |
||||||
|
globalOuter(); |
||||||
|
(new \MagicClosureNames\UsesNames())->renamed(); |
||||||
|
$closure = \MagicClosureNames\dynamicClosure(); |
||||||
|
echo $closure(), "\n"; |
||||||
|
$arrow = \MagicClosureNames\dynamicArrow(); |
||||||
|
echo $arrow(), "\n"; |
||||||
|
\MagicClosureNames\generatorClosure(); |
||||||
|
} |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
{closure:MagicClosureNames\outer():4} |
||||||
|
{closure:MagicClosureNames\outer():4} |
||||||
|
{closure:MagicClosureNames\outer():4} |
||||||
|
{closure:{closure:MagicClosureNames\outer():4}:8} |
||||||
|
{closure:MagicClosureNames\outer():12} |
||||||
|
MagicClosureNames\outer |
||||||
|
{closure:MagicClosureNames\Example::method():50} |
||||||
|
{closure:MagicClosureNames\Example::method():52} |
||||||
|
MagicClosureNames\Example::method |
||||||
|
{closure:globalOuter():60} |
||||||
|
{closure:globalOuter():62} |
||||||
|
{closure:MagicClosureNames\Names::original():39} |
||||||
|
{closure:MagicClosureNames\dynamicClosure():18} |
||||||
|
{closure:MagicClosureNames\dynamicArrow():22} |
||||||
|
{closure:MagicClosureNames\generatorClosure():26} |
||||||
|
{closure:{closure:MagicClosureNames\generatorClosure():26}:28} |
||||||
|
MagicClosureNames\generatorClosure |
||||||
Loading…
Reference in new issue