/** * Creates a negated version of any expression. For instance, passing a * VariableNode will result in !$var. * * @param \Pharborist\ExpressionNode $expr * The expression to negate. * * @return static */ public static function fromExpression(ExpressionNode $expr) { $not = new static(); $not->addChild(Token::not(), 'operator'); /** @var \Pharborist\Node $expr */ $not->addChild($expr->remove(), 'operand'); return $not; }
/** * Creates a new class member. * * @param string $name * The name of the member, with or without the leading $. * @param \Pharborist\ExpressionNode $value * The default value of the member, if any. * @param string $visibility * The member's visibility. Can be public, private, or protected. Defaults to * public. * * @return ClassMemberListNode * * @todo Not all expressions can be default values, but I forget what sorts of * expressions are valid for this. Will need better sanity checking here. */ public static function create($name, ExpressionNode $value = NULL, $visibility = 'public') { $code = $visibility . ' $' . ltrim($name, '$'); if ($value instanceof ExpressionNode) { $code .= ' = ' . $value->getText(); } /** @var ClassNode $class_node */ $class_node = Parser::parseSnippet('class Foo { ' . $code . '; }'); return $class_node->getStatements()[0]->remove(); }
/** * @param ExpressionNode|NULL $node * @return $this */ public function setValue($node) { if ($node === NULL) { if (isset($this->value)) { $this->value->previousUntil(Filter::isInstanceOf('\\Pharborist\\Variables\\VariableNode'))->remove(); $this->value->remove(); } } else { if (isset($this->value)) { /** @var Node $node */ $this->value->replaceWith($node); } else { $this->append([Token::space(), Token::assign(), Token::space(), $node]); } } return $this; }
/** * @param ExpressionNode $operand * @return $this */ public function setRightOperand(ExpressionNode $operand) { /** @var Node $operand */ $this->right->replaceWith($operand); return $this; }
/** * Rewrites an assignment expression as a property setter. Returns NULL if * the expression cannot be rewritten. * * @param \Pharborist\ExpressionNode $expr * The expression to rewrite. * @param string $property * The property being used in the expression. * @param \Pharborist\Operators\AssignNode $assignment * The entire assignment expression being rewritten. * * @return \Pharborist\ExpressionNode|NULL */ public function rewriteAsSetter(ExpressionNode $expr, $property, AssignNode $assignment) { if ($expr instanceof ObjectPropertyNode) { // Should be getRootObject() or getLookupRoot(). // @see Pharborist issue #191 $object = clone $expr->getObject(); } elseif ($expr instanceof ArrayLookupNode) { $object = clone $expr->getRootArray(); } if (isset($object) && isset($this->pluginDefinition['properties'][$property]['set'])) { return ObjectMethodCallNode::create($object, $this->pluginDefinition['properties'][$property]['set'])->appendArgument(clone $assignment->getRightOperand()); } }
/** * {@inheritdoc} */ public function rewriteAsSetter(ExpressionNode $expr, $property, AssignNode $assignment) { /** @var \Pharborist\ArrayLookupNode $expr */ $object = clone $expr->getRootArray(); $keys = $expr->getKeys(); $value = clone $assignment->getRightOperand(); // $form_state['values']['baz'] = 'foo' --> $form_state->setValue(['baz'], 'foo') if ($property == 'values') { array_shift($keys); return ObjectMethodCallNode::create($object, 'setValue')->appendArgument(ArrayNode::create($keys))->appendArgument($value); } elseif (isset($this->pluginDefinition['properties'][$property]['set'])) { return parent::rewriteAsSetter($expr, $property, $assignment); } else { return ObjectMethodCallNode::create($object, 'set')->appendArgument(ArrayNode::create($keys))->appendArgument($value); } }
/** * @param ExpressionNode $else * * @return $this */ public function setElse(ExpressionNode $else) { /** @var \Pharborist\Node $else */ $this->condition->replaceWith($else); return $this; }
/** * Creates a new return statement. * * @param \Pharborist\ExpressionNode $expr * The expression to return. * * @return static */ public static function create(ExpressionNode $expr) { return Parser::parseSnippet('return ' . $expr->getText() . ';'); }
/** * @param ExpressionNode $operand * @return $this */ public function setOperand(ExpressionNode $operand) { /** @var \Pharborist\Node $operand */ $this->operand->replaceWith($operand); return $this; }