Subversion-Projekte lars-tiefland.laravel_shop

Revision

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
use InvalidArgumentException;
15
 
16
/**
17
 * An object method tab completion Matcher.
18
 *
19
 * This matcher provides completion for methods of objects in the current
20
 * Context.
21
 *
22
 * @author Marc Garcia <markcial@gmail.com>
23
 */
24
class ObjectMethodsMatcher extends AbstractContextAwareMatcher
25
{
26
    /**
27
     * {@inheritdoc}
28
     */
29
    public function getMatches(array $tokens, array $info = []): array
30
    {
31
        $input = $this->getInput($tokens);
32
 
33
        $firstToken = \array_pop($tokens);
34
        if (self::tokenIs($firstToken, self::T_STRING)) {
35
            // second token is the object operator
36
            \array_pop($tokens);
37
        }
38
        $objectToken = \array_pop($tokens);
39
        if (!\is_array($objectToken)) {
40
            return [];
41
        }
42
        $objectName = \str_replace('$', '', $objectToken[1]);
43
 
44
        try {
45
            $object = $this->getVariable($objectName);
46
        } catch (InvalidArgumentException $e) {
47
            return [];
48
        }
49
 
50
        if (!\is_object($object)) {
51
            return [];
52
        }
53
 
54
        return \array_filter(
55
            \get_class_methods($object),
56
            function ($var) use ($input) {
57
                return AbstractMatcher::startsWith($input, $var) &&
58
                    // also check that we do not suggest invoking a super method(__construct, __wakeup, …)
59
                    !AbstractMatcher::startsWith('__', $var);
60
            }
61
        );
62
    }
63
 
64
    /**
65
     * {@inheritdoc}
66
     */
67
    public function hasMatched(array $tokens): bool
68
    {
69
        $token = \array_pop($tokens);
70
        $prevToken = \array_pop($tokens);
71
 
72
        switch (true) {
73
            case self::tokenIs($token, self::T_OBJECT_OPERATOR):
74
            case self::tokenIs($prevToken, self::T_OBJECT_OPERATOR):
75
                return true;
76
        }
77
 
78
        return false;
79
    }
80
}