refineParam(); $this->refineReturn(); } /** @inheritdoc */ protected function getContext() { if ($this->reflector instanceof ReflectionFunction) { return null; } return parent::getContext(); } /** * Convenience method to access the method parameters * * @return array */ public function getParameters() { return $this->getTag('param'); } /** * Convenience method to access the method return * * @return array */ public function getReturn() { return $this->getTag('return'); } /** * Parse the param tag into its components * * @return void */ protected function refineParam() { $result = []; // prefill from reflection foreach ($this->reflector->getParameters() as $parameter) { $refType = $parameter->getType(); $result[$parameter->getName()] = [ 'type' => new Type($refType ? $refType->getName() : 'string', $this->getContext()), 'optional' => $parameter->isOptional(), 'description' => '', ]; if ($parameter->isDefaultValueAvailable()) { $result[$parameter->getName()]['default'] = $parameter->getDefaultValue(); } } // refine from doc tags foreach ($this->tags['param'] ?? [] as $param) { [$type, $name, $description] = array_map('trim', sexplode(' ', $param, 3, '')); if ($name === '' || $name[0] !== '$') continue; $name = substr($name, 1); if (!isset($result[$name])) continue; // reflection says this param does not exist $result[$name]['type'] = new Type($type, $this->getContext()); $result[$name]['description'] = $description; } $this->tags['param'] = $result; } /** * Parse the return tag into its components * * @return void */ protected function refineReturn() { // prefill from reflection $refType = $this->reflector->getReturnType(); $result = [ 'type' => new Type($refType ? $refType->getName() : 'void', $this->getContext()), 'description' => '', ]; // refine from doc tag foreach ($this->tags['return'] ?? [] as $return) { [$type, $description] = array_map('trim', sexplode(' ', $return, 2, '')); $result['type'] = new Type($type, $this->getContext()); $result['description'] = $description; } $this->tags['return'] = $result; } }