1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-27 04:45:20 +01:00

Fix #314 - add a way to indicate @method list is comprehensive

This commit is contained in:
Matthew Brown 2018-04-22 00:40:30 -04:00
parent 1c7568e612
commit 2fabdf3353
6 changed files with 41 additions and 3 deletions

View File

@ -305,6 +305,10 @@ class CommentChecker
$info->sealed_properties = true;
}
if (isset($comments['specials']['psalm-seal-methods'])) {
$info->sealed_methods = true;
}
if (isset($comments['specials']['psalm-suppress'])) {
/** @var string $suppress_entry */
foreach ($comments['specials']['psalm-suppress'] as $suppress_entry) {

View File

@ -270,13 +270,13 @@ class MethodCallChecker extends \Psalm\Checker\Statements\Expression\CallChecker
$statements_checker->getSource()
)
) {
$has_valid_method_call_type = true;
$existent_method_ids[] = $method_id;
if ($var_id !== '$this') {
$class_storage = $project_checker->classlike_storage_provider->get($fq_class_name);
if (isset($class_storage->pseudo_methods[$method_name_lc])) {
$has_valid_method_call_type = true;
$existent_method_ids[] = $method_id;
$pseudo_method_storage = $class_storage->pseudo_methods[$method_name_lc];
if (self::checkFunctionArguments(
@ -316,9 +316,15 @@ class MethodCallChecker extends \Psalm\Checker\Statements\Expression\CallChecker
continue;
}
} elseif ($class_storage->sealed_methods) {
$non_existent_method_ids[] = $method_id;
continue;
}
}
$has_valid_method_call_type = true;
$existent_method_ids[] = $method_id;
$return_type = Type::getMixed();
continue;
}

View File

@ -30,6 +30,11 @@ class ClassLikeDocblockComment
*/
public $sealed_properties = false;
/**
* @var bool
*/
public $sealed_methods = false;
/**
* @var array<int, string>
*/

View File

@ -52,6 +52,11 @@ class ClassLikeStorage
*/
public $sealed_properties = false;
/**
* @var bool
*/
public $sealed_methods = false;
/**
* @var array<int, string>
*/

View File

@ -264,6 +264,7 @@ class DependencyFinderVisitor extends PhpParser\NodeVisitorAbstract implements P
$storage->deprecated = $docblock_info->deprecated;
$storage->sealed_properties = $docblock_info->sealed_properties;
$storage->sealed_methods = $docblock_info->sealed_methods;
$storage->suppressed_issues = $docblock_info->suppressed_issues;

View File

@ -1680,6 +1680,23 @@ class AnnotationTest extends TestCase
class Child extends Parent {}',
'error_message' => 'InvalidDocblock',
],
'magicMethodAnnotationWithSealed' => [
'<?php
class Parent {
public function __call() {}
}
/**
* @method string getString()
* @psalm-seal-methods
*/
class Child extends Parent {}
$child = new Child();
$child->getString();
$child->foo();',
'error_message' => 'UndefinedMethod - src/somefile.php:14 - Method Child::foo does not exist',
],
'magicMethodAnnotationInvalidArg' => [
'<?php
class Parent {