ILIAS  release_8 Revision v8.24
ReplaceUtilSendMessageRector.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
23use PhpParser\Node;
24use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
25use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
27use Rector\Core\Exception\ShouldNotHappenException;
28
29final 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}
Rector Core NodeManipulator ClassInsertManipulator $class_insert
Rector Transform NodeTypeAnalyzer TypeProvidingExprFromClassResolver $type_resolver
Rector PostRector Collector PropertyToAddCollector $poperty_adder
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)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ChatMainBarProvider \MainMenu\Provider.