From 8364fef8b80da07bc2050d23cabe0bfaa8089080 Mon Sep 17 00:00:00 2001 From: Daniil Gentili Date: Wed, 26 Jul 2023 10:04:20 +0200 Subject: [PATCH] Fix intersection scanning --- src/Psalm/Internal/Codebase/ClassLikes.php | 34 ++++++++++++++++------ 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/Psalm/Internal/Codebase/ClassLikes.php b/src/Psalm/Internal/Codebase/ClassLikes.php index 696b0413ae1..15953d98755 100644 --- a/src/Psalm/Internal/Codebase/ClassLikes.php +++ b/src/Psalm/Internal/Codebase/ClassLikes.php @@ -2347,15 +2347,31 @@ public function addThreadData(array $thread_data): void $existing_classes, ] = $thread_data; - $this->existing_classlikes_lc = array_merge($existing_classlikes_lc, $this->existing_classlikes_lc); - $this->existing_classes_lc = array_merge($existing_classes_lc, $this->existing_classes_lc); - $this->existing_traits_lc = array_merge($existing_traits_lc, $this->existing_traits_lc); - $this->existing_traits = array_merge($existing_traits, $this->existing_traits); - $this->existing_enums_lc = array_merge($existing_enums_lc, $this->existing_enums_lc); - $this->existing_enums = array_merge($existing_enums, $this->existing_enums); - $this->existing_interfaces_lc = array_merge($existing_interfaces_lc, $this->existing_interfaces_lc); - $this->existing_interfaces = array_merge($existing_interfaces, $this->existing_interfaces); - $this->existing_classes = array_merge($existing_classes, $this->existing_classes); + $this->existing_classlikes_lc = self::mergeThreadData($existing_classlikes_lc, $this->existing_classlikes_lc); + $this->existing_classes_lc = self::mergeThreadData($existing_classes_lc, $this->existing_classes_lc); + $this->existing_traits_lc = self::mergeThreadData($existing_traits_lc, $this->existing_traits_lc); + $this->existing_traits = self::mergeThreadData($existing_traits, $this->existing_traits); + $this->existing_enums_lc = self::mergeThreadData($existing_enums_lc, $this->existing_enums_lc); + $this->existing_enums = self::mergeThreadData($existing_enums, $this->existing_enums); + $this->existing_interfaces_lc = self::mergeThreadData($existing_interfaces_lc, $this->existing_interfaces_lc); + $this->existing_interfaces = self::mergeThreadData($existing_interfaces, $this->existing_interfaces); + $this->existing_classes = self::mergeThreadData($existing_classes, $this->existing_classes); + } + + /** + * @template T as string|lowercase-string + * @param array $old + * @param array $new + * @return array + */ + private static function mergeThreadData(array $old, array $new): array + { + foreach ($new as $name => $value) { + if (!isset($old[$name]) || (!$old[$name] && $value)) { + $old[$name] = $value; + } + } + return $old; } public function getStorageFor(string $fq_class_name): ?ClassLikeStorage