Passed
Pull Request — master (#8)
by Luis
23:31 queued 08:32
created

ExternalDefinitionsResolver::externalTrait()   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 1
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 126
    {
26
        foreach ($codebase->definitions() as $definition) {
27 126
            if ($definition instanceof ClassDefinition) {
28 123
                $this->resolveForClass($definition, $codebase);
29 117
            } elseif ($definition instanceof InterfaceDefinition) {
30 66
                $this->resolveExternalInterfaces($definition->parents(), $codebase);
31 60
            } elseif ($definition instanceof TraitDefinition) {
32 42
                $this->resolveExternalTraits($definition->traits(), $codebase);
33 123
            }
34
        }
35
    }
36 126
37
    /**
38
     * It resolves for its parent class, its interfaces and traits
39
     */
40
    protected function resolveForClass(ClassDefinition $definition, Codebase $codebase): void
41 117
    {
42
        $this->resolveExternalInterfaces($definition->interfaces(), $codebase);
43 117
        $this->resolveExternalTraits($definition->traits(), $codebase);
44 117
        $this->resolveExternalParentClass($definition, $codebase);
45 117
    }
46 117
47
    /** @param Name[] $interfaces */
48
    private function resolveExternalInterfaces(array $interfaces, Codebase $codebase): void
49
    {
50
        array_map(function (Name $interface) use ($codebase): void {
51 60
            if (! $codebase->has($interface)) {
52
                $codebase->add(new InterfaceDefinition($interface));
53 60
            }
54 60
        }, $interfaces);
55
    }
56
57
    /** @param Name[] $traits */
58
    private function resolveExternalTraits(array $traits, Codebase $codebase): void
59 42
    {
60
        array_map(function (Name $trait) use ($codebase): void {
61 42
            if (! $codebase->has($trait)) {
62 42
                $codebase->add(new TraitDefinition($trait));
63
            }
64
        }, $traits);
65
    }
66
67 123
    private function resolveExternalParentClass(ClassDefinition $definition, Codebase $codebase): void
68 51
    {
69 6
        if (! $definition->hasParent()) {
70
            return;
71 123
        }
72 123
        $parent = $definition->parent();
73
        if (! $codebase->has($parent)) {
74
            $codebase->add(new ClassDefinition($parent));
75
        }
76
    }
77
}
78