TranslateAnnotationVisitor   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 75
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 11
lcom 1
cbo 4
dl 0
loc 75
c 0
b 0
f 0
ccs 26
cts 26
cp 1
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A getTranslateDocParser() 0 13 2
B enterNode() 0 28 6
A leaveNode() 0 4 1
A beforeTraverse() 0 4 1
A afterTraverse() 0 4 1
1
<?php
2
3
/*
4
 * This file is part of the PHP Translation package.
5
 *
6
 * (c) PHP Translation team <[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 Translation\Extractor\Visitor\Php;
13
14
use Doctrine\Common\Annotations\DocParser;
15
use PhpParser\Comment;
16
use PhpParser\Node;
17
use PhpParser\NodeVisitor;
18
use Translation\Extractor\Annotation\Translate;
19
20
/**
21
 * Class TranslationAnnotationVisitor.
22
 *
23
 * Supports using @Translate annotation for marking string nodes to be added to the dictionary
24
 */
25
class TranslateAnnotationVisitor extends BasePHPVisitor implements NodeVisitor
26
{
27
    /** @var DocParser */
28
    protected $translateDocParser;
29
30 2
    private function getTranslateDocParser(): DocParser
31
    {
32 2
        if (null === $this->translateDocParser) {
33 2
            $this->translateDocParser = new DocParser();
34
35 2
            $this->translateDocParser->setImports([
36 2
                'translate' => Translate::class,
37
            ]);
38 2
            $this->translateDocParser->setIgnoreNotImportedAnnotations(true);
39
        }
40
41 2
        return $this->translateDocParser;
42
    }
43
44
    /**
45
     * {@inheritdoc}
46
     */
47 2
    public function enterNode(Node $node): ?Node
48
    {
49
        // look for strings
50 2
        if (!$node instanceof Node\Scalar\String_) {
51 2
            return null;
52
        }
53
54
        //look for string with comment
55 2
        $comments = $node->getAttribute('comments', []);
56 2
        if (!\count($comments)) {
57 2
            return null;
58
        }
59
60 2
        foreach ($comments as $comment) {
61 2
            if (!$comment instanceof Comment\Doc) {
62 2
                return null;
63
            }
64
65 2
            foreach ($this->getTranslateDocParser()->parse($comment->getText()) as $annotation) {
66
                //add phrase to dictionary
67 2
                $this->addLocation($node->value, $node->getAttribute('startLine'), $node, ['domain' => $annotation->getDomain()]);
68
69 2
                break;
70
            }
71
        }
72
73 2
        return null;
74
    }
75
76
    /**
77
     * {@inheritdoc}
78
     */
79 2
    public function leaveNode(Node $node): ?Node
80
    {
81 2
        return null;
82
    }
83
84
    /**
85
     * {@inheritdoc}
86
     */
87 2
    public function beforeTraverse(array $nodes): ?Node
88
    {
89 2
        return null;
90
    }
91
92
    /**
93
     * {@inheritdoc}
94
     */
95 2
    public function afterTraverse(array $nodes): ?Node
96
    {
97 2
        return null;
98
    }
99
}
100