Added the Search API Synonym module to deal specifically with licence and license...
[yaffs-website] / vendor / symfony / config / Definition / Dumper / YamlReferenceDumper.php
index 31c3f8e0161fc26737633856847ecbbac1be7fc0..fc5d20a2e70408d1423bd439b4adfcddf9f8f610 100644 (file)
 
 namespace Symfony\Component\Config\Definition\Dumper;
 
-use Symfony\Component\Config\Definition\ConfigurationInterface;
-use Symfony\Component\Config\Definition\NodeInterface;
 use Symfony\Component\Config\Definition\ArrayNode;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
 use Symfony\Component\Config\Definition\EnumNode;
+use Symfony\Component\Config\Definition\NodeInterface;
 use Symfony\Component\Config\Definition\PrototypedArrayNode;
+use Symfony\Component\Config\Definition\ScalarNode;
 use Symfony\Component\Yaml\Inline;
 
 /**
@@ -32,6 +33,32 @@ class YamlReferenceDumper
         return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree());
     }
 
+    public function dumpAtPath(ConfigurationInterface $configuration, $path)
+    {
+        $rootNode = $node = $configuration->getConfigTreeBuilder()->buildTree();
+
+        foreach (explode('.', $path) as $step) {
+            if (!$node instanceof ArrayNode) {
+                throw new \UnexpectedValueException(sprintf('Unable to find node at path "%s.%s"', $rootNode->getName(), $path));
+            }
+
+            /** @var NodeInterface[] $children */
+            $children = $node instanceof PrototypedArrayNode ? $this->getPrototypeChildren($node) : $node->getChildren();
+
+            foreach ($children as $child) {
+                if ($child->getName() === $step) {
+                    $node = $child;
+
+                    continue 2;
+                }
+            }
+
+            throw new \UnexpectedValueException(sprintf('Unable to find node at path "%s.%s"', $rootNode->getName(), $path));
+        }
+
+        return $this->dumpNode($node);
+    }
+
     public function dumpNode(NodeInterface $node)
     {
         $this->reference = '';
@@ -43,10 +70,12 @@ class YamlReferenceDumper
     }
 
     /**
-     * @param NodeInterface $node
-     * @param int           $depth
+     * @param NodeInterface      $node
+     * @param NodeInterface|null $parentNode
+     * @param int                $depth
+     * @param bool               $prototypedArray
      */
-    private function writeNode(NodeInterface $node, $depth = 0)
+    private function writeNode(NodeInterface $node, NodeInterface $parentNode = null, $depth = 0, $prototypedArray = false)
     {
         $comments = array();
         $default = '';
@@ -59,35 +88,13 @@ class YamlReferenceDumper
             $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) {
-                if ($node->hasDefaultValue() && count($defaultArray = $node->getDefaultValue())) {
+                if ($node->hasDefaultValue() && \count($defaultArray = $node->getDefaultValue())) {
                     $default = '';
-                } elseif (!is_array($example)) {
+                } elseif (!\is_array($example)) {
                     $default = '[]';
                 }
             }
@@ -100,10 +107,10 @@ class YamlReferenceDumper
             if ($node->hasDefaultValue()) {
                 $default = $node->getDefaultValue();
 
-                if (is_array($default)) {
-                    if (count($defaultArray = $node->getDefaultValue())) {
+                if (\is_array($default)) {
+                    if (\count($defaultArray = $node->getDefaultValue())) {
                         $default = '';
-                    } elseif (!is_array($example)) {
+                    } elseif (!\is_array($example)) {
                         $default = '[]';
                     }
                 } else {
@@ -117,15 +124,21 @@ class YamlReferenceDumper
             $comments[] = 'Required';
         }
 
+        // deprecated?
+        if ($node->isDeprecated()) {
+            $comments[] = sprintf('Deprecated (%s)', $node->getDeprecationMessage($node->getName(), $parentNode ? $parentNode->getPath() : $node->getPath()));
+        }
+
         // example
-        if ($example && !is_array($example)) {
+        if ($example && !\is_array($example)) {
             $comments[] = 'Example: '.$example;
         }
 
-        $default = (string) $default != '' ? ' '.$default : '';
-        $comments = count($comments) ? '# '.implode(', ', $comments) : '';
+        $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('');
@@ -140,17 +153,17 @@ class YamlReferenceDumper
         if ($defaultArray) {
             $this->writeLine('');
 
-            $message = count($defaultArray) > 1 ? 'Defaults' : 'Default';
+            $message = \count($defaultArray) > 1 ? 'Defaults' : 'Default';
 
             $this->writeLine('# '.$message.':', $depth * 4 + 4);
 
             $this->writeArray($defaultArray, $depth + 1);
         }
 
-        if (is_array($example)) {
+        if (\is_array($example)) {
             $this->writeLine('');
 
-            $message = count($example) > 1 ? 'Examples' : 'Example';
+            $message = \count($example) > 1 ? 'Examples' : 'Example';
 
             $this->writeLine('# '.$message.':', $depth * 4 + 4);
 
@@ -159,7 +172,7 @@ class YamlReferenceDumper
 
         if ($children) {
             foreach ($children as $childNode) {
-                $this->writeNode($childNode, $depth + 1);
+                $this->writeNode($childNode, $node, $depth + 1, $node instanceof PrototypedArrayNode && !$node->getKeyAttribute());
             }
         }
     }
@@ -172,7 +185,7 @@ class YamlReferenceDumper
      */
     private function writeLine($text, $indent = 0)
     {
-        $indent = strlen($text) + $indent;
+        $indent = \strlen($text) + $indent;
         $format = '%'.$indent.'s';
 
         $this->reference .= sprintf($format, $text)."\n";
@@ -183,7 +196,7 @@ class YamlReferenceDumper
         $isIndexed = array_values($array) === $array;
 
         foreach ($array as $key => $value) {
-            if (is_array($value)) {
+            if (\is_array($value)) {
                 $val = '';
             } else {
                 $val = $value;
@@ -195,9 +208,49 @@ class YamlReferenceDumper
                 $this->writeLine(sprintf('%-20s %s', $key.':', $val), $depth * 4);
             }
 
-            if (is_array($value)) {
+            if (\is_array($value)) {
                 $this->writeArray($value, $depth + 1);
             }
         }
     }
+
+    /**
+     * @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);
+    }
 }