BaseFunction   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 84
Duplicated Lines 0 %

Test Coverage

Coverage 82.76%

Importance

Changes 1
Bugs 1 Features 0
Metric Value
eloc 25
c 1
b 1
f 0
dl 0
loc 84
ccs 24
cts 29
cp 0.8276
rs 10
wmc 15

7 Methods

Rating   Name   Duplication   Size   Complexity  
A feedParserWithNodes() 0 10 4
A addNodeMapping() 0 3 1
A setFunctionPrototype() 0 3 1
A parse() 0 10 4
A getSql() 0 8 3
A customizeFunction() 0 2 1
A customiseFunction() 0 4 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;
6
7
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
8
use Doctrine\ORM\Query\AST\Node;
9
use Doctrine\ORM\Query\Lexer;
10
use Doctrine\ORM\Query\Parser;
11
use Doctrine\ORM\Query\SqlWalker;
12
use Doctrine\ORM\Query\TokenType;
13
use MartinGeorgiev\Utils\DoctrineOrm;
14
15
/**
16
 * @since 0.1
17
 *
18
 * @author Martin Georgiev <[email protected]>
19
 */
20
abstract class BaseFunction extends FunctionNode
21
{
22
    protected string $functionPrototype;
23
24
    /**
25
     * @var list<string>
0 ignored issues
show
Bug introduced by
The type MartinGeorgiev\Doctrine\...uery\AST\Functions\list 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...
26
     */
27
    protected array $nodesMapping = [];
28
29
    /**
30
     * @var list<Node|null>
31
     */
32
    protected array $nodes = [];
33
34
    /**
35
     * This method is meant for internal use only, and it is not suggested that the forks of the library depend on it.
36
     * It will be made abstract from version 3.0.
37
     *
38
     * @internal
39
     *
40
     * @see customiseFunction()
41
     */
42
    /* abstract */
43
    protected function customizeFunction(): void
44
    {
45
        // Void
46
    }
47
48
    /**
49
     * @deprecated
50
     */
51
    protected function customiseFunction(): void
52
    {
53
        \trigger_error('The internal-use method of `customiseFunction()` is deprecated and is now renamed to `customizeFunction()`. `customiseFunction()` will be removed from version 3.0 onwards.', E_USER_DEPRECATED);
54
        $this->customizeFunction();
55
    }
56
57 181
    protected function setFunctionPrototype(string $functionPrototype): void
58
    {
59 181
        $this->functionPrototype = $functionPrototype;
60
    }
61
62 79
    protected function addNodeMapping(string $parserMethod): void
63
    {
64 79
        $this->nodesMapping[] = $parserMethod;
65
    }
66
67 174
    public function parse(Parser $parser): void
68
    {
69 174
        $shouldUseLexer = DoctrineOrm::isPre219();
70
71 174
        $this->customizeFunction();
72
73 174
        $parser->match($shouldUseLexer ? Lexer::T_IDENTIFIER : TokenType::T_IDENTIFIER);
0 ignored issues
show
Bug introduced by
The constant Doctrine\ORM\Query\Lexer::T_IDENTIFIER was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
74 174
        $parser->match($shouldUseLexer ? Lexer::T_OPEN_PARENTHESIS : TokenType::T_OPEN_PARENTHESIS);
0 ignored issues
show
Bug introduced by
The constant Doctrine\ORM\Query\Lexer::T_OPEN_PARENTHESIS was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
75 174
        $this->feedParserWithNodes($parser);
76 122
        $parser->match($shouldUseLexer ? Lexer::T_CLOSE_PARENTHESIS : TokenType::T_CLOSE_PARENTHESIS);
0 ignored issues
show
Bug introduced by
The constant Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
77
    }
78
79
    /**
80
     * Feeds given parser with previously set nodes.
81
     */
82 74
    protected function feedParserWithNodes(Parser $parser): void
83
    {
84 74
        $nodesMappingCount = \count($this->nodesMapping);
85 74
        $lastNode = $nodesMappingCount - 1;
86 74
        for ($i = 0; $i < $nodesMappingCount; $i++) {
87 74
            $parserMethod = $this->nodesMapping[$i];
88
            // @phpstan-ignore-next-line
89 74
            $this->nodes[$i] = $parser->{$parserMethod}();
90 74
            if ($i < $lastNode) {
91 48
                $parser->match(\class_exists(TokenType::class) ? TokenType::T_COMMA : Lexer::T_COMMA);
0 ignored issues
show
Bug introduced by
The constant Doctrine\ORM\Query\Lexer::T_COMMA was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
92
            }
93
        }
94
    }
95
96 76
    public function getSql(SqlWalker $sqlWalker): string
97
    {
98 76
        $dispatched = [];
99 76
        foreach ($this->nodes as $node) {
100 76
            $dispatched[] = $node instanceof Node ? $node->dispatch($sqlWalker) : 'null';
101
        }
102
103 76
        return \vsprintf($this->functionPrototype, $dispatched);
104
    }
105
}
106