Passed
Pull Request — master (#993)
by Maxim
20:44 queued 10:42
created

ExceptionMapper::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 0

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 0
dl 0
loc 4
ccs 1
cts 1
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Spiral\Stempler;
6
7
use Spiral\Stempler\Compiler\SourceMap;
8
use Spiral\Views\Exception\RenderException;
9
10
final class ExceptionMapper
11
{
12 3
    public function __construct(
13
        private readonly SourceMap $sourcemap,
14
        private readonly int $lineOffset
15
    ) {
16 3
    }
17
18 3
    public function mapException(\Throwable $e, string $class, string $filename, array $data): \Throwable
19
    {
20 3
        $line = $e->getLine();
21 3
        $classFilename = (new \ReflectionClass($class))->getFileName();
22
23
        // looking for proper view error location
24 3
        if ($e->getFile() !== $classFilename) {
25 1
            foreach ($e->getTrace() as $trace) {
26 1
                if (isset($trace['file']) && $trace['file'] === $classFilename) {
27 1
                    $line = $trace['line'];
28 1
                    break;
29
                }
30
            }
31
        }
32
33 3
        $userStack = [];
34 3
        foreach ($this->sourcemap->getStack($line - $this->lineOffset) as $stack) {
35 3
            $userStack[] = [
36 3
                'file'     => $stack['file'],
37 3
                'line'     => $stack['line'],
38 3
                'class'    => StemplerEngine::class,
39 3
                'type'     => '->',
40 3
                'function' => 'render',
41 3
                'args'     => [$data],
42 3
            ];
43
44 3
            if ($stack['file'] === $filename) {
45
                // no need to jump over root template
46 3
                break;
47
            }
48
        }
49
50
51 3
        $e = new RenderException($e);
52 3
        $e->setUserTrace($userStack);
53
54 3
        return $e;
55
    }
56
}
57