export($node, $indent); } /** * Convert a tree of NodeInterface objects into a plain text string. * * @param \Cake\Error\Debug\NodeInterface $var The node tree to dump. * @param int $indent The current indentation level. * @return string */ protected function export(NodeInterface $var, int $indent): string { if ($var instanceof ScalarNode) { return match ($var->getType()) { 'bool' => $var->getValue() ? 'true' : 'false', 'null' => 'null', 'string' => "'" . (string)$var->getValue() . "'", default => "({$var->getType()}) {$var->getValue()}", }; } if ($var instanceof ArrayNode) { return $this->exportArray($var, $indent + 1); } if ($var instanceof ClassNode || $var instanceof ReferenceNode) { return $this->exportObject($var, $indent + 1); } if ($var instanceof SpecialNode) { return $var->getValue(); } throw new InvalidArgumentException('Unknown node received ' . $var::class); } /** * Export an array type object * * @param \Cake\Error\Debug\ArrayNode $var The array to export. * @param int $indent The current indentation level. * @return string Exported array. */ protected function exportArray(ArrayNode $var, int $indent): string { $out = '['; $break = "\n" . str_repeat(' ', $indent); $end = "\n" . str_repeat(' ', $indent - 1); $vars = []; foreach ($var->getChildren() as $item) { $val = $item->getValue(); $vars[] = $break . $this->export($item->getKey(), $indent) . ' => ' . $this->export($val, $indent); } if ($vars !== []) { return $out . implode(',', $vars) . $end . ']'; } return $out . ']'; } /** * Handles object to string conversion. * * @param \Cake\Error\Debug\ClassNode|\Cake\Error\Debug\ReferenceNode $var Object to convert. * @param int $indent Current indentation level. * @return string * @see \Cake\Error\Debugger::exportVar() */ protected function exportObject(ClassNode|ReferenceNode $var, int $indent): string { $out = ''; $props = []; if ($var instanceof ReferenceNode) { return "object({$var->getValue()}) id:{$var->getId()} {}"; } $out .= "object({$var->getValue()}) id:{$var->getId()} {"; $break = "\n" . str_repeat(' ', $indent); $end = "\n" . str_repeat(' ', $indent - 1) . '}'; foreach ($var->getChildren() as $property) { $visibility = $property->getVisibility(); $name = $property->getName(); if ($visibility && $visibility !== 'public') { $props[] = "[{$visibility}] {$name} => " . $this->export($property->getValue(), $indent); } else { $props[] = "{$name} => " . $this->export($property->getValue(), $indent); } } if ($props !== []) { return $out . $break . implode($break, $props) . $end; } return $out . '}'; } }