Completed
Push — master ( 5289fb...a19420 )
by Shcherbak
02:04
created

FunctionCallPattern::withName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

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