Completed
Branch master (06cb84)
by Tomáš
06:00
created

ErrorDataCollector::getUnfixableErrorMessages()   B

Complexity

Conditions 5
Paths 7

Size

Total Lines 20
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
dl 0
loc 20
ccs 0
cts 17
cp 0
rs 8.8571
c 0
b 0
f 0
cc 5
eloc 11
nc 7
nop 0
crap 30
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;
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
    public function __construct(CurrentListenerSniffCodeProvider $currentListenerSniffCodeProvider)
36
    {
37
        $this->currentListenerSniffCodeProvider = $currentListenerSniffCodeProvider;
38
    }
39
40
    public function getErrorCount() : int
41
    {
42
        return $this->errorCount;
43
    }
44
45
    public function getFixableErrorCount() : int
46
    {
47
        return $this->fixableErrorCount;
48
    }
49
50
    public function getUnfixableErrorCount() : int
51
    {
52
        return $this->errorCount - $this->fixableErrorCount;
53
    }
54
55
    public function getErrorMessages() : array
56
    {
57
        return $this->sortErrorMessagesByFileAndLine($this->errorMessages);
58
    }
59
60
    public function getUnfixableErrorMessages() : array
61
    {
62
        $unfixableErrorMessages = [];
63
        foreach ($this->getErrorMessages() as $file => $errorMessagesForFile) {
64
            $unfixableErrorMessagesForFile = [];
65
            foreach ($errorMessagesForFile as $errorMessage) {
66
                if ($errorMessage['isFixable']) {
67
                    continue;
68
                }
69
70
                $unfixableErrorMessagesForFile[] = $errorMessage;
71
            }
72
73
            if (count($unfixableErrorMessagesForFile)) {
74
                $unfixableErrorMessages[$file] = $unfixableErrorMessagesForFile;
75
            }
76
        }
77
78
        return $unfixableErrorMessages;
79
    }
80
81
    public function addErrorMessage(
82
        string $filePath,
83
        string $message,
84
        int $line,
85
        string $sniffCode,
86
        array $data,
87
        bool $isFixable
88
    ) {
89
        $this->errorCount++;
90
91
        if ($isFixable) {
92
            $this->fixableErrorCount++;
93
        }
94
95
        $this->errorMessages[$filePath][] = [
96
            'line' => $line,
97
            'message' => $this->applyDataToMessage($message, $data),
98
            'sniffCode' => $this->getSniffFullCode($sniffCode),
99
            'isFixable'  => $isFixable
100
        ];
101
    }
102
103
    private function getSniffFullCode(string $sniffCode) : string
104
    {
105
        $parts = explode('.', $sniffCode);
106
        if ($parts[0] !== $sniffCode) {
107
            return $sniffCode;
108
        }
109
110
        $listenerSniffCode = $this->currentListenerSniffCodeProvider->getCurrentListenerSniffCode();
111
        return $listenerSniffCode.'.'.$sniffCode;
112
    }
113
114
    private function applyDataToMessage(string $message, array $data) : string
115
    {
116
        if (count($data)) {
117
            $message = vsprintf($message, $data);
118
        }
119
120
        return $message;
121
    }
122
123
    private function sortErrorMessagesByFileAndLine(array $errorMessages)
124
    {
125
        ksort($errorMessages);
126
127
        foreach ($errorMessages as $file => $errorMessagesForFile) {
128
            if (count($errorMessagesForFile) <= 1) {
129
                continue;
130
            }
131
132
            uasort($errorMessagesForFile, function ($first, $second) {
133
                return ($first['line'] > $second['line']);
134
            });
135
136
            $errorMessages[$file] = $errorMessagesForFile;
137
        }
138
139
        return $errorMessages;
140
    }
141
}
142