Completed
Branch master (aa8164)
by Tomáš
04:04
created

ErrorDataCollector::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 7
ccs 4
cts 4
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 5
nc 1
nop 2
crap 1
1
<?php
2
3
/*
4
 * This file is part of Symplify
5
 * Copyright (c) 2016 Tomas Votruba (http://tomasvotruba.cz).
6
 */
7
8
namespace Symplify\PHP7_CodeSniffer\Report;
9
10
use Symplify\PHP7_CodeSniffer\EventDispatcher\CurrentListenerSniffCodeProvider;
11
use Symplify\PHP7_CodeSniffer\File\File;
12
13
final class ErrorDataCollector
14
{
15
    /**
16
     * @var int
17
     */
18
    private $errorCount = 0;
19
20
    /**
21
     * @var int
22
     */
23
    private $fixableErrorCount = 0;
24
25
    /**
26
     * @var array[]
27
     */
28
    private $errorMessages = [];
29
30
    /**
31
     * @var CurrentListenerSniffCodeProvider
32
     */
33
    private $currentListenerSniffCodeProvider;
34
35
    /**
36
     * @var ErrorMessageSorter
37
     */
38
    private $errorMessageSorter;
39
40 3
    public function __construct(
41
        CurrentListenerSniffCodeProvider $currentListenerSniffCodeProvider,
42
        ErrorMessageSorter $errorMessageSorter
43
    ) {
44 3
        $this->currentListenerSniffCodeProvider = $currentListenerSniffCodeProvider;
45 3
        $this->errorMessageSorter = $errorMessageSorter;
46 3
    }
47
48 1
    public function getErrorCount() : int
49
    {
50 1
        return $this->errorCount;
51
    }
52
53 1
    public function getFixableErrorCount() : int
54
    {
55 1
        return $this->fixableErrorCount;
56
    }
57
58 1
    public function getUnfixableErrorCount() : int
59
    {
60 1
        return $this->errorCount - $this->fixableErrorCount;
61
    }
62
63 2
    public function getErrorMessages() : array
64
    {
65 2
        return $this->errorMessageSorter->sortByFileAndLine($this->errorMessages);
66
    }
67
68 1
    public function getUnfixableErrorMessages() : array
69
    {
70 1
        $unfixableErrorMessages = [];
71 1
        foreach ($this->getErrorMessages() as $file => $errorMessagesForFile) {
72 1
            $unfixableErrorMessagesForFile = [];
73 1
            foreach ($errorMessagesForFile as $errorMessage) {
74 1
                if ($errorMessage['isFixable']) {
75 1
                    continue;
76
                }
77
78 1
                $unfixableErrorMessagesForFile[] = $errorMessage;
79
            }
80
81 1
            if (count($unfixableErrorMessagesForFile)) {
82 1
                $unfixableErrorMessages[$file] = $unfixableErrorMessagesForFile;
83
            }
84
        }
85
86 1
        return $unfixableErrorMessages;
87
    }
88
89 3
    public function addErrorMessage(
90
        string $filePath,
91
        string $message,
92
        int $line,
93
        string $sniffCode,
94
        array $data=[],
95
        bool $isFixable=false
96
    ) {
97 3
        $this->errorCount++;
98
99 3
        if ($isFixable) {
100 1
            $this->fixableErrorCount++;
101
        }
102
103 3
        $this->errorMessages[$filePath][] = [
104 3
            'line' => $line,
105 3
            'message' => $this->applyDataToMessage($message, $data),
106 3
            'sniffCode' => $this->getSniffFullCode($sniffCode),
107 3
            'isFixable'  => $isFixable
108
        ];
109 3
    }
110
111 3
    private function getSniffFullCode(string $sniffCode) : string
112
    {
113 3
        $parts = explode('.', $sniffCode);
114 3
        if ($parts[0] !== $sniffCode) {
115
            return $sniffCode;
116
        }
117
118 3
        $listenerSniffCode = $this->currentListenerSniffCodeProvider->getCurrentListenerSniffCode();
119 3
        return $listenerSniffCode.'.'.$sniffCode;
120
    }
121
122 3
    private function applyDataToMessage(string $message, array $data) : string
123
    {
124 3
        if (count($data)) {
125
            $message = vsprintf($message, $data);
126
        }
127
128 3
        return $message;
129
    }
130
}
131