mirror of
https://github.com/danog/psalm.git
synced 2024-11-26 12:24:49 +01:00
Fix #5020 - remove previous catch var assertions when assigning inside catch
This commit is contained in:
parent
75d1f79a3d
commit
5e75140ca5
@ -630,6 +630,10 @@ class Context
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is used after assignments to variables to remove any existing
|
||||
* items in $vars_in_scope that are now made redundant by an update to some data
|
||||
*/
|
||||
public function removeDescendents(
|
||||
string $remove_var_id,
|
||||
?Union $existing_type = null,
|
||||
|
@ -306,6 +306,14 @@ class TryAnalyzer
|
||||
)
|
||||
);
|
||||
|
||||
// removes dependent vars from $context
|
||||
$catch_context->removeDescendents(
|
||||
$catch_var_id,
|
||||
null,
|
||||
$catch_context->vars_in_scope[$catch_var_id],
|
||||
$statements_analyzer
|
||||
);
|
||||
|
||||
$catch_context->vars_possibly_in_scope[$catch_var_id] = true;
|
||||
|
||||
$location = new CodeLocation($statements_analyzer->getSource(), $catch->var);
|
||||
|
@ -732,6 +732,41 @@ class FunctionTemplateAssertTest extends TestCase
|
||||
}
|
||||
}'
|
||||
],
|
||||
'assertSameOnMemoizedMethodCall' => [
|
||||
'<?php
|
||||
function testValidUsername(): void {
|
||||
try {
|
||||
validateUsername("123");
|
||||
throw new Exception("Failed to throw exception for short username");
|
||||
} catch (Exception $e) {
|
||||
assertSame("a", $e->getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
validateUsername("invalid#1");
|
||||
} catch (Exception $e) {
|
||||
assertSame("b", $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-template ExpectedType
|
||||
* @psalm-param ExpectedType $expected
|
||||
* @psalm-param mixed $actual
|
||||
* @psalm-assert =ExpectedType $actual
|
||||
*/
|
||||
function assertSame($expected, $actual): void {
|
||||
if ($actual !== $expected) {
|
||||
throw new Exception("Bad");
|
||||
}
|
||||
}
|
||||
|
||||
function validateUsername(string $username): void {
|
||||
if (strlen($username) < 5) {
|
||||
throw new Exception("Username must be at least 5 characters long");
|
||||
}
|
||||
}'
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user