ClassGenerator.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Code\Generator;
  7. use Zend\Code\Generator\MethodGenerator;
  8. use Zend\Code\Generator\PropertyGenerator;
  9. class ClassGenerator extends \Zend\Code\Generator\ClassGenerator implements
  10. \Magento\Framework\Code\Generator\CodeGeneratorInterface
  11. {
  12. /**
  13. * Possible doc block options
  14. *
  15. * @var array
  16. */
  17. protected $_docBlockOptions = [
  18. 'shortDescription' => 'setShortDescription',
  19. 'longDescription' => 'setLongDescription',
  20. 'tags' => 'setTags',
  21. ];
  22. /**
  23. * Possible class property options
  24. *
  25. * @var array
  26. */
  27. protected $_propertyOptions = [
  28. 'name' => 'setName',
  29. 'const' => 'setConst',
  30. 'static' => 'setStatic',
  31. 'visibility' => 'setVisibility',
  32. 'defaultValue' => 'setDefaultValue',
  33. ];
  34. /**
  35. * Possible class method options
  36. *
  37. * @var array
  38. */
  39. protected $_methodOptions = [
  40. 'name' => 'setName',
  41. 'final' => 'setFinal',
  42. 'static' => 'setStatic',
  43. 'abstract' => 'setAbstract',
  44. 'visibility' => 'setVisibility',
  45. 'body' => 'setBody',
  46. 'returntype' => 'setReturnType'
  47. ];
  48. /**
  49. * Possible method parameter options
  50. *
  51. * @var array
  52. */
  53. protected $_parameterOptions = [
  54. 'name' => 'setName',
  55. 'type' => 'setType',
  56. 'defaultValue' => 'setDefaultValue',
  57. 'passedByReference' => 'setPassedByReference',
  58. 'variadic' => 'setVariadic',
  59. ];
  60. /**
  61. * @param object $object
  62. * @param array $data
  63. * @param array $map
  64. * @return void
  65. */
  66. protected function _setDataToObject($object, array $data, array $map)
  67. {
  68. foreach ($map as $arrayKey => $setterName) {
  69. if (isset($data[$arrayKey])) {
  70. $object->{$setterName}($data[$arrayKey]);
  71. }
  72. }
  73. }
  74. /**
  75. * Set class dock block
  76. *
  77. * @param array $docBlock
  78. * @return $this
  79. */
  80. public function setClassDocBlock(array $docBlock)
  81. {
  82. $docBlockObject = new \Zend\Code\Generator\DocBlockGenerator();
  83. $docBlockObject->setWordWrap(false);
  84. $this->_setDataToObject($docBlockObject, $docBlock, $this->_docBlockOptions);
  85. return parent::setDocBlock($docBlockObject);
  86. }
  87. /**
  88. * addMethods()
  89. *
  90. * @param array $methods
  91. * @return $this
  92. */
  93. public function addMethods(array $methods)
  94. {
  95. foreach ($methods as $methodOptions) {
  96. $methodObject = $this->createMethodGenerator();
  97. $this->_setDataToObject($methodObject, $methodOptions, $this->_methodOptions);
  98. if (isset(
  99. $methodOptions['parameters']
  100. ) && is_array(
  101. $methodOptions['parameters']
  102. ) && count(
  103. $methodOptions['parameters']
  104. ) > 0
  105. ) {
  106. $parametersArray = [];
  107. foreach ($methodOptions['parameters'] as $parameterOptions) {
  108. $parameterObject = new \Zend\Code\Generator\ParameterGenerator();
  109. $this->_setDataToObject($parameterObject, $parameterOptions, $this->_parameterOptions);
  110. $parametersArray[] = $parameterObject;
  111. }
  112. $methodObject->setParameters($parametersArray);
  113. }
  114. if (isset($methodOptions['docblock']) && is_array($methodOptions['docblock'])) {
  115. $docBlockObject = new \Zend\Code\Generator\DocBlockGenerator();
  116. $docBlockObject->setWordWrap(false);
  117. $this->_setDataToObject($docBlockObject, $methodOptions['docblock'], $this->_docBlockOptions);
  118. $methodObject->setDocBlock($docBlockObject);
  119. }
  120. if (!empty($methodOptions['returnType'])) {
  121. $methodObject->setReturnType($methodOptions['returnType']);
  122. }
  123. $this->addMethodFromGenerator($methodObject);
  124. }
  125. return $this;
  126. }
  127. /**
  128. * Add method from MethodGenerator
  129. *
  130. * @param MethodGenerator $method
  131. * @return $this
  132. * @throws \InvalidArgumentException
  133. */
  134. public function addMethodFromGenerator(MethodGenerator $method)
  135. {
  136. if (!is_string($method->getName())) {
  137. throw new \InvalidArgumentException('addMethodFromGenerator() expects string for name');
  138. }
  139. return parent::addMethodFromGenerator($method);
  140. }
  141. /**
  142. * addProperties()
  143. *
  144. * @param array $properties
  145. * @return $this
  146. * @throws \InvalidArgumentException
  147. */
  148. public function addProperties(array $properties)
  149. {
  150. foreach ($properties as $propertyOptions) {
  151. $propertyObject = new PropertyGenerator();
  152. $this->_setDataToObject($propertyObject, $propertyOptions, $this->_propertyOptions);
  153. if (isset($propertyOptions['docblock'])) {
  154. $docBlock = $propertyOptions['docblock'];
  155. if (is_array($docBlock)) {
  156. $docBlockObject = new \Zend\Code\Generator\DocBlockGenerator();
  157. $docBlockObject->setWordWrap(false);
  158. $this->_setDataToObject($docBlockObject, $docBlock, $this->_docBlockOptions);
  159. $propertyObject->setDocBlock($docBlockObject);
  160. }
  161. }
  162. $this->addPropertyFromGenerator($propertyObject);
  163. }
  164. return $this;
  165. }
  166. /**
  167. * Add property from PropertyGenerator
  168. *
  169. * @param PropertyGenerator $property
  170. * @return $this
  171. * @throws \InvalidArgumentException
  172. */
  173. public function addPropertyFromGenerator(PropertyGenerator $property)
  174. {
  175. if (!is_string($property->getName())) {
  176. throw new \InvalidArgumentException('addPropertyFromGenerator() expects string for name');
  177. }
  178. return parent::addPropertyFromGenerator($property);
  179. }
  180. /**
  181. * Instantiate method generator object.
  182. *
  183. * @return MethodGenerator
  184. */
  185. protected function createMethodGenerator()
  186. {
  187. return new MethodGenerator();
  188. }
  189. /**
  190. * @return string|null
  191. */
  192. public function getNamespaceName()
  193. {
  194. return ltrim(parent::getNamespaceName(), '\\') ?: null;
  195. }
  196. }