/** * 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); }