phabel/src/Plugin/NestedExpressionFixer.php

62 lines
1.5 KiB
PHP
Raw Normal View History

2020-08-30 20:55:28 +02:00
<?php
namespace Phabel\Plugin;
use Phabel\Plugin;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\Instanceof_;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\New_;
use PhpParser\Node\Expr\PropertyFetch;
class NestedExpressionFixer extends Plugin
{
public function enter(Expr $expr): void
{
/** @var array<string, array<class-string<Expr>, true>> */
$subNodes = $this->getConfig($class = \get_class($expr), false);
if (!$subNodes) {
return;
}
foreach ($subNodes as $key => $types) {
/** @var Expr $value */
$value = &$expr->{$key};
if (!isset($types[\get_class($value)])) {
continue;
}
switch ($class) {
case ArrayDimFetch::class:
case PropertyFetch::class:
case MethodCall::class:
case New_::class:
case Instanceof_::class:
$value = self::callPoly('returnMe', $value);
break;
case FuncCall::class:
$expr->var = self::callPoly('returnMe', $expr->var);
break;
}
}
}
/**
* Returns the data provided.
*
* @param mixed $data Data
*
* @return mixed
*
* @template T
*
* @psalm-param T $data data
*
* @psalm-return T
*/
public static function returnMe($data)
{
return $data;
}
}