mirror of
https://github.com/Combodo/iTop.git
synced 2026-05-19 15:22:17 +02:00
fix few Evaluators code
This commit is contained in:
@@ -4,33 +4,45 @@ namespace Combodo\iTop\PhpParser\Evaluation;
|
||||
|
||||
use PhpParser\Node\Expr;
|
||||
use PhpParser\Node\Expr\MethodCall;
|
||||
use PhpParser\Node\Expr\PropertyFetch;
|
||||
use PhpParser\Node\Identifier;
|
||||
use ReflectionClass;
|
||||
|
||||
class MethodCallEvaluator extends AbstractExprEvaluator {
|
||||
class MethodCallEvaluator extends AbstractExprEvaluator {
|
||||
public function GetHandledExpressionType(): ?string {
|
||||
return MethodCall::class;
|
||||
return null;
|
||||
}
|
||||
|
||||
public function GetHandledExpressionTypes(): ?array {
|
||||
return [MethodCall::class, Expr\NullsafeMethodCall::class];
|
||||
}
|
||||
|
||||
public function Evaluate(Expr $oExpr): mixed {
|
||||
/** @var MethodCall $oExpr */
|
||||
|
||||
$oVar = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->var);
|
||||
if (is_null($oVar)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$aArgs = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->args);
|
||||
$sName = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->name);
|
||||
$oReflectionClass = new ReflectionClass(get_class($oVar));
|
||||
|
||||
$oMethods = $oReflectionClass->getMethods();
|
||||
if (array_key_exists($sName, $oMethods)){
|
||||
$oMethods = $oMethods[$sName];
|
||||
if ($oMethods->isPublic()){
|
||||
return $oMethods->invokeArgs($oVar, $aArgs);
|
||||
}
|
||||
$aArgs=[];
|
||||
foreach ($oExpr->args as $arg){
|
||||
/** @var \PhpParser\Node\Arg $arg */
|
||||
$aArgs[]=$arg->value->value;
|
||||
}
|
||||
|
||||
if ($oExpr->name instanceof Identifier){
|
||||
$sName = $oExpr->name->name;
|
||||
} else {
|
||||
$sName = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->name);
|
||||
}
|
||||
|
||||
$oReflectionClass = new ReflectionClass(get_class($oVar));
|
||||
try{
|
||||
$oMethod = $oReflectionClass->getMethod($sName);
|
||||
if ($oMethod->isPublic()){
|
||||
return $oMethod->invokeArgs($oVar, $aArgs);
|
||||
}
|
||||
} catch (\ReflectionException $t) {}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user