mirror of
https://github.com/danog/psalm.git
synced 2024-12-02 09:37:59 +01:00
Improve dead code detection a little more
This commit is contained in:
parent
7708e1c489
commit
8c653b0312
@ -70,7 +70,7 @@ class DoAnalyzer
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($do_context->hasVariable($var)) {
|
if (isset($do_context->vars_in_scope[$var])) {
|
||||||
if ($do_context->vars_in_scope[$var]->getId() !== $type->getId()) {
|
if ($do_context->vars_in_scope[$var]->getId() !== $type->getId()) {
|
||||||
$do_context->vars_in_scope[$var] = Type::combineUnionTypes($do_context->vars_in_scope[$var], $type);
|
$do_context->vars_in_scope[$var] = Type::combineUnionTypes($do_context->vars_in_scope[$var], $type);
|
||||||
}
|
}
|
||||||
|
@ -130,21 +130,19 @@ class ForAnalyzer
|
|||||||
$context->vars_possibly_in_scope = $pre_context->vars_possibly_in_scope;
|
$context->vars_possibly_in_scope = $pre_context->vars_possibly_in_scope;
|
||||||
}
|
}
|
||||||
|
|
||||||
$context->referenced_var_ids =
|
$context->referenced_var_ids = array_intersect_key(
|
||||||
$for_context->referenced_var_ids + $context->referenced_var_ids;
|
$for_context->referenced_var_ids,
|
||||||
|
$context->referenced_var_ids
|
||||||
|
);
|
||||||
|
|
||||||
if ($context->collect_references) {
|
if ($context->collect_references) {
|
||||||
$context->unreferenced_vars = array_intersect_key(
|
foreach ($for_context->unreferenced_vars as $var_id => $locations) {
|
||||||
$for_context->unreferenced_vars,
|
if (isset($context->unreferenced_vars[$var_id])) {
|
||||||
$context->unreferenced_vars
|
$context->unreferenced_vars[$var_id] += $locations;
|
||||||
);
|
} else {
|
||||||
|
$context->unreferenced_vars[$var_id] = $locations;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($context->collect_references) {
|
|
||||||
$context->unreferenced_vars = array_intersect_key(
|
|
||||||
$for_context->unreferenced_vars,
|
|
||||||
$context->unreferenced_vars
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($context->collect_exceptions) {
|
if ($context->collect_exceptions) {
|
||||||
|
@ -173,6 +173,7 @@ class ForeachAnalyzer
|
|||||||
|
|
||||||
if ($context->collect_references && !isset($foreach_context->byref_constraints[$key_var_id])) {
|
if ($context->collect_references && !isset($foreach_context->byref_constraints[$key_var_id])) {
|
||||||
$foreach_context->unreferenced_vars[$key_var_id] = [$location->getHash() => $location];
|
$foreach_context->unreferenced_vars[$key_var_id] = [$location->getHash() => $location];
|
||||||
|
unset($foreach_context->referenced_var_ids[$key_var_id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$statements_analyzer->hasVariable($key_var_id)) {
|
if (!$statements_analyzer->hasVariable($key_var_id)) {
|
||||||
@ -267,7 +268,7 @@ class ForeachAnalyzer
|
|||||||
$context->vars_possibly_in_scope
|
$context->vars_possibly_in_scope
|
||||||
);
|
);
|
||||||
|
|
||||||
$context->referenced_var_ids = array_merge(
|
$context->referenced_var_ids = array_intersect_key(
|
||||||
$foreach_context->referenced_var_ids,
|
$foreach_context->referenced_var_ids,
|
||||||
$context->referenced_var_ids
|
$context->referenced_var_ids
|
||||||
);
|
);
|
||||||
|
@ -189,7 +189,10 @@ class LoopAnalyzer
|
|||||||
* @var array<string, bool>
|
* @var array<string, bool>
|
||||||
*/
|
*/
|
||||||
$new_referenced_var_ids = $inner_context->referenced_var_ids;
|
$new_referenced_var_ids = $inner_context->referenced_var_ids;
|
||||||
$inner_context->referenced_var_ids = $old_referenced_var_ids + $inner_context->referenced_var_ids;
|
$inner_context->referenced_var_ids = array_intersect_key(
|
||||||
|
$old_referenced_var_ids,
|
||||||
|
$inner_context->referenced_var_ids
|
||||||
|
);
|
||||||
|
|
||||||
$recorded_issues = IssueBuffer::clearRecordingLevel();
|
$recorded_issues = IssueBuffer::clearRecordingLevel();
|
||||||
IssueBuffer::stopRecording();
|
IssueBuffer::stopRecording();
|
||||||
|
@ -22,7 +22,7 @@ function call(callable $gen) : Promise {}
|
|||||||
*/
|
*/
|
||||||
interface Promise {
|
interface Promise {
|
||||||
/**
|
/**
|
||||||
* @param callable(\Throwable|null $exception, TReturn|null $result):void
|
* @param callable(?\Throwable, ?TReturn):void $onResolved
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function onResolve(callable $onResolved);
|
function onResolve(callable $onResolved);
|
||||||
@ -39,7 +39,7 @@ class Success implements Promise {
|
|||||||
*/
|
*/
|
||||||
public function __construct($value = null) {}
|
public function __construct($value = null) {}
|
||||||
/**
|
/**
|
||||||
* @param callable(\Throwable|null $exception, TReturn|null $result):void
|
* @param callable(?Throwable, ?TReturn):void $onResolved
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function onResolve(callable $onResolved) {}
|
function onResolve(callable $onResolved) {}
|
||||||
|
@ -1588,6 +1588,46 @@ class UnusedVariableTest extends TestCase
|
|||||||
}',
|
}',
|
||||||
'error_message' => 'UnusedVariable',
|
'error_message' => 'UnusedVariable',
|
||||||
],
|
],
|
||||||
|
'detectUnusedVariableReassignedInIfFollowedByTryInsideForLoop' => [
|
||||||
|
'<?php
|
||||||
|
$user_id = 0;
|
||||||
|
$user = null;
|
||||||
|
|
||||||
|
if (rand(0, 1)) {
|
||||||
|
$user_id = rand(0, 1);
|
||||||
|
$user = $user_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($user) {
|
||||||
|
$a = 0;
|
||||||
|
for ($i = 1; $i <= 10; $i++) {
|
||||||
|
$a += $i;
|
||||||
|
try {} catch (\Exception $e) {}
|
||||||
|
}
|
||||||
|
echo $i;
|
||||||
|
}',
|
||||||
|
'error_message' => 'UnusedVariable',
|
||||||
|
],
|
||||||
|
'detectUnusedVariableReassignedInIfFollowedByTryInsideForeachLoop' => [
|
||||||
|
'<?php
|
||||||
|
$user_id = 0;
|
||||||
|
$user = null;
|
||||||
|
|
||||||
|
if (rand(0, 1)) {
|
||||||
|
$user_id = rand(0, 1);
|
||||||
|
$user = $user_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($user) {
|
||||||
|
$a = 0;
|
||||||
|
foreach ([1, 2, 3] as $i) {
|
||||||
|
$a += $i;
|
||||||
|
try {} catch (\Exception $e) {}
|
||||||
|
}
|
||||||
|
echo $i;
|
||||||
|
}',
|
||||||
|
'error_message' => 'UnusedVariable',
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user