ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
ReplaceUtilSendMessageRector.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
23 use PhpParser\Node;
28 
29 final class ReplaceUtilSendMessageRector extends \Rector\Core\Rector\AbstractRector
30 {
31  protected \ILIAS\CI\Rector\DIC\DICMemberResolver $dic_member_resolver;
32  protected \Rector\Transform\NodeTypeAnalyzer\TypeProvidingExprFromClassResolver $type_resolver;
33  protected \Rector\Core\NodeManipulator\ClassDependencyManipulator $class_dependecied;
34  protected \Rector\PostRector\Collector\PropertyToAddCollector $poperty_adder;
35  protected \Rector\Core\NodeManipulator\ClassInsertManipulator $class_insert;
36  protected array $old_method_names = [
37  'sendInfo',
38  'sendSuccess',
39  'sendFailure',
40  'sendQuestion',
41  ];
42  protected string $new_method_name = 'setOnScreenMessage';
43 
44  public function __construct(
45  \ILIAS\CI\Rector\DIC\DICMemberResolver $dic_member_resolver,
46  \Rector\Transform\NodeTypeAnalyzer\TypeProvidingExprFromClassResolver $typre_resolver,
47  \Rector\Core\NodeManipulator\ClassDependencyManipulator $classDependencyManipulator,
48  \Rector\PostRector\Collector\PropertyToAddCollector $propertyToAddCollector,
49  \Rector\Core\NodeManipulator\ClassInsertManipulator $class_insert
50  ) {
51  $this->dic_member_resolver = $dic_member_resolver;
52  $this->type_resolver = $typre_resolver;
53  $this->class_dependecied = $classDependencyManipulator;
54  $this->poperty_adder = $propertyToAddCollector;
55  $this->class_insert = $class_insert;
56  }
57 
58  public function getNodeTypes(): array
59  {
60  return [\PhpParser\Node\Expr\StaticCall::class];
61  }
62 
63  private function isApplicable(Node $node): bool
64  {
66  if (!$node->class instanceof \PhpParser\Node\Name) {
67  return false;
68  }
69  $staticCallClassName = $node->class->toString();
70  if ($staticCallClassName !== \ilUtil::class) {
71  // not calling ilUtil
72  return false;
73  }
74  if (!$node->name instanceof \PhpParser\Node\Identifier) {
75  // node has no name
76  return false;
77  }
78  // not interested in method since not in list
79  return in_array($node->name->name, $this->old_method_names);
80  }
81 
85  public function refactor(Node $node)
86  {
87  if (!$this->isApplicable($node)) {
88  return null; // leave the node as it is
89  }
90  $class_where_call_happens = $this->betterNodeFinder->findParentType(
91  $node,
92  \PhpParser\Node\Stmt\Class_::class
93  );
94  if (!$class_where_call_happens instanceof \PhpParser\Node\Stmt\Class_) {
95  // not on class, abort
96  return null; // leave the node as it is
97  }
98  $method_where_call_happend = $this->betterNodeFinder->findParentType(
99  $node,
100  \PhpParser\Node\Stmt\ClassMethod::class
101  );
102  if (!$method_where_call_happend instanceof \PhpParser\Node\Stmt\ClassMethod) {
103  // not in a method, abort
104  return null; // leave the node as it is
105  }
106 
107  if ($method_where_call_happend->isStatic()) {
108 // return null;
109  }
110 
111  // prepend a new argument with the type of the message, aka sendInfo goes to setOnScreenMessage('info', ...
112  $message_type = strtolower(str_replace('send', '', $node->name->name));
113  $first_argument = $this->nodeFactory->createArg($message_type);
114  $arguments = $node->args;
115  array_unshift($arguments, $first_argument);
116 
117  // ensure a dic property for ilGlobalTemplate is in the class. or we get another Expr to fetch ilGlobalTemplate
118  try {
119  $dicPropertyFetch = $this->dic_member_resolver->ensureDICDependency(
121  $class_where_call_happens,
122  $method_where_call_happend
123  );
124  } catch (ShouldNotHappenException $e) {
125  throw new ShouldNotHappenException(
126  "Could not process " . $this->file->getFilePath() . ': ' . $e->getMessage()
127  );
128  echo "Could not process " . $this->file->getFilePath() . ': ' . $e->getMessage();
129  // there are places where the DIC dependency could not be added, we must skip thoses places
130  return null;
131  }
132 
133  // return new method call
134  $methodCall = new \PhpParser\Node\Expr\MethodCall(
135  $dicPropertyFetch,
136  $this->new_method_name,
137  $arguments
138  );
139  return $methodCall;
140  }
141 
142  public function getRuleDefinition(): \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
143  {
144  return new RuleDefinition('lorem', [
145  new CodeSample(
146  "\ilUtil::sendQuestion('my_text', true);",
147  "\$this->main_tpl->setOnScreenMessage('question', 'my_text', true)"
148  )
149  ]);
150  }
151 }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ChatMainBarProvider .
Rector Core NodeManipulator ClassDependencyManipulator $class_dependecied
__construct(\ILIAS\CI\Rector\DIC\DICMemberResolver $dic_member_resolver, \Rector\Transform\NodeTypeAnalyzer\TypeProvidingExprFromClassResolver $typre_resolver, \Rector\Core\NodeManipulator\ClassDependencyManipulator $classDependencyManipulator, \Rector\PostRector\Collector\PropertyToAddCollector $propertyToAddCollector, \Rector\Core\NodeManipulator\ClassInsertManipulator $class_insert)
Rector PostRector Collector PropertyToAddCollector $poperty_adder
Rector Transform NodeTypeAnalyzer TypeProvidingExprFromClassResolver $type_resolver
Rector Core NodeManipulator ClassInsertManipulator $class_insert