1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-30 04:39:00 +01:00

Improve trait method mismatch failure rules

This commit is contained in:
Matthew Brown 2020-01-16 22:36:30 -05:00
parent 17857163fc
commit 257ebfd205
2 changed files with 36 additions and 2 deletions

View File

@ -594,6 +594,8 @@ class MethodAnalyzer extends FunctionLikeAnalyzer
if (!$is_contained_by) { if (!$is_contained_by) {
if ($guide_classlike_storage->is_trait === $implementer_classlike_storage->is_trait if ($guide_classlike_storage->is_trait === $implementer_classlike_storage->is_trait
|| !in_array($guide_classlike_storage->name, $implementer_classlike_storage->used_traits)
|| $implementer_method_storage->defining_fqcln !== $implementer_classlike_storage->name
|| (!$implementer_method_storage->abstract || (!$implementer_method_storage->abstract
&& !$guide_method_storage->abstract) && !$guide_method_storage->abstract)
) { ) {
@ -912,6 +914,8 @@ class MethodAnalyzer extends FunctionLikeAnalyzer
); );
if (!$is_contained_by) { if (!$is_contained_by) {
if ($guide_classlike_storage->is_trait === $implementer_classlike_storage->is_trait if ($guide_classlike_storage->is_trait === $implementer_classlike_storage->is_trait
|| !in_array($guide_classlike_storage->name, $implementer_classlike_storage->used_traits)
|| $implementer_method_storage->defining_fqcln !== $implementer_classlike_storage->name
|| (!$implementer_method_storage->abstract || (!$implementer_method_storage->abstract
&& !$guide_method_storage->abstract) && !$guide_method_storage->abstract)
) { ) {

View File

@ -885,7 +885,7 @@ class MethodSignatureTest extends TestCase
class B extends A { class B extends A {
use T; use T;
}', }',
'error_message' => 'TraitMethodSignatureMismatch', 'error_message' => 'MethodSignatureMismatch',
], ],
'abstractTraitMethodWithDifferentReturnType' => [ 'abstractTraitMethodWithDifferentReturnType' => [
'<?php '<?php
@ -918,7 +918,7 @@ class MethodSignatureTest extends TestCase
class B extends A { class B extends A {
use T; use T;
}', }',
'error_message' => 'TraitMethodSignatureMismatch', 'error_message' => 'MethodSignatureMismatch',
], ],
'abstractTraitMethodWithDifferentParamType' => [ 'abstractTraitMethodWithDifferentParamType' => [
'<?php '<?php
@ -1168,6 +1168,36 @@ class MethodSignatureTest extends TestCase
'error_message' => 'InvalidReturnType', 'error_message' => 'InvalidReturnType',
2 => ['InvalidParent'], 2 => ['InvalidParent'],
], ],
'regularMethodMismatchFromParentUse' => [
'<?php
trait T2 {
abstract public function test(int $x) : void;
}
abstract class P2 {
use T2;
}
class C2 extends P2 {
public function test(string $x) : void {}
}',
'error_message' => 'MethodSignatureMismatch',
],
'regularMethodMismatchFromChildUse' => [
'<?php
trait T3 {
abstract public function test(int $x) : void;
}
class P3 {
public function test(string $x) : void {}
}
class C3 extends P3 {
use T3;
}',
'error_message' => 'MethodSignatureMismatch',
],
]; ];
} }
} }