Test existence of registered arguments set referenced in expectedReturnValues/expectedArguments

This commit is contained in:
Kirill Smelov 2019-02-13 12:52:07 +03:00
parent 91358c9e6d
commit f79466e058
3 changed files with 41 additions and 14 deletions

View File

@ -196,7 +196,7 @@ namespace PHPSTORM_META {
expectedArguments(\FilesystemIterator::setFlags(), 0, \FilesystemIterator::CURRENT_MODE_MASK,\FilesystemIterator::CURRENT_AS_PATHNAME,\FilesystemIterator::CURRENT_AS_FILEINFO,\FilesystemIterator::CURRENT_AS_SELF,\FilesystemIterator::KEY_MODE_MASK,\FilesystemIterator::KEY_AS_PATHNAME,\FilesystemIterator::FOLLOW_SYMLINKS,\FilesystemIterator::KEY_AS_FILENAME,\FilesystemIterator::NEW_CURRENT_AND_KEY,\FilesystemIterator::SKIP_DOTS,\FilesystemIterator::UNIX_PATHS,\FilesystemIterator::OTHER_MODE_MASK);
egisterArgumentsSet("splFileObjectFlags", \SplFileObject::DROP_NEW_LINE|\SplFileObject::READ_AHEAD|\SplFileObject::SKIP_EMPTY|\SplFileObject::READ_CSV);
registerArgumentsSet("splFileObjectFlags", \SplFileObject::DROP_NEW_LINE|\SplFileObject::READ_AHEAD|\SplFileObject::SKIP_EMPTY|\SplFileObject::READ_CSV);
expectedArguments(\SplFileObject::setFlags(), 0, argumentsSet("splFileObjectFlags"));
expectedArguments(\SplDoublyLinkedList::setIteratorMode(), 0, \SplDoublyLinkedList::IT_MODE_LIFO|\SplDoublyLinkedList::IT_MODE_FIFO|\SplDoublyLinkedList::IT_MODE_DELETE|\SplDoublyLinkedList::IT_MODE_KEEP);
expectedArguments(\SplQueue::setIteratorMode(), 0, \SplDoublyLinkedList::IT_MODE_LIFO|\SplDoublyLinkedList::IT_MODE_FIFO|\SplDoublyLinkedList::IT_MODE_DELETE|\SplDoublyLinkedList::IT_MODE_KEEP);

View File

@ -20,10 +20,18 @@ class MetaExpectedArgumentsCollector extends NodeVisitorAbstract
* @var ExpectedFunctionArgumentsInfo[]
*/
private $expectedArgumentsInfos;
/**
* @var String[]
*/
private $registeredArgumentsSet;
public function __construct()
{
$this->expectedArgumentsInfos = array();
$this->registeredArgumentsSet = array();
StubParser::processStubs($this, function (SplFileInfo $file) {
return $file->getFilename() === '.phpstorm.meta.php';
});
}
public function enterNode(Node $node)
@ -37,6 +45,8 @@ class MetaExpectedArgumentsCollector extends NodeVisitorAbstract
$args = $node->args;
if (count($args) < 2) throw new RuntimeException('Expected at least 2 arguments for registerArgumentsSet call');
$this->expectedArgumentsInfos[] = $this->getExpectedArgumentsInfo(null, array_slice($args, 1));
$name = $args[0]->value->value;
$this->registeredArgumentsSet[$name] = $name;
} else if ((string)$node->name === self::EXPECTED_RETURN_VALUES) {
$args = $node->args;
if (count($args) < 2) throw new RuntimeException('Expected at least 2 arguments for expectedReturnValues call');
@ -53,6 +63,14 @@ class MetaExpectedArgumentsCollector extends NodeVisitorAbstract
return $this->expectedArgumentsInfos;
}
/**
* @return String[]
*/
public function getRegisteredArgumentsSet(): array
{
return $this->registeredArgumentsSet;
}
/**
* @param Expr[] $expressions
* @return Expr[]
@ -71,18 +89,6 @@ class MetaExpectedArgumentsCollector extends NodeVisitorAbstract
return $result;
}
/**
* @return ExpectedFunctionArgumentsInfo[]
*/
public static function getMetaExpectedArguments(): array
{
$visitor = new MetaExpectedArgumentsCollector();
StubParser::processStubs($visitor, function (SplFileInfo $file) {
return $file->getFilename() === '.phpstorm.meta.php';
});
return $visitor->getExpectedArgumentsInfos();
}
/**
* @param Expr|null $functionReference
* @param $args

View File

@ -20,13 +20,19 @@ class StubsMetaExpectedArgumentsTest extends TestCase
* @var ExpectedFunctionArgumentsInfo[]
*/
private static $expectedArguments;
/**
* @var String[]
*/
private static $registeredArgumentsSet;
private static $functionsFqns;
private static $methodsFqns;
private static $constantsFqns;
public static function setUpBeforeClass()
{
self::$expectedArguments = MetaExpectedArgumentsCollector::getMetaExpectedArguments();
$argumentsCollector = new MetaExpectedArgumentsCollector();
self::$expectedArguments = $argumentsCollector->getExpectedArgumentsInfos();
self::$registeredArgumentsSet = $argumentsCollector->getRegisteredArgumentsSet();
$stubs = PhpStormStubsSingleton::getPhpStormStubs();
self::$functionsFqns = array_map(function (Model\PHPFunction $func) {
return self::toPresentableFqn((string)$func->name);
@ -104,6 +110,21 @@ class StubsMetaExpectedArgumentsTest extends TestCase
}
}
public function testRegisteredArgumentsSetExists()
{
foreach (self::$expectedArguments as $argument) {
foreach ($argument->getExpectedArguments() as $argumentsSet) {
if ($argumentsSet instanceof FuncCall && ((string)$argumentsSet->name) === 'argumentsSet') {
$args = $argumentsSet->args;
self::assertGreaterThanOrEqual(1, count($args), 'argumentsSet call should provide set name');
$name = $args[0]->value->value;
self::assertArrayHasKey($name, self::$registeredArgumentsSet, 'Can\'t find registered argument set: ' . $name);
}
}
}
}
public function testStringLiteralsSingleQuoted()
{
foreach (self::$expectedArguments as $argument) {