From 580278d32356ebac804a670191c4436631cca28e Mon Sep 17 00:00:00 2001 From: AndrolGenhald Date: Thu, 17 Feb 2022 09:31:33 -0600 Subject: [PATCH 1/2] Fix some minor issues with references. References assigned to properties on `$this` should never be unused. Using a `@var` docblock before a reference should be allowed if it targets a variable instead of the assignment statement. --- .../Statements/Expression/AssignmentAnalyzer.php | 11 ++++++++++- tests/ReferenceTest.php | 10 ++++++++++ tests/UnusedVariableTest.php | 14 ++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php index 7ef3882ef2b..6746e0b9432 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php @@ -923,7 +923,7 @@ public static function analyzeAssignmentRef( ) ); } - if (!empty($var_comments)) { + if (!empty($var_comments) && $var_comments[0]->type !== null && $var_comments[0]->var_id === null) { IssueBuffer::maybeAdd( new InvalidDocblock( "Docblock type cannot be used for reference assignment", @@ -1004,6 +1004,15 @@ public static function analyzeAssignmentRef( : "property-assignment-as-reference" ); } + + if ($root_var_id === '$this') { + // Variables on `$this` are always used + $statements_analyzer->data_flow_graph->addPath( + $lhs_node, + new DataFlowNode('variable-use', 'variable use', null), + 'variable-use', + ); + } } if ($stmt->var instanceof ArrayDimFetch) { diff --git a/tests/ReferenceTest.php b/tests/ReferenceTest.php index af50a5ebee0..56569774505 100644 --- a/tests/ReferenceTest.php +++ b/tests/ReferenceTest.php @@ -247,6 +247,16 @@ function func(array &$a): void ', 'assertions' => [], ], + 'allowDocblockTypingOtherVariable' => [ + 'code' => ' [ + '$b' => 'string', + ], + ], ]; } diff --git a/tests/UnusedVariableTest.php b/tests/UnusedVariableTest.php index b536ad4dca2..a6767d8e200 100644 --- a/tests/UnusedVariableTest.php +++ b/tests/UnusedVariableTest.php @@ -2587,6 +2587,20 @@ function takesAnInt(): void { } }', ], + 'referenceInPropertyIsNotUnused' => [ + 'code' => 'bar = &$ref; + } + } + ', + ], ]; } From 8f710cc37f90c394043677aa21624d518941d44d Mon Sep 17 00:00:00 2001 From: AndrolGenhald Date: Thu, 17 Feb 2022 10:34:34 -0600 Subject: [PATCH 2/2] Fix crash when data_flow_graph is null. --- .../Analyzer/Statements/Expression/AssignmentAnalyzer.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php index 6746e0b9432..54ccb593688 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php @@ -988,7 +988,8 @@ public static function analyzeAssignmentRef( $context->vars_in_scope[$lhs_var_id]->parent_nodes[$lhs_node->id] = $lhs_node; - if (($stmt->var instanceof ArrayDimFetch || $stmt->var instanceof PropertyFetch) + if ($statements_analyzer->data_flow_graph !== null + && ($stmt->var instanceof ArrayDimFetch || $stmt->var instanceof PropertyFetch) && $stmt->var->var instanceof Variable && is_string($stmt->var->var->name) ) {