Summary::__construct()   A
last analyzed

Complexity

Conditions 4
Paths 5

Size

Total Lines 22
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 4

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 18
nc 5
nop 1
dl 0
loc 22
ccs 19
cts 19
cp 1
crap 4
rs 9.6666
c 1
b 0
f 0
1
<?php declare(strict_types=1);
2
/**
3
 * This source file is subject to the license that is bundled with this package in the file LICENSE.
4
 */
5
6
namespace PhUml\Code;
7
8
use PhUml\Code\Modifiers\Visibility;
0 ignored issues
show
Bug introduced by
The type PhUml\Code\Modifiers\Visibility was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
9
10
/**
11
 * It creates a summary of the classes, interfaces, methods, and properties of a codebase
12
 *
13
 * The summary of a `Structure` does not include counts of constants
14
 */
15
final class Summary
16
{
17
    /** @noRector \Rector\Php81\Rector\Property\ReadOnlyPropertyRector  */
18
    private int $interfaceCount;
19
20
    /** @noRector \Rector\Php81\Rector\Property\ReadOnlyPropertyRector  */
21
    private int $classCount;
22
23
    private int $publicFunctionCount;
24
25
    private int $publicPropertyCount;
26
27
    private int $publicTypedProperties;
28
29
    private int $protectedFunctionCount;
30
31
    private int $protectedPropertyCount;
32
33
    private int $protectedTypedProperties;
34
35
    private int $privateFunctionCount;
36
37
    private int $privatePropertyCount;
38
39
    private int $privateTypedProperties;
40
41 9
    public static function from(Codebase $codebase): Summary
42
    {
43 9
        return new Summary($codebase);
44
    }
45
46 9
    private function __construct(Codebase $codebase)
47
    {
48 9
        $this->interfaceCount = 0;
49 9
        $this->classCount = 0;
50 9
        $this->publicFunctionCount = 0;
51 9
        $this->publicPropertyCount = 0;
52 9
        $this->publicTypedProperties = 0;
53 9
        $this->protectedFunctionCount = 0;
54 9
        $this->protectedPropertyCount = 0;
55 9
        $this->protectedTypedProperties = 0;
56 9
        $this->privateFunctionCount = 0;
57 9
        $this->privatePropertyCount = 0;
58 9
        $this->privateTypedProperties = 0;
59 9
        foreach ($codebase->definitions() as $definition) {
60 7
            if ($definition instanceof InterfaceDefinition) {
61 4
                $this->interfaceCount++;
62
            }
63 7
            if ($definition instanceof ClassDefinition) {
64 7
                $this->classCount++;
65 7
                $this->propertiesSummary($definition);
66
            }
67 7
            $this->methodsSummary($definition);
68
        }
69
    }
70
71 7
    private function propertiesSummary(ClassDefinition $definition): void
72
    {
73
        // Properties count
74 7
        $this->publicPropertyCount += $definition->countPropertiesByVisibility(Visibility::PUBLIC);
75 7
        $this->protectedPropertyCount += $definition->countPropertiesByVisibility(Visibility::PROTECTED);
76 7
        $this->privatePropertyCount += $definition->countPropertiesByVisibility(Visibility::PRIVATE);
77
78
        // Typed properties count
79 7
        $this->publicTypedProperties += $definition->countTypedPropertiesByVisibility(Visibility::PUBLIC);
80 7
        $this->protectedTypedProperties += $definition->countTypedPropertiesByVisibility(Visibility::PROTECTED);
81 7
        $this->privateTypedProperties += $definition->countTypedPropertiesByVisibility(Visibility::PRIVATE);
82
    }
83
84 7
    private function methodsSummary(Definition $definition): void
85
    {
86 7
        $this->publicFunctionCount += $definition->countMethodsByVisibility(Visibility::PUBLIC);
87 7
        $this->protectedFunctionCount += $definition->countMethodsByVisibility(Visibility::PROTECTED);
88 7
        $this->privateFunctionCount += $definition->countMethodsByVisibility(Visibility::PRIVATE);
89
    }
90
91 6
    public function interfaceCount(): int
92
    {
93 6
        return $this->interfaceCount;
94
    }
95
96 6
    public function classCount(): int
97
    {
98 6
        return $this->classCount;
99
    }
100
101 6
    public function publicFunctionCount(): int
102
    {
103 6
        return $this->publicFunctionCount;
104
    }
105
106 6
    public function publicPropertyCount(): int
107
    {
108 6
        return $this->publicPropertyCount;
109
    }
110
111 2
    public function publicTypedProperties(): int
112
    {
113 2
        return $this->publicTypedProperties;
114
    }
115
116 6
    public function protectedFunctionCount(): int
117
    {
118 6
        return $this->protectedFunctionCount;
119
    }
120
121 6
    public function protectedPropertyCount(): int
122
    {
123 6
        return $this->protectedPropertyCount;
124
    }
125
126 3
    public function protectedTypedProperties(): int
127
    {
128 3
        return $this->protectedTypedProperties;
129
    }
130
131 6
    public function privateFunctionCount(): int
132
    {
133 6
        return $this->privateFunctionCount;
134
    }
135
136 6
    public function privatePropertyCount(): int
137
    {
138 6
        return $this->privatePropertyCount;
139
    }
140
141 2
    public function privateTypedProperties(): int
142
    {
143 2
        return $this->privateTypedProperties;
144
    }
145
146 7
    public function functionCount(): int
147
    {
148 7
        return $this->publicFunctionCount + $this->protectedFunctionCount + $this->privateFunctionCount;
149
    }
150
151 7
    public function propertiesCount(): int
152
    {
153 7
        return $this->publicPropertyCount + $this->protectedPropertyCount + $this->privatePropertyCount;
154
    }
155
156 6
    public function typedPropertiesCount(): int
157
    {
158 6
        return $this->publicTypedProperties + $this->protectedTypedProperties + $this->privateTypedProperties;
159
    }
160
161 7
    public function propertiesPerClass(): float
162
    {
163 7
        if ($this->classCount === 0) {
164 2
            return 0;
165
        }
166
167 5
        return round($this->propertiesCount() / $this->classCount, 2);
168
    }
169
170 7
    public function functionsPerClass(): float
171
    {
172 7
        if ($this->classCount === 0) {
173 2
            return 0;
174
        }
175
176 5
        return round($this->functionCount() / $this->classCount, 2);
177
    }
178
}
179