mirror of
https://github.com/Combodo/iTop.git
synced 2026-05-19 07:12:26 +02:00
replace eval by iTop custom evaluation classes
This commit is contained in:
@@ -75,7 +75,7 @@ class ModuleFileParser {
|
||||
throw new ModuleFileReaderException("2nd parameter to SetupWebPage::AddModule not a string: " . get_class($oModuleId->value), 0, null, $sModuleFilePath);
|
||||
}
|
||||
|
||||
$sModuleId = $this->EvaluateExpression($oModuleId->value);
|
||||
$sModuleId = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oModuleId->value);
|
||||
|
||||
$oModuleConfigInfo = $aArgs[2];
|
||||
if (false === ($oModuleConfigInfo instanceof PhpParser\Node\Arg)) {
|
||||
@@ -87,7 +87,7 @@ class ModuleFileParser {
|
||||
throw new ModuleFileReaderException("3rd parameter to SetupWebPage::AddModule not an array: " . get_class($oModuleConfigInfo->value), 0, null, $sModuleFilePath);
|
||||
}
|
||||
|
||||
$aModuleConfig = $this->EvaluateExpression($oModuleConfigInfo->value);
|
||||
$aModuleConfig = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oModuleConfigInfo->value);
|
||||
|
||||
if (! is_array($aModuleConfig)){
|
||||
throw new ModuleFileReaderException("3rd parameter to SetupWebPage::AddModule not an array: " . get_class($oModuleConfigInfo->value), 0, null, $sModuleFilePath);
|
||||
@@ -109,7 +109,7 @@ class ModuleFileParser {
|
||||
*/
|
||||
public function GetModuleInformationFromIf(string $sModuleFilePath, \PhpParser\Node\Stmt\If_ $oNode) : ?array
|
||||
{
|
||||
$bCondition = $this->EvaluateExpression($oNode->cond);
|
||||
$bCondition = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oNode->cond);
|
||||
if ($bCondition) {
|
||||
foreach ($oNode->stmts as $oSubNode) {
|
||||
if ($oSubNode instanceof \PhpParser\Node\Stmt\Expression) {
|
||||
@@ -126,7 +126,7 @@ class ModuleFileParser {
|
||||
if (! is_null($oNode->elseifs)) {
|
||||
foreach ($oNode->elseifs as $oElseIfSubNode) {
|
||||
/** @var \PhpParser\Node\Stmt\ElseIf_ $oElseIfSubNode */
|
||||
$bCondition = $this->EvaluateExpression($oElseIfSubNode->cond);
|
||||
$bCondition = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oElseIfSubNode->cond);
|
||||
if ($bCondition) {
|
||||
return $this->GetModuleConfigurationFromStatement($sModuleFilePath, $oElseIfSubNode->stmts);
|
||||
}
|
||||
@@ -153,20 +153,4 @@ class ModuleFileParser {
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $sBooleanExpr
|
||||
*
|
||||
* @return bool
|
||||
* @throws ModuleFileReaderException
|
||||
*/
|
||||
public function EvaluateBooleanExpression(string $sBooleanExpr) : bool
|
||||
{
|
||||
return PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateBooleanExpression($sBooleanExpr);
|
||||
}
|
||||
|
||||
private function EvaluateExpression(Expr $oExpression) : mixed
|
||||
{
|
||||
return PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpression);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace evaluation\expression;
|
||||
|
||||
use PhpParser\Node\Expr;
|
||||
use PhpParser\Node\Expr\ArrayDimFetch;
|
||||
|
||||
class ArrayDimFetchEvaluator implements iExprEvaluator {
|
||||
public function GetHandledExpressionType(): string {
|
||||
return ArrayDimFetch::class;
|
||||
}
|
||||
|
||||
public function Evaluate(Expr $oExpr): mixed {
|
||||
/** @var ArrayDimFetch $oExpr */
|
||||
|
||||
$var = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->var);
|
||||
if (is_null($var)){
|
||||
return null;
|
||||
}
|
||||
|
||||
$dim = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->dim);
|
||||
if (is_null($var)){
|
||||
return $dim;
|
||||
}
|
||||
|
||||
return $var[$dim] ?? null;
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ use ModuleFileReaderException;
|
||||
use PhpParser\Node\Expr;
|
||||
use PhpParser\Node\Expr\Array_;
|
||||
use PhpParser\Node\Expr\ConstFetch;
|
||||
use PhpParser\Node\Scalar\Int_;
|
||||
use PhpParser\Node\Scalar\String_;
|
||||
|
||||
class ArrayEvaluator implements iExprEvaluator {
|
||||
@@ -20,7 +21,7 @@ class ArrayEvaluator implements iExprEvaluator {
|
||||
$aModuleInformation=[];
|
||||
/** @var \PhpParser\Node\Expr\ArrayItem $oValue */
|
||||
foreach ($oExpr->items as $oArrayItem){
|
||||
if ($oArrayItem->key instanceof String_||$oArrayItem->key instanceof ConstFetch) {
|
||||
if ($oArrayItem->key instanceof Int_||$oArrayItem->key instanceof String_||$oArrayItem->key instanceof ConstFetch) {
|
||||
//dictionnary
|
||||
$sKey = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oArrayItem->key);
|
||||
if (is_null($sKey)){
|
||||
|
||||
@@ -2,10 +2,8 @@
|
||||
|
||||
namespace evaluation\expression;
|
||||
|
||||
use ModuleFileReaderException;
|
||||
use PhpParser\Node\Expr;
|
||||
use PhpParser\Node\Expr\BinaryOp;
|
||||
use Throwable;
|
||||
|
||||
abstract class BinaryOpEvaluator implements iExprEvaluator {
|
||||
abstract function EvaluateBinaryOperation(mixed $left, mixed $right) : mixed;
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace evaluation\expression;
|
||||
|
||||
use PhpParser\Node\Expr\BinaryOp\Concat;
|
||||
|
||||
class ConcatEvaluator extends BinaryOpEvaluator {
|
||||
public function GetHandledExpressionType(): string {
|
||||
return Concat::class;
|
||||
}
|
||||
|
||||
function EvaluateBinaryOperation(mixed $left, mixed $right) : mixed
|
||||
{
|
||||
if (is_null($left) && is_null($right)){
|
||||
return null;
|
||||
}
|
||||
|
||||
if (is_null($left)){
|
||||
return $right;
|
||||
}
|
||||
|
||||
if (is_null($right)){
|
||||
return $left;
|
||||
}
|
||||
|
||||
return "$left" . "$right";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace evaluation\expression;
|
||||
|
||||
use PhpParser\Node\Expr\BinaryOp\Equal;
|
||||
|
||||
class EqualEvaluator extends BinaryOpEvaluator {
|
||||
public function GetHandledExpressionType(): string {
|
||||
return Equal::class;
|
||||
}
|
||||
|
||||
function EvaluateBinaryOperation(mixed $left, mixed $right) : mixed
|
||||
{
|
||||
return $left == $right;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace evaluation\expression;
|
||||
|
||||
use PhpParser\Node\Expr\BinaryOp\Greater;
|
||||
|
||||
class GreaterEvaluator extends BinaryOpEvaluator {
|
||||
public function GetHandledExpressionType(): string {
|
||||
return Greater::class;
|
||||
}
|
||||
|
||||
function EvaluateBinaryOperation(mixed $left, mixed $right) : mixed
|
||||
{
|
||||
return $left > $right;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace evaluation\expression;
|
||||
|
||||
use PhpParser\Node\Expr\BinaryOp\GreaterOrEqual;
|
||||
|
||||
class GreaterOrEqualEvaluator extends BinaryOpEvaluator {
|
||||
public function GetHandledExpressionType(): string {
|
||||
return GreaterOrEqual::class;
|
||||
}
|
||||
|
||||
function EvaluateBinaryOperation(mixed $left, mixed $right) : mixed
|
||||
{
|
||||
return $left >= $right;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace evaluation\expression;
|
||||
|
||||
use PhpParser\Node\Expr\BinaryOp\NotEqual;
|
||||
|
||||
class NotEqualEvaluator extends BinaryOpEvaluator {
|
||||
public function GetHandledExpressionType(): string {
|
||||
return NotEqual::class;
|
||||
}
|
||||
|
||||
function EvaluateBinaryOperation(mixed $left, mixed $right) : mixed
|
||||
{
|
||||
return $left != $right;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
|
||||
#Combodo\\iTop\\
|
||||
namespace evaluation\expression;
|
||||
|
||||
use PhpParser\Node\Expr;
|
||||
@@ -61,7 +62,7 @@ class PhpExpressionEvaluator {
|
||||
return $this->ParseAndEvaluateExpression($sBooleanExpr);
|
||||
}
|
||||
|
||||
public function ParseAndEvaluateExpression(string $sExpr) : bool
|
||||
public function ParseAndEvaluateExpression(string $sExpr) : mixed
|
||||
{
|
||||
$sPhpContent = <<<PHP
|
||||
<?php
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace evaluation\expression;
|
||||
|
||||
use PhpParser\Node\Expr\BinaryOp\Smaller;
|
||||
|
||||
class SmallerEvaluator extends BinaryOpEvaluator {
|
||||
public function GetHandledExpressionType(): string {
|
||||
return Smaller::class;
|
||||
}
|
||||
|
||||
function EvaluateBinaryOperation(mixed $left, mixed $right) : mixed
|
||||
{
|
||||
return $left < $right;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace evaluation\expression;
|
||||
|
||||
use PhpParser\Node\Expr\BinaryOp\SmallerOrEqual;
|
||||
|
||||
class SmallerOrEqualEvaluator extends BinaryOpEvaluator {
|
||||
public function GetHandledExpressionType(): string {
|
||||
return SmallerOrEqual::class;
|
||||
}
|
||||
|
||||
function EvaluateBinaryOperation(mixed $left, mixed $right) : mixed
|
||||
{
|
||||
return $left <= $right;
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ class StaticCallEvaluator implements iExprEvaluator {
|
||||
$sClassName = $oExpr->class->name;
|
||||
$sMethodName = $oExpr->name->name;
|
||||
|
||||
$aWhiteList = ["SetupInfo::ModuleIsSelected"];
|
||||
$aWhiteList = ["SetupInfo::ModuleIsSelected", "utils::GetItopVersionWikiSyntax"];
|
||||
$sStaticCallDescription = "$sClassName::$sMethodName";
|
||||
if (! in_array($sStaticCallDescription, $aWhiteList)){
|
||||
throw new ModuleFileReaderException("StaticCall $sStaticCallDescription not supported");
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace evaluation\expression;
|
||||
|
||||
use PhpParser\Node\Expr;
|
||||
use PhpParser\Node\Expr\BinaryOp;
|
||||
use PhpParser\Node\Expr\UnaryMinus;
|
||||
|
||||
class UnaryMinusEvaluator implements iExprEvaluator {
|
||||
public function GetHandledExpressionType(): string {
|
||||
return UnaryMinus::class;
|
||||
}
|
||||
|
||||
public function Evaluate(Expr $oExpr): mixed {
|
||||
/** @var UnaryMinus $oExpr */
|
||||
|
||||
return - PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oExpr->expr);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace evaluation\expression;
|
||||
|
||||
use PhpParser\Node\Expr;
|
||||
use PhpParser\Node\Expr\ClassConstFetch;
|
||||
use PhpParser\Node\Expr\Variable;
|
||||
|
||||
class VariableEvaluator implements iExprEvaluator {
|
||||
public function GetHandledExpressionType(): string {
|
||||
return Variable::class;
|
||||
}
|
||||
|
||||
public function Evaluate(Expr $oExpr): mixed {
|
||||
/** @var Variable $oExpr */
|
||||
if (is_null($oExpr->name)){
|
||||
return null;
|
||||
}
|
||||
|
||||
if (! isset($oExpr->name)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$sVarname=$oExpr->name;
|
||||
|
||||
$bResult = null;
|
||||
@eval('$bResult = $'.$sVarname.';');
|
||||
|
||||
return $bResult;
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user