mirror of
https://github.com/danog/psalm.git
synced 2024-11-30 04:39:00 +01:00
Fix #110 - failure to eliminate false from array|false on isset
This commit is contained in:
parent
4619ef1390
commit
048d7f0142
@ -154,9 +154,19 @@ class TypeChecker
|
|||||||
|
|
||||||
$clauses[] = new Clause([$base => ['isset']]);
|
$clauses[] = new Clause([$base => ['isset']]);
|
||||||
|
|
||||||
foreach ($key_parts as $key_part_dim) {
|
if (count($key_parts)) {
|
||||||
|
$clauses[] = new Clause([$base => ['!false']]);
|
||||||
|
$clauses[] = new Clause([$base => ['!int']]);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($key_parts as $i => $key_part_dim) {
|
||||||
$base .= '[' . $key_part_dim . ']';
|
$base .= '[' . $key_part_dim . ']';
|
||||||
$clauses[] = new Clause([$base => ['isset']]);
|
$clauses[] = new Clause([$base => ['isset']]);
|
||||||
|
|
||||||
|
if ($i < count($key_parts) - 1) {
|
||||||
|
$clauses[] = new Clause([$base => ['!false']]);
|
||||||
|
$clauses[] = new Clause([$base => ['!int']]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$clauses[] = new Clause([$var => [$type]]);
|
$clauses[] = new Clause([$var => [$type]]);
|
||||||
|
@ -112,6 +112,30 @@ class IssetTest extends PHPUnit_Framework_TestCase
|
|||||||
$this->assertEquals('mixed', (string) $context->vars_in_scope['$foo[\'a\']']);
|
$this->assertEquals('mixed', (string) $context->vars_in_scope['$foo[\'a\']']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testIssetKeyedOffsetOrFalse()
|
||||||
|
{
|
||||||
|
$file_checker = new FileChecker(
|
||||||
|
'somefile.php',
|
||||||
|
$this->project_checker,
|
||||||
|
self::$parser->parse('<?php
|
||||||
|
/** @return void */
|
||||||
|
function takesString(string $str) {}
|
||||||
|
|
||||||
|
$bar = rand(0, 1) ? ["foo" => "bar"] : false;
|
||||||
|
|
||||||
|
if (isset($bar["foo"])) {
|
||||||
|
takesString($bar["foo"]);
|
||||||
|
}
|
||||||
|
')
|
||||||
|
);
|
||||||
|
$context = new Context();
|
||||||
|
$context->vars_in_scope['$foo'] = \Psalm\Type::getArray();
|
||||||
|
$file_checker->visitAndAnalyzeMethods($context);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user