mirror of
https://github.com/danog/psalm.git
synced 2024-11-30 04:39:00 +01:00
handle return flag for a try/catch/finally (#4746)
* handle return flag for a try/catch/finally * add tests for psalter
This commit is contained in:
parent
0814f5d6ee
commit
feeaaeb03c
@ -444,6 +444,7 @@ class TryAnalyzer
|
||||
$context->loop_scope->final_actions[] = ScopeAnalyzer::ACTION_NONE;
|
||||
}
|
||||
|
||||
$finally_has_returned = false;
|
||||
if ($stmt->finally) {
|
||||
if ($try_context->finally_scope) {
|
||||
$finally_context = clone $context;
|
||||
@ -455,9 +456,7 @@ class TryAnalyzer
|
||||
|
||||
$statements_analyzer->analyze($stmt->finally->stmts, $finally_context);
|
||||
|
||||
if ($finally_context->has_returned) {
|
||||
$context->has_returned = true;
|
||||
}
|
||||
$finally_has_returned = $finally_context->has_returned;
|
||||
|
||||
/** @var string $var_id */
|
||||
foreach ($finally_context->assigned_var_ids as $var_id => $_) {
|
||||
@ -500,6 +499,9 @@ class TryAnalyzer
|
||||
}
|
||||
}
|
||||
|
||||
$body_has_returned = !in_array(ScopeAnalyzer::ACTION_NONE, $stmt_control_actions, true);
|
||||
$context->has_returned = ($body_has_returned && $all_catches_leave) || $finally_has_returned;
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -607,6 +607,38 @@ class ReturnTypeManipulationTest extends FileManipulationTest
|
||||
false,
|
||||
true,
|
||||
],
|
||||
'tryCatchReturn' => [
|
||||
'<?php
|
||||
function scope(){
|
||||
try{
|
||||
return func();
|
||||
}
|
||||
catch(Exception $e){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function func(): stdClass{
|
||||
return new stdClass();
|
||||
}',
|
||||
'<?php
|
||||
function scope(): ?stdClass{
|
||||
try{
|
||||
return func();
|
||||
}
|
||||
catch(Exception $e){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function func(): stdClass{
|
||||
return new stdClass();
|
||||
}',
|
||||
'7.3',
|
||||
['MissingReturnType'],
|
||||
false,
|
||||
true,
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user