Completed
Push — master ( 2fd8e1...1442eb )
by Tomáš
03:40
created

ErrorDataCollector   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 124
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 95.65%

Importance

Changes 0
Metric Value
wmc 17
c 0
b 0
f 0
lcom 1
cbo 2
dl 0
loc 124
ccs 44
cts 46
cp 0.9565
rs 10

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
A getErrorCount() 0 4 1
A getFixableErrorCount() 0 4 1
A getUnfixableErrorCount() 0 4 1
A getErrorMessages() 0 4 1
A getUnfixableErrorMessages() 0 12 3
A addErrorMessage() 0 21 2
A getSniffFullCode() 0 10 2
A applyDataToMessage() 0 8 2
A filterUnfixableErrorMessagesForFile() 0 13 3
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 23
    public function __construct(
41
        CurrentListenerSniffCodeProvider $currentListenerSniffCodeProvider,
42
        ErrorMessageSorter $errorMessageSorter
43
    ) {
44 23
        $this->currentListenerSniffCodeProvider = $currentListenerSniffCodeProvider;
45 23
        $this->errorMessageSorter = $errorMessageSorter;
46 23
    }
47
48 3
    public function getErrorCount() : int
49
    {
50 3
        return $this->errorCount;
51
    }
52
53 6
    public function getFixableErrorCount() : int
54
    {
55 6
        return $this->fixableErrorCount;
56
    }
57
58 4
    public function getUnfixableErrorCount() : int
59
    {
60 4
        return $this->errorCount - $this->fixableErrorCount;
61
    }
62
63 6
    public function getErrorMessages() : array
64
    {
65 6
        return $this->errorMessageSorter->sortByFileAndLine($this->errorMessages);
66
    }
67
68 4
    public function getUnfixableErrorMessages() : array
69
    {
70 4
        $unfixableErrorMessages = [];
71 4
        foreach ($this->getErrorMessages() as $file => $errorMessagesForFile) {
72 3
            $unfixableErrorMessagesForFile = $this->filterUnfixableErrorMessagesForFile($errorMessagesForFile);
73 3
            if (count($unfixableErrorMessagesForFile)) {
74 3
                $unfixableErrorMessages[$file] = $unfixableErrorMessagesForFile;
75
            }
76
        }
77
78 4
        return $unfixableErrorMessages;
79
    }
80
81 7
    public function addErrorMessage(
82
        string $filePath,
83
        string $message,
84
        int $line,
85
        string $sniffCode,
86
        array $data = [],
87
        bool $isFixable = false
88
    ) {
89 7
        $this->errorCount++;
90
91 7
        if ($isFixable) {
92 4
            $this->fixableErrorCount++;
93
        }
94
95 7
        $this->errorMessages[$filePath][] = [
96 7
            'line' => $line,
97 7
            'message' => $this->applyDataToMessage($message, $data),
98 7
            'sniffCode' => $this->getSniffFullCode($sniffCode),
99 7
            'isFixable'  => $isFixable
100
        ];
101 7
    }
102
103 7
    private function getSniffFullCode(string $sniffCode) : string
104
    {
105 7
        $parts = explode('.', $sniffCode);
106 7
        if ($parts[0] !== $sniffCode) {
107
            return $sniffCode;
108
        }
109
110 7
        $listenerSniffCode = $this->currentListenerSniffCodeProvider->getCurrentListenerSniffCode();
111 7
        return $listenerSniffCode.'.'.$sniffCode;
112
    }
113
114 7
    private function applyDataToMessage(string $message, array $data) : string
115
    {
116 7
        if (count($data)) {
117
            $message = vsprintf($message, $data);
118
        }
119
120 7
        return $message;
121
    }
122
123 3
    private function filterUnfixableErrorMessagesForFile(array $errorMessagesForFile) : array
124
    {
125 3
        $unfixableErrorMessages = [];
126 3
        foreach ($errorMessagesForFile as $errorMessage) {
127 3
            if ($errorMessage['isFixable']) {
128 2
                continue;
129
            }
130
131 3
            $unfixableErrorMessages[] = $errorMessage;
132
        }
133
134 3
        return $unfixableErrorMessages;
135
    }
136
}
137