/** * @param bool $isDocumented * @param array $methods * @param ReflectionMethodMagic $method * @return bool */ private function canBeExtracted($isDocumented, array $methods, ReflectionMethodMagic $method) { if (isset($methods[$method->getName()])) { return FALSE; } if ($isDocumented && !$method->isDocumented()) { return FALSE; } return TRUE; }
/** * @param ReflectionMethodMagic $method * @param string $args */ private function attachMethodParameters(ReflectionMethodMagic $method, $args) { $parameters = []; foreach (array_filter(preg_split('~\\s*,\\s*~', $args)) as $position => $arg) { if (!preg_match(self::PATTERN_PARAMETER, $arg, $matches)) { // Wrong annotation format continue; } list(, $typeHint, $passedByReference, $name, $defaultValueDefinition) = $matches; $parameters[$name] = $this->reflectionFactory->createParameterMagic(['name' => $name, 'position' => $position, 'typeHint' => $typeHint, 'defaultValueDefinition' => $defaultValueDefinition, 'unlimited' => FALSE, 'passedByReference' => $passedByReference === '&', 'declaringFunction' => $method]); $method->addAnnotation('param', ltrim(sprintf('%s $%s', $typeHint, $name))); } $method->setParameters($parameters); }
/** * @return int */ public function getEndLine() { return $this->declaringFunction->getEndLine(); }
/** * Returns visible magic methods declared by inspected class. * * @return array */ public function getOwnMagicMethods() { if (null === $this->ownMagicMethods) { $this->ownMagicMethods = array(); if (!(self::$methodAccessLevels & InternalReflectionMethod::IS_PUBLIC) || false === $this->getDocComment()) { return $this->ownMagicMethods; } $annotations = $this->getAnnotation('method'); if (null === $annotations) { return $this->ownMagicMethods; } foreach ($annotations as $annotation) { if (!preg_match('~^(?:([\\w\\\\]+(?:\\|[\\w\\\\]+)*)\\s+)?(&)?\\s*(\\w+)\\s*\\(\\s*(.*)\\s*\\)\\s*(.*|$)~s', $annotation, $matches)) { // Wrong annotation format continue; } list(, $returnTypeHint, $returnsReference, $name, $args, $shortDescription) = $matches; $doc = $this->getDocComment(); $tmp = $annotation; if ($delimiter = strpos($annotation, "\n")) { $tmp = substr($annotation, 0, $delimiter); } $startLine = $this->getStartLine() + substr_count(substr($doc, 0, strpos($doc, $tmp)), "\n"); $endLine = $startLine + substr_count($annotation, "\n"); $method = new ReflectionMethodMagic(null, self::$generator); $method->setName($name)->setShortDescription(str_replace("\n", ' ', $shortDescription))->setStartLine($startLine)->setEndLine($endLine)->setReturnsReference('&' === $returnsReference)->setDeclaringClass($this)->addAnnotation('return', $returnTypeHint); $this->ownMagicMethods[$name] = $method; $parameters = array(); foreach (array_filter(preg_split('~\\s*,\\s*~', $args)) as $position => $arg) { if (!preg_match('~^(?:([\\w\\\\]+(?:\\|[\\w\\\\]+)*)\\s+)?(&)?\\s*\\$(\\w+)(?:\\s*=\\s*(.*))?($)~s', $arg, $matches)) { // Wrong annotation format continue; } list(, $typeHint, $passedByReference, $name, $defaultValueDefinition) = $matches; if (empty($typeHint)) { $typeHint = 'mixed'; } $parameter = new ReflectionParameterMagic(null, self::$generator); $parameter->setName($name)->setPosition($position)->setTypeHint($typeHint)->setDefaultValueDefinition($defaultValueDefinition)->setUnlimited(false)->setPassedByReference('&' === $passedByReference)->setDeclaringFunction($method); $parameters[$name] = $parameter; $method->addAnnotation('param', ltrim(sprintf('%s $%s', $typeHint, $name))); } $method->setParameters($parameters); } } return $this->ownMagicMethods; }