mirror of
https://github.com/danog/psalm.git
synced 2024-11-26 20:34:47 +01:00
Prevent isset on uknown property in pure function
This commit is contained in:
parent
1ec0f35011
commit
5513fcdcff
@ -789,6 +789,26 @@ class InstancePropertyFetchAnalyzer
|
|||||||
$property_id = $context->self . '::$' . $prop_name;
|
$property_id = $context->self . '::$' . $prop_name;
|
||||||
} else {
|
} else {
|
||||||
if ($context->inside_isset || $context->collect_initializations) {
|
if ($context->inside_isset || $context->collect_initializations) {
|
||||||
|
$project_analyzer = $statements_analyzer->getProjectAnalyzer();
|
||||||
|
|
||||||
|
if ($context->pure) {
|
||||||
|
if (IssueBuffer::accepts(
|
||||||
|
new ImpurePropertyFetch(
|
||||||
|
'Cannot access a property on a mutable object from a pure context',
|
||||||
|
new CodeLocation($statements_analyzer, $stmt)
|
||||||
|
),
|
||||||
|
$statements_analyzer->getSuppressedIssues()
|
||||||
|
)) {
|
||||||
|
// fall through
|
||||||
|
}
|
||||||
|
} elseif ($codebase->alter_code
|
||||||
|
&& isset($project_analyzer->getIssuesToFix()['MissingPureAnnotation'])
|
||||||
|
&& $statements_analyzer->getSource()
|
||||||
|
instanceof \Psalm\Internal\Analyzer\FunctionLikeAnalyzer
|
||||||
|
) {
|
||||||
|
$statements_analyzer->getSource()->inferred_impure = true;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -670,6 +670,50 @@ class PureAnnotationTest extends TestCase
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}',
|
||||||
|
'error_message' => 'ImpurePropertyFetch',
|
||||||
|
],
|
||||||
|
'preventIssetOnMutableClassKnownProperty' => [
|
||||||
|
'<?php
|
||||||
|
namespace Bar;
|
||||||
|
|
||||||
|
class A {
|
||||||
|
public ?int $a;
|
||||||
|
|
||||||
|
public function __construct(?int $a) {
|
||||||
|
$this->a = $a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @psalm-pure */
|
||||||
|
function filterOdd(A $a) : bool {
|
||||||
|
if (isset($a->a)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}',
|
||||||
|
'error_message' => 'ImpurePropertyFetch',
|
||||||
|
],
|
||||||
|
'preventIssetOnMutableClassUnknownProperty' => [
|
||||||
|
'<?php
|
||||||
|
namespace Bar;
|
||||||
|
|
||||||
|
class A {
|
||||||
|
public ?int $a;
|
||||||
|
|
||||||
|
public function __construct(?int $a) {
|
||||||
|
$this->a = $a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @psalm-pure */
|
||||||
|
function filterOdd(A $a) : bool {
|
||||||
|
if (isset($a->b)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}',
|
}',
|
||||||
'error_message' => 'ImpurePropertyFetch',
|
'error_message' => 'ImpurePropertyFetch',
|
||||||
|
Loading…
Reference in New Issue
Block a user