AssociationTableMixinClassReflectionExtension.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <?php declare(strict_types = 1);
  2. namespace Cake\PHPStan;
  3. use Cake\ORM\Association;
  4. use Cake\ORM\Table;
  5. use PHPStan\Broker\Broker;
  6. use PHPStan\Reflection\BrokerAwareClassReflectionExtension;
  7. use PHPStan\Reflection\ClassReflection;
  8. use PHPStan\Reflection\MethodReflection;
  9. use PHPStan\Reflection\MethodsClassReflectionExtension;
  10. use PHPStan\Reflection\PropertiesClassReflectionExtension;
  11. use PHPStan\Reflection\PropertyReflection;
  12. class AssociationTableMixinClassReflectionExtension implements PropertiesClassReflectionExtension, MethodsClassReflectionExtension, BrokerAwareClassReflectionExtension
  13. {
  14. /**
  15. * @var \PHPStan\Broker\Broker
  16. */
  17. private $broker;
  18. /**
  19. * @param Broker $broker Class reflection broker
  20. * @return void
  21. */
  22. public function setBroker(Broker $broker): void
  23. {
  24. $this->broker = $broker;
  25. }
  26. /**
  27. * @return ClassReflection
  28. */
  29. protected function getTableReflection(): ClassReflection
  30. {
  31. return $this->broker->getClass(Table::class);
  32. }
  33. /**
  34. * @param ClassReflection $classReflection Class reflection
  35. * @param string $methodName Method name
  36. * @return bool
  37. */
  38. public function hasMethod(ClassReflection $classReflection, string $methodName): bool
  39. {
  40. // magic findBy* method
  41. if ($classReflection->isSubclassOf(Table::class) && preg_match('/^find(?:\w+)?By/', $methodName) > 0) {
  42. return true;
  43. }
  44. if (!$classReflection->isSubclassOf(Association::class)) {
  45. return false;
  46. }
  47. return $this->getTableReflection()->hasMethod($methodName);
  48. }
  49. /**
  50. * @param ClassReflection $classReflection Class reflection
  51. * @param string $methodName Method name
  52. * @return MethodReflection
  53. */
  54. public function getMethod(ClassReflection $classReflection, string $methodName): MethodReflection
  55. {
  56. // magic findBy* method
  57. if ($classReflection->isSubclassOf(Table::class) && preg_match('/^find(?:\w+)?By/', $methodName) > 0) {
  58. return new TableFindByPropertyMethodReflection($methodName, $classReflection);
  59. }
  60. return $this->getTableReflection()->getNativeMethod($methodName);
  61. }
  62. /**
  63. * @param ClassReflection $classReflection Class reflection
  64. * @param string $propertyName Method name
  65. * @return bool
  66. */
  67. public function hasProperty(ClassReflection $classReflection, string $propertyName): bool
  68. {
  69. if (!$classReflection->isSubclassOf(Association::class)) {
  70. return false;
  71. }
  72. return $this->getTableReflection()->hasProperty($propertyName);
  73. }
  74. /**
  75. * @param ClassReflection $classReflection Class reflection
  76. * @param string $propertyName Method name
  77. * @return PropertyReflection
  78. */
  79. public function getProperty(ClassReflection $classReflection, string $propertyName): PropertyReflection
  80. {
  81. return $this->getTableReflection()->getNativeProperty($propertyName);
  82. }
  83. }