Completed
Push — master ( 95fe89...6b0ea2 )
by Dave
19s queued 16s
created

Location::fromRelativeFileName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
c 0
b 0
f 0
nc 1
nop 3
dl 0
loc 8
rs 10
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\Domain\Common;
14
15
class Location
16
{
17
    /**
18
     * @var RelativeFileName
19
     */
20
    private $relativeFileName;
21
22
    /**
23
     * @var LineNumber
24
     */
25
    private $lineNumber;
26
    /**
27
     * @var AbsoluteFileName
28
     */
29
    private $absoluteFileName;
30
31
    /**
32
     * @throws InvalidPathException
33
     */
34
    public static function fromAbsoluteFileName(
35
        AbsoluteFileName $absoluteFileName,
36
        ProjectRoot $projectRoot,
37
        LineNumber $lineNumber
38
    ): self {
39
        $relativeFileName = $projectRoot->getPathRelativeToRootDirectory($absoluteFileName);
40
41
        return new self($absoluteFileName, $relativeFileName, $lineNumber);
42
    }
43
44
    public static function fromRelativeFileName(
45
        RelativeFileName $relativeFileName,
46
        ProjectRoot $projectRoot,
47
        LineNumber $lineNumber
48
    ): self {
49
        $absoluteFileName = $projectRoot->getAbsoluteFileName($relativeFileName);
50
51
        return new self($absoluteFileName, $relativeFileName, $lineNumber);
52
    }
53
54
    private function __construct(
55
        AbsoluteFileName $absoluteFileName,
56
        RelativeFileName $relativeFileName,
57
        LineNumber $lineNumber
58
    ) {
59
        $this->relativeFileName = $relativeFileName;
60
        $this->lineNumber = $lineNumber;
61
        $this->absoluteFileName = $absoluteFileName;
62
    }
63
64
    public function getRelativeFileName(): RelativeFileName
65
    {
66
        return $this->relativeFileName;
67
    }
68
69
    public function getLineNumber(): LineNumber
70
    {
71
        return $this->lineNumber;
72
    }
73
74
    public function getAbsoluteFileName(): AbsoluteFileName
75
    {
76
        return $this->absoluteFileName;
77
    }
78
79
    /**
80
     * Used for ordering Locations, first by FileName then by line number.
81
     */
82
    public function compareTo(self $other): int
83
    {
84
        if ($this->relativeFileName->getFileName() !== $other->relativeFileName->getFileName()) {
85
            return $this->relativeFileName->getFileName() <=> $other->relativeFileName->getFileName();
86
        }
87
88
        return $this->lineNumber->getLineNumber() <=> $other->lineNumber->getLineNumber();
89
    }
90
}
91