From 1474340cf21cf687f09ecb733a86ab5ac3e1a0bb Mon Sep 17 00:00:00 2001 From: Bruce Weirdan Date: Sun, 20 Aug 2023 23:39:21 +0200 Subject: [PATCH] Fix crash on array access to undefined class --- .../Expression/Fetch/ArrayFetchAnalyzer.php | 4 +++- tests/ArrayAccessTest.php | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php index 5e30eb5029c..9c6d85d7639 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php @@ -1737,8 +1737,10 @@ private static function handleArrayAccessOnNamedObject( ?Union &$array_access_type, bool &$has_array_access ): void { + $codebase = $statements_analyzer->getCodebase(); if (strtolower($type->value) === 'simplexmlelement' - || $statements_analyzer->getCodebase()->classExtendsOrImplements($type->value, 'SimpleXMLElement') + || ($codebase->classExists($type->value) + && $codebase->classExtendsOrImplements($type->value, 'SimpleXMLElement')) ) { $call_array_access_type = new Union([new TNull(), new TNamedObject('SimpleXMLElement')]); } elseif (strtolower($type->value) === 'domnodelist' && $stmt->dim) { diff --git a/tests/ArrayAccessTest.php b/tests/ArrayAccessTest.php index d216ca7393a..2302b2661b6 100644 --- a/tests/ArrayAccessTest.php +++ b/tests/ArrayAccessTest.php @@ -1199,6 +1199,27 @@ function f($p): int { ', 'assertions' => ['$a===' => "array{1: 'b'}"], ], + 'noCrashOnUnknownClassArrayAccess' => [ + 'code' => <<<'PHP' + [], + 'ignored_issues' => ['UndefinedDocblockClass'], + ], ]; }