From 0d7c5a2d8ec12e66cfc3a8f6f1b27d25365d3305 Mon Sep 17 00:00:00 2001 From: kkmuffme <11071985+kkmuffme@users.noreply.github.com> Date: Sat, 18 Nov 2023 11:03:17 +0100 Subject: [PATCH] Fix docblock mixed escape hatch revert https://github.com/vimeo/psalm/pull/7663 including previous from_docblock Mixed assignments, as the tests required 2 suppressions and created an escape hatch via mixed on higher psalm error levels, where mixed isn't reported, thus hiding potentially fatal bugs. It's still possible to run the validation of docblock docs though: a @var declaration that contains both possible types, to ensure later code won't escape any checks (and no @psalm-suppress needed at all) This is also a required preparation to fix some isset issues of https://github.com/vimeo/psalm/issues/9759 --- .../Type/NegatedAssertionReconciler.php | 4 +- .../Type/SimpleAssertionReconciler.php | 69 +++++-------------- .../Type/SimpleNegatedAssertionReconciler.php | 56 ++++----------- tests/TypeReconciliation/ConditionalTest.php | 2 +- tests/UnusedVariableTest.php | 15 ++-- 5 files changed, 44 insertions(+), 102 deletions(-) diff --git a/src/Psalm/Internal/Type/NegatedAssertionReconciler.php b/src/Psalm/Internal/Type/NegatedAssertionReconciler.php index af2b84b27..88be51f72 100644 --- a/src/Psalm/Internal/Type/NegatedAssertionReconciler.php +++ b/src/Psalm/Internal/Type/NegatedAssertionReconciler.php @@ -304,9 +304,7 @@ final class NegatedAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } return $existing_var_type; diff --git a/src/Psalm/Internal/Type/SimpleAssertionReconciler.php b/src/Psalm/Internal/Type/SimpleAssertionReconciler.php index 24041dfac..568d059f7 100644 --- a/src/Psalm/Internal/Type/SimpleAssertionReconciler.php +++ b/src/Psalm/Internal/Type/SimpleAssertionReconciler.php @@ -40,7 +40,6 @@ use Psalm\Type\Atomic\TCallableObject; use Psalm\Type\Atomic\TCallableString; use Psalm\Type\Atomic\TClassConstant; use Psalm\Type\Atomic\TClassString; -use Psalm\Type\Atomic\TEmptyMixed; use Psalm\Type\Atomic\TFalse; use Psalm\Type\Atomic\TFloat; use Psalm\Type\Atomic\TGenericObject; @@ -976,9 +975,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? new Union([new TEmptyMixed()]) - : Type::getNever(); + return Type::getNever(); } /** @@ -1071,9 +1068,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? new Union([new TEmptyMixed()]) - : Type::getNever(); + return Type::getNever(); } /** @@ -1165,9 +1160,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? new Union([new TEmptyMixed()]) - : Type::getNever(); + return Type::getNever(); } /** @@ -1244,9 +1237,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1329,9 +1320,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1414,9 +1403,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1489,9 +1476,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1582,9 +1567,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1702,9 +1685,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1760,9 +1741,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1832,9 +1811,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1895,9 +1872,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1939,9 +1914,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } return $intersection; @@ -2260,9 +2233,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -2375,9 +2346,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -2485,9 +2454,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -2725,9 +2692,7 @@ final class SimpleAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** diff --git a/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php b/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php index 06d654ec1..4fcdea909 100644 --- a/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php +++ b/src/Psalm/Internal/Type/SimpleNegatedAssertionReconciler.php @@ -141,9 +141,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler } } - return $existing_var_type->from_docblock - ? Type::getNull() - : Type::getNever(); + return Type::getNever(); } return Type::getNull(); @@ -507,9 +505,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -703,9 +699,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -785,9 +779,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -867,9 +859,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -924,9 +914,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler $failed_reconciliation = 2; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } if ($redundant) { @@ -1139,9 +1127,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1240,9 +1226,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1336,9 +1320,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1438,9 +1420,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1535,9 +1515,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1641,9 +1619,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1746,9 +1722,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** @@ -1818,9 +1792,7 @@ final class SimpleNegatedAssertionReconciler extends Reconciler $failed_reconciliation = Reconciler::RECONCILIATION_EMPTY; - return $existing_var_type->from_docblock - ? Type::getMixed() - : Type::getNever(); + return Type::getNever(); } /** diff --git a/tests/TypeReconciliation/ConditionalTest.php b/tests/TypeReconciliation/ConditionalTest.php index 926e2866b..ca69a70a3 100644 --- a/tests/TypeReconciliation/ConditionalTest.php +++ b/tests/TypeReconciliation/ConditionalTest.php @@ -80,7 +80,7 @@ class ConditionalTest extends TestCase } }', 'assertions' => [], - 'ignored_issues' => ['DocblockTypeContradiction'], + 'ignored_issues' => ['DocblockTypeContradiction', 'TypeDoesNotContainType'], ], 'notInstanceof' => [ 'code' => '