Chris@14: Chris@14: * Chris@14: * For the full copyright and license information, please view the LICENSE Chris@14: * file that was distributed with this source code. Chris@14: */ Chris@14: Chris@14: namespace Symfony\Component\DependencyInjection\Compiler; Chris@14: Chris@14: use Symfony\Component\DependencyInjection\Definition; Chris@14: Chris@14: /** Chris@14: * Looks for definitions with autowiring enabled and registers their corresponding "@required" methods as setters. Chris@14: * Chris@14: * @author Nicolas Grekas Chris@14: */ Chris@14: class AutowireRequiredMethodsPass extends AbstractRecursivePass Chris@14: { Chris@14: /** Chris@14: * {@inheritdoc} Chris@14: */ Chris@14: protected function processValue($value, $isRoot = false) Chris@14: { Chris@14: $value = parent::processValue($value, $isRoot); Chris@14: Chris@14: if (!$value instanceof Definition || !$value->isAutowired() || $value->isAbstract() || !$value->getClass()) { Chris@14: return $value; Chris@14: } Chris@14: if (!$reflectionClass = $this->container->getReflectionClass($value->getClass(), false)) { Chris@14: return $value; Chris@14: } Chris@14: Chris@17: $alreadyCalledMethods = []; Chris@14: Chris@14: foreach ($value->getMethodCalls() as list($method)) { Chris@14: $alreadyCalledMethods[strtolower($method)] = true; Chris@14: } Chris@14: Chris@14: foreach ($reflectionClass->getMethods() as $reflectionMethod) { Chris@14: $r = $reflectionMethod; Chris@14: Chris@14: if ($r->isConstructor() || isset($alreadyCalledMethods[strtolower($r->name)])) { Chris@14: continue; Chris@14: } Chris@14: Chris@14: while (true) { Chris@14: if (false !== $doc = $r->getDocComment()) { Chris@14: if (false !== stripos($doc, '@required') && preg_match('#(?:^/\*\*|\n\s*+\*)\s*+@required(?:\s|\*/$)#i', $doc)) { Chris@14: $value->addMethodCall($reflectionMethod->name); Chris@14: break; Chris@14: } Chris@14: if (false === stripos($doc, '@inheritdoc') || !preg_match('#(?:^/\*\*|\n\s*+\*)\s*+(?:\{@inheritdoc\}|@inheritdoc)(?:\s|\*/$)#i', $doc)) { Chris@14: break; Chris@14: } Chris@14: } Chris@14: try { Chris@14: $r = $r->getPrototype(); Chris@14: } catch (\ReflectionException $e) { Chris@14: break; // method has no prototype Chris@14: } Chris@14: } Chris@14: } Chris@14: Chris@14: return $value; Chris@14: } Chris@14: }