composer update
This commit is contained in:
parent
f6abc3dce2
commit
71dfaca858
1753 changed files with 45274 additions and 14619 deletions
|
@ -149,6 +149,14 @@ class GraphvizDumper extends Dumper
|
|||
$edges[] = array('name' => $name, 'required' => $required, 'to' => $argument, 'lazy' => $lazyEdge);
|
||||
} elseif ($argument instanceof ArgumentInterface) {
|
||||
$edges = array_merge($edges, $this->findEdges($id, $argument->getValues(), $required, $name, true));
|
||||
} elseif ($argument instanceof Definition) {
|
||||
$edges = array_merge($edges,
|
||||
$this->findEdges($id, $argument->getArguments(), $required, ''),
|
||||
$this->findEdges($id, $argument->getProperties(), false, '')
|
||||
);
|
||||
foreach ($argument->getMethodCalls() as $call) {
|
||||
$edges = array_merge($edges, $this->findEdges($id, $call[1], false, $call[0].'()'));
|
||||
}
|
||||
} elseif (\is_array($argument)) {
|
||||
$edges = array_merge($edges, $this->findEdges($id, $argument, $required, $name, $lazy));
|
||||
}
|
||||
|
|
|
@ -154,14 +154,19 @@ class PhpDumper extends Dumper
|
|||
}
|
||||
}
|
||||
|
||||
(new AnalyzeServiceReferencesPass(false))->process($this->container);
|
||||
$this->circularReferences = array();
|
||||
(new AnalyzeServiceReferencesPass(false, !$this->getProxyDumper() instanceof NullDumper))->process($this->container);
|
||||
$checkedNodes = array();
|
||||
$this->circularReferences = array();
|
||||
foreach ($this->container->getCompiler()->getServiceReferenceGraph()->getNodes() as $id => $node) {
|
||||
$currentPath = array($id => $id);
|
||||
$this->analyzeCircularReferences($node->getOutEdges(), $checkedNodes, $currentPath);
|
||||
if (!$node->getValue() instanceof Definition) {
|
||||
continue;
|
||||
}
|
||||
if (!isset($checkedNodes[$id])) {
|
||||
$this->analyzeCircularReferences($id, $node->getOutEdges(), $checkedNodes);
|
||||
}
|
||||
}
|
||||
$this->container->getCompiler()->getServiceReferenceGraph()->clear();
|
||||
$checkedNodes = array();
|
||||
|
||||
$this->docStar = $options['debug'] ? '*' : '';
|
||||
|
||||
|
@ -297,26 +302,56 @@ EOF;
|
|||
return $this->proxyDumper;
|
||||
}
|
||||
|
||||
private function analyzeCircularReferences(array $edges, &$checkedNodes, &$currentPath)
|
||||
private function analyzeCircularReferences($sourceId, array $edges, &$checkedNodes, &$currentPath = array())
|
||||
{
|
||||
$checkedNodes[$sourceId] = true;
|
||||
$currentPath[$sourceId] = $sourceId;
|
||||
|
||||
foreach ($edges as $edge) {
|
||||
$node = $edge->getDestNode();
|
||||
$id = $node->getId();
|
||||
|
||||
if ($node->getValue() && ($edge->isLazy() || $edge->isWeak())) {
|
||||
if (!$node->getValue() instanceof Definition || $sourceId === $id || $edge->isLazy() || $edge->isWeak()) {
|
||||
// no-op
|
||||
} elseif (isset($currentPath[$id])) {
|
||||
$currentId = $id;
|
||||
foreach (array_reverse($currentPath) as $parentId) {
|
||||
$this->circularReferences[$parentId][$id] = $id;
|
||||
$id = $parentId;
|
||||
$this->circularReferences[$parentId][$currentId] = $currentId;
|
||||
if ($parentId === $id) {
|
||||
break;
|
||||
}
|
||||
$currentId = $parentId;
|
||||
}
|
||||
} elseif (!isset($checkedNodes[$id])) {
|
||||
$checkedNodes[$id] = true;
|
||||
$currentPath[$id] = $id;
|
||||
$this->analyzeCircularReferences($node->getOutEdges(), $checkedNodes, $currentPath);
|
||||
unset($currentPath[$id]);
|
||||
$this->analyzeCircularReferences($id, $node->getOutEdges(), $checkedNodes, $currentPath);
|
||||
} elseif (isset($this->circularReferences[$id])) {
|
||||
$this->connectCircularReferences($id, $currentPath);
|
||||
}
|
||||
}
|
||||
unset($currentPath[$sourceId]);
|
||||
}
|
||||
|
||||
private function connectCircularReferences($sourceId, &$currentPath, &$subPath = array())
|
||||
{
|
||||
$subPath[$sourceId] = $sourceId;
|
||||
$currentPath[$sourceId] = $sourceId;
|
||||
|
||||
foreach ($this->circularReferences[$sourceId] as $id) {
|
||||
if (isset($currentPath[$id])) {
|
||||
$currentId = $id;
|
||||
foreach (array_reverse($currentPath) as $parentId) {
|
||||
$this->circularReferences[$parentId][$currentId] = $currentId;
|
||||
if ($parentId === $id) {
|
||||
break;
|
||||
}
|
||||
$currentId = $parentId;
|
||||
}
|
||||
} elseif (!isset($subPath[$id]) && isset($this->circularReferences[$id])) {
|
||||
$this->connectCircularReferences($id, $currentPath, $subPath);
|
||||
}
|
||||
}
|
||||
unset($currentPath[$sourceId]);
|
||||
unset($subPath[$sourceId]);
|
||||
}
|
||||
|
||||
private function collectLineage($class, array &$lineage)
|
||||
|
@ -557,7 +592,8 @@ EOF;
|
|||
|
||||
if (\is_array($callable)) {
|
||||
if ($callable[0] instanceof Reference
|
||||
|| ($callable[0] instanceof Definition && $this->definitionVariables->contains($callable[0]))) {
|
||||
|| ($callable[0] instanceof Definition && $this->definitionVariables->contains($callable[0]))
|
||||
) {
|
||||
return sprintf(" %s->%s(\$%s);\n", $this->dumpValue($callable[0]), $callable[1], $variableName);
|
||||
}
|
||||
|
||||
|
@ -591,7 +627,7 @@ EOF;
|
|||
$this->definitionVariables = new \SplObjectStorage();
|
||||
$this->referenceVariables = array();
|
||||
$this->variableCount = 0;
|
||||
$this->definitionVariables[$definition] = $this->referenceVariables[$id] = new Variable('instance');
|
||||
$this->referenceVariables[$id] = new Variable('instance');
|
||||
|
||||
$return = array();
|
||||
|
||||
|
@ -663,22 +699,7 @@ EOF;
|
|||
$code .= sprintf(" @trigger_error(%s, E_USER_DEPRECATED);\n\n", $this->export($definition->getDeprecationMessage($id)));
|
||||
}
|
||||
|
||||
$head = $tail = '';
|
||||
$arguments = array($definition->getArguments(), $definition->getFactory());
|
||||
$this->addInlineVariables($head, $tail, $id, $arguments, true);
|
||||
$code .= '' !== $head ? $head."\n" : '';
|
||||
|
||||
if ($arguments = array_filter(array($definition->getProperties(), $definition->getMethodCalls(), $definition->getConfigurator()))) {
|
||||
$this->addInlineVariables($tail, $tail, $id, $arguments, false);
|
||||
|
||||
$tail .= '' !== $tail ? "\n" : '';
|
||||
$tail .= $this->addServiceProperties($definition);
|
||||
$tail .= $this->addServiceMethodCalls($definition);
|
||||
$tail .= $this->addServiceConfigurator($definition);
|
||||
}
|
||||
|
||||
$code .= $this->addServiceInstance($id, $definition, '' === $tail)
|
||||
.('' !== $tail ? "\n".$tail."\n return \$instance;\n" : '');
|
||||
$code .= $this->addInlineService($id, $definition);
|
||||
|
||||
if ($asFile) {
|
||||
$code = implode("\n", array_map(function ($line) { return $line ? substr($line, 8) : $line; }, explode("\n", $code)));
|
||||
|
@ -692,35 +713,45 @@ EOF;
|
|||
return $code;
|
||||
}
|
||||
|
||||
private function addInlineVariables(&$head, &$tail, $id, array $arguments, $forConstructor)
|
||||
private function addInlineVariables($id, Definition $definition, array $arguments, $forConstructor)
|
||||
{
|
||||
$hasSelfRef = false;
|
||||
$code = '';
|
||||
|
||||
foreach ($arguments as $argument) {
|
||||
if (\is_array($argument)) {
|
||||
$hasSelfRef = $this->addInlineVariables($head, $tail, $id, $argument, $forConstructor) || $hasSelfRef;
|
||||
$code .= $this->addInlineVariables($id, $definition, $argument, $forConstructor);
|
||||
} elseif ($argument instanceof Reference) {
|
||||
$hasSelfRef = $this->addInlineReference($head, $id, $this->container->normalizeId($argument), $forConstructor) || $hasSelfRef;
|
||||
$code .= $this->addInlineReference($id, $definition, $this->container->normalizeId($argument), $forConstructor);
|
||||
} elseif ($argument instanceof Definition) {
|
||||
$hasSelfRef = $this->addInlineService($head, $tail, $id, $argument, $forConstructor) || $hasSelfRef;
|
||||
$code .= $this->addInlineService($id, $definition, $argument, $forConstructor);
|
||||
}
|
||||
}
|
||||
|
||||
return $hasSelfRef;
|
||||
return $code;
|
||||
}
|
||||
|
||||
private function addInlineReference(&$code, $id, $targetId, $forConstructor)
|
||||
private function addInlineReference($id, Definition $definition, $targetId, $forConstructor)
|
||||
{
|
||||
$hasSelfRef = isset($this->circularReferences[$id][$targetId]);
|
||||
|
||||
if ('service_container' === $targetId || isset($this->referenceVariables[$targetId])) {
|
||||
return $hasSelfRef;
|
||||
}
|
||||
|
||||
list($callCount, $behavior) = $this->serviceCalls[$targetId];
|
||||
|
||||
if (2 > $callCount && (!$hasSelfRef || !$forConstructor)) {
|
||||
return $hasSelfRef;
|
||||
while ($this->container->hasAlias($targetId)) {
|
||||
$targetId = (string) $this->container->getAlias($targetId);
|
||||
}
|
||||
|
||||
if ($id === $targetId) {
|
||||
return $this->addInlineService($id, $definition, $definition);
|
||||
}
|
||||
|
||||
if ('service_container' === $targetId || isset($this->referenceVariables[$targetId])) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$hasSelfRef = isset($this->circularReferences[$id][$targetId]);
|
||||
$forConstructor = $forConstructor && !isset($this->definitionVariables[$definition]);
|
||||
$code = $hasSelfRef && !$forConstructor ? $this->addInlineService($id, $definition, $definition) : '';
|
||||
|
||||
if (isset($this->referenceVariables[$targetId]) || (2 > $callCount && (!$hasSelfRef || !$forConstructor))) {
|
||||
return $code;
|
||||
}
|
||||
|
||||
$name = $this->getNextVariableName();
|
||||
|
@ -730,7 +761,7 @@ EOF;
|
|||
$code .= sprintf(" \$%s = %s;\n", $name, $this->getServiceCall($targetId, $reference));
|
||||
|
||||
if (!$hasSelfRef || !$forConstructor) {
|
||||
return $hasSelfRef;
|
||||
return $code;
|
||||
}
|
||||
|
||||
$code .= sprintf(<<<'EOTXT'
|
||||
|
@ -745,46 +776,56 @@ EOTXT
|
|||
$id
|
||||
);
|
||||
|
||||
return false;
|
||||
return $code;
|
||||
}
|
||||
|
||||
private function addInlineService(&$head, &$tail, $id, Definition $definition, $forConstructor)
|
||||
private function addInlineService($id, Definition $definition, Definition $inlineDef = null, $forConstructor = true)
|
||||
{
|
||||
if (isset($this->definitionVariables[$definition])) {
|
||||
return false;
|
||||
$isSimpleInstance = $isRootInstance = null === $inlineDef;
|
||||
|
||||
if (isset($this->definitionVariables[$inlineDef = $inlineDef ?: $definition])) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$arguments = array($definition->getArguments(), $definition->getFactory());
|
||||
$arguments = array($inlineDef->getArguments(), $inlineDef->getFactory());
|
||||
|
||||
if (2 > $this->inlinedDefinitions[$definition] && !$definition->getMethodCalls() && !$definition->getProperties() && !$definition->getConfigurator()) {
|
||||
return $this->addInlineVariables($head, $tail, $id, $arguments, $forConstructor);
|
||||
$code = $this->addInlineVariables($id, $definition, $arguments, $forConstructor);
|
||||
|
||||
if ($arguments = array_filter(array($inlineDef->getProperties(), $inlineDef->getMethodCalls(), $inlineDef->getConfigurator()))) {
|
||||
$isSimpleInstance = false;
|
||||
} elseif ($definition !== $inlineDef && 2 > $this->inlinedDefinitions[$inlineDef]) {
|
||||
return $code;
|
||||
}
|
||||
|
||||
$name = $this->getNextVariableName();
|
||||
$this->definitionVariables[$definition] = new Variable($name);
|
||||
|
||||
$code = '';
|
||||
if ($forConstructor) {
|
||||
$hasSelfRef = $this->addInlineVariables($code, $tail, $id, $arguments, $forConstructor);
|
||||
if (isset($this->definitionVariables[$inlineDef])) {
|
||||
$isSimpleInstance = false;
|
||||
} else {
|
||||
$hasSelfRef = $this->addInlineVariables($code, $code, $id, $arguments, $forConstructor);
|
||||
}
|
||||
$code .= $this->addNewInstance($definition, '$'.$name, ' = ', $id);
|
||||
$hasSelfRef && !$forConstructor ? $tail .= ('' !== $tail ? "\n" : '').$code : $head .= ('' !== $head ? "\n" : '').$code;
|
||||
$name = $definition === $inlineDef ? 'instance' : $this->getNextVariableName();
|
||||
$this->definitionVariables[$inlineDef] = new Variable($name);
|
||||
$code .= '' !== $code ? "\n" : '';
|
||||
|
||||
$code = '';
|
||||
$arguments = array($definition->getProperties(), $definition->getMethodCalls(), $definition->getConfigurator());
|
||||
$hasSelfRef = $this->addInlineVariables($code, $code, $id, $arguments, false) || $hasSelfRef;
|
||||
if ('instance' === $name) {
|
||||
$code .= $this->addServiceInstance($id, $definition, $isSimpleInstance);
|
||||
} else {
|
||||
$code .= $this->addNewInstance($inlineDef, '$'.$name, ' = ', $id);
|
||||
}
|
||||
|
||||
$code .= '' !== $code ? "\n" : '';
|
||||
$code .= $this->addServiceProperties($definition, $name);
|
||||
$code .= $this->addServiceMethodCalls($definition, $name);
|
||||
$code .= $this->addServiceConfigurator($definition, $name);
|
||||
if ('' !== $code) {
|
||||
$hasSelfRef ? $tail .= ('' !== $tail ? "\n" : '').$code : $head .= $code;
|
||||
if ('' !== $inline = $this->addInlineVariables($id, $definition, $arguments, false)) {
|
||||
$code .= "\n".$inline."\n";
|
||||
} elseif ($arguments && 'instance' === $name) {
|
||||
$code .= "\n";
|
||||
}
|
||||
|
||||
$code .= $this->addServiceProperties($inlineDef, $name);
|
||||
$code .= $this->addServiceMethodCalls($inlineDef, $name);
|
||||
$code .= $this->addServiceConfigurator($inlineDef, $name);
|
||||
}
|
||||
|
||||
return $hasSelfRef;
|
||||
if ($isRootInstance && !$isSimpleInstance) {
|
||||
$code .= "\n return \$instance;\n";
|
||||
}
|
||||
|
||||
return $code;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1350,7 +1391,7 @@ EOF;
|
|||
/*{$this->docStar}
|
||||
* Computes a dynamic parameter.
|
||||
*
|
||||
* @param string The name of the dynamic parameter to load
|
||||
* @param string \$name The name of the dynamic parameter to load
|
||||
*
|
||||
* @return mixed The value of the dynamic parameter
|
||||
*
|
||||
|
@ -1781,6 +1822,7 @@ EOF;
|
|||
if ($definition->isShared()) {
|
||||
$code = sprintf('$this->services[\'%s\'] = %s', $id, $code);
|
||||
}
|
||||
$code = "($code)";
|
||||
} elseif ($this->asFiles && $definition->isShared() && !$this->isHotPath($definition)) {
|
||||
$code = sprintf("\$this->load('%s.php')", $this->generateMethodName($id));
|
||||
} else {
|
||||
|
|
Reference in a new issue