AssociationTableMixinClassReflectionExtension.php 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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)
  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. if (!$classReflection->isSubclassOf(Association::class)) {
  41. return false;
  42. }
  43. return $this->getTableReflection()->hasMethod($methodName);
  44. }
  45. /**
  46. * @param ClassReflection $classReflection Class reflection
  47. * @param string $methodName Method name
  48. * @return MethodReflection
  49. */
  50. public function getMethod(ClassReflection $classReflection, string $methodName): MethodReflection
  51. {
  52. return $this->getTableReflection()->getNativeMethod($methodName);
  53. }
  54. /**
  55. * @param ClassReflection $classReflection Class reflection
  56. * @param string $propertyName Method name
  57. * @return bool
  58. */
  59. public function hasProperty(ClassReflection $classReflection, string $propertyName): bool
  60. {
  61. if (!$classReflection->isSubclassOf(Association::class)) {
  62. return false;
  63. }
  64. return $this->getTableReflection()->hasProperty($propertyName);
  65. }
  66. /**
  67. * @param ClassReflection $classReflection Class reflection
  68. * @param string $propertyName Method name
  69. * @return PropertyReflection
  70. */
  71. public function getProperty(ClassReflection $classReflection, string $propertyName): PropertyReflection
  72. {
  73. return $this->getTableReflection()->getNativeProperty($propertyName);
  74. }
  75. }