Generic.php in Drupal 7 to 8/9 Module Upgrader 8
File
src/Plugin/DMU/Rewriter/Generic.php
View source
<?php
namespace Drupal\drupalmoduleupgrader\Plugin\DMU\Rewriter;
use Drupal\Core\StringTranslation\TranslationInterface;
use Drupal\drupalmoduleupgrader\PluginBase;
use Drupal\drupalmoduleupgrader\RewriterInterface;
use Drupal\drupalmoduleupgrader\Utility\Filter\FieldValueFilter;
use Drupal\drupalmoduleupgrader\Utility\Filter\NodeAssignmentFilter;
use Pharborist\ArrayLookupNode;
use Pharborist\Constants\ConstantNode;
use Pharborist\ExpressionNode;
use Pharborist\Filter;
use Pharborist\Functions\CallNode;
use Pharborist\Functions\ParameterNode;
use Pharborist\Node;
use Pharborist\NodeCollection;
use Pharborist\Objects\ClassConstantLookupNode;
use Pharborist\Objects\ObjectMethodCallNode;
use Pharborist\Objects\ObjectPropertyNode;
use Pharborist\Operators\AssignNode;
use Pharborist\Operators\BooleanNotNode;
use Pharborist\Parser;
use Pharborist\Types\StringNode;
use Pharborist\Variables\VariableNode;
use Psr\Log\LoggerInterface;
class Generic extends PluginBase implements RewriterInterface {
protected $isAssigned;
public function __construct(array $configuration, $plugin_id, $plugin_definition, TranslationInterface $translator, LoggerInterface $log) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $translator, $log);
$this->isAssigned = new NodeAssignmentFilter();
}
public function rewrite(ParameterNode $parameter) {
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 ($getter instanceof CallNode && $empty instanceof CallNode) {
$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) {
$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);
}
}
if (isset($this->pluginDefinition['type_hint'])) {
$parameter
->setTypeHint($this->pluginDefinition['type_hint']);
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));
}
}
}
}
protected function getExpressions(ParameterNode $parameter) {
$filter = Filter::isInstanceOf('\\Pharborist\\ArrayLookupNode', '\\Pharborist\\Objects\\ObjectPropertyNode');
$expressions = new NodeCollection();
$parameter
->getFunction()
->find(Filter::isInstanceOf('\\Pharborist\\Variables\\VariableNode'))
->filter(function (VariableNode $variable) use ($parameter) {
return $variable
->getName() == $parameter
->getName();
})
->each(function (VariableNode $variable) use ($filter, $expressions) {
$root = $variable
->furthest($filter);
if ($root) {
$expressions
->add($root);
}
});
return $expressions;
}
protected function getProperty(ExpressionNode $expr) {
if ($expr instanceof ObjectPropertyNode) {
return $expr
->getPropertyName();
}
elseif ($expr instanceof ArrayLookupNode) {
$key = $expr
->getKey(0);
if ($key instanceof StringNode) {
return $key
->toValue();
}
}
}
public function rewriteAsGetter(ExpressionNode $expr, $property) {
if ($expr instanceof ObjectPropertyNode) {
$object = clone $expr
->getObject();
}
elseif ($expr instanceof ArrayLookupNode) {
$object = clone $expr
->getRootArray();
}
if (isset($object) && isset($this->pluginDefinition['properties'][$property]['get'])) {
return ObjectMethodCallNode::create($object, $this->pluginDefinition['properties'][$property]['get']);
}
}
public function rewriteAsSetter(ExpressionNode $expr, $property, AssignNode $assignment) {
if ($expr instanceof ObjectPropertyNode) {
$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());
}
}
protected function isReassigned(ParameterNode $parameter) {
return (bool) $parameter
->getFunction()
->find(Filter::isInstanceOf('\\Pharborist\\Variables\\VariableNode'))
->filter(function (VariableNode $variable) use ($parameter) {
return $variable
->getName() == $parameter
->getName();
})
->filter($this->isAssigned)
->count();
}
public static function rewriteFieldLookup(ArrayLookupNode $node) {
$keys = $node
->getKeys();
$root = $node
->getRootArray();
$expr = $root
->getObject()
->getText();
if (self::isTranslation($keys[0])) {
$expr .= '->getTranslation(' . $keys[0] . ')';
}
$expr .= '->' . $root
->getPropertyName() . '[' . $keys[1] . ']';
foreach (array_slice($keys, 2) as $column) {
$expr .= '->';
$expr .= $column instanceof StringNode ? $column
->toValue() : $column
->getText();
}
return Parser::parseExpression($expr);
}
public static function isTranslation(Node $key) {
if ($key instanceof ClassConstantLookupNode) {
$constant = $key
->getClassName() . '::' . $key
->getConstantName();
return $constant != '\\Drupal\\Core\\Language\\Language::LANGCODE_NOT_SPECIFIED';
}
elseif ($key instanceof ConstantNode) {
return $key
->getConstantName() != 'LANGUAGE_NONE';
}
elseif ($key instanceof StringNode) {
return $key
->toValue() != 'und';
}
else {
return TRUE;
}
}
}
Classes
Name |
Description |
Generic |
Plugin annotation
@Rewriter(
id = "_rewriter",
deriver = "\Drupal\drupalmoduleupgrader\Plugin\DMU\Rewriter\GenericDeriver"
) |