Chris@0: Chris@0: */ Chris@0: class ObjectMethodsMatcher extends AbstractContextAwareMatcher 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 object operator Chris@0: array_pop($tokens); Chris@0: } Chris@0: $objectToken = array_pop($tokens); Chris@0: if (!is_array($objectToken)) { Chris@0: return array(); Chris@0: } Chris@0: $objectName = str_replace('$', '', $objectToken[1]); Chris@0: Chris@0: try { Chris@0: $object = $this->getVariable($objectName); Chris@0: } catch (InvalidArgumentException $e) { Chris@0: return array(); Chris@0: } Chris@0: Chris@0: if (!is_object($object)) { Chris@0: return array(); Chris@0: } Chris@0: Chris@0: return array_filter( Chris@0: get_class_methods($object), Chris@0: function ($var) use ($input) { Chris@0: return AbstractMatcher::startsWith($input, $var) && Chris@0: // also check that we do not suggest invoking a super method(__construct, __wakeup, …) Chris@0: !AbstractMatcher::startsWith('__', $var); 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($token, self::T_OBJECT_OPERATOR): Chris@0: case self::tokenIs($prevToken, self::T_OBJECT_OPERATOR): Chris@0: return true; Chris@0: } Chris@0: Chris@0: return false; Chris@0: } Chris@0: }