calculateOriginalLineNumber()   B
last analyzed

Complexity

Conditions 8
Paths 8

Size

Total Lines 43
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 24
nc 8
nop 2
dl 0
loc 43
rs 8.4444
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Static Analysis Results Baseliner (sarb).
5
 *
6
 * (c) Dave Liddament
7
 *
8
 * For the full copyright and licence information please view the LICENSE file distributed with this source code.
9
 */
10
11
declare(strict_types=1);
12
13
namespace DaveLiddament\StaticAnalysisResultsBaseliner\Plugins\GitDiffHistoryAnalyser\internal;
14
15
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\HistoryAnalyser\UnifiedDiffParser\FileMutation;
16
use Webmozart\Assert\Assert;
17
18
final class OriginalLineNumberCalculator
19
{
20
    /**
21
     * Returns original line number or null if the line was added in the mutation given the file mutations.
22
     */
23
    public static function calculateOriginalLineNumber(FileMutation $fileMutation, int $newLineNumber): ?int
24
    {
25
        $lineNumberMapper = new LineNumberMapper();
26
27
        foreach ($fileMutation->getLineMutations() as $lineMutation) {
28
            if ($lineMutation->isAdded()) {
29
                $newLine = $lineMutation->getNewLine();
30
                Assert::notNull($newLine);
31
                $targetNewLineNumber = $newLine->getLineNumber();
32
33
                if ($newLineNumber === $targetNewLineNumber) {
34
                    return null;
35
                }
36
37
                while ($lineNumberMapper->getNewLineNumber() < $targetNewLineNumber) {
38
                    if ($lineNumberMapper->getNewLineNumber() === $newLineNumber) {
39
                        return $lineNumberMapper->getOriginalLineNumber();
40
                    }
41
42
                    $lineNumberMapper->incrementBoth();
43
                }
44
45
                $lineNumberMapper->incrementNew();
46
            } else {
47
                $originalLine = $lineMutation->getOriginalLine();
48
                Assert::notNull($originalLine);
49
                $targetOriginalLineNumber = $originalLine->getLineNumber();
50
51
                while ($lineNumberMapper->getOriginalLineNumber() < $targetOriginalLineNumber) {
52
                    if ($lineNumberMapper->getNewLineNumber() === $newLineNumber) {
53
                        return $lineNumberMapper->getOriginalLineNumber();
54
                    }
55
56
                    $lineNumberMapper->incrementBoth();
57
                }
58
59
                $lineNumberMapper->incrementOriginal();
60
            }
61
        }
62
63
        $differenceNewLineAndCurrentNewLine = $newLineNumber - $lineNumberMapper->getNewLineNumber();
64
65
        return $lineNumberMapper->getOriginalLineNumber() + $differenceNewLineAndCurrentNewLine;
66
    }
67
}
68