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 Node\Name $node * @param ClassMetadata $metadata * @param array $classCollected * * @return string */ public function findRightClass(Node\Name $node, ClassMetadata $metadata, array $classCollected = array()) { $class = implode('\\', $node->parts); $lastPartsClass = array_map(function ($value) { return substr(strrchr($value, '\\'), 1); }, $classCollected); $class = $this->reservedWordReplacer->replace($class); if (in_array($class, $classCollected)) { return '\\' . $class; } elseif (array_key_exists($class, $metadata->getClassesAlias())) { $alias = $metadata->getClassesAlias(); return '\\' . $alias[$class]; } elseif (false !== ($key = array_search($class, $lastPartsClass))) { return '\\' . $classCollected[$key]; } elseif (false !== ($key = array_search($metadata->getNamespace() . '\\' . $class, $classCollected))) { return '\\' . $classCollected[$key]; } else { return $class; } }
/** * @param array $nodes * @param ClassMetadata $classMetadata * * @return ClassMetadata */ public function build(array $nodes, ClassMetadata $classMetadata) { $class = null; foreach ($this->nodeFetcher->foreachNodes($nodes) as $nodeData) { $node = $nodeData['node']; if ($node instanceof Stmt\UseUse) { $classMetadata->addUse($node); $classMetadata->addClasses($this->reservedWordReplacer->replace(implode('\\', $node->name->parts))); if ($node->name->getLast() !== $node->alias) { $classMetadata->addClassesAlias($node->alias, $this->reservedWordReplacer->replace(implode('\\', $node->name->parts))); } } elseif ($node instanceof Stmt\Namespace_) { $classMetadata->setNamespace(implode('\\', $node->name->parts)); } elseif ($node instanceof Stmt\Interface_ || $node instanceof Stmt\Class_) { if ($class !== null) { throw new \Exception('Multiple class find in ' . $fileName); } $class = $this->reservedWordReplacer->replace($node->name); $classMetadata->setClass($class); if ($node instanceof Stmt\Interface_) { } elseif ($node instanceof Stmt\Class_ && $node->implements !== null) { $implementsClean = array(); foreach ($node->implements as $implement) { $implementsClean[] = $this->reservedWordReplacer->replace(implode('\\', $implement->parts)); } $classMetadata->setImplements($implementsClean); } } elseif ($node instanceof Stmt\Interface_ || $node instanceof Stmt\Class_) { if ($class !== null) { throw new \Exception('Multiple class find in ' . $fileName); } $class = $this->reservedWordReplacer->replace($node->name); $classMetadata->setClass($class); } } return $classMetadata; }
/** * @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; }