Subversion-Projekte lars-tiefland.laravel_shop

Revision

Revision 148 | Details | Vergleich mit vorheriger | 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
 *
200 lars 6
 * (c) 2012-2023 Justin Hileman
148 lars 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 class method tab completion Matcher.
16
 *
17
 * Given a namespace and class, this matcher provides completion for static
18
 * methods.
19
 *
20
 * @author Marc Garcia <markcial@gmail.com>
21
 */
22
class ClassMethodsMatcher extends AbstractMatcher
23
{
24
    /**
25
     * {@inheritdoc}
26
     */
27
    public function getMatches(array $tokens, array $info = []): array
28
    {
29
        $input = $this->getInput($tokens);
30
 
31
        $firstToken = \array_pop($tokens);
32
        if (self::tokenIs($firstToken, self::T_STRING)) {
33
            // second token is the nekudotayim operator
34
            \array_pop($tokens);
35
        }
36
 
37
        $class = $this->getNamespaceAndClass($tokens);
38
 
39
        try {
40
            $reflection = new \ReflectionClass($class);
41
        } catch (\ReflectionException $re) {
42
            return [];
43
        }
44
 
45
        if (self::needCompleteClass($tokens[1])) {
46
            $methods = $reflection->getMethods();
47
        } else {
48
            $methods = $reflection->getMethods(\ReflectionMethod::IS_STATIC);
49
        }
50
 
51
        $methods = \array_map(function (\ReflectionMethod $method) {
52
            return $method->getName();
53
        }, $methods);
54
 
55
        return \array_map(
56
            function ($name) use ($class) {
57
                $chunks = \explode('\\', $class);
58
                $className = \array_pop($chunks);
59
 
60
                return $className.'::'.$name;
61
            },
62
            \array_filter($methods, function ($method) use ($input) {
63
                return AbstractMatcher::startsWith($input, $method);
64
            })
65
        );
66
    }
67
 
68
    /**
69
     * {@inheritdoc}
70
     */
71
    public function hasMatched(array $tokens): bool
72
    {
73
        $token = \array_pop($tokens);
74
        $prevToken = \array_pop($tokens);
75
 
76
        switch (true) {
77
            case self::tokenIs($prevToken, self::T_DOUBLE_COLON) && self::tokenIs($token, self::T_STRING):
78
            case self::tokenIs($token, self::T_DOUBLE_COLON):
79
                return true;
80
        }
81
 
82
        return false;
83
    }
84
}