Passed
Push — 1.6 ( c2a002 )
by Luis
05:37
created

ExternalDefinitionsResolver::resolveForClass()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 2
dl 0
loc 5
ccs 4
cts 4
cp 1
crap 1
rs 9.4285
c 0
b 0
f 0
1
<?php
2
/**
3
 * PHP version 7.1
4
 *
5
 * This source file is subject to the license that is bundled with this package in the file LICENSE.
6
 */
7
8
namespace PhUml\Parser\Code;
9
10
use PhUml\Code\ClassDefinition;
11
use PhUml\Code\Codebase;
12
use PhUml\Code\InterfaceDefinition;
13
use PhUml\Code\Name;
14
use PhUml\Code\TraitDefinition;
15
16
/**
17
 * It checks the parent of a definition and the interfaces it implements looking for external
18
 * definitions
19
 *
20
 * An external definition is either a class or interface from a third party library, or a built-in
21
 * class
22
 */
23
class ExternalDefinitionsResolver
24
{
25 123
    public function resolve(Codebase $codebase): void
26
    {
27 123
        foreach ($codebase->definitions() as $definition) {
28 120
            if ($definition instanceof ClassDefinition) {
29 114
                $this->resolveForClass($definition, $codebase);
30 66
            } elseif ($definition instanceof InterfaceDefinition) {
31 60
                $this->resolveForInterface($definition, $codebase);
32 42
            } elseif ($definition instanceof TraitDefinition) {
33 120
                $this->resolveForTrait($definition, $codebase);
34
            }
35
        }
36 123
    }
37
38 114
    protected function resolveForClass(ClassDefinition $definition, Codebase $codebase): void
39
    {
40 114
        $this->resolveExternalInterfaces($definition->interfaces(), $codebase);
41 114
        $this->resolveExternalTraits($definition->traits(), $codebase);
42 114
        $this->resolveExternalParentClass($definition, $codebase);
43 114
    }
44
45 60
    protected function resolveForInterface(InterfaceDefinition $definition, Codebase $codebase): void
46
    {
47 60
        $this->resolveExternalInterfaces($definition->parents(), $codebase);
48 60
    }
49
50 42
    private function resolveForTrait(TraitDefinition $trait, Codebase $codebase): void
51
    {
52 42
        $this->resolveExternalTraits($trait->traits(), $codebase);
53 42
    }
54
55
    /** @param \PhUml\Code\Name[] $interfaces */
56
    private function resolveExternalInterfaces(array $interfaces, Codebase $codebase): void
57
    {
58 120
        array_map(function (Name $interface) use ($codebase) {
59 51
            if (!$codebase->has($interface)) {
60 6
                $codebase->add($this->externalInterface($interface));
61
            }
62 120
        }, $interfaces);
63 120
    }
64
65
    /** @param \PhUml\Code\Name[] $interfaces */
66
    private function resolveExternalTraits(array $traits, Codebase $codebase): void
67
    {
68 114
        array_map(function (Name $trait) use ($codebase) {
69 42
            if (!$codebase->has($trait)) {
70 6
                $codebase->add($this->externalTrait($trait));
71
            }
72 114
        }, $traits);
73 114
    }
74
75 114
    private function resolveExternalParentClass(ClassDefinition $definition, Codebase $codebase): void
76
    {
77 114
        if (!$definition->hasParent()) {
78 108
            return;
79
        }
80 54
        $parent = $definition->parent();
81 54
        if (!$codebase->has($parent)) {
82 48
            $codebase->add($this->externalClass($parent));
83
        }
84 54
    }
85
86 6
    protected function externalInterface(Name $name): InterfaceDefinition
87
    {
88 6
        return new InterfaceDefinition($name);
89
    }
90
91 51
    protected function externalClass(Name $name): ClassDefinition
92
    {
93 51
        return new ClassDefinition($name);
94
    }
95
96 6
    protected function externalTrait(Name $name): TraitDefinition
97
    {
98 6
        return new TraitDefinition($name);
99
    }
100
}
101