1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-26 20:34:47 +01:00

Be better about dealing with byref args when not checking functions

This commit is contained in:
Matthew Brown 2017-02-15 01:47:03 -05:00
parent 8ae4bf6a18
commit 32dd5d5512
2 changed files with 44 additions and 18 deletions

View File

@ -121,18 +121,17 @@ class CallChecker
}
$method_id = null;
$function_params = null;
$in_call_map = false;
$is_stubbed = false;
$function_storage = null;
$code_location = new CodeLocation($statements_checker->getSource(), $stmt);
$defined_constants = [];
if ($context->check_functions) {
$in_call_map = false;
$is_stubbed = false;
$function_storage = null;
$function_params = null;
$code_location = new CodeLocation($statements_checker->getSource(), $stmt);
$defined_constants = [];
if ($stmt->name instanceof PhpParser\Node\Expr) {
if (ExpressionChecker::analyze($statements_checker, $stmt->name, $context) === false) {
@ -239,16 +238,18 @@ class CallChecker
);
}
}
}
if (self::checkFunctionArguments(
$statements_checker,
$stmt->args,
$function_params,
$context
) === false) {
// fall through
}
if (self::checkFunctionArguments(
$statements_checker,
$stmt->args,
$function_params,
$context
) === false) {
// fall through
}
if ($context->check_functions) {
$generic_params = null;
if ($stmt->name instanceof PhpParser\Node\Name && $method_id) {

View File

@ -456,4 +456,29 @@ class FunctionCallTest extends PHPUnit_Framework_TestCase
$file_checker->visitAndAnalyzeMethods($context);
$this->assertEquals('array<string, int>', (string) $context->vars_in_scope['$d']);
}
/**
* @return void
*/
public function testByRefAfterCallable()
{
Config::getInstance()->setCustomErrorLevel('MixedAssignment', Config::REPORT_SUPPRESS);
Config::getInstance()->setCustomErrorLevel('MixedArrayAccess', Config::REPORT_SUPPRESS);
$stmts = self::$parser->parse('<?php
/**
* @param callable $callback
* @return void
*/
function route($callback) {
if (!is_callable($callback)) { }
$a = preg_match("", "", $b);
if ($b[0]) {}
}
');
$file_checker = new FileChecker('somefile.php', $this->project_checker, $stmts);
$context = new Context();
$file_checker->visitAndAnalyzeMethods($context);
}
}