Chris@0: Chris@0: */ Chris@0: class ClassAttributesMatcher extends AbstractMatcher Chris@0: { Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getMatches(array $tokens, array $info = array()) Chris@0: { Chris@0: $input = $this->getInput($tokens); Chris@0: Chris@0: $firstToken = array_pop($tokens); Chris@0: if (self::tokenIs($firstToken, self::T_STRING)) { Chris@0: // second token is the nekudotayim operator Chris@0: array_pop($tokens); Chris@0: } Chris@0: Chris@0: $class = $this->getNamespaceAndClass($tokens); Chris@0: Chris@0: try { Chris@0: $reflection = new \ReflectionClass($class); Chris@0: } catch (\ReflectionException $re) { Chris@0: return array(); Chris@0: } Chris@0: Chris@0: $vars = array_merge( Chris@0: array_map( Chris@0: function ($var) { Chris@0: return '$' . $var; Chris@0: }, Chris@0: array_keys($reflection->getStaticProperties()) Chris@0: ), Chris@0: array_keys($reflection->getConstants()) Chris@0: ); Chris@0: Chris@0: return array_map( Chris@0: function ($name) use ($class) { Chris@0: return $class . '::' . $name; Chris@0: }, Chris@0: array_filter( Chris@0: $vars, Chris@0: function ($var) use ($input) { Chris@0: return AbstractMatcher::startsWith($input, $var); Chris@0: } Chris@0: ) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function hasMatched(array $tokens) Chris@0: { Chris@12: $token = array_pop($tokens); Chris@0: $prevToken = array_pop($tokens); Chris@0: Chris@0: switch (true) { Chris@0: case self::tokenIs($prevToken, self::T_DOUBLE_COLON) && self::tokenIs($token, self::T_STRING): Chris@0: case self::tokenIs($token, self::T_DOUBLE_COLON): Chris@0: return true; Chris@0: } Chris@0: Chris@0: return false; Chris@0: } Chris@0: }