Skip to content

Commit

Permalink
fix level of error when comparing lists of mixed
Browse files Browse the repository at this point in the history
  • Loading branch information
orklah committed Apr 3, 2023
1 parent 87d0854 commit 595f98a
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1025,7 +1025,13 @@ public static function verifyType(
IssueBuffer::maybeAdd(
new InvalidScalarArgument(
'Argument ' . ($argument_offset + 1) . $method_identifier . ' expects ' .
$param_type->getId() . ', but ' . $type . ' provided',
$param_type->getId() . ', but ' . $type
. ($union_comparison_results->missing_shape_fields
? ' with additional array shape fields ('
. implode(', ', $union_comparison_results->missing_shape_fields)
. ') was'
: '')
. ' provided',
$arg_location,
$cased_method_id,
),
Expand Down
56 changes: 52 additions & 4 deletions src/Psalm/Internal/Type/Comparator/KeyedArrayComparator.php
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public static function isContainedBy(
if ($atomic_comparison_result) {
$atomic_comparison_result->to_string_cast
= $atomic_comparison_result->to_string_cast === true
|| $property_type_comparison->to_string_cast === true;
|| $property_type_comparison->to_string_cast === true;
}
}
}
Expand Down Expand Up @@ -152,7 +152,23 @@ public static function isContainedBy(
if ($atomic_comparison_result) {
$atomic_comparison_result->type_coerced
= $key_type_comparison->type_coerced === true
&& $atomic_comparison_result->type_coerced !== false;
&& $atomic_comparison_result->type_coerced !== false;

$atomic_comparison_result->type_coerced_from_mixed
= $key_type_comparison->type_coerced_from_mixed === true
&& $atomic_comparison_result->type_coerced_from_mixed !== false;

$atomic_comparison_result->type_coerced_from_as_mixed
= $key_type_comparison->type_coerced_from_as_mixed === true
&& $atomic_comparison_result->type_coerced_from_as_mixed !== false;

$atomic_comparison_result->type_coerced_from_scalar
= $key_type_comparison->type_coerced_from_scalar === true
&& $atomic_comparison_result->type_coerced_from_scalar !== false;

$atomic_comparison_result->scalar_type_match_found
= $key_type_comparison->scalar_type_match_found === true
&& $atomic_comparison_result->scalar_type_match_found !== false;
}
$all_types_contain = false;
}
Expand All @@ -170,7 +186,23 @@ public static function isContainedBy(
if ($atomic_comparison_result) {
$atomic_comparison_result->type_coerced
= $property_type_comparison->type_coerced === true
&& $atomic_comparison_result->type_coerced !== false;
&& $atomic_comparison_result->type_coerced !== false;

$atomic_comparison_result->type_coerced_from_mixed
= $property_type_comparison->type_coerced_from_mixed === true
&& $atomic_comparison_result->type_coerced_from_mixed !== false;

$atomic_comparison_result->type_coerced_from_as_mixed
= $property_type_comparison->type_coerced_from_as_mixed === true
&& $atomic_comparison_result->type_coerced_from_as_mixed !== false;

$atomic_comparison_result->type_coerced_from_scalar
= $property_type_comparison->type_coerced_from_scalar === true
&& $atomic_comparison_result->type_coerced_from_scalar !== false;

$atomic_comparison_result->scalar_type_match_found
= $property_type_comparison->scalar_type_match_found === true
&& $atomic_comparison_result->scalar_type_match_found !== false;
}
$all_types_contain = false;
}
Expand Down Expand Up @@ -198,7 +230,23 @@ public static function isContainedBy(
if ($atomic_comparison_result) {
$atomic_comparison_result->type_coerced
= $param_comparison->type_coerced === true
&& $atomic_comparison_result->type_coerced !== false;
&& $atomic_comparison_result->type_coerced !== false;

$atomic_comparison_result->type_coerced_from_mixed
= $param_comparison->type_coerced_from_mixed === true
&& $atomic_comparison_result->type_coerced_from_mixed !== false;

$atomic_comparison_result->type_coerced_from_as_mixed
= $param_comparison->type_coerced_from_as_mixed === true
&& $atomic_comparison_result->type_coerced_from_as_mixed !== false;

$atomic_comparison_result->type_coerced_from_scalar
= $param_comparison->type_coerced_from_scalar === true
&& $atomic_comparison_result->type_coerced_from_scalar !== false;

$atomic_comparison_result->scalar_type_match_found
= $param_comparison->scalar_type_match_found === true
&& $atomic_comparison_result->scalar_type_match_found !== false;
}
$all_types_contain = false;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ public static function isContainedBy(
$union_comparison_result->scalar_type_match_found = false;
}

if ($some_missing_shape_fields && !$some_type_coerced && !$scalar_type_match_found) {
if ($some_missing_shape_fields) {
$union_comparison_result->missing_shape_fields = $some_missing_shape_fields;
}
}
Expand Down
16 changes: 16 additions & 0 deletions tests/ReturnTypeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1227,6 +1227,22 @@ function alwaysNull(): null {
'ignored_issues' => [],
'php_version' => '8.2',
],
'returnListMixedVsListStringIsAMixedError' => [
'code' => '<?php
/**
* @psalm-suppress MixedReturnTypeCoercion
* @return list<string>
*/
function foo(){
/**
* @var list<mixed>
* @psalm-suppress MixedReturnTypeCoercion
*/
return [];
}
',
],
];
}

Expand Down

0 comments on commit 595f98a

Please sign in to comment.