public function testRewriteFieldLookup()
 {
     /** @var \Pharborist\ArrayLookupNode $lookup */
     $lookup = Parser::parseExpression('$node->field_foo[LANGUAGE_NONE][0]["value"]');
     $rewritten = GenericRewriter::rewriteFieldLookup($lookup);
     $this->assertInstanceOf('\\Pharborist\\Objects\\ObjectPropertyNode', $rewritten);
     $this->assertEquals('$node->field_foo[0]->value', $rewritten->getText());
     $lookup = Parser::parseExpression('$node->field_foo[\\Drupal\\Core\\Language\\Language::LANGCODE_NOT_SPECIFIED][0]["value"]');
     $rewritten = GenericRewriter::rewriteFieldLookup($lookup);
     $this->assertInstanceOf('\\Pharborist\\Objects\\ObjectPropertyNode', $rewritten);
     $this->assertEquals('$node->field_foo[0]->value', $rewritten->getText());
     $lookup = Parser::parseExpression('$node->field_foo["und"][0]["value"]');
     $rewritten = GenericRewriter::rewriteFieldLookup($lookup);
     $this->assertInstanceOf('\\Pharborist\\Objects\\ObjectPropertyNode', $rewritten);
     $this->assertEquals('$node->field_foo[0]->value', $rewritten->getText());
     $lookup = Parser::parseExpression('$node->field_foo["en"][0]["value"]');
     $rewritten = GenericRewriter::rewriteFieldLookup($lookup);
     $this->assertInstanceOf('\\Pharborist\\Objects\\ObjectPropertyNode', $rewritten);
     $this->assertEquals('$node->getTranslation("en")->field_foo[0]->value', $rewritten->getText());
     $lookup = Parser::parseExpression('$node->field_foo["und"][2]["wambooli"]');
     $rewritten = GenericRewriter::rewriteFieldLookup($lookup);
     $this->assertInstanceOf('\\Pharborist\\Objects\\ObjectPropertyNode', $rewritten);
     $this->assertEquals('$node->field_foo[2]->wambooli', $rewritten->getText());
 }
 /**
  * {@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);
     }
 }