Subversion-Projekte lars-tiefland.laravel_shop

Revision

Revision 200 | Zur aktuellen Revision | Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php
2
 
3
/*
4
 * This file is part of Psy Shell.
5
 *
6
 * (c) 2012-2022 Justin Hileman
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 Psy\TabCompletion\Matcher;
13
 
14
/**
15
 * A PHP keyword tab completion Matcher.
16
 *
17
 * This matcher provides completion for all function-like PHP keywords.
18
 *
19
 * @author Marc Garcia <markcial@gmail.com>
20
 */
21
class KeywordsMatcher extends AbstractMatcher
22
{
23
    protected $keywords = [
24
        'array', 'clone', 'declare', 'die', 'echo', 'empty', 'eval', 'exit', 'include',
25
        'include_once', 'isset', 'list', 'print',  'require', 'require_once', 'unset',
26
    ];
27
 
28
    protected $mandatoryStartKeywords = [
29
        'die', 'echo', 'print', 'unset',
30
    ];
31
 
32
    /**
33
     * Get all (completable) PHP keywords.
34
     *
35
     * @return array
36
     */
37
    public function getKeywords(): array
38
    {
39
        return $this->keywords;
40
    }
41
 
42
    /**
43
     * Check whether $keyword is a (completable) PHP keyword.
44
     *
45
     * @param string $keyword
46
     *
47
     * @return bool
48
     */
49
    public function isKeyword(string $keyword): bool
50
    {
51
        return \in_array($keyword, $this->keywords);
52
    }
53
 
54
    /**
55
     * {@inheritdoc}
56
     */
57
    public function getMatches(array $tokens, array $info = []): array
58
    {
59
        $input = $this->getInput($tokens);
60
 
61
        return \array_filter($this->keywords, function ($keyword) use ($input) {
62
            return AbstractMatcher::startsWith($input, $keyword);
63
        });
64
    }
65
 
66
    /**
67
     * {@inheritdoc}
68
     */
69
    public function hasMatched(array $tokens): bool
70
    {
71
        $token = \array_pop($tokens);
72
        $prevToken = \array_pop($tokens);
73
 
74
        switch (true) {
75
            case self::hasToken([self::T_OPEN_TAG, self::T_VARIABLE], $token):
76
//            case is_string($token) && $token === '$':
77
            case self::hasToken([self::T_OPEN_TAG, self::T_VARIABLE], $prevToken) &&
78
                self::tokenIs($token, self::T_STRING):
79
            case self::isOperator($token):
80
                return true;
81
        }
82
 
83
        return false;
84
    }
85
}