Completed
Push — master ( ab7dfd...201082 )
by Shcherbak
02:27
created

FunctionCallPattern   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 102
Duplicated Lines 0 %

Coupling/Cohesion

Components 3
Dependencies 5

Test Coverage

Coverage 100%

Importance

Changes 3
Bugs 0 Features 1
Metric Value
wmc 13
c 3
b 0
f 1
lcom 3
cbo 5
dl 0
loc 102
ccs 35
cts 35
cp 1
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A withName() 0 4 1
A withParameters() 0 4 1
A outputFull() 0 4 1
A outputArguments() 0 4 1
D __invoke() 0 37 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 ArgumentsPattern
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 ArgumentsPattern $pattern
64
     * @return $this
65
     */
66 3
    public function withParameters(ArgumentsPattern $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
  }