Example #1
0
 /**
  * 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;
 }