public function showCallLocation() { $namespace = Debug::libraryNamespace(); $base = __DIR__; $stack = debug_backtrace(0); $FNS = self::GLOBAL_LOG_FNS; // Discard frames of all functions that belong to this library. while (!empty($stack) && (isset($stack[0]['file']) && stripos($stack[0]['file'], $base) === 0 || isset($stack[0]['class']) && stripos($stack[0]['class'], $namespace) === 0 || isset($stack[0]['function']) && !isset($FNS[$stack[0]['function']]))) { array_shift($stack); } $trace = $stack ? $stack[0] : []; $path = isset($trace['file']) ? $trace['file'] : ''; $line = isset($trace['line']) ? $trace['line'] : ''; $shortPath = ErrorConsole::shortFileName($path); $shortPath = str_segmentsLast($shortPath, '/'); $location = empty($line) ? $shortPath : ErrorConsole::errorLink($path, $line, 1, "{$shortPath}:{$line}", 'hint--rounded hint--left', 'data-hint'); if ($path != '') { $path = <<<HTML <div class="__debug-location">At {$location}</div> HTML; } $this->write($path); return $this; }
private static function filterStackTrace(array $trace) { $n = explode('\\', Debug::libraryNamespace()); array_pop($n); $namespace = implode('\\', $n); return array_values(array_filter($trace, function ($frame) use($namespace) { return !isset($frame['class']) || substr($frame['class'], 0, strlen($namespace)) != $namespace; })); }