Passed
Push — attribute-types ( 3de1eb )
by Luis
10:25
created

ExternalDefinitionsResolver::resolveForTrait()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 2
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
/**
3
 * PHP version 7.4
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, the interfaces it implements, and the traits it uses
18
 * looking for external definitions
19
 *
20
 * An external definition is a class, trait or interface from a third party library, or a built-in class or interface
21
 */
22
final class ExternalDefinitionsResolver implements RelationshipsResolver
23
{
24
    public function resolve(Codebase $codebase): void
25
    {
26
        foreach ($codebase->definitions() as $definition) {
27
            if ($definition instanceof ClassDefinition) {
28
                $this->resolveForClass($definition, $codebase);
29
            } elseif ($definition instanceof InterfaceDefinition) {
30
                $this->resolveExternalInterfaces($definition->parents(), $codebase);
31
            } elseif ($definition instanceof TraitDefinition) {
32
                $this->resolveExternalTraits($definition->traits(), $codebase);
33
            }
34
        }
35
    }
36
37
    /**
38
     * It resolves for its parent class, its interfaces and traits
39
     */
40
    protected function resolveForClass(ClassDefinition $definition, Codebase $codebase): void
41
    {
42
        $this->resolveExternalInterfaces($definition->interfaces(), $codebase);
43
        $this->resolveExternalTraits($definition->traits(), $codebase);
44
        $this->resolveExternalParentClass($definition, $codebase);
45
    }
46
47
    /** @param Name[] $interfaces */
48
    private function resolveExternalInterfaces(array $interfaces, Codebase $codebase): void
49
    {
50
        array_map(function (Name $interface) use ($codebase): void {
51
            if (! $codebase->has($interface)) {
52
                $codebase->add(new InterfaceDefinition($interface));
53
            }
54
        }, $interfaces);
55
    }
56
57
    /** @param Name[] $traits */
58
    private function resolveExternalTraits(array $traits, Codebase $codebase): void
59
    {
60
        array_map(function (Name $trait) use ($codebase): void {
61
            if (! $codebase->has($trait)) {
62
                $codebase->add(new TraitDefinition($trait));
63
            }
64
        }, $traits);
65
    }
66
67
    private function resolveExternalParentClass(ClassDefinition $definition, Codebase $codebase): void
68
    {
69
        if (! $definition->hasParent()) {
70
            return;
71
        }
72
        $parent = $definition->parent();
73
        if (! $codebase->has($parent)) {
74
            $codebase->add(new ClassDefinition($parent));
75
        }
76
    }
77
}
78