/**
  * Prepares and returns used class lists.
  *
  * @return ReflectionClass[]
  */
 protected function parseClassLists()
 {
     $this->declared = array_flip(array_merge(get_declared_classes(), get_declared_interfaces()));
     foreach ($this->getNamespaces() as $namespace) {
         foreach ($namespace->getClasses() as $name => $ref) {
             $class = $this->reflectionFactory->createFromReflection($ref);
             $this->allClasses[self::TOKENIZED_CLASSES][$name] = $class;
             if (!$class->isDocumented()) {
                 continue;
             }
             $this->loadParentClassesAndInterfacesFromClassReflection($ref);
         }
     }
     /** @var ReflectionClass $class */
     foreach ($this->allClasses[self::TOKENIZED_CLASSES] as $class) {
         if (!$class->isDocumented()) {
             continue;
         }
         foreach ($class->getOwnMethods() as $method) {
             $this->processFunction($method);
         }
         foreach ($class->getOwnProperties() as $property) {
             $this->loadAnnotationFromReflection($class, $property->getAnnotations(), 'var');
         }
     }
     foreach ($this->getFunctions() as $function) {
         $this->processFunction($function);
     }
     array_walk_recursive($this->allClasses, function (&$reflection) {
         if (!$reflection instanceof ReflectionClass) {
             $reflection = $this->reflectionFactory->createFromReflection($reflection);
         }
     });
     return $this->allClasses;
 }
 /**
  * @param string $annotation
  * @param string $annotationName
  * @return ReflectionPropertyMagic[]|array
  */
 private function processMagicPropertyAnnotation($annotation, $annotationName)
 {
     if (!preg_match(self::PATTERN_PROPERTY, $annotation, $matches)) {
         return [];
     }
     list(, $typeHint, $name, $shortDescription) = $matches;
     $startLine = $this->getStartLine($annotation);
     $properties = [];
     $properties[$name] = $this->reflectionFactory->createPropertyMagic(['name' => $name, 'typeHint' => $typeHint, 'shortDescription' => str_replace("\n", ' ', $shortDescription), 'startLine' => $startLine, 'endLine' => $startLine + substr_count($annotation, "\n"), 'readOnly' => $annotationName === 'property-read', 'writeOnly' => $annotationName === 'property-write', 'declaringClass' => $this->reflectionClass]);
     return $properties;
 }
 /**
  * @param ReflectionMethodMagic $method
  * @param string $args
  */
 private function attachMethodParameters(ReflectionMethodMagic $method, $args)
 {
     $parameters = [];
     foreach (array_filter(preg_split('~\\s*,\\s*~', $args)) as $position => $arg) {
         if (!preg_match(self::PATTERN_PARAMETER, $arg, $matches)) {
             // Wrong annotation format
             continue;
         }
         list(, $typeHint, $passedByReference, $name, $defaultValueDefinition) = $matches;
         $parameters[$name] = $this->reflectionFactory->createParameterMagic(['name' => $name, 'position' => $position, 'typeHint' => $typeHint, 'defaultValueDefinition' => $defaultValueDefinition, 'unlimited' => FALSE, 'passedByReference' => $passedByReference === '&', 'declaringFunction' => $method]);
         $method->addAnnotation('param', ltrim(sprintf('%s $%s', $typeHint, $name)));
     }
     $method->setParameters($parameters);
 }