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