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 attribute tab completion Matcher.
18
 *
19
 * This matcher provides completion for properties of objects in the current
20
 * Context.
21
 *
22
 * @author Marc Garcia <markcial@gmail.com>
23
 */
24
class ObjectAttributesMatcher 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
            \array_keys(\get_class_vars(\get_class($object))),
56
            function ($var) use ($input) {
57
                return AbstractMatcher::startsWith($input, $var);
58
            }
59
        );
60
    }
61
 
62
    /**
63
     * {@inheritdoc}
64
     */
65
    public function hasMatched(array $tokens): bool
66
    {
67
        $token = \array_pop($tokens);
68
        $prevToken = \array_pop($tokens);
69
 
70
        switch (true) {
71
            case self::tokenIs($token, self::T_OBJECT_OPERATOR):
72
            case self::tokenIs($prevToken, self::T_OBJECT_OPERATOR):
73
                return true;
74
        }
75
 
76
        return false;
77
    }
78
}