Chris@0: Chris@0: */ Chris@0: class ClassNamesMatcher 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: $class = $this->getNamespaceAndClass($tokens); Chris@0: if (strlen($class) > 0 && $class[0] === '\\') { Chris@0: $class = substr($class, 1, strlen($class)); Chris@0: } Chris@0: $quotedClass = preg_quote($class); Chris@0: Chris@0: return array_map( Chris@0: function ($className) use ($class) { Chris@0: // get the number of namespace separators Chris@0: $nsPos = substr_count($class, '\\'); Chris@0: $pieces = explode('\\', $className); Chris@0: //$methods = Mirror::get($class); Chris@0: return implode('\\', array_slice($pieces, $nsPos, count($pieces))); Chris@0: }, Chris@0: array_filter( Chris@0: get_declared_classes(), Chris@0: function ($className) use ($quotedClass) { Chris@0: return AbstractMatcher::startsWith($quotedClass, $className); 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@0: $token = array_pop($tokens); Chris@0: $prevToken = array_pop($tokens); Chris@0: Chris@0: $blacklistedTokens = array( Chris@0: self::T_INCLUDE, self::T_INCLUDE_ONCE, self::T_REQUIRE, self::T_REQUIRE_ONCE, Chris@0: ); Chris@0: Chris@0: switch (true) { Chris@0: case self::hasToken(array($blacklistedTokens), $token): Chris@0: case self::hasToken(array($blacklistedTokens), $prevToken): Chris@0: case is_string($token) && $token === '$': Chris@0: return false; Chris@0: case self::hasToken(array(self::T_NEW, self::T_OPEN_TAG, self::T_NS_SEPARATOR), $prevToken): Chris@0: case self::hasToken(array(self::T_NEW, self::T_OPEN_TAG, self::T_NS_SEPARATOR), $token): Chris@0: case self::hasToken(array(self::T_OPEN_TAG, self::T_VARIABLE), $token): Chris@0: case self::isOperator($token): Chris@0: return true; Chris@0: } Chris@0: Chris@0: return false; Chris@0: } Chris@0: }