예제 #1
0
 private function implementExist(ClassMetadata $metadata, ClassCollector $classCollector, $implements)
 {
     // Class is in actual namespace
     if (array_key_exists($metadata->getNamespace() . '\\' . $implements, $classCollector->getCollected())) {
         return true;
     }
     foreach ($metadata->getClasses() as $use) {
         if (substr(strrchr($use, "\\"), 1) === $implements) {
             return true;
         }
     }
     throw new \Exception(sprintf('interface %s does not exist', $implements));
 }
예제 #2
0
 /**
  * @param CodeCollectorInterface $codeCollector
  * @param Logger                 $logger
  * @param string                 $filterFileName
  *
  * @return array
  */
 public function convert(CodeCollectorInterface $codeCollector, Logger $logger, $filterFileName = null)
 {
     $zephirCode = array();
     $classes = array();
     $files = $codeCollector->getCode();
     $count = count($files);
     $codes = array();
     $logger->log('Collect class names');
     $progress = $logger->progress($count);
     foreach ($files as $fileName => $fileContent) {
         try {
             $codes[$fileName] = $this->parser->parse($fileContent);
             $classes[$fileName] = $this->classCollector->collect($codes[$fileName], $fileName);
         } catch (\Exception $e) {
             $logger->log(sprintf('<error>Could not convert file' . "\n" . '"%s"' . "\n" . 'cause : %s %s %s</error>' . "\n", $fileName, $e->getMessage(), $e->getFile(), $e->getLine()));
         }
         $progress->advance();
     }
     $progress->finish();
     $logger->log("\nConvert php to zephir");
     $progress = $logger->progress(count($classes));
     foreach ($classes as $phpFile => $class) {
         if ($filterFileName !== null) {
             if (basename($phpFile, '.php') !== $filterFileName) {
                 continue;
             }
         }
         $phpCode = $codes[$phpFile];
         $zephirFile = pathinfo($phpFile, PATHINFO_DIRNAME) . DIRECTORY_SEPARATOR . pathinfo($phpFile, PATHINFO_FILENAME) . '.zep';
         $fileName = basename($phpFile, '.php');
         try {
             $converted = $this->convertCode($phpCode, $this->classCollector, $logger, $phpFile, $classes);
             $converted['class'] = $class;
         } catch (\Exception $e) {
             $logger->log(sprintf('Could not convert file "%s" cause : %s %s %s' . "\n", $phpFile, $e->getMessage(), $e->getFile(), $e->getLine()));
             $progress->advance();
             continue;
         }
         $zephirCode[$phpFile] = array_merge($converted, array('phpPath' => substr($phpFile, 0, strrpos($phpFile, '/')), 'fileName' => $fileName, 'fileDestination' => $zephirFile));
         $zephirCode[$phpFile]['fileDestination'] = str_replace('\\', '/', $zephirCode[$phpFile]['fileDestination']);
         foreach ($converted['additionalClass'] as $aditionalClass) {
             $zephirCode[$phpFile . $aditionalClass['name']] = array_merge(array('fileName' => $aditionalClass['name'], 'zephir' => $aditionalClass['code'], 'fileDestination' => str_replace('\\', '/', $converted['namespace']) . '/' . $aditionalClass['name'] . '.zep', 'destination' => str_replace('\\', '/', $converted['namespace']) . '/'));
         }
         $progress->advance();
     }
     $progress->finish();
     $logger->log("\n");
     return $zephirCode;
 }
예제 #3
0
 /**
  * @param string $dir
  *
  * @return array
  */
 public function convertDirectory($dir, $recursive = true, $filterFileName = null)
 {
     $zephirCode = array();
     $fileExtension = '.php';
     $classes = array();
     $files = $this->findFiles($dir);
     $count = iterator_count($files);
     $this->logger->log('Collect class names');
     $progress = $this->logger->progress($count);
     foreach ($files as $filei) {
         $file = $filei[0];
         try {
             $classes[$file] = $this->classCollector->collect($this->parser->parse(file_get_contents($file)), $file);
         } catch (\Exception $e) {
             $this->logger->log(sprintf('<error>Could not convert file' . "\n" . '"%s"' . "\n" . 'cause : %s %s %s</error>' . "\n", $file, $e->getMessage(), $e->getFile(), $e->getLine()));
         }
         $progress->advance();
     }
     $progress->finish();
     $this->logger->log("\nConvert php to zephir");
     $progress = $this->logger->progress(count($classes));
     foreach ($classes as $phpFile => $class) {
         if ($filterFileName !== null) {
             if (basename($phpFile, '.php') !== $filterFileName) {
                 continue;
             }
         }
         $phpCode = file_get_contents($phpFile);
         $fileName = basename($phpFile, '.php');
         try {
             $converted = $this->convertCode($phpCode, $phpFile, $classes);
             $converted['class'] = $class;
         } catch (\Exception $e) {
             $this->logger->log(sprintf('Could not convert file "%s" cause : %s %s %s' . "\n", $phpFile, $e->getMessage(), $e->getFile(), $e->getLine()));
             $progress->advance();
             continue;
         }
         $zephirCode[$phpFile] = array_merge($converted, array('phpPath' => substr($phpFile, 0, strrpos($phpFile, '/')), 'fileName' => $fileName, 'fileDestination' => $converted['class'] . '.zep'));
         $zephirCode[$phpFile]['fileDestination'] = strtolower(str_replace('\\', '/', $zephirCode[$phpFile]['fileDestination']));
         foreach ($converted['additionalClass'] as $aditionalClass) {
             $zephirCode[$phpFile . $aditionalClass['name']] = array_merge(array('fileName' => $aditionalClass['name'], 'zephir' => $aditionalClass['code'], 'fileDestination' => strtolower(str_replace('\\', '/', $converted['namespace']) . '/' . $aditionalClass['name']) . '.zep', 'destination' => strtolower(str_replace('\\', '/', $converted['namespace']) . '/')));
         }
         $progress->advance();
     }
     $progress->finish();
     $this->logger->log("\n");
     return $zephirCode;
 }
예제 #4
0
 /**
  * @param string   $actualNamespace
  * @param array    $definition
  * @param array    $use
  * @param array    $classes
  * @param DocBlock $phpdoc
  *
  * @return array
  */
 private function findReturnTag($phpdoc = null, array $definition, ClassMetadata $classMetadata, ClassMethod $node)
 {
     $implements = $classMetadata->getImplements();
     if (is_array($implements) === true) {
         foreach ($implements as $implement) {
             foreach ($this->classCollector->getCollected() as $className => $classInfo) {
                 if ($classMetadata->getNamespace() . '\\' . $implement === $className) {
                     try {
                         $phpdoc = $this->nodeToDocBlock($this->findMethod($classInfo, $node->name));
                     } catch (\InvalidArgumentException $e) {
                     }
                 }
                 foreach ($classMetadata->getClasses() as $use) {
                     if ($use . '/' . $implement === $className) {
                         try {
                             $phpdoc = $this->nodeToDocBlock($this->findMethod($classInfo, $node->name));
                         } catch (\InvalidArgumentException $e) {
                         }
                     }
                 }
             }
         }
     }
     if ($phpdoc !== null) {
         foreach ($phpdoc->getTags() as $tag) {
             if ($this->isReturnTag($tag) === true) {
                 $definition['return'] = array('type' => $this->findType($tag));
                 break;
             }
         }
     }
     return $definition;
 }