예제 #1
0
 public function getDeclaringClass()
 {
     if (!empty($this->declaringClass)) {
         return $this->declaringClass;
     }
     return parent::getDeclaringClass();
 }
예제 #2
0
 /**
  * @param  MethodReflection $reflectionMethod
  * @return MethodGenerator
  */
 public static function fromReflection(MethodReflection $reflectionMethod)
 {
     $method = new static();
     $declaringClass = $reflectionMethod->getDeclaringClass();
     $method->setSourceContent($reflectionMethod->getContents(false));
     $method->setSourceDirty(false);
     $method->setReturnType(self::extractReturnTypeFromMethodReflection($reflectionMethod));
     if ($reflectionMethod->getDocComment() != '') {
         $method->setDocBlock(DocBlockGenerator::fromReflection($reflectionMethod->getDocBlock()));
     }
     $method->setFinal($reflectionMethod->isFinal());
     if ($reflectionMethod->isPrivate()) {
         $method->setVisibility(self::VISIBILITY_PRIVATE);
     } elseif ($reflectionMethod->isProtected()) {
         $method->setVisibility(self::VISIBILITY_PROTECTED);
     } else {
         $method->setVisibility(self::VISIBILITY_PUBLIC);
     }
     $method->setInterface($declaringClass->isInterface());
     $method->setStatic($reflectionMethod->isStatic());
     $method->setReturnsReference($reflectionMethod->returnsReference());
     $method->setName($reflectionMethod->getName());
     foreach ($reflectionMethod->getParameters() as $reflectionParameter) {
         $method->setParameter(ParameterGenerator::fromReflection($reflectionParameter));
     }
     $method->setBody(static::clearBodyIndention($reflectionMethod->getBody()));
     return $method;
 }
예제 #3
0
 /**
  * Get import statements and aliases from the class containing this method
  *
  * @return string[]
  */
 protected function getUses()
 {
     if (null !== $this->uses) {
         return $this->uses;
     }
     $rClass = $this->reflection->getDeclaringClass();
     $rFile = $rClass->getDeclaringFile();
     $this->uses = $rFile->getUses();
     return $this->uses;
 }
예제 #4
0
 /**
  * Retrieve method full documentation description.
  *
  * @param \Zend\Code\Reflection\MethodReflection $method
  * @return string
  */
 protected function extractMethodDescription(\Zend\Code\Reflection\MethodReflection $method)
 {
     $methodReflection = new MethodReflection($method->getDeclaringClass()->getName(), $method->getName());
     $docBlock = $methodReflection->getDocBlock();
     if (!$docBlock) {
         throw new \LogicException('The docBlock of the method ' . $method->getDeclaringClass()->getName() . '::' . $method->getName() . ' is empty.');
     }
     return $this->_typeProcessor->getDescription($docBlock);
 }
예제 #5
0
 public function testDeclaringClassReturn()
 {
     $method = new MethodReflection('ZendTest\\Code\\Reflection\\TestAsset\\TestSampleClass2', 'getProp1');
     $this->assertInstanceOf('Zend\\Code\\Reflection\\ClassReflection', $method->getDeclaringClass());
 }
예제 #6
0
 /**
  * Identify getter return type by its reflection.
  *
  * @param \Zend\Code\Reflection\MethodReflection $methodReflection
  * @return array <pre>array(
  *     'type' => <string>$type,
  *     'isRequired' => $isRequired,
  *     'description' => $description
  * )</pre>
  * @throws \InvalidArgumentException
  */
 public function getGetterReturnType($methodReflection)
 {
     $methodDocBlock = $methodReflection->getDocBlock();
     if (!$methodDocBlock) {
         throw new \InvalidArgumentException("Each getter must have description with @return annotation. " . "See {$methodReflection->getDeclaringClass()->getName()}::{$methodReflection->getName()}()");
     }
     $returnAnnotations = $methodDocBlock->getTags('return');
     if (empty($returnAnnotations)) {
         throw new \InvalidArgumentException("Getter return type must be specified using @return annotation. " . "See {$methodReflection->getDeclaringClass()->getName()}::{$methodReflection->getName()}()");
     }
     /** @var \Zend\Code\Reflection\DocBlock\Tag\ReturnTag $returnAnnotation */
     $returnAnnotation = current($returnAnnotations);
     $returnType = $returnAnnotation->getType();
     /*
      * Adding this code as a workaround since \Zend\Code\Reflection\DocBlock\Tag\ReturnTag::initialize does not
      * detect and return correct type for array of objects in annotation.
      * eg @return \Magento\Webapi\Service\Entity\SimpleData[] is returned with type
      * \Magento\Webapi\Service\Entity\SimpleData instead of \Magento\Webapi\Service\Entity\SimpleData[]
      */
     $escapedReturnType = str_replace('[]', '\\[\\]', $returnType);
     $escapedReturnType = str_replace('\\', '\\\\', $escapedReturnType);
     if (preg_match("/.*\\@return\\s+({$escapedReturnType}).*/i", $methodDocBlock->getContents(), $matches)) {
         $returnType = $matches[1];
     }
     $isRequired = preg_match("/.*\\@return\\s+\\S+\\|null.*/i", $methodDocBlock->getContents(), $matches) ? false : true;
     return ['type' => $returnType, 'isRequired' => $isRequired, 'description' => $returnAnnotation->getDescription(), 'parameterCount' => $methodReflection->getNumberOfRequiredParameters()];
 }