Completed
Push — master ( 1bff1a...f9631c )
by Shcherbak
02:38
created

FunctionCallPattern::__invoke()   D

Complexity

Conditions 9
Paths 14

Size

Total Lines 37
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 23
CRAP Score 9

Importance

Changes 3
Bugs 0 Features 1
Metric Value
c 3
b 0
f 1
dl 0
loc 37
ccs 23
cts 23
cp 1
rs 4.909
cc 9
eloc 21
nc 14
nop 1
crap 9
1
<?php
2
3
  namespace Funivan\PhpTokenizer\Pattern\Patterns;
4
5
  use Funivan\PhpTokenizer\Pattern\PatternMatcher;
6
  use Funivan\PhpTokenizer\Query\Query;
7
  use Funivan\PhpTokenizer\QuerySequence\QuerySequence;
8
9
  /**
10
   *
11
   */
12
  class FunctionCallPattern implements PatternInterface {
13
14
    const OUTPUT_FULL = 1;
15
16
    const OUTPUT_ARGUMENTS = 2;
17
18
    /**
19
     * @var Query|null
20
     */
21
    private $nameQuery;
22
23
    /**
24
     * @var ParametersPattern
25
     */
26
    private $parametersPattern;
27
28
    /**
29
     * @var int
30
     */
31
    private $outputType = self::OUTPUT_FULL;
32
33
34
    /**
35
     * @return $this
36
     */
37 3
    public function outputFull() {
38 3
      $this->outputType = self::OUTPUT_FULL;
39 3
      return $this;
40
    }
41
42
43
    /**
44
     * @return $this
45
     */
46 3
    public function outputArguments() {
47 3
      $this->outputType = self::OUTPUT_ARGUMENTS;
48 3
      return $this;
49
    }
50
51
52
    /**
53
     * @param Query $query
54
     * @return $this
55
     */
56 3
    public function withName(Query $query) {
57 3
      $this->nameQuery = $query;
58 3
      return $this;
59
    }
60
61
62
    /**
63
     * @param ParametersPattern $pattern
64
     * @return $this
65
     */
66 3
    public function withParameters(ParametersPattern $pattern) {
67 3
      $this->parametersPattern = $pattern;
68 3
      return $this;
69
    }
70
71
72
    /**
73
     * @inheritdoc
74
     */
75 12
    public function __invoke(QuerySequence $querySequence) {
76
77 12
      $name = $querySequence->strict(T_STRING);
78 12
      if ($this->nameQuery !== null and $this->nameQuery->isValid($name) === false) {
79 3
        return null;
80
      }
81
82 12
      $querySequence->possible(T_WHITESPACE);
83 12
      $arguments = $querySequence->section('(', ')');
84
85 12
      if (!$querySequence->isValid()) {
86 12
        return null;
87
      }
88
89 12
      $querySequence->moveToToken($name);
90 12
      $before = $querySequence->move(-1);
91 12
      if ($before->getType() === T_WHITESPACE) {
92 12
        $before = $querySequence->move(-1);
93 8
      }
94
95 12
      if (in_array($before->getValue(), ['::', 'function', '->'])) {
96 3
        return null;
97
      }
98
99 12
      if ($this->parametersPattern !== null) {
100 3
        $pattern = (new PatternMatcher($arguments))->apply($this->parametersPattern);
101 3
        if (count($pattern->getCollections()) === 0) {
102 3
          return null;
103
        }
104 2
      }
105
106 12
      if ($this->outputType === self::OUTPUT_ARGUMENTS) {
107 3
        return $arguments;
108
      }
109
110 9
      return $querySequence->getCollection()->extractByTokens($name, $arguments->getLast());
111
    }
112
113
  }