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

@@ -469,29 +469,42 @@ return array(
'Combodo\\iTop\\Form\\Validator\\NotEmptyExtKeyValidator' => $baseDir . '/sources/Form/Validator/NotEmptyExtKeyValidator.php',
'Combodo\\iTop\\Form\\Validator\\SelectObjectValidator' => $baseDir . '/sources/Form/Validator/SelectObjectValidator.php',
'Combodo\\iTop\\Kernel' => $baseDir . '/sources/Kernel.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\AbstractExprEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/AbstractExprEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\ArrayDimFetchEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/ArrayDimFetchEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\ArrayEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/ArrayEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BinaryOpEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/BinaryOpEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BitwiseAndEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/BitwiseAndEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BitwiseNotEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/BitwiseNotEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BitwiseOrEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/BitwiseOrEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BitwiseXorEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/BitwiseXorEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BooleanAndEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/BooleanAndEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BooleanNotEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/BooleanNotEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BooleanOrEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/BooleanOrEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\CastEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/CastEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\ClassConstFetchEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/ClassConstFetchEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\CoalesceEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/CoalesceEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\ConcatEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/ConcatEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\ConstFetchEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/ConstFetchEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\EqualEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/EqualEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\FuncCallEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/FuncCallEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\GreaterEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/GreaterEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\GreaterOrEqualEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/GreaterOrEqualEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\IssetEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/IssetEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\MethodCallEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/MethodCallEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\ModEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/ModEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\MulEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/MulEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\NotEqualEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/NotEqualEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\NullsafeMethodCallEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/NullsafeMethodCallEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\NullsafePropertyFetchEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/NullsafePropertyFetchEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\PhpExpressionEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/PhpExpressionEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\PropertyFetchEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/PropertyFetchEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\SmallerEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/SmallerEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\SmallerOrEqualEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/SmallerOrEqualEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\StaticCallEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/StaticCallEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\StaticPropertyFetchEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/StaticPropertyFetchEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\TernaryEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/TernaryEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\UnaryMinusEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/UnaryMinusEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\UnaryPlusEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/UnaryPlusEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\VariableEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/VariableEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\iExprEvaluator' => $baseDir . '/sources/PhpParser/Evaluation/iExprEvaluator.php',
'Combodo\\iTop\\Renderer\\BlockRenderer' => $baseDir . '/sources/Renderer/BlockRenderer.php',

View File

@@ -847,29 +847,42 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Combodo\\iTop\\Form\\Validator\\NotEmptyExtKeyValidator' => __DIR__ . '/../..' . '/sources/Form/Validator/NotEmptyExtKeyValidator.php',
'Combodo\\iTop\\Form\\Validator\\SelectObjectValidator' => __DIR__ . '/../..' . '/sources/Form/Validator/SelectObjectValidator.php',
'Combodo\\iTop\\Kernel' => __DIR__ . '/../..' . '/sources/Kernel.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\AbstractExprEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/AbstractExprEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\ArrayDimFetchEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/ArrayDimFetchEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\ArrayEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/ArrayEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BinaryOpEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/BinaryOpEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BitwiseAndEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/BitwiseAndEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BitwiseNotEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/BitwiseNotEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BitwiseOrEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/BitwiseOrEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BitwiseXorEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/BitwiseXorEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BooleanAndEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/BooleanAndEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BooleanNotEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/BooleanNotEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\BooleanOrEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/BooleanOrEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\CastEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/CastEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\ClassConstFetchEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/ClassConstFetchEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\CoalesceEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/CoalesceEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\ConcatEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/ConcatEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\ConstFetchEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/ConstFetchEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\EqualEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/EqualEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\FuncCallEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/FuncCallEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\GreaterEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/GreaterEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\GreaterOrEqualEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/GreaterOrEqualEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\IssetEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/IssetEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\MethodCallEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/MethodCallEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\ModEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/ModEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\MulEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/MulEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\NotEqualEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/NotEqualEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\NullsafeMethodCallEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/NullsafeMethodCallEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\NullsafePropertyFetchEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/NullsafePropertyFetchEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\PhpExpressionEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/PhpExpressionEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\PropertyFetchEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/PropertyFetchEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\SmallerEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/SmallerEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\SmallerOrEqualEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/SmallerOrEqualEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\StaticCallEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/StaticCallEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\StaticPropertyFetchEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/StaticPropertyFetchEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\TernaryEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/TernaryEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\UnaryMinusEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/UnaryMinusEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\UnaryPlusEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/UnaryPlusEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\VariableEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/VariableEvaluator.php',
'Combodo\\iTop\\PhpParser\\Evaluation\\iExprEvaluator' => __DIR__ . '/../..' . '/sources/PhpParser/Evaluation/iExprEvaluator.php',
'Combodo\\iTop\\Renderer\\BlockRenderer' => __DIR__ . '/../..' . '/sources/Renderer/BlockRenderer.php',

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;
}

View File

@@ -4,7 +4,6 @@ namespace Combodo\iTop\Test\UnitTest\Setup\ModuleDiscovery;
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
use ModuleFileReader;
use PhpParser\ParserFactory;
class ModuleFileReaderTest extends ItopDataTestCase
{
@@ -35,7 +34,7 @@ class ModuleFileReaderTest extends ItopDataTestCase
];
$aErrors=[];
foreach (glob(__DIR__.'/resources/all_designer/**.php') as $sModuleFilePath){
foreach (glob(__DIR__.'/resources/all_designer/*.php') as $sModuleFilePath){
//var_dump($sModuleFilePath);
try{
$aRes = ModuleFileReader::GetInstance()->ReadModuleFileInformation($sModuleFilePath);
@@ -54,7 +53,7 @@ class ModuleFileReaderTest extends ItopDataTestCase
//$this->assertEquals($aExpected, $aRes, $sModuleFilePath);
}
$this->assertEquals([], $aErrors);
$this->assertEquals([], $aErrors, var_export($aErrors, true));
}*/
public static function ReadModuleFileConfigurationFileNameProvider()

View File

@@ -23,12 +23,12 @@ class PhpExpressionEvaluatorTest extends ItopDataTestCase {
'ClassConstFetch: unknown class:class' => [ 'sExpression' => 'GabuZomeuUnknownClass::class'],
'ClassConstFetch: private existing constant' => [
'sExpression' => 'Combodo\iTop\Test\UnitTest\Setup\ModuleDiscovery\PhpExpressionEvaluatorTest::PRIVATE_CONSTANT',
'forced_expected' => null
'forced_expected' => null,
],
'StaticProperty: public existing constant' => [ 'sExpression' => 'Combodo\iTop\Test\UnitTest\Setup\ModuleDiscovery\PhpExpressionEvaluatorTest::$STATIC_PROPERTY'],
'StaticProperty: private existing constant' => [
'sExpression' => 'Combodo\iTop\Test\UnitTest\Setup\ModuleDiscovery\PhpExpressionEvaluatorTest::$PRIVATE_STATIC_PROPERTY',
'forced_expected' => null
'forced_expected' => null,
],
'BinaryOperator: false|true' => [ 'sExpression' => 'false|true'],
'BinaryOperator: false||true' => [ 'sExpression' => 'false||true'],
@@ -45,13 +45,40 @@ class PhpExpressionEvaluatorTest extends ItopDataTestCase {
'FuncCall: function_exists(\'ldap_connect\')' => [ 'sExpression' => 'function_exists(\'ldap_connect\')'],
'FuncCall: function_exists(\'gabuzomeushouldnotexist\')' => [ 'sExpression' => 'function_exists(\'gabuzomeushouldnotexist\')'],
'UnaryMinus: -1' => ['sExpression' => '-1'],
'UnaryPlus: +1' => ['sExpression' => '+1'],
'Concat: "a"."b"' => ['sExpression' => '"a"."b"'],
'ArrayDimFetch: $_SERVER[\'toto\']' => ['sExpression' => '$_SERVER[\'toto\']'],
'Variable: $_SERVER' => ['sExpression' => '$_SERVER'],
'Array: [1000 => "a"]' => ['sExpression' => '[1000 => "a"]'],
'Array: ["a"]' => ['sExpression' => '["a"]'],
'Array dict: ["a"=>"b"]' => ['sExpression' => '["a"=>"b"]'],
'StaticCall utils::GetItopVersionWikiSyntax()' => ['sExpression' => 'utils::GetItopVersionWikiSyntax()']
'StaticCall utils::GetItopVersionWikiSyntax()' => ['sExpression' => 'utils::GetItopVersionWikiSyntax()'],
'NullsafePropertyFetch: $oNullVar?->b' => ['sExpression' => '$oNullVar?->b'],
'NullsafePropertyFetch: $oEvaluationFakeClass?->bIsOk' => ['sExpression' => '$oEvaluationFakeClass?->bIsOk'],
'PropertyFetch: $oEvaluationFakeClass->bIsOk' => ['sExpression' => '$oEvaluationFakeClass->bIsOk'],
'NullsafeMethodCall: $oEvaluationFakeClass?->GetName()' => ['sExpression' => '$oEvaluationFakeClass?->GetName()'],
'NullsafeMethodCall: $oEvaluationFakeClass?->GetLongName("aa")' => ['sExpression' => '$oEvaluationFakeClass?->GetLongName("aa")'],
'MethodCall: $oEvaluationFakeClass->GetName()' => ['sExpression' => '$oEvaluationFakeClass->GetName()'],
'MethodCall: $oEvaluationFakeClass->GetLongName("aa")' => ['sExpression' => '$oEvaluationFakeClass->GetLongName("aa")'],
'Coalesce: $oNullVar ?? 1' => ['sExpression' => '$oNullVar ?? 1'],
'Coalesce: $oNonNullVar ?? 1' => ['sExpression' => '$oNonNullVar ?? 1'],
'Isset: isset($a)' => ['sExpression' => 'isset($a)'],
'Isset: isset($a, $_SERVER)' => ['sExpression' => 'isset($a, $_SERVER)'],
'Isset: isset($_SERVER)' => ['sExpression' => 'isset($_SERVER)'],
'Isset: isset($_SERVER, $a)' => ['sExpression' => 'isset($_SERVER, $a)'],
'BitwiseNot: ~3' => ['sExpression' => '~3'],
'Mod: 3%2' => ['sExpression' => '3%2'],
'BitwiseXor: 3^2' => ['sExpression' => '3^2'],
'Ternary: (true) ? 1 : 2' => ['sExpression' => '(true) ? 1 : 2'],
'Ternary: (false) ? 1 : 2' => ['sExpression' => '(false) ? 1 : 2'],
'Cast: (array)3' => ['sExpression' => '(array)3'],
'Cast: (bool)1' => ['sExpression' => '(bool)1'],
'Cast: (bool)0' => ['sExpression' => '(bool)0'],
'Cast: (double)3' => ['sExpression' => '(double)3'],
'Cast: (float)3' => ['sExpression' => '(float)3'],
'Cast: (int)3' => ['sExpression' => '(int)3'],
'Cast: (object)3' => ['sExpression' => '(object)3'],
'Cast: (string)3' => ['sExpression' => '(string)3'],
];
}
@@ -60,10 +87,16 @@ class PhpExpressionEvaluatorTest extends ItopDataTestCase {
*/
public function testEvaluateExpression($sExpression, $forced_expected="NOTPROVIDED")
{
$oNullVar=null;
$oNonNullVar="a";
$_SERVER=[
'toto' => 'titi'
'toto' => 'titi',
];
$oEvaluationFakeClass = new EvaluationFakeClass();
$oEvaluationFakeClass->bIsOk;
$oEvaluationFakeClass->GetName();
$res = PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateExpression($sExpression);
if ($forced_expected === "NOTPROVIDED"){
$this->assertEquals($this->UnprotectedComputeExpression($sExpression), $res, $sExpression);
@@ -90,12 +123,6 @@ class PhpExpressionEvaluatorTest extends ItopDataTestCase {
}
}
public function testParseAndEvaluateBooleanExpression_BrokenBooleanExpression(){
$this->expectException(\ModuleFileReaderException::class);
$this->expectExceptionMessage('Eval of \'(a || true)\' caused an error');
$this->assertTrue(PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateBooleanExpression("(a || true)"));
}
public static function ParseAndEvaluateBooleanExpression_AutoselectProvider()
{
$sSimpleCallToModuleIsSelected = "SetupInfo::ModuleIsSelected(\"itop-storage-mgmt\")";
@@ -131,4 +158,18 @@ class PhpExpressionEvaluatorTest extends ItopDataTestCase {
\SetupInfo::SetSelectedModules(["itop-storage-mgmt" => "123"]);
$this->assertEquals($expected, PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateBooleanExpression($sBooleanExpression), $sBooleanExpression);
}
}
class EvaluationFakeClass {
public bool $bIsOk=true;
public function GetName()
{
return "gabuzomeu";
}
public function GetLongName($suffix)
{
return "gabuzomeu_" . $suffix;
}
}