Passed
Pull Request — master (#27)
by
unknown
09:32
created

File   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 257
Duplicated Lines 9.34 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 2
dl 24
loc 257
ccs 31
cts 31
cp 1
rs 10
c 0
b 0
f 0

12 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A getAdvancedTokens() 0 11 2
A addFixableError() 0 9 1
A getTokens() 0 4 1
A addError() 0 10 1
A addErrorOnLine() 0 9 1
A findPrevious() 12 12 1
A addWarningOnLine() 0 9 1
A findNext() 12 12 1
A preparePointer() 0 4 2
A getFixer() 0 4 1
A getEolChar() 0 4 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace BestIt\CodeSniffer;
6
7
use PHP_CodeSniffer\Files\File as PhpCsFile;
8
9
/**
10
 * Class File
11
 *
12
 * Wrapper Class for PhpCsFile to provide a consistent way to replace int|bool returns
13
 * with int returns (false => -1)
14
 * Additionally there could be some architecture changes in the future, like Token-Objects and so on.
15
 *
16
 * @package BestIt\CodeSniffer
17
 * @author Nick Lubisch <[email protected]>
18
 */
19
class File
20
{
21
    /**
22
     * The CodeSniffer file
23
     *
24
     * @var PhpCsFile
25
     */
26
    private $baseFile;
27
28
    /**
29
     * Wrapped PHP_CodeSniffer_Fixer
30
     *
31
     * @var Fixer
32
     */
33
    private $fixer;
34
35
    /**
36
     * Contains the advanced token stack
37
     *
38
     * @var array
39
     */
40
    private $tokens;
41
42
    /**
43
     * File constructor.
44
     *
45
     * @param PhpCsFile $baseFile CodeSniffer file
46
     */
47 121
    public function __construct(PhpCsFile $baseFile)
48
    {
49 121
        $this->baseFile = $baseFile;
50 121
        $this->fixer = new Fixer($this, $this->baseFile->fixer);
51 121
        $this->tokens = $this->getAdvancedTokens();
52 121
    }
53
54
    /**
55
     * Adds the pointer to all token data arrays.
56
     *
57
     * @return array Advanced token stack.
58
     */
59 121
    private function getAdvancedTokens(): array
60
    {
61 121
        $tokens = [];
62
63 121
        foreach ($this->baseFile->getTokens() as $tokenPtr => $token) {
64 121
            $token['pointer'] = $tokenPtr;
65 121
            $tokens[$tokenPtr] = $token;
66
        }
67
68 121
        return $tokens;
69
    }
70
71
    /**
72
     * Records a fixable error against a specific token in the file.
73
     *
74
     * @param string $error The error message.
75
     * @param int $stackPtr The stack position where the error occurred.
76
     * @param string $code A violation code unique to the sniff message.
77
     * @param array $data Replacements for the error message.
78
     * @param int $severity The severity level for this error.
79
     *                      A value of 0 will be converted into the default severity level.
80
     *
81
     * @return bool Returns true if the error was recorded and should be fixed.
82
     */
83 68
    public function addFixableError(
84
        string $error,
85
        int $stackPtr,
86
        string $code = '',
87
        array $data = [],
88
        int $severity = 0
89
    ): bool {
90 68
         return $this->baseFile->addFixableError($error, $stackPtr, $code, $data, $severity);
91
    }
92
93
    /**
94
     * Returns the token stack for this file.
95
     *
96
     * @return array Return array of token data
97
     */
98 121
    public function getTokens(): array
99
    {
100 121
        return $this->tokens;
101
    }
102
103
    /**
104
     * Returns the position of the previous specified token(s).
105
     *
106
     * If a value is specified, the previous token of the specified type(s)
107
     * containing the specified value will be returned.
108
     *
109
     * Returns -1 if no token can be found.
110
     *
111
     * @param array $types The type(s) of tokens to search for.
112
     * @param int $start The position to start searching from in the token stack.
113
     * @param int|null $end The end position to fail if no token is found.
114
     *        if not specified or null, end will default to the start of the token stack.
115
     * @param bool $exclude If true, find the previous token that are NOT of the types specified in $types.
116
     * @param string|null $value The value that the token(s) must be equal to.
117
     *        If value is omitted, tokens with any value will be returned.
118
     * @param bool $local If true, tokens outside the current statement will not be checked.
119
     *        IE. checking will stop at the previous semi-colon found.
120
     *
121
     * @return int Pointer to the found token
122
     *
123
     * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
124
     */
125 121 View Code Duplication
    public function findPrevious(
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
126
        array $types,
127
        int $start,
128
        $end = null,
129
        bool $exclude = false,
130
        $value = null,
131
        bool $local = false
132
    ): int {
133 121
        $pointer = $this->baseFile->findPrevious($types, $start, $end, $exclude, $value, $local);
134
135 121
        return $this->preparePointer($pointer);
136
    }
137
138
    /**
139
     * Records an error against a specific token in the file.
140
     *
141
     * @param string $error The error message.
142
     * @param int $stackPtr The stack position where the error occurred.
143
     * @param string $code A violation code unique to the sniff message.
144
     * @param array $data Replacements for the error message.
145
     * @param int $severity The severity level for this error. A value of 0
146
     *                      will be converted into the default severity level.
147
     * @param bool $fixable Can the error be fixed by the sniff?
148
     *
149
     * @return bool Returns true if setting the error was done or false
150
     *
151
     * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
152
     */
153 64
    public function addError(
154
        string $error,
155
        int $stackPtr,
156
        string $code = '',
157
        array $data = [],
158
        int $severity = 0,
159
        bool $fixable = false
160
    ): bool {
161 64
        return $this->baseFile->addError($error, $stackPtr, $code, $data, $severity, $fixable);
162
    }
163
164
    /**
165
     * Records an error against a specific line in the file.
166
     *
167
     * @param string $error The error message.
168
     * @param int $line The line on which the error occurred.
169
     * @param string $code A violation code unique to the sniff message.
170
     * @param array $data Replacements for the error message.
171
     * @param int $severity The severity level for this error. A value of 0
172
     *                      will be converted into the default severity level.
173
     *
174
     * @return bool Returns true of the error got recorded
175
     */
176 12
    public function addErrorOnLine(
177
        string $error,
178
        int $line,
179
        string $code = '',
180
        array $data = [],
181
        int $severity = 0
182
    ): bool {
183 12
        return $this->baseFile->addErrorOnLine($error, $line, $code, $data, $severity);
184
    }
185
186
    /**
187
     * Records a warning against a specific token in the file.
188
     *
189
     * @param string $warning The error message.
190
     * @param int $line The line on which the warning occurred.
191
     * @param string $code A violation code unique to the sniff message.
192
     * @param array $data Replacements for the warning message.
193
     * @param int $severity The severity level for this warning. A value of 0 will
194
     *                         will be converted into the default severity level.
195
     *
196
     * @return boolean Returns true if the warning got recorded
197
     */
198
    public function addWarningOnLine(
199
        $warning,
200
        $line,
201
        $code,
202
        $data = [],
203
        $severity = 0
204
    ):bool {
205
        return $this->baseFile->addWarningOnLine($warning, $line, $code, $data, $severity);
206
    }
207
208
    /**
209 113
     * Returns the position of the next specified token(s).
210
     *
211
     * If a value is specified, the next token of the specified type(s)
212
     * containing the specified value will be returned.
213
     *
214
     * Returns false if no token can be found.
215
     *
216
     * @param array $types The type(s) of tokens to search for.
217 113
     * @param int $start The position to start searching from in the
218
     *                   token stack.
219 113
     * @param int|null $end The end position to fail if no token is found. if not specified or null, end will default to
220
     *                 the end of the token stack.
221
     * @param bool $exclude If true, find the next token that is NOT of a type specified in $types.
222
     * @param string|null $value The value that the token(s) must be equal to.
223
     *                      If value is omitted, tokens with any value will be returned.
224
     * @param bool $local If true, tokens outside the current statement will not be checked. i.e., checking will stop
225
     *                    at the next semi-colon found.
226
     *
227
     * @return int Returns the pointer of the token or -1
228
     *
229 121
     * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
230
     */
231 121 View Code Duplication
    public function findNext(
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
232
        array $types,
233
        int $start,
234
        $end = null,
235
        bool $exclude = false,
236
        $value = null,
237
        bool $local = false
238
    ): int {
239 33
        $result = $this->baseFile->findNext($types, $start, $end, $exclude, $value, $local);
240
241 33
        return $this->preparePointer($result);
242
    }
243
244
    /**
245
     * Prepares given pointer result.
246
     *
247
     * @param int|bool $pointer Pointer of a token
248
     *
249 87
     * @return int Pointer or -1 when not found
250
     */
251 87
    public function preparePointer($pointer): int
252
    {
253
        return $pointer !== false ? $pointer : -1;
254
    }
255
256
    /**
257
     * Returns the Wrapped PHP_CodeSniffer_Fixer
258
     *
259
     * @return Fixer Returns the wrapped PHP_CodeSniffer_Fixer
260
     */
261
    public function getFixer(): Fixer
262
    {
263
        return $this->fixer;
264
    }
265
266
    /**
267
     * Returns the eol char of the file
268
     *
269
     * @return string Returns the EndOfLine-Character of the processed file
270
     */
271
    public function getEolChar(): string
272
    {
273
        return $this->baseFile->eolChar;
274
    }
275
}
276