From be3010575d9ac015e15f5203a21f3e295ad55d66 Mon Sep 17 00:00:00 2001 From: Jack Worman Date: Fri, 26 May 2023 17:52:09 -0400 Subject: [PATCH] GH-9825 --- .../Expression/AssignmentAnalyzer.php | 18 ++++++---- tests/UnsupportedPropertyReferenceUsage.php | 35 +++++++++++++++++++ 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php index 509acb41ad0..76c7073c12e 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php @@ -981,17 +981,23 @@ public static function analyzeAssignmentRef( $context->references_to_external_scope[$lhs_var_id] = true; } if (strpos($rhs_var_id, '->') !== false) { - IssueBuffer::maybeAdd(new UnsupportedPropertyReferenceUsage( - new CodeLocation($statements_analyzer->getSource(), $stmt), - )); + IssueBuffer::maybeAdd( + new UnsupportedPropertyReferenceUsage( + new CodeLocation($statements_analyzer->getSource(), $stmt), + ), + $statements_analyzer->getSuppressedIssues(), + ); // Reference to object property, we always consider object properties to be an external scope for references // TODO handle differently so it's detected as unused if the object is unused? $context->references_to_external_scope[$lhs_var_id] = true; } if (strpos($rhs_var_id, '::') !== false) { - IssueBuffer::maybeAdd(new UnsupportedPropertyReferenceUsage( - new CodeLocation($statements_analyzer->getSource(), $stmt), - )); + IssueBuffer::maybeAdd( + new UnsupportedPropertyReferenceUsage( + new CodeLocation($statements_analyzer->getSource(), $stmt), + ), + $statements_analyzer->getSuppressedIssues(), + ); } $lhs_location = new CodeLocation($statements_analyzer->getSource(), $stmt->var); diff --git a/tests/UnsupportedPropertyReferenceUsage.php b/tests/UnsupportedPropertyReferenceUsage.php index e89939c51ed..f441ebb65dd 100644 --- a/tests/UnsupportedPropertyReferenceUsage.php +++ b/tests/UnsupportedPropertyReferenceUsage.php @@ -5,11 +5,30 @@ namespace Psalm\Tests; use Psalm\Tests\Traits\InvalidCodeAnalysisTestTrait; +use Psalm\Tests\Traits\ValidCodeAnalysisTestTrait; class UnsupportedPropertyReferenceUsage extends TestCase { + use ValidCodeAnalysisTestTrait; use InvalidCodeAnalysisTestTrait; + public function providerValidCodeParse(): iterable + { + return [ + 'can be suppressed' => [ + 'code' => <<<'PHP' + b; + PHP, + ], + ]; + } + public function providerInvalidCodeParse(): iterable { return [ @@ -53,6 +72,22 @@ public function __construct( 'error_levels' => [], 'php_version' => '8.1', ], + 'instance property, foreach assignment' => [ + 'code' => <<<'PHP' + b; + foreach ($a->b as &$b) { + $b = 4; // Fatal error + } + PHP, + 'error_message' => 'UnsupportedPropertyReferenceUsage', + 'error_levels' => [], + 'php_version' => '8.1', + ], ]; } }