<?php
namespace phpDocumentor\Plugin\Core\Descriptor\Validator\Functions;
use phpDocumentor\Descriptor\Validator\Error;
use phpDocumentor\Reflection\BaseReflector;
use phpDocumentor\Reflection\DocBlock\Tag\ParamTag;
use phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\FunctionReflector\ArgumentReflector;
use phpDocumentor\Reflection\FunctionReflector;
use Psr\Log\LogLevel;
class AreAllArgumentsValid
{
public function validate($element)
{
$docBlock = $element->getDocBlock();
if (null === $docBlock) {
throw new \UnexpectedValueException(
'A DocBlock should be present (and validated) before this validator can be applied'
);
}
if ($docBlock->hasTag('return')) {
$returnTag = current($docBlock->getTagsByName('return'));
if ($returnTag->getType() == 'type') {
return new Error(LogLevel::WARNING, 'PPC:ERR-50017', $element->getLinenumber());
}
}
return null;
}
protected function validateArguments($element)
{
$params = $element->getDocBlock()->getTagsByName('param');
$arguments = $element->getArguments();
foreach (array_values($arguments) as $key => $argument) {
if (!$this->isArgumentInDocBlock($key, $argument, $element, $params)) {
continue;
}
$result = $this->doesArgumentNameMatchParam($params[$key], $argument, $element);
if ($result) {
return $result;
}
$result = $this->doesArgumentTypehintMatchParam($params[$key], $argument, $element);
if ($result) {
return $result;
}
}
foreach ($params as $param) {
$param_name = $param->getVariableName();
if (isset($arguments[$param_name])) {
continue;
}
return new Error(
LogLevel::NOTICE,
'PPC:ERR-50013',
$element->getLinenumber(),
array($param_name, $element->getName())
);
}
return null;
}
protected function isArgumentInDocBlock($index, ArgumentReflector $argument, BaseReflector $element, array $params)
{
if (isset($params[$index])) {
return null;
}
return new Error(
LogLevel::ERROR,
'PPC:ERR-50015',
$argument->getLinenumber(),
array($argument->getName(), $element->getName())
);
}
protected function doesArgumentNameMatchParam(ParamTag $param, ArgumentReflector $argument, BaseReflector $element)
{
$param_name = $param->getVariableName();
if ($param_name == $argument->getName()) {
return null;
}
if ($param_name == '') {
$param->setVariableName($argument->getName());
return null;
}
return new Error(
LogLevel::ERROR,
'PPC:ERR-50014',
$argument->getLinenumber(),
array($argument->getName(), $param_name, $element->getName())
);
}
protected function doesArgumentTypehintMatchParam(
ParamTag $param,
ArgumentReflector $argument,
BaseReflector $element
) {
if (!$argument->getType() || in_array($argument->getType(), $param->getTypes())) {
return null;
} elseif ($argument->getType() == 'array' && substr($param->getType(), -2) == '[]') {
return null;
}
return new Error(
LogLevel::ERROR,
'PPC:ERR-50016',
$argument->getLinenumber(),
array($argument->getName(), $element->getName())
);
}
}