Passed
Push — main ( d4eae3...e1a72d )
by Chema
01:29
created

DocBlockParser::parseFacadeTemplate()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
eloc 3
c 0
b 0
f 0
dl 0
loc 7
ccs 0
cts 0
cp 0
rs 10
cc 2
nc 2
nop 1
crap 6
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Gacela\Framework\ClassResolver\DocBlockService;
6
7
use Gacela\Framework\AbstractFactory;
8
9 27
final class DocBlockParser
10
{
11 27
    public function getClassFromMethod(string $docBlock, string $method): string
12 1
    {
13
        if ($docBlock === '') {
14
            return '';
15 26
        }
16
17
        if (strcasecmp(substr(PHP_OS, 0, 3), 'WIN') === 0) {
18
            $docBlock = str_replace("\n", PHP_EOL, $docBlock);
19 26
        }
20 26
21 26
        $lines = array_filter(
22 26
            explode(PHP_EOL, $docBlock),
23
            static fn (string $l): bool => str_contains($l, $method),
24 26
        );
25
26 26
        /** @var array<int, string> $lineSplit */
27
        $lineSplit = explode(' ', (string)reset($lines));
28
29
        $classFromMethod = $lineSplit[3] ?? '';
30
        if ($classFromMethod !== '') {
31
            return $classFromMethod;
32
        }
33
34
        if ($method === 'getFactory') {
35
            $factoryType = $this->parseFacadeTemplate($docBlock);
36
            if ($factoryType !== '') {
37
                return $factoryType;
38
            }
39
40
            return AbstractFactory::class;
41
        }
42
43
        return '';
44
    }
45
46
    private function parseFacadeTemplate(string $docBlock): string
47
    {
48
        if (preg_match('/@extends\s+[^<]*AbstractFacade<\s*([^>\s]+)\s*>/i', $docBlock, $matches) === 1) {
49
            return $matches[1];
50
        }
51
52
        return '';
53
    }
54
}
55