-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStackTracePrinter.php
More file actions
115 lines (99 loc) · 3.21 KB
/
StackTracePrinter.php
File metadata and controls
115 lines (99 loc) · 3.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?php
/*
* This file is part of the awesomite/stack-trace package.
*
* (c) Bartłomiej Krukowski <bartlomiej@krukowski.me>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
use Awesomite\StackTrace\Arguments\ArgumentInterface;
use Awesomite\StackTrace\Arguments\ArgumentsInterface;
use Awesomite\StackTrace\StackTraceFactory;
use Awesomite\StackTrace\Steps\StepInterface;
use Awesomite\VarDumper\LightVarDumper;
/**
* @internal
*/
class StackTracePrinter
{
public function printStackTrace()
{
$factory = new StackTraceFactory();
$stackTrace = $factory->create();
$i = 0;
foreach ($stackTrace as $step) {
$this->printStep($step, ++$i);
}
}
private function printStep(StepInterface $step, $i)
{
$function = $step->hasCalledFunction() ? $step->getCalledFunction()->getName() : 'unknown';
echo "#{$i} {$function}(";
$arguments = $step->getArguments();
$first = true;
foreach ($arguments as $argument) {
if ($argument->hasDeclaration()) {
if ($first) {
$first = false;
} else {
echo ', ';
}
echo '$' . $argument->getDeclaration()->getName();
} else {
break;
}
}
echo ")\n";
if ($step->hasPlaceInCode()) {
echo " Place in code:\n";
$placeInCode = $step->getPlaceInCode();
$fileName = $this->shortFileName($placeInCode->getFileName());
echo " {$fileName}:{$placeInCode->getLineNumber()}\n";
}
$this->printArguments($step->getArguments());
}
/**
* @param ArgumentInterface[]|ArgumentsInterface $arguments
*/
private function printArguments($arguments)
{
if (!\count($arguments)) {
return;
}
echo " Arguments:\n";
foreach ($arguments as $argument) {
if ($argument->hasValue()) {
$dump = $argument->getValue();
} else {
$dump = 'undefined';
if ($argument->hasDeclaration()) {
$declaration = $argument->getDeclaration();
if ($declaration->hasDefaultValue()) {
$dumper = new LightVarDumper();
$defDump = $dumper->dumpAsString($declaration->getDefaultValue());
$dump .= ' (default ' . \substr($defDump, 0, -1) . ')';
}
}
$dump .= "\n";
}
$tabs = ' ';
$dump = \substr($dump, 0, -1);
$dump = $tabs . \str_replace("\n", "\n", $dump) . "\n";
echo $dump;
}
}
private function shortFileName($file)
{
$exploded = \explode(\DIRECTORY_SEPARATOR, $file);
$shifted = false;
while (\count($exploded) > 3) {
\array_shift($exploded);
$shifted = true;
}
if ($shifted) {
\array_unshift($exploded, '(...)');
}
return \implode(\DIRECTORY_SEPARATOR, $exploded);
}
}