예제 #1
0
파일: Visitor.php 프로젝트: j0k3r/rulerz
 /**
  * {@inheritDoc}
  */
 public function visitOperator(AST\Operator $element, &$handle = null, $eldnah = null)
 {
     // visit the arguments
     array_map(function ($argument) use(&$handle, $eldnah) {
         return $argument->accept($this, $handle, $eldnah);
     }, $element->getArguments());
 }
예제 #2
0
 /**
  * {@inheritDoc}
  */
 public function visitOperator(AST\Operator $element, &$handle = null, $eldnah = null)
 {
     $xcallable = $this->getOperator($element->getName());
     $arguments = array_map(function ($argument) use(&$handle, $eldnah) {
         return $argument->accept($this, $handle, $eldnah);
     }, $element->getArguments());
     return $xcallable->distributeArguments($arguments);
 }
예제 #3
0
 /**
  * {@inheritDoc}
  */
 public function visitOperator(AST\Operator $element, &$handle = null, $eldnah = null)
 {
     $parameters = [];
     $operator = $element->getName();
     $sql = parent::visitOperator($element, $parameters, $eldnah);
     if (in_array($operator, ['and', 'or', 'not'])) {
         return $sql;
     }
     if ($this->hasOperator($operator)) {
         return sprintf('(new \\PommProject\\Foundation\\Where(%s, [%s]))', $sql, implode(', ', $parameters));
     }
     return sprintf('(new \\PommProject\\Foundation\\Where("%s", [%s]))', $sql, implode(', ', $parameters));
 }
예제 #4
0
 /**
  * {@inheritDoc}
  */
 public function visitOperator(AST\Operator $element, &$handle = null, $eldnah = null)
 {
     try {
         $xcallable = $this->getOperator($element->getName());
     } catch (OperatorNotFoundException $e) {
         if (!$this->allowStarOperator) {
             throw $e;
         }
         $xcallable = $this->getStarOperator($element);
     }
     $parameters = [];
     $arguments = array_map(function ($argument) use(&$parameters) {
         return $argument->accept($this, $parameters);
     }, $element->getArguments());
     $sql = $xcallable->distributeArguments($arguments);
     if ($sql instanceof Where) {
         return $sql;
     }
     return new Where($sql, $parameters);
 }
예제 #5
0
 /**
  * {@inheritDoc}
  */
 public function visitOperator(AST\Operator $element, &$handle = null, $eldnah = null)
 {
     $operatorName = $element->getName();
     // the operator does not exist at all, throw an error before doing anything else.
     if (!$this->hasInlineOperator($operatorName) && !$this->hasOperator($operatorName)) {
         throw new OperatorNotFoundException($operatorName, sprintf('Operator "%s" does not exist.', $operatorName));
     }
     // expand the arguments
     $arguments = array_map(function ($argument) use(&$handle, $eldnah) {
         return $argument->accept($this, $handle, $eldnah);
     }, $element->getArguments());
     // and either inline the operator call
     if ($this->hasInlineOperator($operatorName)) {
         $callable = $this->getInlineOperator($operatorName);
         return call_user_func_array($callable, $arguments);
     }
     $inlinedArguments = empty($arguments) ? '' : ', ' . implode(', ', $arguments);
     // or defer it.
     return sprintf('call_user_func($operators["%s"]%s)', $operatorName, $inlinedArguments);
 }
예제 #6
0
파일: Asserter.php 프로젝트: K-Phoen/Ruler
 /**
  * Visit an operator
  *
  * @param   \Hoa\Visitor\Element  $element    Element to visit.
  * @param   mixed                 &$handle    Handle (reference).
  * @param   mixed                 $eldnah     Handle (not reference).
  * @return  mixed
  */
 protected function visitOperator(Ruler\Model\Operator $element, &$handle = null, $eldnah = null)
 {
     $name = $element->getName();
     $arguments = [];
     foreach ($element->getArguments() as $argument) {
         $value = $argument->accept($this, $handle, $eldnah);
         $arguments[] = $value;
         if ($element::LAZY_BREAK === $element->shouldBreakLazyEvaluation($value)) {
             break;
         }
     }
     if (false === $this->operatorExists($name)) {
         throw new Ruler\Exception\Asserter('Operator %s does not exist.', 0, $name);
     }
     return $this->getOperator($name)->distributeArguments($arguments);
 }
예제 #7
0
 /**
  * Return a "*" or "catch all" operator.
  *
  * @param Visitor\Element $element The node representing the operator.
  *
  * @return \Hoa\Core\Consistency\Xcallable
  */
 protected function getStarOperator(AST\Operator $element)
 {
     return xcallable(function () use($element) {
         return sprintf('%s(%s)', $element->getName(), implode(', ', func_get_args()));
     });
 }
예제 #8
0
 /**
  * Visit an element.
  *
  * @param   \Hoa\Visitor\Element  $element    Element to visit.
  * @param   mixed                 &$handle    Handle (reference).
  * @param   mixed                 $eldnah     Handle (not reference).
  * @return  mixed
  */
 public function visit(Visitor\Element $element, &$handle = null, $eldnah = null)
 {
     $out = null;
     if ($element instanceof Ruler\Model) {
         $out .= $element->getExpression()->accept($this, $handle, $eldnah);
     } elseif ($element instanceof Ruler\Model\Operator) {
         $name = $element->getName();
         $arguments = [];
         foreach ($element->getArguments() as $argument) {
             $arguments[] = $argument->accept($this, $handle, $eldnah);
         }
         if (true === $element->isFunction()) {
             $out .= $name . '(' . implode(', ', $arguments) . ')';
         } else {
             if (!isset($arguments[1])) {
                 $_out = $name . ' ' . $arguments[0];
             } else {
                 $_out = $arguments[0] . ' ' . $name . ' ' . $arguments[1];
             }
             if (false === Ruler\Model\Operator::isToken($name)) {
                 $_out = '(' . $_out . ')';
             }
             $out .= $_out;
         }
     } elseif ($element instanceof Ruler\Model\Bag\Scalar) {
         $value = $element->getValue();
         if (true === $value) {
             $out .= 'true';
         } elseif (false === $value) {
             $out .= 'false';
         } elseif (null === $value) {
             $out .= 'null';
         } elseif (is_numeric($value)) {
             $out .= (string) $value;
         } else {
             $out .= '\'' . str_replace('\\', '\\\'', $value) . '\'';
         }
     } elseif ($element instanceof Ruler\Model\Bag\RulerArray) {
         $values = [];
         foreach ($element->getArray() as $value) {
             $values[] = $value->accept($this, $handle, $eldnah);
         }
         $out .= '[' . implode(', ', $values) . ']';
     } elseif ($element instanceof Ruler\Model\Bag\Context) {
         $out .= $element->getId();
         foreach ($element->getDimensions() as $dimension) {
             $value = $dimension[Ruler\Model\Bag\Context::ACCESS_VALUE];
             switch ($dimension[Ruler\Model\Bag\Context::ACCESS_TYPE]) {
                 case Ruler\Model\Bag\Context::ARRAY_ACCESS:
                     $out .= '[' . $value->accept($this, $handle, $eldnah) . ']';
                     break;
                 case Ruler\Model\Bag\Context::ATTRIBUTE_ACCESS:
                     $out .= '.' . $value;
                     break;
                 case Ruler\Model\Bag\Context::METHOD_ACCESS:
                     $out .= '.' . $value->accept($this, $handle, $eldnah);
                     break;
             }
         }
     }
     return $out;
 }