Skip to content

Commit 0019530

Browse files
committed
Dumper: the same siblings (or parent's siblings) objects are collapsed and labelled
1 parent 268abae commit 0019530

File tree

3 files changed

+102
-0
lines changed

3 files changed

+102
-0
lines changed

src/Tracy/Dumper/Dumper.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,9 @@ private function dumpArray(&$var, array $options, int $level): string
313313
? Helpers::escapeHtml(self::hideValue($v)) . "\n"
314314
: $this->dumpVar($v, $options, $level + 1)
315315
);
316+
if (is_object($v)) {
317+
$options['siblings'][] = $v;
318+
}
316319
}
317320
} finally {
318321
unset($var[$marker]);
@@ -354,6 +357,14 @@ private function dumpObject(&$var, array $options, int $level): string
354357
} elseif (in_array($var, $options['parents'] ?? [], true)) {
355358
return $out . " { <i>RECURSION</i> }\n";
356359

360+
} elseif (in_array($var, $options['siblings'] ?? [], true)) {
361+
if ($options[self::LAZY] !== false) {
362+
return '<span class="tracy-toggle tracy-collapsed" data-tracy-dump=\''
363+
. json_encode($this->toJson($var, $options, $level), JSON_HEX_APOS | JSON_HEX_AMP)
364+
. "'>" . $out . "</span>\n";
365+
}
366+
return $out . " { <i>see above</i> }\n";
367+
357368
} elseif (!$this->maxDepth || $level < $this->maxDepth || $var instanceof \Closure) {
358369
$collapsed = $level
359370
? count($fields) >= $this->collapseSub
@@ -382,6 +393,10 @@ private function dumpObject(&$var, array $options, int $level): string
382393
? Helpers::escapeHtml(self::hideValue($v)) . "\n"
383394
: $this->dumpVar($v, $options, $level + 1)
384395
);
396+
397+
if (is_object($v)) {
398+
$options['siblings'][] = $v;
399+
}
385400
}
386401
return $out . '</div>';
387402
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
/**
4+
* Test: Tracy\Dumper::toHtml() sibling
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
use Tester\Assert;
10+
use Tracy\Dumper;
11+
12+
13+
require __DIR__ . '/../bootstrap.php';
14+
require __DIR__ . '/fixtures/DumpClass.php';
15+
16+
17+
$obj = new Test;
18+
$arr = [$obj, new Test, $obj, [$obj, new Test, $obj]];
19+
20+
21+
Assert::match('<pre class="tracy-dump" data-tracy-snapshot=\'{"1":{"name":"Test","hash":%d%,"items":[["x",[[0,10],[1,null]],0],["y","hello",2],["z",{"number":"30.0"},1]]}}\'><span class="tracy-toggle"><span class="tracy-dump-array">array</span> (4)</span>
22+
<div><span class="tracy-dump-indent"> </span><span class="tracy-dump-key">0</span> => <span class="tracy-toggle"><span class="tracy-dump-object">Test</span> <span class="tracy-dump-hash">#%d%</span></span>
23+
<div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-key">x</span> => <span class="tracy-toggle"><span class="tracy-dump-array">array</span> (2)</span>
24+
<div><span class="tracy-dump-indent"> | | </span><span class="tracy-dump-key">0</span> => <span class="tracy-dump-number">10</span>
25+
<span class="tracy-dump-indent"> | | </span><span class="tracy-dump-key">1</span> => <span class="tracy-dump-null">null</span>
26+
</div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-key">y</span> <span class="tracy-dump-visibility">private</span> => <span class="tracy-dump-string">"hello"</span> (5)
27+
<span class="tracy-dump-indent"> | </span><span class="tracy-dump-key">z</span> <span class="tracy-dump-visibility">protected</span> => <span class="tracy-dump-number">30.0</span>
28+
</div><span class="tracy-dump-indent"> </span><span class="tracy-dump-key">1</span> => <span class="tracy-toggle"><span class="tracy-dump-object">Test</span> <span class="tracy-dump-hash">#%d%</span></span>
29+
<div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-key">x</span> => <span class="tracy-toggle"><span class="tracy-dump-array">array</span> (2)</span>
30+
<div><span class="tracy-dump-indent"> | | </span><span class="tracy-dump-key">0</span> => <span class="tracy-dump-number">10</span>
31+
<span class="tracy-dump-indent"> | | </span><span class="tracy-dump-key">1</span> => <span class="tracy-dump-null">null</span>
32+
</div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-key">y</span> <span class="tracy-dump-visibility">private</span> => <span class="tracy-dump-string">"hello"</span> (5)
33+
<span class="tracy-dump-indent"> | </span><span class="tracy-dump-key">z</span> <span class="tracy-dump-visibility">protected</span> => <span class="tracy-dump-number">30.0</span>
34+
</div><span class="tracy-dump-indent"> </span><span class="tracy-dump-key">2</span> => <span class="tracy-toggle tracy-collapsed" data-tracy-dump=\'{"object":1}\'><span class="tracy-dump-object">Test</span> <span class="tracy-dump-hash">#%d%</span></span>
35+
<span class="tracy-dump-indent"> </span><span class="tracy-dump-key">3</span> => <span class="tracy-toggle"><span class="tracy-dump-array">array</span> (3)</span>
36+
<div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-key">0</span> => <span class="tracy-toggle tracy-collapsed" data-tracy-dump=\'{"object":1}\'><span class="tracy-dump-object">Test</span> <span class="tracy-dump-hash">#%d%</span></span>
37+
<span class="tracy-dump-indent"> | </span><span class="tracy-dump-key">1</span> => <span class="tracy-toggle"><span class="tracy-dump-object">Test</span> <span class="tracy-dump-hash">#%d%</span></span>
38+
<div><span class="tracy-dump-indent"> | | </span><span class="tracy-dump-key">x</span> => <span class="tracy-toggle"><span class="tracy-dump-array">array</span> (2)</span>
39+
<div><span class="tracy-dump-indent"> | | | </span><span class="tracy-dump-key">0</span> => <span class="tracy-dump-number">10</span>
40+
<span class="tracy-dump-indent"> | | | </span><span class="tracy-dump-key">1</span> => <span class="tracy-dump-null">null</span>
41+
</div><span class="tracy-dump-indent"> | | </span><span class="tracy-dump-key">y</span> <span class="tracy-dump-visibility">private</span> => <span class="tracy-dump-string">"hello"</span> (5)
42+
<span class="tracy-dump-indent"> | | </span><span class="tracy-dump-key">z</span> <span class="tracy-dump-visibility">protected</span> => <span class="tracy-dump-number">30.0</span>
43+
</div><span class="tracy-dump-indent"> | </span><span class="tracy-dump-key">2</span> => <span class="tracy-toggle tracy-collapsed" data-tracy-dump=\'{"object":1}\'><span class="tracy-dump-object">Test</span> <span class="tracy-dump-hash">#%d%</span></span>
44+
</div></div></pre>', Dumper::toHtml($arr));
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
/**
4+
* Test: Tracy\Dumper::toText() sibling
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
use Tester\Assert;
10+
use Tracy\Dumper;
11+
12+
13+
require __DIR__ . '/../bootstrap.php';
14+
require __DIR__ . '/fixtures/DumpClass.php';
15+
16+
17+
$obj = new Test;
18+
$arr = [$obj, new Test, $obj, [$obj, new Test, $obj]];
19+
20+
Assert::match('array (4)
21+
0 => Test #%d%
22+
| x => array (2)
23+
| | 0 => 10
24+
| | 1 => null
25+
| y private => "hello" (5)
26+
| z protected => 30.0
27+
1 => Test #%d%
28+
| x => array (2)
29+
| | 0 => 10
30+
| | 1 => null
31+
| y private => "hello" (5)
32+
| z protected => 30.0
33+
2 => Test #%d% { see above }
34+
3 => array (3)
35+
| 0 => Test #%d% { see above }
36+
| 1 => Test #%d%
37+
| | x => array (2)
38+
| | | 0 => 10
39+
| | | 1 => null
40+
| | y private => "hello" (5)
41+
| | z protected => 30.0
42+
| 2 => Test #%d% { see above }
43+
', Dumper::toText($arr));

0 commit comments

Comments
 (0)