88use Exception ;
99use phpDocumentor \Reflection \DocBlock \Tag ;
1010use ReflectionClass ;
11+ use ReflectionException ;
1112use ReflectionFunction ;
1213use Throwable ;
1314use function array_map ;
14- use function array_walk_recursive ;
1515use function get_class ;
1616use function get_resource_type ;
17+ use function is_array ;
1718use function is_object ;
1819use function is_resource ;
1920use function sprintf ;
@@ -80,29 +81,12 @@ private function flattenExceptionBacktrace(Throwable $exception) : void
8081 $ traceProperty = (new ReflectionClass (Exception::class))->getProperty ('trace ' );
8182 $ traceProperty ->setAccessible (true );
8283
83- $ flatten =
84- /** @param mixed $value */
85- static function (&$ value ) : void {
86- if ($ value instanceof Closure) {
87- $ closureReflection = new ReflectionFunction ($ value );
88- $ value = sprintf (
89- '(Closure at %s:%s) ' ,
90- $ closureReflection ->getFileName (),
91- $ closureReflection ->getStartLine ()
92- );
93- } elseif (is_object ($ value )) {
94- $ value = sprintf ('object(%s) ' , get_class ($ value ));
95- } elseif (is_resource ($ value )) {
96- $ value = sprintf ('resource(%s) ' , get_resource_type ($ value ));
97- }
98- };
99-
10084 do {
10185 $ trace = $ exception ->getTrace ();
10286 if (isset ($ trace [0 ]['args ' ])) {
10387 $ trace = array_map (
104- static function (array $ call) use ( $ flatten ) : array {
105- array_walk_recursive ( $ call ['args ' ], $ flatten );
88+ function (array $ call ) : array {
89+ $ call ['args ' ] = array_map ([ $ this , ' flattenArguments ' ], $ call [ ' args ' ] );
10690
10791 return $ call ;
10892 },
@@ -117,6 +101,33 @@ static function (array $call) use ($flatten) : array {
117101 $ traceProperty ->setAccessible (false );
118102 }
119103
104+ /**
105+ * @param mixed $value
106+ *
107+ * @return mixed
108+ *
109+ * @throws ReflectionException
110+ */
111+ private function flattenArguments ($ value )
112+ {
113+ if ($ value instanceof Closure) {
114+ $ closureReflection = new ReflectionFunction ($ value );
115+ $ value = sprintf (
116+ '(Closure at %s:%s) ' ,
117+ $ closureReflection ->getFileName (),
118+ $ closureReflection ->getStartLine ()
119+ );
120+ } elseif (is_object ($ value )) {
121+ $ value = sprintf ('object(%s) ' , get_class ($ value ));
122+ } elseif (is_resource ($ value )) {
123+ $ value = sprintf ('resource(%s) ' , get_resource_type ($ value ));
124+ } elseif (is_array ($ value )) {
125+ $ value = array_map ([$ this , 'flattenArguments ' ], $ value );
126+ }
127+
128+ return $ value ;
129+ }
130+
120131 public function render (?Formatter $ formatter = null ) : string
121132 {
122133 if ($ formatter === null ) {
0 commit comments