GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Push — master ( 5cefd1...492078 )
by Anton
04:08
created

CodePointString::replace()   A

Complexity

Conditions 6
Paths 4

Size

Total Lines 19
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 10
nc 4
nop 2
dl 0
loc 19
c 1
b 0
f 0
cc 6
rs 9.2222
1
<?php
2
3
/*
4
 * This file is part of the Symfony package.
5
 *
6
 * (c) Fabien Potencier <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Symfony\Component\String;
13
14
use Symfony\Component\String\Exception\ExceptionInterface;
15
use Symfony\Component\String\Exception\InvalidArgumentException;
16
17
/**
18
 * Represents a string of Unicode code points encoded as UTF-8.
19
 *
20
 * @author Nicolas Grekas <[email protected]>
21
 * @author Hugo Hamon <[email protected]>
22
 *
23
 * @throws ExceptionInterface
24
 */
25
class CodePointString extends AbstractUnicodeString
26
{
27
    public function __construct(string $string = '')
28
    {
29
        if ('' !== $string && !preg_match('//u', $string)) {
30
            throw new InvalidArgumentException('Invalid UTF-8 string.');
31
        }
32
33
        $this->string = $string;
34
    }
35
36
    public function append(string ...$suffix): AbstractString
37
    {
38
        $str = clone $this;
39
        $str->string .= 1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix);
40
41
        if (!preg_match('//u', $str->string)) {
42
            throw new InvalidArgumentException('Invalid UTF-8 string.');
43
        }
44
45
        return $str;
46
    }
47
48
    public function chunk(int $length = 1): array
49
    {
50
        if (1 > $length) {
51
            throw new InvalidArgumentException('The chunk length must be greater than zero.');
52
        }
53
54
        if ('' === $this->string) {
55
            return [];
56
        }
57
58
        $rx = '/(';
59
        while (65535 < $length) {
60
            $rx .= '.{65535}';
61
            $length -= 65535;
62
        }
63
        $rx .= '.{'.$length.'})/us';
64
65
        $str = clone $this;
66
        $chunks = [];
67
68
        foreach (preg_split($rx, $this->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY) as $chunk) {
69
            $str->string = $chunk;
70
            $chunks[] = clone $str;
71
        }
72
73
        return $chunks;
74
    }
75
76
    public function codePointsAt(int $offset): array
77
    {
78
        $str = $offset ? $this->slice($offset, 1) : $this;
79
80
        return '' === $str->string ? [] : [mb_ord($str->string, 'UTF-8')];
81
    }
82
83
    public function endsWith($suffix): bool
84
    {
85
        if ($suffix instanceof AbstractString) {
86
            $suffix = $suffix->string;
87
        } elseif (\is_array($suffix) || $suffix instanceof \Traversable) {
88
            return parent::endsWith($suffix);
89
        } else {
90
            $suffix = (string) $suffix;
91
        }
92
93
        if ('' === $suffix || !preg_match('//u', $suffix)) {
94
            return false;
95
        }
96
97
        if ($this->ignoreCase) {
98
            return preg_match('{'.preg_quote($suffix).'$}iuD', $this->string);
0 ignored issues
show
Bug Best Practice introduced by
The expression return preg_match('{' . ...'$}iuD', $this->string) returns the type integer which is incompatible with the type-hinted return boolean.
Loading history...
99
        }
100
101
        return \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix));
102
    }
103
104
    public function equalsTo($string): bool
105
    {
106
        if ($string instanceof AbstractString) {
107
            $string = $string->string;
108
        } elseif (\is_array($string) || $string instanceof \Traversable) {
109
            return parent::equalsTo($string);
110
        } else {
111
            $string = (string) $string;
112
        }
113
114
        if ('' !== $string && $this->ignoreCase) {
115
            return \strlen($string) === \strlen($this->string) && 0 === mb_stripos($this->string, $string, 0, 'UTF-8');
116
        }
117
118
        return $string === $this->string;
119
    }
120
121
    public function indexOf($needle, int $offset = 0): ?int
122
    {
123
        if ($needle instanceof AbstractString) {
124
            $needle = $needle->string;
125
        } elseif (\is_array($needle) || $needle instanceof \Traversable) {
126
            return parent::indexOf($needle, $offset);
127
        } else {
128
            $needle = (string) $needle;
129
        }
130
131
        if ('' === $needle) {
132
            return null;
133
        }
134
135
        $i = $this->ignoreCase ? mb_stripos($this->string, $needle, $offset, 'UTF-8') : mb_strpos($this->string, $needle, $offset, 'UTF-8');
136
137
        return false === $i ? null : $i;
0 ignored issues
show
introduced by
The condition false === $i is always false.
Loading history...
138
    }
139
140
    public function indexOfLast($needle, int $offset = 0): ?int
141
    {
142
        if ($needle instanceof AbstractString) {
143
            $needle = $needle->string;
144
        } elseif (\is_array($needle) || $needle instanceof \Traversable) {
145
            return parent::indexOfLast($needle, $offset);
146
        } else {
147
            $needle = (string) $needle;
148
        }
149
150
        if ('' === $needle) {
151
            return null;
152
        }
153
154
        $i = $this->ignoreCase ? mb_strripos($this->string, $needle, $offset, 'UTF-8') : mb_strrpos($this->string, $needle, $offset, 'UTF-8');
155
156
        return false === $i ? null : $i;
0 ignored issues
show
introduced by
The condition false === $i is always false.
Loading history...
157
    }
158
159
    public function length(): int
160
    {
161
        return mb_strlen($this->string, 'UTF-8');
162
    }
163
164
    public function prepend(string ...$prefix): AbstractString
165
    {
166
        $str = clone $this;
167
        $str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string;
168
169
        if (!preg_match('//u', $str->string)) {
170
            throw new InvalidArgumentException('Invalid UTF-8 string.');
171
        }
172
173
        return $str;
174
    }
175
176
    public function replace(string $from, string $to): AbstractString
177
    {
178
        $str = clone $this;
179
180
        if ('' === $from || !preg_match('//u', $from)) {
181
            return $str;
182
        }
183
184
        if ('' !== $to && !preg_match('//u', $to)) {
185
            throw new InvalidArgumentException('Invalid UTF-8 string.');
186
        }
187
188
        if ($this->ignoreCase) {
189
            $str->string = implode($to, preg_split('{'.preg_quote($from).'}iuD', $this->string));
190
        } else {
191
            $str->string = str_replace($from, $to, $this->string);
192
        }
193
194
        return $str;
195
    }
196
197
    public function slice(int $start = 0, int $length = null): AbstractString
198
    {
199
        $str = clone $this;
200
        $str->string = mb_substr($this->string, $start, $length, 'UTF-8');
201
202
        return $str;
203
    }
204
205
    public function splice(string $replacement, int $start = 0, int $length = null): AbstractString
206
    {
207
        if (!preg_match('//u', $replacement)) {
208
            throw new InvalidArgumentException('Invalid UTF-8 string.');
209
        }
210
211
        $str = clone $this;
212
        $start = $start ? \strlen(mb_substr($this->string, 0, $start, 'UTF-8')) : 0;
213
        $length = $length ? \strlen(mb_substr($this->string, $start, $length, 'UTF-8')) : $length;
214
        $str->string = substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX);
215
216
        return $str;
217
    }
218
219
    public function split(string $delimiter, int $limit = null, int $flags = null): array
220
    {
221
        if (1 > $limit = $limit ?? \PHP_INT_MAX) {
222
            throw new InvalidArgumentException('Split limit must be a positive integer.');
223
        }
224
225
        if ('' === $delimiter) {
226
            throw new InvalidArgumentException('Split delimiter is empty.');
227
        }
228
229
        if (null !== $flags) {
230
            return parent::split($delimiter.'u', $limit, $flags);
0 ignored issues
show
Bug Best Practice introduced by
The expression return parent::split($de... . 'u', $limit, $flags) returns the type array<mixed,array|string> which is incompatible with the return type mandated by Symfony\Component\String\AbstractString::split() of array<mixed,Symfony\Comp...\String\AbstractString>.

In the issue above, the returned value is violating the contract defined by the mentioned interface.

Let's take a look at an example:

interface HasName {
    /** @return string */
    public function getName();
}

class Name {
    public $name;
}

class User implements HasName {
    /** @return string|Name */
    public function getName() {
        return new Name('foo'); // This is a violation of the ``HasName`` interface
                                // which only allows a string value to be returned.
    }
}
Loading history...
231
        }
232
233
        if (!preg_match('//u', $delimiter)) {
234
            throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.');
235
        }
236
237
        $str = clone $this;
238
        $chunks = $this->ignoreCase
239
            ? preg_split('{'.preg_quote($delimiter).'}iuD', $this->string, $limit)
240
            : explode($delimiter, $this->string, $limit);
241
242
        foreach ($chunks as &$chunk) {
243
            $str->string = $chunk;
244
            $chunk = clone $str;
245
        }
246
247
        return $chunks;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $chunks returns the type string[] which is incompatible with the return type mandated by Symfony\Component\String\AbstractString::split() of array<mixed,Symfony\Comp...\String\AbstractString>.

In the issue above, the returned value is violating the contract defined by the mentioned interface.

Let's take a look at an example:

interface HasName {
    /** @return string */
    public function getName();
}

class Name {
    public $name;
}

class User implements HasName {
    /** @return string|Name */
    public function getName() {
        return new Name('foo'); // This is a violation of the ``HasName`` interface
                                // which only allows a string value to be returned.
    }
}
Loading history...
248
    }
249
250
    public function startsWith($prefix): bool
251
    {
252
        if ($prefix instanceof AbstractString) {
253
            $prefix = $prefix->string;
254
        } elseif (\is_array($prefix) || $prefix instanceof \Traversable) {
255
            return parent::startsWith($prefix);
256
        } else {
257
            $prefix = (string) $prefix;
258
        }
259
260
        if ('' === $prefix || !preg_match('//u', $prefix)) {
261
            return false;
262
        }
263
264
        if ($this->ignoreCase) {
265
            return 0 === mb_stripos($this->string, $prefix, 0, 'UTF-8');
266
        }
267
268
        return 0 === strncmp($this->string, $prefix, \strlen($prefix));
269
    }
270
}
271