diff --git a/config.xsd b/config.xsd index 97e5401e1f9..634b3de26a1 100644 --- a/config.xsd +++ b/config.xsd @@ -410,7 +410,6 @@ - diff --git a/docs/running_psalm/issues.md b/docs/running_psalm/issues.md index dca69c9dda2..a57d76b9e4f 100644 --- a/docs/running_psalm/issues.md +++ b/docs/running_psalm/issues.md @@ -2,6 +2,7 @@ - [AbstractInstantiation](issues/AbstractInstantiation.md) - [AbstractMethodCall](issues/AbstractMethodCall.md) + - [AmbiguousConstantInheritance](issues/AmbiguousConstantInheritance.md) - [ArgumentTypeCoercion](issues/ArgumentTypeCoercion.md) - [AssignmentToVoid](issues/AssignmentToVoid.md) - [CircularReference](issues/CircularReference.md) @@ -93,6 +94,7 @@ - [InvalidToString](issues/InvalidToString.md) - [InvalidTraversableImplementation](issues/InvalidTraversableImplementation.md) - [InvalidTypeImport](issues/InvalidTypeImport.md) + - [LessSpecificClassConstantType](issues/LessSpecificClassConstantType.md) - [LessSpecificImplementedReturnType](issues/LessSpecificImplementedReturnType.md) - [LessSpecificReturnStatement](issues/LessSpecificReturnStatement.md) - [LessSpecificReturnType](issues/LessSpecificReturnType.md) @@ -153,6 +155,7 @@ - [NullPropertyAssignment](issues/NullPropertyAssignment.md) - [NullPropertyFetch](issues/NullPropertyFetch.md) - [NullReference](issues/NullReference.md) + - [OverriddenInterfaceConstant](issues/OverriddenInterfaceConstant.md) - [OverriddenMethodAccess](issues/OverriddenMethodAccess.md) - [OverriddenPropertyAccess](issues/OverriddenPropertyAccess.md) - [ParadoxicalCondition](issues/ParadoxicalCondition.md) diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/ClassConstAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/ClassConstAnalyzer.php index c924a776595..958c144f95b 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/ClassConstAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/ClassConstAnalyzer.php @@ -722,15 +722,14 @@ public static function analyze( ): void { foreach ($class_storage->constants as $const_name => $const_storage) { // Check covariance - /** @psalm-suppress PossiblyNullArrayAccess https://github.com/vimeo/psalm/issues/7151 */ [$parent_classlike_storage, $parent_const_storage] = self::getOverriddenConstant( $class_storage, $const_storage, $const_name, $codebase ); - /** @psalm-suppress RedundantConditionGivenDocblockType https://github.com/vimeo/psalm/issues/7151 */ if ($parent_const_storage !== null) { + assert($parent_classlike_storage !== null); $location = $const_storage->type_location ?? $const_storage->stmt_location; if ($location !== null && $const_storage->type !== null @@ -776,10 +775,7 @@ private static function getOverriddenConstant( if ($parent_const_storage !== null) { if ($const_storage->location && $const_storage !== $parent_const_storage - && ( - $codebase->php_major_version < 8 - || ($codebase->php_major_version === 8 && $codebase->php_minor_version < 1) - ) + && $codebase->analysis_php_version_id < 8_01_00 ) { $interface_overrides[strtolower($interface)] = new OverriddenInterfaceConstant( "{$class_storage->name}::{$const_name} cannot override constant from $interface", diff --git a/src/Psalm/Issue/AmbiguousConstantInheritance.php b/src/Psalm/Issue/AmbiguousConstantInheritance.php index 9064237cbb9..9da852f6b5b 100644 --- a/src/Psalm/Issue/AmbiguousConstantInheritance.php +++ b/src/Psalm/Issue/AmbiguousConstantInheritance.php @@ -1,4 +1,5 @@ type_param->getId($exact) . '>'; } diff --git a/tests/ConstantTest.php b/tests/ConstantTest.php index b3a6991cd62..ba15fb23a4f 100644 --- a/tests/ConstantTest.php +++ b/tests/ConstantTest.php @@ -1328,7 +1328,7 @@ function foo(array $arg): void {} ', ], 'classConstCovariant' => [ - ' ' [ - ' ' [ - ' ' 'InvalidReturnStatement', - [], - false, - '8.1', + 'ignored_issues' => [], + 'php_version' => '8.1', ], 'outOfScopeDefinedConstant' => [ 'code' => ' "InvalidConstantAssignmentValue", ], 'classConstContravariant' => [ - ' ' "LessSpecificClassConstantType", ], 'classConstAmbiguousInherit' => [ - ' ' 'AmbiguousConstantInheritance', ], 'overrideClassConstFromInterface' => [ - ' ' 'OverriddenInterfaceConstant', ], 'overrideClassConstFromInterfaceWithInterface' => [ - ' '