Chris@0: Chris@0: */ Chris@0: class ClassMethodsMatcher 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: $methods = $reflection->getMethods(\ReflectionMethod::IS_STATIC); Chris@0: $methods = array_map(function (\ReflectionMethod $method) { Chris@0: return $method->getName(); Chris@0: }, $methods); Chris@0: Chris@0: return array_map( Chris@0: function ($name) use ($class) { Chris@0: return $class . '::' . $name; Chris@0: }, Chris@0: array_filter($methods, function ($method) use ($input) { Chris@0: return AbstractMatcher::startsWith($input, $method); 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: }