Skip to content

Commit 1ad8a2d

Browse files
Do not depend on sebastian/code-unit-reverse-lookup
1 parent 951acfc commit 1ad8a2d

File tree

5 files changed

+80
-23
lines changed

5 files changed

+80
-23
lines changed

composer.json

-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
"nikic/php-parser": "^5.3.1",
3838
"phpunit/php-file-iterator": "^5.1.0",
3939
"phpunit/php-text-template": "^4.0.1",
40-
"sebastian/code-unit-reverse-lookup": "^4.0.1",
4140
"sebastian/complexity": "^4.0.1",
4241
"sebastian/environment": "^7.2.0",
4342
"sebastian/lines-of-code": "^3.0.1",

src/CodeCoverage.php

+1-4
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
use SebastianBergmann\CodeCoverage\Test\Target\ValidationResult;
3636
use SebastianBergmann\CodeCoverage\Test\TestSize\TestSize;
3737
use SebastianBergmann\CodeCoverage\Test\TestStatus\TestStatus;
38-
use SebastianBergmann\CodeUnitReverseLookup\Wizard;
3938

4039
/**
4140
* Provides collection functionality for PHP code coverage information.
@@ -50,7 +49,6 @@ final class CodeCoverage
5049
private const string UNCOVERED_FILES = 'UNCOVERED_FILES';
5150
private readonly Driver $driver;
5251
private readonly Filter $filter;
53-
private readonly Wizard $wizard;
5452
private ?Mapper $targetMapper = null;
5553
private bool $checkForUnintentionallyCoveredCode = false;
5654
private bool $ignoreDeprecatedCode = false;
@@ -77,7 +75,6 @@ public function __construct(Driver $driver, Filter $filter)
7775
$this->driver = $driver;
7876
$this->filter = $filter;
7977
$this->data = new ProcessedCodeCoverageData;
80-
$this->wizard = new Wizard;
8178
}
8279

8380
/**
@@ -499,7 +496,7 @@ private function performUnintentionallyCoveredCodeCheck(RawCodeCoverageData $dat
499496
foreach ($data->lineCoverage() as $file => $_data) {
500497
foreach ($_data as $line => $flag) {
501498
if ($flag === 1 && !isset($allowedLines[$file][$line])) {
502-
$unintentionallyCoveredUnits[] = $this->wizard->lookup($file, $line);
499+
$unintentionallyCoveredUnits[] = $this->targetMapper->lookup($file, $line);
503500
}
504501
}
505502
}

src/Target/MapBuilder.php

+20-2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public function build(Filter $filter, FileAnalyser $analyser): array
4141
$traits = [];
4242
$methods = [];
4343
$functions = [];
44+
$reverseLookup = [];
4445

4546
foreach ($filter->files() as $file) {
4647
foreach ($analyser->interfacesIn($file) as $interface) {
@@ -55,7 +56,13 @@ public function build(Filter $filter, FileAnalyser $analyser): array
5556
$this->process($classes, $class->namespacedName(), $file, $class->startLine(), $class->endLine());
5657

5758
foreach ($class->methods() as $method) {
58-
$this->process($methods, $class->namespacedName() . '::' . $method->name(), $file, $method->startLine(), $method->endLine());
59+
$methodName = $class->namespacedName() . '::' . $method->name();
60+
61+
$this->process($methods, $methodName, $file, $method->startLine(), $method->endLine());
62+
63+
foreach (range($method->startLine(), $method->endLine()) as $line) {
64+
$reverseLookup[$file . ':' . $line] = $methodName;
65+
}
5966
}
6067

6168
$classesThatExtendClass[$class->namespacedName()] = [];
@@ -70,7 +77,13 @@ public function build(Filter $filter, FileAnalyser $analyser): array
7077
$this->process($traits, $trait->namespacedName(), $file, $trait->startLine(), $trait->endLine());
7178

7279
foreach ($trait->methods() as $method) {
73-
$this->process($methods, $trait->namespacedName() . '::' . $method->name(), $file, $method->startLine(), $method->endLine());
80+
$methodName = $trait->namespacedName() . '::' . $method->name();
81+
82+
$this->process($methods, $methodName, $file, $method->startLine(), $method->endLine());
83+
84+
foreach (range($method->startLine(), $method->endLine()) as $line) {
85+
$reverseLookup[$file . ':' . $line] = $methodName;
86+
}
7487
}
7588
}
7689

@@ -80,6 +93,10 @@ public function build(Filter $filter, FileAnalyser $analyser): array
8093
}
8194

8295
$this->process($functions, $function->namespacedName(), $file, $function->startLine(), $function->endLine());
96+
97+
foreach (range($function->startLine(), $function->endLine()) as $line) {
98+
$reverseLookup[$file . ':' . $line] = $function->namespacedName();
99+
}
83100
}
84101
}
85102

@@ -135,6 +152,7 @@ public function build(Filter $filter, FileAnalyser $analyser): array
135152
'traits' => $traits,
136153
'methods' => $methods,
137154
'functions' => $functions,
155+
'reverseLookup' => $reverseLookup,
138156
];
139157
}
140158

src/Target/Mapper.php

+19-1
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
use function sort;
1515

1616
/**
17-
* @phpstan-type TargetMap = array{namespaces: TargetMapPart, classes: TargetMapPart, classesThatExtendClass: TargetMapPart, classesThatImplementInterface: TargetMapPart, traits: TargetMapPart, methods: TargetMapPart, functions: TargetMapPart}
17+
* @phpstan-type TargetMap = array{namespaces: TargetMapPart, classes: TargetMapPart, classesThatExtendClass: TargetMapPart, classesThatImplementInterface: TargetMapPart, traits: TargetMapPart, methods: TargetMapPart, functions: TargetMapPart, reverseLookup: ReverseLookup}
1818
* @phpstan-type TargetMapPart = array<non-empty-string, array<non-empty-string, list<positive-int>>>
19+
* @phpstan-type ReverseLookup = array<non-empty-string, non-empty-string>
1920
*
2021
* @immutable
2122
*
@@ -75,4 +76,21 @@ public function mapTarget(Target $target): array
7576

7677
return $this->map[$target->key()][$target->target()];
7778
}
79+
80+
/**
81+
* @param non-empty-string $file
82+
* @param positive-int $line
83+
*
84+
* @return non-empty-string
85+
*/
86+
public function lookup(string $file, int $line): string
87+
{
88+
$key = $file . ':' . $line;
89+
90+
if (isset($this->map['reverseLookup'][$key])) {
91+
return $this->map['reverseLookup'][$key];
92+
}
93+
94+
return $key;
95+
}
7896
}

tests/tests/Target/MapBuilderTest.php

+40-15
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@ final class MapBuilderTest extends TestCase
2424
{
2525
public function testBuildsMap(): void
2626
{
27+
$file = realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php');
28+
2729
$this->assertSame(
2830
[
2931
'namespaces' => [
3032
'SebastianBergmann\\CodeCoverage\\StaticAnalysis' => [
31-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => array_merge(
33+
$file => array_merge(
3234
range(19, 24),
3335
range(26, 31),
3436
range(33, 52),
@@ -38,58 +40,81 @@ public function testBuildsMap(): void
3840
],
3941
'classes' => [
4042
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParentClass' => [
41-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(26, 31),
43+
$file => range(26, 31),
4244
],
4345
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ChildClass' => [
44-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(33, 52),
46+
$file => range(33, 52),
4547
],
4648
],
4749
'classesThatExtendClass' => [
4850
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParentClass' => [
49-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(33, 52),
51+
$file => range(33, 52),
5052
],
5153
],
5254
'classesThatImplementInterface' => [
5355
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\A' => [
54-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(33, 52),
56+
$file => range(33, 52),
5557
],
5658
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\B' => [
57-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(33, 52),
59+
$file => range(33, 52),
5860
],
5961
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\C' => [
60-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(26, 31),
62+
$file => range(26, 31),
6163
],
6264
],
6365
'traits' => [
6466
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\T' => [
65-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(19, 24),
67+
$file => range(19, 24),
6668
],
6769
],
6870
'methods' => [
6971
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParentClass::five' => [
70-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(28, 30),
72+
$file => range(28, 30),
7173
],
7274
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ChildClass::six' => [
73-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(37, 39),
75+
$file => range(37, 39),
7476
],
7577
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ChildClass::one' => [
76-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(41, 43),
78+
$file => range(41, 43),
7779
],
7880
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ChildClass::two' => [
79-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(45, 47),
81+
$file => range(45, 47),
8082
],
8183
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ChildClass::three' => [
82-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(49, 51),
84+
$file => range(49, 51),
8385
],
8486
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\T::four' => [
85-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(21, 23),
87+
$file => range(21, 23),
8688
],
8789
],
8890
'functions' => [
8991
'SebastianBergmann\\CodeCoverage\\StaticAnalysis\\f' => [
90-
realpath(__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php') => range(54, 56),
92+
$file => range(54, 56),
9193
],
9294
],
95+
'reverseLookup' => [
96+
$file . ':28' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ParentClass::five',
97+
$file . ':29' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ParentClass::five',
98+
$file . ':30' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ParentClass::five',
99+
$file . ':37' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ChildClass::six',
100+
$file . ':38' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ChildClass::six',
101+
$file . ':39' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ChildClass::six',
102+
$file . ':41' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ChildClass::one',
103+
$file . ':42' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ChildClass::one',
104+
$file . ':43' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ChildClass::one',
105+
$file . ':45' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ChildClass::two',
106+
$file . ':46' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ChildClass::two',
107+
$file . ':47' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ChildClass::two',
108+
$file . ':49' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ChildClass::three',
109+
$file . ':50' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ChildClass::three',
110+
$file . ':51' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\ChildClass::three',
111+
$file . ':21' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\T::four',
112+
$file . ':22' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\T::four',
113+
$file . ':23' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\T::four',
114+
$file . ':54' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\f',
115+
$file . ':55' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\f',
116+
$file . ':56' => 'SebastianBergmann\CodeCoverage\StaticAnalysis\f',
117+
],
93118
],
94119
$this->map([__DIR__ . '/../../_files/source_with_interfaces_classes_traits_functions.php']),
95120
);

0 commit comments

Comments
 (0)