Completed
Push — refactor ( 1ac315 )
by Akihito
05:56
created

DependencySaver   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 43
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 3
dl 0
loc 43
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A __invoke() 0 9 2
A saveQualifier() 0 18 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Ray\Compiler;
6
7
use LogicException;
8
use ReflectionClass;
9
10
use function file_exists;
11
use function is_dir;
12
use function mkdir;
13
use function serialize;
14
use function sprintf;
15
use function str_replace;
16
17
use const PHP_EOL;
18
19
final class DependencySaver
20
{
21
    /** @var string */
22
    private $scriptDir;
23
24
    /** @var FilePutContents */
25
    private $filePutContents;
26
27
    public function __construct(string $scriptDir)
28
    {
29
        $this->scriptDir = $scriptDir;
30
        $this->filePutContents = new FilePutContents();
31
    }
32
33
    public function __invoke(string $dependencyIndex, Code $code): void
34
    {
35
        $pearStyleName = str_replace('\\', '_', $dependencyIndex);
36
        $instanceScript = sprintf(ScriptInjector::INSTANCE, $this->scriptDir, $pearStyleName);
37
        ($this->filePutContents)($instanceScript, (string) $code . PHP_EOL);
38
        if ($code->qualifiers) {
39
            $this->saveQualifier($code->qualifiers);
40
        }
41
    }
42
43
    private function saveQualifier(IpQualifier $qualifer): void
44
    {
45
        $qualifier = $this->scriptDir . '/qualifer';
46
        ! file_exists($qualifier) && ! @mkdir($qualifier) && ! is_dir($qualifier);
47
        $class = $qualifer->param->getDeclaringClass();
48
        if (! $class instanceof ReflectionClass) {
49
            throw new LogicException(); // @codeCoverageIgnore
50
        }
51
52
        $fileName = sprintf(
53
            ScriptInjector::QUALIFIER,
54
            $this->scriptDir,
55
            str_replace('\\', '_', $class->name),
56
            $qualifer->param->getDeclaringFunction()->name,
57
            $qualifer->param->name
58
        );
59
        ($this->filePutContents)($fileName, serialize($qualifer->qualifier) . PHP_EOL);
60
    }
61
}
62