Completed
Push — master ( 662a49...9d1eac )
by Дмитрий
9s
created

FileParser::parseTopDefinitions()   C

Complexity

Conditions 21
Paths 36

Size

Total Lines 66
Code Lines 44

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 44
CRAP Score 28.2437

Importance

Changes 0
Metric Value
cc 21
eloc 44
nc 36
nop 3
dl 0
loc 66
ccs 44
cts 59
cp 0.7458
crap 28.2437
rs 5.781
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * @author Patsura Dmitry https://github.com/ovr <[email protected]>
4
 */
5
6
namespace PHPSA\Definition;
7
8
use PHPSA\Compiler;
9
use PHPSA\Context;
10
use RuntimeException;
11
12
class FileParser
13
{
14
    /**
15
     * @var \PhpParser\Parser
16
     */
17
    protected $parser;
18
19
    /**
20
     * @var \PhpParser\NodeTraverser
21
     */
22
    protected $nodeTraverser;
23
24
    /**
25
     * @var Compiler
26
     */
27
    protected $compiler;
28
29
    /**
30
     * @var \PHPSA\Compiler\DefinitionVisitor
31
     */
32
    protected $definitionVisitor;
33
34
    /**
35
     * @param \PhpParser\Parser $parser
36
     * @param Compiler $compiler
37
     */
38 51
    public function __construct(\PhpParser\Parser $parser, Compiler $compiler)
39
    {
40 51
        $this->nodeTraverser = new \PhpParser\NodeTraverser();
41 51
        $this->nodeTraverser->addVisitor(new \PhpParser\NodeVisitor\NameResolver);
42 51
        $this->nodeTraverser->addVisitor(
43 51
            $this->definitionVisitor = new \PHPSA\Compiler\DefinitionVisitor($compiler)
44 51
        );
45
46 51
        $this->parser = $parser;
47 51
        $this->compiler = $compiler;
48 51
    }
49
50
    /**
51
     * @param string $filepath
52
     * @param Context $context
53
     * @throws RuntimeException when filepath is not readable
54
     */
55 51
    public function parserFile($filepath, Context $context)
56
    {
57 51
        $context->setFilepath($filepath);
58
59
        try {
60 51
            if (!is_readable($filepath)) {
61
                throw new RuntimeException('File ' . $filepath . ' is not readable');
62
            }
63
64 51
            $context->debug('<comment>Precompile: ' . $filepath . '.</comment>');
65
66 51
            $code = file_get_contents($filepath);
67 51
            $astTree = $this->parser->parse($code);
68
69 51
            $this->definitionVisitor->setFilePath($filepath);
70 51
            $this->nodeTraverser->traverse($astTree);
0 ignored issues
show
Bug introduced by
It seems like $astTree defined by $this->parser->parse($code) on line 67 can also be of type null; however, PhpParser\NodeTraverser::traverse() does only seem to accept array<integer,object<PhpParser\Node>>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
71
72 51
            $context->clear();
73 51
        } catch (\PhpParser\Error $e) {
74
            $context->syntaxError($e, $filepath);
75
        } catch (\Exception $e) {
76
            $context->output->writeln("<error>{$e->getMessage()}</error>");
77
        }
78 51
    }
79
}
80