use Symfony\Component\Config\Definition\ArrayNode;
use Symfony\Component\Config\Definition\EnumNode;
use Symfony\Component\Config\Definition\PrototypedArrayNode;
+use Symfony\Component\Config\Definition\ScalarNode;
use Symfony\Component\Yaml\Inline;
/**
/**
* @param NodeInterface $node
* @param int $depth
+ * @param bool $prototypedArray
*/
- private function writeNode(NodeInterface $node, $depth = 0)
+ private function writeNode(NodeInterface $node, $depth = 0, $prototypedArray = false)
{
$comments = array();
$default = '';
$children = $node->getChildren();
if ($node instanceof PrototypedArrayNode) {
- $prototype = $node->getPrototype();
-
- if ($prototype instanceof ArrayNode) {
- $children = $prototype->getChildren();
- }
-
- // check for attribute as key
- if ($key = $node->getKeyAttribute()) {
- $keyNodeClass = 'Symfony\Component\Config\Definition\\'.($prototype instanceof ArrayNode ? 'ArrayNode' : 'ScalarNode');
- $keyNode = new $keyNodeClass($key, $node);
-
- $info = 'Prototype';
- if (null !== $prototype->getInfo()) {
- $info .= ': '.$prototype->getInfo();
- }
- $keyNode->setInfo($info);
-
- // add children
- foreach ($children as $childNode) {
- $keyNode->addChild($childNode);
- }
- $children = array($key => $keyNode);
- }
+ $children = $this->getPrototypeChildren($node);
}
if (!$children) {
$default = (string) $default != '' ? ' '.$default : '';
$comments = count($comments) ? '# '.implode(', ', $comments) : '';
- $text = rtrim(sprintf('%-21s%s %s', $node->getName().':', $default, $comments), ' ');
+ $key = $prototypedArray ? '-' : $node->getName().':';
+ $text = rtrim(sprintf('%-21s%s %s', $key, $default, $comments), ' ');
if ($info = $node->getInfo()) {
$this->writeLine('');
if ($children) {
foreach ($children as $childNode) {
- $this->writeNode($childNode, $depth + 1);
+ $this->writeNode($childNode, $depth + 1, $node instanceof PrototypedArrayNode && !$node->getKeyAttribute());
}
}
}
}
}
}
+
+ /**
+ * @param PrototypedArrayNode $node
+ *
+ * @return array
+ */
+ private function getPrototypeChildren(PrototypedArrayNode $node)
+ {
+ $prototype = $node->getPrototype();
+ $key = $node->getKeyAttribute();
+
+ // Do not expand prototype if it isn't an array node nor uses attribute as key
+ if (!$key && !$prototype instanceof ArrayNode) {
+ return $node->getChildren();
+ }
+
+ if ($prototype instanceof ArrayNode) {
+ $keyNode = new ArrayNode($key, $node);
+ $children = $prototype->getChildren();
+
+ if ($prototype instanceof PrototypedArrayNode && $prototype->getKeyAttribute()) {
+ $children = $this->getPrototypeChildren($prototype);
+ }
+
+ // add children
+ foreach ($children as $childNode) {
+ $keyNode->addChild($childNode);
+ }
+ } else {
+ $keyNode = new ScalarNode($key, $node);
+ }
+
+ $info = 'Prototype';
+ if (null !== $prototype->getInfo()) {
+ $info .= ': '.$prototype->getInfo();
+ }
+ $keyNode->setInfo($info);
+
+ return array($key => $keyNode);
+ }
}