mirror of
https://github.com/Combodo/iTop.git
synced 2026-05-18 23:08:46 +02:00
complete Evaluators list + autoload
This commit is contained in:
9
sources/PhpParser/Evaluation/AbstractExprEvaluator.php
Normal file
9
sources/PhpParser/Evaluation/AbstractExprEvaluator.php
Normal file
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Combodo\iTop\PhpParser\Evaluation;
|
||||
|
||||
abstract class AbstractExprEvaluator implements iExprEvaluator {
|
||||
public function GetHandledExpressionTypes(): ?array {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
18
sources/PhpParser/Evaluation/BitwiseNotEvaluator.php
Normal file
18
sources/PhpParser/Evaluation/BitwiseNotEvaluator.php
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
16
sources/PhpParser/Evaluation/BitwiseXorEvaluator.php
Normal file
16
sources/PhpParser/Evaluation/BitwiseXorEvaluator.php
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
59
sources/PhpParser/Evaluation/CastEvaluator.php
Normal file
59
sources/PhpParser/Evaluation/CastEvaluator.php
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
23
sources/PhpParser/Evaluation/CoalesceEvaluator.php
Normal file
23
sources/PhpParser/Evaluation/CoalesceEvaluator.php
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
26
sources/PhpParser/Evaluation/IssetEvaluator.php
Normal file
26
sources/PhpParser/Evaluation/IssetEvaluator.php
Normal 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;
|
||||
}
|
||||
}
|
||||
36
sources/PhpParser/Evaluation/MethodCallEvaluator.php
Normal file
36
sources/PhpParser/Evaluation/MethodCallEvaluator.php
Normal 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;
|
||||
}
|
||||
}
|
||||
16
sources/PhpParser/Evaluation/ModEvaluator.php
Normal file
16
sources/PhpParser/Evaluation/ModEvaluator.php
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
36
sources/PhpParser/Evaluation/NullsafeMethodCallEvaluator.php
Normal file
36
sources/PhpParser/Evaluation/NullsafeMethodCallEvaluator.php
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
47
sources/PhpParser/Evaluation/PropertyFetchEvaluator.php
Normal file
47
sources/PhpParser/Evaluation/PropertyFetchEvaluator.php
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
24
sources/PhpParser/Evaluation/TernaryEvaluator.php
Normal file
24
sources/PhpParser/Evaluation/TernaryEvaluator.php
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
18
sources/PhpParser/Evaluation/UnaryPlusEvaluator.php
Normal file
18
sources/PhpParser/Evaluation/UnaryPlusEvaluator.php
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user