AbstractLineBeforeClassEnd::isValidBodyEndToken()   A
last analyzed

Complexity

Conditions 4
Paths 3

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 11
c 0
b 0
f 0
ccs 6
cts 6
cp 1
rs 9.2
cc 4
eloc 6
nc 3
nop 1
crap 4
1
<?php
2
3
  namespace Funivan\Cs\Tools\Php\LineBeforeClassEnd;
4
5
  use Funivan\Cs\FileTool\FileTool;
6
  use Funivan\Cs\Fs\File;
7
  use Funivan\Cs\Fs\FileFilter;
8
  use Funivan\PhpTokenizer\Collection;
9
  use Funivan\PhpTokenizer\Pattern\PatternMatcher;
10
  use Funivan\PhpTokenizer\Pattern\Patterns\ClassPattern;
11
  use Funivan\PhpTokenizer\Token;
12
13
  /**
14
   *
15
   */
16
  abstract class AbstractLineBeforeClassEnd implements FileTool {
17
18
    /**
19
     * @var int
20
     */
21
    private $linesNum = 1;
22
23
24
    /**
25
     * @param File $file
26
     * @return boolean
27
     */
28
    public function canProcess(File $file) {
29
      return (new FileFilter())->extension(['php'])->notDeleted()->isValid($file);
30
    }
31
32
33
    /**
34
     * @param int $linesNum
35
     * @return $this
36
     */
37 4
    public function setLinesNum($linesNum) {
38 4
      if (!is_int($linesNum) or $linesNum < 0) {
39
        throw new \InvalidArgumentException('Expect positive lines num');
40
      }
41 4
      $this->linesNum = $linesNum;
42 4
      return $this;
43
    }
44
45
46
    /**
47
     * @return int
48
     */
49 5
    public function getLinesNum() {
50 5
      return $this->linesNum;
51
    }
52
53
54
    /**
55
     * @param Collection $collection
56
     * @return Collection
57
     */
58 5
    protected function getInvalidTokens(Collection $collection) {
59
60 5
      $resultCollection = new Collection();
61 5
      $classBody = (new PatternMatcher($collection))->apply((new ClassPattern()))->getCollections();
62 5
      if (empty($classBody)) {
63
        return $resultCollection;
64
      }
65
66 5
      foreach ($classBody as $body) {
67 5
        if ($body->count() === 0) {
68
          continue;
69
        }
70
71 5
        $resultCollection->append($body->getLast());
72
      }
73
74
75 5
      foreach ($resultCollection as $index => $token) {
76 5
        if ($this->isValidBodyEndToken($token)) {
77 5
          $resultCollection->offsetUnset($index);
78
        }
79
      }
80
81 5
      $resultCollection->rewind();
82
83 5
      return $resultCollection;
84
    }
85
86
87
    /**
88
     * @param Token $token
89
     * @return bool
90
     */
91 5
    protected function isValidBodyEndToken(Token $token) {
92 5
      if (T_WHITESPACE !== $token->getType()) {
93 1
        return false;
94
      }
95
96 4
      if ($this->linesNum === 0 and strpos($token->getValue(), "\n") === false) {
97 1
        return true;
98
      }
99
100 3
      return ($this->linesNum === (count(explode("\n", $token->getValue())) - 2));
101
    }
102
103
  }