complete Evaluators list + autoload

This commit is contained in:
odain
2025-09-03 16:48:40 +02:00
parent 794a9afe3e
commit c14ac90a13
42 changed files with 522 additions and 80 deletions

View File

@@ -0,0 +1,9 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;
abstract class AbstractExprEvaluator implements iExprEvaluator {
public function GetHandledExpressionTypes(): ?array {
return null;
}
}

View File

@@ -1,12 +1,12 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\ArrayDimFetch;
class ArrayDimFetchEvaluator implements iExprEvaluator {
public function GetHandledExpressionType(): string {
class ArrayDimFetchEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return ArrayDimFetch::class;
}

View File

@@ -1,6 +1,6 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use ModuleFileReaderException;
use PhpParser\Node\Expr;
@@ -9,8 +9,8 @@ use PhpParser\Node\Expr\ConstFetch;
use PhpParser\Node\Scalar\Int_;
use PhpParser\Node\Scalar\String_;
class ArrayEvaluator implements iExprEvaluator {
public function GetHandledExpressionType(): string {
class ArrayEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return Array_::class;
}

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\BinaryOp;
abstract class BinaryOpEvaluator implements iExprEvaluator {
abstract class BinaryOpEvaluator extends AbstractExprEvaluator {
abstract function EvaluateBinaryOperation(mixed $left, mixed $right) : mixed;
public function Evaluate(Expr $oExpr): mixed {

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\BitwiseAnd;
class BitwiseAndEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): string {
public function GetHandledExpressionType(): ?string {
return BitwiseAnd::class;
}

View File

@@ -0,0 +1,18 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\BitwiseNot;
class BitwiseNotEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return BitwiseNot::class;
}
public function Evaluate(Expr $oExpr): mixed {
/** @var BitwiseNot $oExpr */
return ~ PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->expr);
}
}

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\BitwiseOr;
class BitwiseOrEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): string {
public function GetHandledExpressionType(): ?string {
return BitwiseOr::class;
}

View File

@@ -0,0 +1,16 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\BitwiseXor;
class BitwiseXorEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): ?string {
return BitwiseXor::class;
}
function EvaluateBinaryOperation(mixed $left, mixed $right) : mixed
{
return $left ^ $right;
}
}

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\BooleanAnd;
class BooleanAndEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): string {
public function GetHandledExpressionType(): ?string {
return BooleanAnd::class;
}

View File

@@ -1,12 +1,12 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\BooleanNot;
class BooleanNotEvaluator implements iExprEvaluator {
public function GetHandledExpressionType(): string {
class BooleanNotEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return BooleanNot::class;
}

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\BooleanOr;
class BooleanOrEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): string {
public function GetHandledExpressionType(): ?string {
return BooleanOr::class;
}

View File

@@ -0,0 +1,59 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\Cast;
use PhpParser\Node\Expr\StaticPropertyFetch;
class CastEvaluator implements iExprEvaluator {
public function GetHandledExpressionType(): ?string {
return null;
}
public function GetHandledExpressionTypes(): ?array {
return [
Cast\Array_::class,
Cast\Bool_::class,
Cast\Double::class,
Cast\Int_::class,
Cast\Object_::class,
Cast\String_::class,
];
}
public function Evaluate(Expr $oExpr): mixed {
$oSubExpr = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->expr);
switch (get_class($oExpr)){
case Cast\Array_::class:
return (array) $oSubExpr;
case Cast\Bool_::class:
return (bool) $oSubExpr;
case Cast\Double::class:
/** @var Cast\Double $oExpr */
switch ($oExpr->getAttribute("kind")){
case Cast\Double::KIND_DOUBLE:
return (double) $oSubExpr;
case Cast\Double::KIND_FLOAT:
case Cast\Double::KIND_REAL:
return (float) $oSubExpr;
}
break;
case Cast\Int_::class:
return (int) $oSubExpr;
case Cast\Object_::class:
return (object) $oSubExpr;
case Cast\String_::class:
return (string) $oSubExpr;
}
return null;
}
}

View File

@@ -1,12 +1,12 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\ClassConstFetch;
class ClassConstFetchEvaluator implements iExprEvaluator {
public function GetHandledExpressionType(): string {
class ClassConstFetchEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return ClassConstFetch::class;
}

View File

@@ -0,0 +1,23 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\BinaryOp\Coalesce;
class CoalesceEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return Coalesce::class;
}
public function Evaluate(Expr $oExpr): mixed {
/** @var Coalesce $oExpr */
$oLeftEval = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->left);
if (! is_null($oLeftEval)) {
return $oLeftEval;
}
return PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->right);
}
}

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\Concat;
class ConcatEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): string {
public function GetHandledExpressionType(): ?string {
return Concat::class;
}

View File

@@ -1,12 +1,12 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\ConstFetch;
class ConstFetchEvaluator implements iExprEvaluator {
public function GetHandledExpressionType(): string {
class ConstFetchEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return ConstFetch::class;
}

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\Equal;
class EqualEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): string {
public function GetHandledExpressionType(): ?string {
return Equal::class;
}

View File

@@ -1,14 +1,14 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use ModuleFileReaderException;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\FuncCall;
use ReflectionFunction;
class FuncCallEvaluator implements iExprEvaluator {
public function GetHandledExpressionType(): string {
class FuncCallEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return FuncCall::class;
}

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\Greater;
class GreaterEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): string {
public function GetHandledExpressionType(): ?string {
return Greater::class;
}

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\GreaterOrEqual;
class GreaterOrEqualEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): string {
public function GetHandledExpressionType(): ?string {
return GreaterOrEqual::class;
}

View File

@@ -0,0 +1,26 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\ConstFetch;
use PhpParser\Node\Expr\Isset_;
class IssetEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return Isset_::class;
}
public function Evaluate(Expr $oExpr): mixed {
/** @var Isset_ $oExpr */
foreach ($oExpr->vars as $oVar){
$var = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oVar);
if (! isset($var)){
return false;
}
}
return true;
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\MethodCall;
use ReflectionClass;
class MethodCallEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return MethodCall::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);
}
}
return null;
}
}

View File

@@ -0,0 +1,16 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\Mod;
class ModEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): ?string {
return Mod::class;
}
function EvaluateBinaryOperation(mixed $left, mixed $right) : mixed
{
return $left % $right;
}
}

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\Mul;
class MulEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): string {
public function GetHandledExpressionType(): ?string {
return Mul::class;
}

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\NotEqual;
class NotEqualEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): string {
public function GetHandledExpressionType(): ?string {
return NotEqual::class;
}

View File

@@ -0,0 +1,36 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\NullsafeMethodCall;
use ReflectionClass;
class NullsafeMethodCallEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return NullsafeMethodCall::class;
}
public function Evaluate(Expr $oExpr): mixed {
/** @var NullsafeMethodCall $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);
}
}
return null;
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\NullsafePropertyFetch;
use ReflectionClass;
class NullsafePropertyFetchEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return NullsafePropertyFetch::class;
}
public function Evaluate(Expr $oExpr): mixed {
/** @var NullsafePropertyFetch $oExpr */
$oVar = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->var);
if (is_null($oVar)) {
return null;
}
$sName = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->name);
$oReflectionClass = new ReflectionClass(get_class($oVar));
$oProperties = $oReflectionClass->getProperties();
if (array_key_exists($sName, $oProperties)){
$oProperty = $oProperties[$sName];
if ($oProperty->isPublic()){
return $oProperty->getValue($oVar);
}
}
return null;
}
}

View File

@@ -3,9 +3,9 @@
namespace Combodo\iTop\PhpParser\Evaluation;
use ModuleFileParser;
use ModuleFileReaderException;
use PhpParser\Node\Expr;
require_once __DIR__ . '/iExprEvaluator.php';
class PhpExpressionEvaluator {
private static PhpExpressionEvaluator $oInstance;
@@ -21,14 +21,23 @@ class PhpExpressionEvaluator {
static::$aPhpParserEvaluators=[];
foreach (glob(__DIR__ . "/**Evaluator.php") as $sFile){
require_once $sFile;
require_once $sFile;
$sNamespace = 'Combodo\\iTop\PhpParser\\Evaluation\\';
$sClass = $sNamespace. str_replace(".php", "", basename($sFile));
$oReflectionClass = new \ReflectionClass($sClass);
if ($oReflectionClass->isInstantiable()
&& $oReflectionClass->implementsInterface("{$sNamespace}iExprEvaluator")){
&& $oReflectionClass->implementsInterface(iExprEvaluator::class)){
$oClass = new $sClass;
static::$aPhpParserEvaluators[$oClass->GetHandledExpressionType()] = $oClass;
if (! is_null($oClass->GetHandledExpressionType())){
static::RegisterEvaluator($oClass, $oClass->GetHandledExpressionType());
}
if (! is_null($oClass->GetHandledExpressionTypes())) {
foreach ($oClass->GetHandledExpressionTypes() as $sHandledExpressionType){
static::RegisterEvaluator($oClass, $sHandledExpressionType);
}
}
}
}
}
@@ -36,6 +45,14 @@ class PhpExpressionEvaluator {
return static::$oInstance;
}
private static function RegisterEvaluator(iExprEvaluator $oClass, string $sHandledExpressionType)
{
if (array_key_exists($sHandledExpressionType, static::$aPhpParserEvaluators)){
throw new \CoreException("Another Evaluator class already deals with $sHandledExpressionType");
}
static::$aPhpParserEvaluators[$sHandledExpressionType] = $oClass;
}
final public static function SetInstance(?PhpExpressionEvaluator $oInstance): void {
static::$oInstance = $oInstance;
}
@@ -72,9 +89,8 @@ PHP;
$aNodes = ModuleFileParser::GetInstance()->ParsePhpCode($sPhpContent);
$oExpr = $aNodes[0];
return $this->EvaluateExpression($oExpr->expr);
} catch (\Throwable $t) {
throw new \ModuleFileReaderException("Eval of '$sExpr' caused an error:".$t->getMessage());
throw new ModuleFileReaderException("Eval of '$sExpr' caused an error:".$t->getMessage());
}
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\PropertyFetch;
use ReflectionClass;
class PropertyFetchEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return PropertyFetch::class;
}
public function Evaluate(Expr $oExpr): mixed {
/** @var PropertyFetch $oExpr */
$oVar = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->var);
if (is_null($oVar)) {
return null;
}
$sName = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->name);
$oReflectionClass = new ReflectionClass(get_class($oVar));
$oProperties = $oReflectionClass->getProperties();
if (array_key_exists($sName, $oProperties)){
$oProperty = $oProperties[$sName];
if ($oProperty->isPublic()){
return $oProperty->getValue($oVar);
}
return null;
}
$aArgs=[];
$oMethods = $oReflectionClass->getMethods();
if (array_key_exists($sName, $oMethods)){
$oMethod = $oMethods[$sName];
if ($oMethod->isPublic()){
return $oMethod->invokeArgs(null, $aArgs);
}
return null;
}
}
}

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\Smaller;
class SmallerEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): string {
public function GetHandledExpressionType(): ?string {
return Smaller::class;
}

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr\BinaryOp\SmallerOrEqual;
class SmallerOrEqualEvaluator extends BinaryOpEvaluator {
public function GetHandledExpressionType(): string {
public function GetHandledExpressionType(): ?string {
return SmallerOrEqual::class;
}

View File

@@ -1,14 +1,13 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use ModuleFileReaderException;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\StaticCall;
use ReflectionFunction;
class StaticCallEvaluator implements iExprEvaluator {
public function GetHandledExpressionType(): string {
class StaticCallEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return StaticCall::class;
}

View File

@@ -1,12 +1,12 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\StaticPropertyFetch;
class StaticPropertyFetchEvaluator implements iExprEvaluator {
public function GetHandledExpressionType(): string {
class StaticPropertyFetchEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return StaticPropertyFetch::class;
}

View File

@@ -0,0 +1,24 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\Ternary;
class TernaryEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return Ternary::class;
}
public function Evaluate(Expr $oExpr): mixed {
/** @var Ternary $oExpr */
$cond = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->cond);
if ($cond){
return PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->if);
}
return PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->else);
}
}

View File

@@ -1,13 +1,12 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\BinaryOp;
use PhpParser\Node\Expr\UnaryMinus;
class UnaryMinusEvaluator implements iExprEvaluator {
public function GetHandledExpressionType(): string {
class UnaryMinusEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return UnaryMinus::class;
}

View File

@@ -0,0 +1,18 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\UnaryPlus;
class UnaryPlusEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return UnaryPlus::class;
}
public function Evaluate(Expr $oExpr): mixed {
/** @var UnaryPlus $oExpr */
return + PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->expr);
}
}

View File

@@ -1,13 +1,12 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\ClassConstFetch;
use PhpParser\Node\Expr\Variable;
class VariableEvaluator implements iExprEvaluator {
public function GetHandledExpressionType(): string {
class VariableEvaluator extends AbstractExprEvaluator {
public function GetHandledExpressionType(): ?string {
return Variable::class;
}

View File

@@ -1,11 +1,11 @@
<?php
namespace Combodo\iTop\PhpParser\Evaluation;;
namespace Combodo\iTop\PhpParser\Evaluation;
use PhpParser\Node\Expr;
interface iExprEvaluator {
public function GetHandledExpressionType(): string;
public function GetHandledExpressionType(): ?string;
public function GetHandledExpressionTypes(): ?array ;
public function Evaluate(Expr $oExpr) : mixed;
}