Completed
Push — master ( 801382...79583e )
by Konstantin
02:27
created

SplFileInfoPatch::nodeIsDirectoryIterator()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 1
Metric Value
c 2
b 0
f 1
dl 0
loc 7
rs 9.4285
cc 2
eloc 4
nc 2
nop 1
1
<?php
2
3
/*
4
 * This file is part of the Prophecy.
5
 * (c) Konstantin Kudryashov <[email protected]>
6
 *     Marcello Duarte <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Prophecy\Doubler\ClassPatch;
13
14
use Prophecy\Doubler\Generator\Node\ClassNode;
15
use Prophecy\Doubler\Generator\Node\MethodNode;
16
17
/**
18
 * SplFileInfo patch.
19
 * Makes SplFileInfo and derivative classes usable with Prophecy.
20
 *
21
 * @author Konstantin Kudryashov <[email protected]>
22
 */
23
class SplFileInfoPatch implements ClassPatchInterface
24
{
25
    /**
26
     * Supports everything that extends SplFileInfo.
27
     *
28
     * @param ClassNode $node
29
     *
30
     * @return bool
31
     */
32
    public function supports(ClassNode $node)
33
    {
34
        if (null === $node->getParentClass()) {
35
            return false;
36
        }
37
38
        return 'SplFileInfo' === $node->getParentClass()
39
            || is_subclass_of($node->getParentClass(), 'SplFileInfo')
40
        ;
41
    }
42
43
    /**
44
     * Updated constructor code to call parent one with dummy file argument.
45
     *
46
     * @param ClassNode $node
47
     */
48
    public function apply(ClassNode $node)
49
    {
50
        if ($node->hasMethod('__construct')) {
51
            $constructor = $node->getMethod('__construct');
52
        } else {
53
            $constructor = new MethodNode('__construct');
54
            $node->addMethod($constructor);
55
        }
56
57
        if ($this->nodeIsDirectoryIterator($node)) {
58
            $constructor->setCode('return parent::__construct("' . __DIR__ . '");');
59
60
            return;
61
        }
62
63
        if ($this->nodeIsSplFileObject($node)) {
64
            $constructor->setCode('return parent::__construct("' . __FILE__ .'");');
65
66
            return;
67
        }
68
69
        $constructor->useParentCode();
70
    }
71
72
    /**
73
     * Returns patch priority, which determines when patch will be applied.
74
     *
75
     * @return int Priority number (higher - earlier)
76
     */
77
    public function getPriority()
78
    {
79
        return 50;
80
    }
81
82
    /**
83
     * @param ClassNode $node
84
     * @return boolean
85
     */
86
    private function nodeIsDirectoryIterator(ClassNode $node)
87
    {
88
        $parent = $node->getParentClass();
89
90
        return 'DirectoryIterator' === $parent
91
            || is_subclass_of($parent, 'DirectoryIterator');
92
    }
93
94
    /**
95
     * @param ClassNode $node
96
     * @return boolean
97
     */
98
    private function nodeIsSplFileObject(ClassNode $node)
99
    {
100
        $parent = $node->getParentClass();
101
102
        return 'SplFileObject' === $parent
103
            || is_subclass_of($parent, 'SplFileObject');
104
    }
105
}
106