/** * Generate classes, interfaces, traits, exceptions, constants and functions files. * * @param Template $template Template * @return \ApiGen\Generator * @throws \RuntimeException If template is not set. */ private function generateElements(Template $template) { if (!empty($this->classes) || !empty($this->interfaces) || !empty($this->traits) || !empty($this->exceptions)) { $this->prepareTemplate('class'); } if (!empty($this->constants)) { $this->prepareTemplate('constant'); } if (!empty($this->functions)) { $this->prepareTemplate('function'); } if ($this->config->sourceCode) { $this->prepareTemplate('source'); } // Add @usedby annotation foreach ($this->getElementTypes() as $type) { foreach ($this->{$type} as $parentElement) { $elements = array($parentElement); if ($parentElement instanceof Reflection\ReflectionClass) { $elements = array_merge($elements, array_values($parentElement->getOwnMethods()), array_values($parentElement->getOwnConstants()), array_values($parentElement->getOwnProperties())); } foreach ($elements as $element) { $uses = $element->getAnnotation('uses'); if (null === $uses) { continue; } foreach ($uses as $value) { list($link, $description) = preg_split('~\\s+|$~', $value, 2); $resolved = $this->resolveElement($link, $element); if (null !== $resolved) { $resolved->addAnnotation('usedby', $element->getPrettyName() . ' ' . $description); } } } } } $template->package = null; $template->namespace = null; $template->classes = $this->classes; $template->interfaces = $this->interfaces; $template->traits = $this->traits; $template->exceptions = $this->exceptions; $template->constants = $this->constants; $template->functions = $this->functions; foreach ($this->getElementTypes() as $type) { foreach ($this->{$type} as $element) { if (!empty($this->namespaces)) { $template->namespace = $namespaceName = $element->getPseudoNamespaceName(); $template->classes = $this->namespaces[$namespaceName]['classes']; $template->interfaces = $this->namespaces[$namespaceName]['interfaces']; $template->traits = $this->namespaces[$namespaceName]['traits']; $template->exceptions = $this->namespaces[$namespaceName]['exceptions']; $template->constants = $this->namespaces[$namespaceName]['constants']; $template->functions = $this->namespaces[$namespaceName]['functions']; } elseif (!empty($this->packages)) { $template->package = $packageName = $element->getPseudoPackageName(); $template->classes = $this->packages[$packageName]['classes']; $template->interfaces = $this->packages[$packageName]['interfaces']; $template->traits = $this->packages[$packageName]['traits']; $template->exceptions = $this->packages[$packageName]['exceptions']; $template->constants = $this->packages[$packageName]['constants']; $template->functions = $this->packages[$packageName]['functions']; } $template->class = null; $template->constant = null; $template->function = null; if ($element instanceof Reflection\ReflectionClass) { // Class $template->tree = array_merge(array_reverse($element->getParentClasses()), array($element)); $template->directSubClasses = $element->getDirectSubClasses(); uksort($template->directSubClasses, 'strcasecmp'); $template->indirectSubClasses = $element->getIndirectSubClasses(); uksort($template->indirectSubClasses, 'strcasecmp'); $template->directImplementers = $element->getDirectImplementers(); uksort($template->directImplementers, 'strcasecmp'); $template->indirectImplementers = $element->getIndirectImplementers(); uksort($template->indirectImplementers, 'strcasecmp'); $template->directUsers = $element->getDirectUsers(); uksort($template->directUsers, 'strcasecmp'); $template->indirectUsers = $element->getIndirectUsers(); uksort($template->indirectUsers, 'strcasecmp'); $template->class = $element; $template->setFile($this->getTemplatePath('class'))->save($this->config->destination . DIRECTORY_SEPARATOR . $template->getClassUrl($element)); } elseif ($element instanceof Reflection\ReflectionConstant) { // Constant $template->constant = $element; $template->setFile($this->getTemplatePath('constant'))->save($this->config->destination . DIRECTORY_SEPARATOR . $template->getConstantUrl($element)); } elseif ($element instanceof Reflection\ReflectionFunction) { // Function $template->function = $element; $template->setFile($this->getTemplatePath('function'))->save($this->config->destination . DIRECTORY_SEPARATOR . $template->getFunctionUrl($element)); } $this->fireEvent('generateProgress', 1); // Generate source codes if ($this->config->sourceCode && $element->isTokenized()) { $template->fileName = $this->getRelativePath($element->getFileName()); $template->source = $this->highlighter->highlight($this->charsetConvertor->convertFile($element->getFileName()), true); $template->setFile($this->getTemplatePath('source'))->save($this->config->destination . DIRECTORY_SEPARATOR . $template->getSourceUrl($element, false)); $this->fireEvent('generateProgress', 1); } } } return $this; }