From 60732d00baf74e89ae8cad44ecbc3d953555c413 Mon Sep 17 00:00:00 2001 From: orklah Date: Mon, 3 Jan 2022 23:21:59 +0100 Subject: [PATCH 1/2] resolve ClassConstant for both sides in isContainedBy --- .../Type/Comparator/UnionTypeComparator.php | 34 ++++++------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php b/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php index bee00cdb7b1..30d174b42a9 100644 --- a/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php +++ b/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php @@ -84,27 +84,6 @@ public static function isContainedBy( continue; } - if ($input_type_part instanceof TClassConstant) { - $expanded = TypeExpander::expandAtomic( - $codebase, - $input_type_part, - $input_type_part->fq_classlike_name, - $input_type_part->fq_classlike_name, - null, - true, - true - ); - - if ($expanded instanceof Atomic) { - if (!$expanded instanceof TClassConstant) { - $input_atomic_types[] = $expanded; - continue; - } - } else { - $input_atomic_types = array_merge($expanded, $input_atomic_types); - continue; - } - } $type_match_found = false; $scalar_type_match_found = false; @@ -485,15 +464,22 @@ private static function getTypeParts( ): array { $atomic_types = []; foreach ($union_type->getAtomicTypes() as $atomic_type) { - if (!$atomic_type instanceof TTypeAlias) { + if (!$atomic_type instanceof TTypeAlias && !$atomic_type instanceof TClassConstant) { $atomic_types[] = $atomic_type; continue; } + + if ($atomic_type instanceof TTypeAlias) { + $fq_classlike_name = $atomic_type->declaring_fq_classlike_name; + } else { + $fq_classlike_name = $atomic_type->fq_classlike_name; + } + $expanded = TypeExpander::expandAtomic( $codebase, $atomic_type, - $atomic_type->declaring_fq_classlike_name, - $atomic_type->declaring_fq_classlike_name, + $fq_classlike_name, + $fq_classlike_name, null, true, true From 6905daedd760743addc96c2424888d184bdd74d6 Mon Sep 17 00:00:00 2001 From: orklah Date: Mon, 3 Jan 2022 23:30:36 +0100 Subject: [PATCH 2/2] handle the case where the expansion was not successful --- src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php b/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php index 30d174b42a9..f0303e362d5 100644 --- a/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php +++ b/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php @@ -485,7 +485,9 @@ private static function getTypeParts( true ); if ($expanded instanceof Atomic) { - $atomic_types[] = $expanded; + if (!$expanded instanceof TTypeAlias && !$expanded instanceof TClassConstant) { + $atomic_types[] = $expanded; + } continue; }