public function extractTypes(\ReflectionProperty $reflectionProperty)
 {
     $className = $reflectionProperty->getDeclaringClass()->getName();
     try {
         $metadata = $this->classMetadataFactory->getMetadataFor($className);
     } catch (MappingException $exception) {
         return;
     }
     $type = new Type();
     $propertyName = $reflectionProperty->getName();
     if ($metadata->hasAssociation($propertyName)) {
         $class = $metadata->getAssociationTargetClass($propertyName);
         if ($metadata->isSingleValuedAssociation($propertyName)) {
             $type->setCollection(false);
             $type->setType('object');
             $type->setClass($class);
         } else {
             $type->setCollection(true);
             $type->setType('object');
             $type->setClass('Doctrine\\Common\\Collections\\Collection');
             $collectionType = new Type();
             $collectionType->setCollection(false);
             $collectionType->setType('object');
             $collectionType->setClass($class);
             $type->setCollectionType($collectionType);
         }
         return [$type];
     }
     if ($metadata->hasField($propertyName)) {
         $typeOfField = $metadata->getTypeOfField($propertyName);
         switch ($typeOfField) {
             case 'date':
                 // No break
             // No break
             case 'datetime':
                 // No break
             // No break
             case 'datetimetz':
                 // No break
             // No break
             case 'time':
                 $type->setType('object');
                 $type->setClass('DateTime');
                 $type->setCollection(false);
                 return [$type];
             case 'array':
                 // No break
             // No break
             case 'simple_array':
                 // No break
             // No break
             case 'json_array':
                 $type->setType('array');
                 $type->setCollection(true);
                 return [$type];
             default:
                 $type->setType($this->getPhpType($typeOfField));
                 $type->setCollection(false);
                 return [$type];
         }
     }
 }
 /**
  * Creates a {@see Type} from a PHPDoc type.
  *
  * @param string $docType
  *
  * @return Type|null
  */
 private function createType($docType)
 {
     // Cannot guess
     if (!$docType || 'mixed' === $docType) {
         return;
     }
     if ($collection = '[]' === substr($docType, -2)) {
         $docType = substr($docType, 0, -2);
     }
     $array = 'array' === $docType;
     $type = new Type();
     if ($collection || $array) {
         $type->setCollection(true);
         $type->setType('array');
         if (!$array && 'mixed' !== $docType) {
             $docType = $this->normalizeType($docType);
             $collectionType = new Type();
             $collectionType->setCollection(false);
             $this->populateType($collectionType, $docType);
             $type->setCollectionType($collectionType);
         }
         return $type;
     }
     $docType = $this->normalizeType($docType);
     $type->setCollection(false);
     $this->populateType($type, $docType);
     return $type;
 }