public function testCreate()
 {
     $expr = Parser::parseExpression('empty($foo)');
     $not = BooleanNotNode::fromExpression($expr);
     $this->assertInstanceOf('\\Pharborist\\Operators\\BooleanNotNode', $not);
     $this->assertSame($expr, $not->getOperand());
     $this->assertEquals('!empty($foo)', $not->getText());
 }
 /**
  * {@inheritdoc}
  */
 public function rewrite(ParameterNode $parameter)
 {
     // Don't even try to rewrite the function if the parameter is reassigned.
     if ($this->isReassigned($parameter)) {
         $error = $this->t('@function() cannot be parametrically rewritten because @parameter is reassigned.', ['@parameter' => $parameter->getName(), '@function' => $parameter->getFunction()->getName()->getText()]);
         throw new \LogicException($error);
     }
     foreach ($this->getExpressions($parameter)->not($this->isAssigned) as $expr) {
         $property = $this->getProperty($expr);
         if (empty($property)) {
             continue;
         }
         $getter = $this->rewriteAsGetter($expr, $property);
         if ($getter) {
             $empty = $expr->closest(Filter::isFunctionCall('empty', 'isset'));
             // If the original expression was wrapped by a call to isset() or
             // empty(), we need to replace it entirely.
             if ($getter instanceof CallNode && $empty instanceof CallNode) {
                 // If the isset() or empty() call was negated, reverse that logic.
                 $parent = $empty->parent();
                 if ($parent instanceof BooleanNotNode) {
                     $parent->replaceWith($getter);
                 } else {
                     $empty->replaceWith(BooleanNotNode::fromExpression($getter));
                 }
             } else {
                 $expr->replaceWith($getter);
             }
         }
     }
     foreach ($this->getExpressions($parameter)->filter($this->isAssigned) as $expr) {
         // If the property cannot be determined, don't even try to rewrite the
         // expression.
         $property = $this->getProperty($expr);
         if (empty($property)) {
             continue;
         }
         $assignment = $expr->closest(Filter::isInstanceOf('\\Pharborist\\Operators\\AssignNode'));
         $setter = $this->rewriteAsSetter($expr, $property, $assignment);
         if ($setter) {
             $assignment->replaceWith($setter);
         }
     }
     // Set the type hint, if one is defined.
     if (isset($this->pluginDefinition['type_hint'])) {
         $parameter->setTypeHint($this->pluginDefinition['type_hint']);
         // If the type hint extends FieldableEntityInterface, rewrite any field
         // lookups (e.g. $node->body[LANGUAGE_NONE][0]['value']).
         if (in_array('Drupal\\Core\\Entity\\FieldableEntityInterface', class_implements($this->pluginDefinition['type_hint']))) {
             $filter = new FieldValueFilter($parameter->getName());
             foreach ($parameter->getFunction()->find($filter) as $lookup) {
                 $lookup->replaceWith(self::rewriteFieldLookup($lookup));
             }
         }
     }
 }