|
11 | 11 |
|
12 | 12 | use function array_keys;
|
13 | 13 | use function array_merge;
|
| 14 | +use function array_slice; |
14 | 15 | use function array_unique;
|
| 16 | +use function count; |
| 17 | +use function explode; |
| 18 | +use function implode; |
15 | 19 | use function range;
|
16 | 20 | use SebastianBergmann\CodeCoverage\Filter;
|
17 | 21 | use SebastianBergmann\CodeCoverage\StaticAnalysis\Class_;
|
@@ -48,7 +52,7 @@ public function build(Filter $filter, FileAnalyser $analyser): array
|
48 | 52 | foreach ($filter->files() as $file) {
|
49 | 53 | foreach ($analyser->traitsIn($file) as $trait) {
|
50 | 54 | if ($trait->isNamespaced()) {
|
51 |
| - $this->process($namespaces, $trait->namespace(), $file, $trait->startLine(), $trait->endLine()); |
| 55 | + $this->processNamespace($namespaces, $trait->namespace(), $file, $trait->startLine(), $trait->endLine()); |
52 | 56 | }
|
53 | 57 |
|
54 | 58 | $this->process($traits, $trait->namespacedName(), $file, $trait->startLine(), $trait->endLine());
|
@@ -88,7 +92,7 @@ public function build(Filter $filter, FileAnalyser $analyser): array
|
88 | 92 |
|
89 | 93 | foreach ($analyser->classesIn($file) as $class) {
|
90 | 94 | if ($class->isNamespaced()) {
|
91 |
| - $this->process($namespaces, $class->namespace(), $file, $class->startLine(), $class->endLine()); |
| 95 | + $this->processNamespace($namespaces, $class->namespace(), $file, $class->startLine(), $class->endLine()); |
92 | 96 | }
|
93 | 97 |
|
94 | 98 | $this->process($classes, $class->namespacedName(), $file, $class->startLine(), $class->endLine());
|
@@ -122,7 +126,7 @@ public function build(Filter $filter, FileAnalyser $analyser): array
|
122 | 126 |
|
123 | 127 | foreach ($analyser->functionsIn($file) as $function) {
|
124 | 128 | if ($function->isNamespaced()) {
|
125 |
| - $this->process($namespaces, $function->namespace(), $file, $function->startLine(), $function->endLine()); |
| 129 | + $this->processNamespace($namespaces, $function->namespace(), $file, $function->startLine(), $function->endLine()); |
126 | 130 | }
|
127 | 131 |
|
128 | 132 | $this->process($functions, $function->namespacedName(), $file, $function->startLine(), $function->endLine());
|
@@ -199,6 +203,24 @@ private function processMethods(Class_|Trait_ $classOrTrait, string $file, array
|
199 | 203 | }
|
200 | 204 | }
|
201 | 205 |
|
| 206 | + /** |
| 207 | + * @param TargetMapPart $data |
| 208 | + * @param non-empty-string $namespace |
| 209 | + * @param non-empty-string $file |
| 210 | + * @param positive-int $startLine |
| 211 | + * @param positive-int $endLine |
| 212 | + * |
| 213 | + * @param-out TargetMapPart $data |
| 214 | + */ |
| 215 | + private function processNamespace(array &$data, string $namespace, string $file, int $startLine, int $endLine): void |
| 216 | + { |
| 217 | + $parts = explode('\\', $namespace); |
| 218 | + |
| 219 | + foreach (range(1, count($parts)) as $i) { |
| 220 | + $this->process($data, implode('\\', array_slice($parts, 0, $i)), $file, $startLine, $endLine); |
| 221 | + } |
| 222 | + } |
| 223 | + |
202 | 224 | /**
|
203 | 225 | * @param TargetMapPart $data
|
204 | 226 | * @param non-empty-string $unit
|
|
0 commit comments