Test Failed
Pull Request — master (#336)
by Sergei
24:39 queued 11:27
created

SqlParser::getNextPlaceholder()   B

Complexity

Conditions 10
Paths 3

Size

Total Lines 34
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 10
eloc 24
nc 3
nop 1
dl 0
loc 34
rs 7.6666
c 1
b 0
f 0

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Db\Pgsql;
6
7
use Yiisoft\Db\Syntax\SqlParser as BaseSqlParser;
0 ignored issues
show
Bug introduced by
The type Yiisoft\Db\Syntax\SqlParser was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
8
9
final class SqlParser extends BaseSqlParser
10
{
11
    public function getNextPlaceholder(int|null &$position = null): string|null
12
    {
13
        $result = null;
14
        $length = $this->length - 1;
15
16
        while ($this->position < $length) {
17
            $pos = $this->position++;
18
19
            match ($this->sql[$pos]) {
20
                ':' => ($word = $this->parseWord()) === ''
21
                    ? $this->skipChars(':')
22
                    : $result = ':' . $word,
23
                '"', "'" => $this->skipQuotedWithoutEscape($this->sql[$pos]),
24
                'e', 'E' => $this->sql[$this->position] === "'"
25
                    ? ++$this->position && $this->skipQuotedWithEscape("'")
26
                    : null,
27
                '$' => $this->skipQuotedWithDollar(),
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->skipQuotedWithDollar() targeting Yiisoft\Db\Pgsql\SqlParser::skipQuotedWithDollar() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
28
                '-' => $this->sql[$this->position] === '-'
29
                    ? ++$this->position && $this->skipToAfterChar("\n")
30
                    : null,
31
                '/' => $this->sql[$this->position] === '*'
32
                    ? ++$this->position && $this->skipToAfterString('*/')
33
                    : null,
34
                default => null,
35
            };
36
37
            if ($result !== null) {
38
                $position = $pos;
39
40
                return $result;
41
            }
42
        }
43
44
        return null;
45
    }
46
47
    /**
48
     * Skips dollar-quoted string.
49
     */
50
    private function skipQuotedWithDollar(): void
51
    {
52
        $pos = $this->position;
53
        $identifier = $this->parseIdentifier();
54
55
        if ($this->sql[$this->position] !== '$') {
56
            $this->position = $pos;
0 ignored issues
show
Bug Best Practice introduced by
The property position does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
57
            return;
58
        }
59
60
        ++$this->position;
61
62
        $this->skipToAfterString('$' . $identifier . '$');
63
    }
64
}
65