ILIAS  trunk Revision v11.0_alpha-1744-gb0451eebef4
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule Class Reference
+ Inheritance diagram for ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule:
+ Collaboration diagram for ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule:

Public Member Functions

 __construct (ReflectionProvider $reflectionProvider, \PHPStan\Rules\Generics\GenericAncestorsCheck $genericAncestorsCheck)
 
 getNodeType ()
 
 processNode (Node $node, Scope $scope)
 

Protected Member Functions

 findInstanceCreation ()
 
 findMethodUsages ()
 
 getForbiddenClasses ()
 
 getHumanReadableRuleName ()
 
 getRelevantILIASVersion ()
 

Protected Attributes

ReflectionProvider $reflectionProvider
 
PHPStan Rules Generics GenericAncestorsCheck $genericAncestorsCheck
 

Private Member Functions

 getClassAncestors (string $class_name)
 
 cacheAncestors ($class_name, array $ancestor_classes)
 
 instantiatesForbiddenClasses (Node $node)
 
 usesMethodsOfForbiddenClass (Node $node, Scope $scope)
 

Private Attributes

array $forbidden_classes = []
 
array $ancestor_cache = []
 

Detailed Description

Definition at line 28 of file LegacyClassUsageRule.php.

Constructor & Destructor Documentation

◆ __construct()

ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::__construct ( ReflectionProvider  $reflectionProvider,
\PHPStan\Rules\Generics\GenericAncestorsCheck  $genericAncestorsCheck 
)

Definition at line 35 of file LegacyClassUsageRule.php.

References ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\$genericAncestorsCheck, ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\$reflectionProvider, ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\cacheAncestors(), ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\getClassAncestors(), and ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\getForbiddenClasses().

38  {
39  $this->reflectionProvider = $reflectionProvider;
40  $this->genericAncestorsCheck = $genericAncestorsCheck;
41 
42  // Determine possible class-names (parents and children) of the forbidden classes
43  $forbidden_classes = [];
44 
45  foreach ($this->getForbiddenClasses() as $forbidden_class) {
46  $ancestors = $this->getClassAncestors($forbidden_class);
47  $this->cacheAncestors($forbidden_class, $ancestors);
48  $forbidden_classes = array_merge(
50  $ancestors
51  );
52  }
53 
54  $this->forbidden_classes = array_unique($forbidden_classes);
55  }
cacheAncestors($class_name, array $ancestor_classes)
PHPStan Rules Generics GenericAncestorsCheck $genericAncestorsCheck
+ Here is the call graph for this function:

Member Function Documentation

◆ cacheAncestors()

ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::cacheAncestors (   $class_name,
array  $ancestor_classes 
)
private

Definition at line 76 of file LegacyClassUsageRule.php.

Referenced by ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\__construct(), and ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\instantiatesForbiddenClasses().

76  : void
77  {
78  $this->ancestor_cache[$class_name] = $ancestor_classes;
79  }
+ Here is the caller graph for this function:

◆ findInstanceCreation()

ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::findInstanceCreation ( )
protected

Definition at line 86 of file LegacyClassUsageRule.php.

Referenced by ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\processNode().

86  : bool
87  {
88  return true;
89  }
+ Here is the caller graph for this function:

◆ findMethodUsages()

ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::findMethodUsages ( )
protected

◆ getClassAncestors()

ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::getClassAncestors ( string  $class_name)
private

Definition at line 57 of file LegacyClassUsageRule.php.

References Vendor\Package\$e.

Referenced by ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\__construct(), and ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\instantiatesForbiddenClasses().

57  : array
58  {
59  if (isset($this->ancestor_cache[$class_name])) {
60  return $this->ancestor_cache[$class_name];
61  }
62 
63  $ancestors[] = $class_name;
64 
65  try {
66  $reflection = $this->reflectionProvider->getClass($class_name);
67  $ancestors = array_merge($ancestors, $reflection->getParentClassesNames());
68  } catch (\PHPStan\Broker\ClassNotFoundException $e) {
69  // Do nothing
70  } finally {
71  unset($reflection);
72  }
73  return array_unique($ancestors);
74  }
+ Here is the caller graph for this function:

◆ getForbiddenClasses()

ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::getForbiddenClasses ( )
abstractprotected

◆ getHumanReadableRuleName()

ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::getHumanReadableRuleName ( )
abstractprotected

◆ getNodeType()

ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::getNodeType ( )

Definition at line 81 of file LegacyClassUsageRule.php.

81  : string
82  {
83  return CallLike::class;
84  }

◆ getRelevantILIASVersion()

ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::getRelevantILIASVersion ( )
abstractprotected

◆ instantiatesForbiddenClasses()

ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::instantiatesForbiddenClasses ( Node  $node)
private

Definition at line 102 of file LegacyClassUsageRule.php.

References ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\cacheAncestors(), and ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\getClassAncestors().

Referenced by ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\processNode().

102  : bool
103  {
104  if ($node->class instanceof Node\Name) {
105  $class_name = $node->class->toString();
106  } else {
107  return false;
108  }
109  $class_names_to_test = $this->getClassAncestors($class_name);
110 
111  $array_intersect = array_intersect($class_names_to_test, $this->forbidden_classes);
112  if ($array_intersect !== []) {
113  $this->cacheAncestors($class_name, $class_names_to_test);
114  return true;
115  }
116  return false;
117  }
cacheAncestors($class_name, array $ancestor_classes)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ processNode()

ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::processNode ( Node  $node,
Scope  $scope 
)
final

Definition at line 131 of file LegacyClassUsageRule.php.

References ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\findInstanceCreation(), ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\findMethodUsages(), ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\getHumanReadableRuleName(), ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\getRelevantILIASVersion(), ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\instantiatesForbiddenClasses(), and ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\usesMethodsOfForbiddenClass().

131  : array
132  {
133  // Find new Instance Creation or Static Method Calls
134  if ($this->findInstanceCreation()
135  && ($node instanceof Node\Expr\StaticCall || $node instanceof Node\Expr\New_)
136  && $this->instantiatesForbiddenClasses($node)
137  ) {
138  $class_name = $node->class->toString();
139  return [
140  RuleErrorBuilder::message("Usage of $class_name is forbidden.")
141  ->metadata([
142  'rule' => $this->getHumanReadableRuleName(),
143  'version' => $this->getRelevantILIASVersion(),
144  ])
145  ->build()
146  ];
147  }
148 
149  // Find Method Calls to forbidden classes
150  if ($node instanceof Node\Expr\MethodCall
151  && $this->findMethodUsages()
152  && $this->usesMethodsOfForbiddenClass($node, $scope)
153  ) {
154  $method_name = $node->name->name;
155  $class_name = $scope->getType($node->var)->getObjectClassNames()[0];
156  return [
157  RuleErrorBuilder::message("Usage of $class_name::$method_name is forbidden.")
158  ->metadata([
159  'rule' => $this->getHumanReadableRuleName(),
160  'version' => $this->getRelevantILIASVersion(),
161  ])
162  ->build()
163  ];
164  }
165 
166  return [];
167  }
$scope
Definition: ltiregstart.php:47
+ Here is the call graph for this function:

◆ usesMethodsOfForbiddenClass()

ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::usesMethodsOfForbiddenClass ( Node  $node,
Scope  $scope 
)
private

Definition at line 119 of file LegacyClassUsageRule.php.

References ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\getForbiddenClasses().

Referenced by ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule\processNode().

119  : bool
120  {
121  if (!$node->name instanceof Node\Identifier) {
122  return false;
123  }
124  $method_name = $node->name->name;
125  $called_classes = $scope->getType($node->var)->getObjectClassNames();
127 
128  return array_intersect($called_classes, $forbidden_classes) !== [];
129  }
$scope
Definition: ltiregstart.php:47
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Field Documentation

◆ $ancestor_cache

array ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::$ancestor_cache = []
private

Definition at line 33 of file LegacyClassUsageRule.php.

◆ $forbidden_classes

array ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::$forbidden_classes = []
private

Definition at line 32 of file LegacyClassUsageRule.php.

◆ $genericAncestorsCheck

PHPStan Rules Generics GenericAncestorsCheck ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::$genericAncestorsCheck
protected

◆ $reflectionProvider

ReflectionProvider ILIAS\Scripts\PHPStan\Rules\LegacyClassUsageRule::$reflectionProvider
protected

The documentation for this class was generated from the following file: