From 200158e461ac8acbc317bf241c95be497d4669ce Mon Sep 17 00:00:00 2001 From: Alex Wells Date: Mon, 11 Jul 2022 02:51:22 +0300 Subject: [PATCH] Split method-signature-variance.php test stub into three different test cases --- .../MethodSignatureVarianceRuleTest.php | 197 +++++++++++------- ...ethod-signature-variance-contravariant.php | 75 +++++++ .../method-signature-variance-covariant.php | 75 +++++++ .../method-signature-variance-invariant.php | 75 +++++++ .../data/method-signature-variance.php | 189 ++--------------- 5 files changed, 369 insertions(+), 242 deletions(-) create mode 100644 tests/PHPStan/Rules/Generics/data/method-signature-variance-contravariant.php create mode 100644 tests/PHPStan/Rules/Generics/data/method-signature-variance-covariant.php create mode 100644 tests/PHPStan/Rules/Generics/data/method-signature-variance-invariant.php diff --git a/tests/PHPStan/Rules/Generics/MethodSignatureVarianceRuleTest.php b/tests/PHPStan/Rules/Generics/MethodSignatureVarianceRuleTest.php index 008a117cdd..4505e5a507 100644 --- a/tests/PHPStan/Rules/Generics/MethodSignatureVarianceRuleTest.php +++ b/tests/PHPStan/Rules/Generics/MethodSignatureVarianceRuleTest.php @@ -22,148 +22,201 @@ public function testRule(): void { $this->analyse([__DIR__ . '/data/method-signature-variance.php'], [ [ - 'Template type K is declared as contravariant, but occurs in covariant position in parameter b of method MethodSignatureVariance\B::a().', - 94, + 'Template type T is declared as covariant, but occurs in contravariant position in parameter a of method MethodSignatureVariance\C::a().', + 25, ], [ - 'Template type K is declared as contravariant, but occurs in covariant position in parameter d of method MethodSignatureVariance\B::a().', - 94, + 'Template type T is declared as covariant, but occurs in invariant position in parameter b of method MethodSignatureVariance\C::a().', + 25, ], [ - 'Template type K is declared as contravariant, but occurs in invariant position in parameter e of method MethodSignatureVariance\B::a().', - 94, + 'Template type T is declared as covariant, but occurs in contravariant position in parameter c of method MethodSignatureVariance\C::a().', + 25, ], [ - 'Template type K is declared as contravariant, but occurs in covariant position in parameter h of method MethodSignatureVariance\B::a().', - 94, + 'Template type W is declared as covariant, but occurs in contravariant position in parameter d of method MethodSignatureVariance\C::a().', + 25, ], [ - 'Template type K is declared as contravariant, but occurs in invariant position in parameter i of method MethodSignatureVariance\B::a().', - 94, + 'Variance annotation is only allowed for type parameters of classes and interfaces, but occurs in template type U in in method MethodSignatureVariance\C::b().', + 35, + ], + ]); + } + + public function testRuleInvariant(): void + { + $this->analyse([__DIR__ . '/data/method-signature-variance-invariant.php'], []); + } + + public function testRuleContravariant(): void + { + $this->analyse([__DIR__ . '/data/method-signature-variance-contravariant.php'], [ + [ + 'Template type K is declared as contravariant, but occurs in covariant position in parameter b of method MethodSignatureVarianceContravariant\A::a().', + 38, + ], + [ + 'Template type K is declared as contravariant, but occurs in covariant position in parameter d of method MethodSignatureVarianceContravariant\A::a().', + 38, + ], + [ + 'Template type K is declared as contravariant, but occurs in invariant position in parameter e of method MethodSignatureVarianceContravariant\A::a().', + 38, + ], + [ + 'Template type K is declared as contravariant, but occurs in invariant position in parameter f of method MethodSignatureVarianceContravariant\A::a().', + 38, ], [ - 'Template type K is declared as contravariant, but occurs in invariant position in parameter j of method MethodSignatureVariance\B::a().', - 94, + 'Template type K is declared as contravariant, but occurs in covariant position in parameter i of method MethodSignatureVarianceContravariant\A::a().', + 38, ], [ - 'Template type K is declared as contravariant, but occurs in invariant position in parameter k of method MethodSignatureVariance\B::a().', - 94, + 'Template type K is declared as contravariant, but occurs in invariant position in parameter j of method MethodSignatureVarianceContravariant\A::a().', + 38, ], [ - 'Template type K is declared as contravariant, but occurs in invariant position in parameter l of method MethodSignatureVariance\B::a().', - 94, + 'Template type K is declared as contravariant, but occurs in invariant position in parameter k of method MethodSignatureVarianceContravariant\A::a().', + 38, ], [ - 'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVariance\B::a().', - 94, + 'Template type K is declared as contravariant, but occurs in invariant position in parameter l of method MethodSignatureVarianceContravariant\A::a().', + 38, ], [ - 'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVariance\B::c().', - 100, + 'Template type K is declared as contravariant, but occurs in invariant position in parameter m of method MethodSignatureVarianceContravariant\A::a().', + 38, ], [ - 'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\B::e().', - 106, + 'Template type K is declared as contravariant, but occurs in invariant position in parameter n of method MethodSignatureVarianceContravariant\A::a().', + 38, ], [ - 'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVariance\B::f().', - 109, + 'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVarianceContravariant\A::a().', + 38, ], [ - 'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVariance\B::g().', - 112, + 'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVarianceContravariant\A::c().', + 44, ], [ - 'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\B::i().', - 118, + 'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVarianceContravariant\A::e().', + 50, ], [ - 'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\B::j().', - 121, + 'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVarianceContravariant\A::f().', + 53, ], [ - 'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\B::k().', - 124, + 'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVarianceContravariant\A::g().', + 56, ], [ - 'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\B::l().', - 127, + 'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVarianceContravariant\A::i().', + 62, + ], + [ + 'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVarianceContravariant\A::j().', + 65, + ], + [ + 'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVarianceContravariant\A::k().', + 68, + ], + [ + 'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVarianceContravariant\A::l().', + 71, + ], + [ + 'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVarianceContravariant\A::m().', + 74, + ], + ]); + } + + public function testRuleCovariant(): void + { + $this->analyse([__DIR__ . '/data/method-signature-variance-covariant.php'], [ + [ + 'Template type K is declared as covariant, but occurs in contravariant position in parameter a of method MethodSignatureVarianceCovariant\A::a().', + 38, ], [ - 'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\B::m().', - 130, + 'Template type K is declared as covariant, but occurs in contravariant position in parameter c of method MethodSignatureVarianceCovariant\A::a().', + 38, ], [ - 'Template type K is declared as covariant, but occurs in contravariant position in parameter a of method MethodSignatureVariance\C::a().', - 152, + 'Template type K is declared as covariant, but occurs in invariant position in parameter e of method MethodSignatureVarianceCovariant\A::a().', + 38, ], [ - 'Template type K is declared as covariant, but occurs in contravariant position in parameter c of method MethodSignatureVariance\C::a().', - 152, + 'Template type K is declared as covariant, but occurs in invariant position in parameter f of method MethodSignatureVarianceCovariant\A::a().', + 38, ], [ - 'Template type K is declared as covariant, but occurs in invariant position in parameter e of method MethodSignatureVariance\C::a().', - 152, + 'Template type K is declared as covariant, but occurs in contravariant position in parameter g of method MethodSignatureVarianceCovariant\A::a().', + 38, ], [ - 'Template type K is declared as covariant, but occurs in contravariant position in parameter f of method MethodSignatureVariance\C::a().', - 152, + 'Template type K is declared as covariant, but occurs in contravariant position in parameter h of method MethodSignatureVarianceCovariant\A::a().', + 38, ], [ - 'Template type K is declared as covariant, but occurs in contravariant position in parameter g of method MethodSignatureVariance\C::a().', - 152, + 'Template type K is declared as covariant, but occurs in invariant position in parameter j of method MethodSignatureVarianceCovariant\A::a().', + 38, ], [ - 'Template type K is declared as covariant, but occurs in invariant position in parameter i of method MethodSignatureVariance\C::a().', - 152, + 'Template type K is declared as covariant, but occurs in invariant position in parameter k of method MethodSignatureVarianceCovariant\A::a().', + 38, ], [ - 'Template type K is declared as covariant, but occurs in invariant position in parameter j of method MethodSignatureVariance\C::a().', - 152, + 'Template type K is declared as covariant, but occurs in invariant position in parameter l of method MethodSignatureVarianceCovariant\A::a().', + 38, ], [ - 'Template type K is declared as covariant, but occurs in invariant position in parameter k of method MethodSignatureVariance\C::a().', - 152, + 'Template type K is declared as covariant, but occurs in invariant position in parameter m of method MethodSignatureVarianceCovariant\A::a().', + 38, ], [ - 'Template type K is declared as covariant, but occurs in invariant position in parameter l of method MethodSignatureVariance\C::a().', - 152, + 'Template type K is declared as covariant, but occurs in invariant position in parameter n of method MethodSignatureVarianceCovariant\A::a().', + 38, ], [ - 'Template type K is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVariance\C::b().', - 155, + 'Template type K is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVarianceCovariant\A::b().', + 41, ], [ - 'Template type K is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVariance\C::d().', - 161, + 'Template type K is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVarianceCovariant\A::d().', + 47, ], [ - 'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\C::e().', - 164, + 'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVarianceCovariant\A::e().', + 50, ], [ - 'Template type K is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVariance\C::h().', - 173, + 'Template type K is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVarianceCovariant\A::h().', + 59, ], [ - 'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\C::i().', - 176, + 'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVarianceCovariant\A::i().', + 62, ], [ - 'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\C::j().', - 179, + 'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVarianceCovariant\A::j().', + 65, ], [ - 'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\C::k().', - 182, + 'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVarianceCovariant\A::k().', + 68, ], [ - 'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\C::l().', - 185, + 'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVarianceCovariant\A::l().', + 71, ], [ - 'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\C::m().', - 188, + 'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVarianceCovariant\A::m().', + 74, ], ]); } diff --git a/tests/PHPStan/Rules/Generics/data/method-signature-variance-contravariant.php b/tests/PHPStan/Rules/Generics/data/method-signature-variance-contravariant.php new file mode 100644 index 0000000000..53f5125356 --- /dev/null +++ b/tests/PHPStan/Rules/Generics/data/method-signature-variance-contravariant.php @@ -0,0 +1,75 @@ + $b + * @param In> $c + * @param In> $d + * @param In>> $e + * @param In>> $f + * @param Out $g + * @param Out> $h + * @param Out> $i + * @param Out>> $j + * @param Out>> $k + * @param Invariant $l + * @param Invariant> $m + * @param Invariant>> $n + * @return K + */ + function a($a, $b, $c, $d, $e, $f, $g, $h, $i, $j, $k, $l, $m, $n) {} + + /** @return In */ + function b() {} + + /** @return In> */ + function c() {} + + /** @return In> */ + function d() {} + + /** @return In>> */ + function e() {} + + /** @return Out */ + function f() {} + + /** @return Out> */ + function g() {} + + /** @return Out> */ + function h() {} + + /** @return Out>> */ + function i() {} + + /** @return Invariant */ + function j() {} + + /** @return Invariant> */ + function k() {} + + /** @return Invariant>> */ + function l() {} + + /** @return Invariant>> */ + function m() {} +} diff --git a/tests/PHPStan/Rules/Generics/data/method-signature-variance-covariant.php b/tests/PHPStan/Rules/Generics/data/method-signature-variance-covariant.php new file mode 100644 index 0000000000..637225d619 --- /dev/null +++ b/tests/PHPStan/Rules/Generics/data/method-signature-variance-covariant.php @@ -0,0 +1,75 @@ + $b + * @param In> $c + * @param In> $d + * @param In>> $e + * @param In>> $f + * @param Out $g + * @param Out> $h + * @param Out> $i + * @param Out>> $j + * @param Out>> $k + * @param Invariant $l + * @param Invariant> $m + * @param Invariant>> $n + * @return K + */ + function a($a, $b, $c, $d, $e, $f, $g, $h, $i, $j, $k, $l, $m, $n) {} + + /** @return In */ + function b() {} + + /** @return In> */ + function c() {} + + /** @return In> */ + function d() {} + + /** @return In>> */ + function e() {} + + /** @return Out */ + function f() {} + + /** @return Out> */ + function g() {} + + /** @return Out> */ + function h() {} + + /** @return Out>> */ + function i() {} + + /** @return Invariant */ + function j() {} + + /** @return Invariant> */ + function k() {} + + /** @return Invariant>> */ + function l() {} + + /** @return Invariant>> */ + function m() {} +} diff --git a/tests/PHPStan/Rules/Generics/data/method-signature-variance-invariant.php b/tests/PHPStan/Rules/Generics/data/method-signature-variance-invariant.php new file mode 100644 index 0000000000..8a87afa8d6 --- /dev/null +++ b/tests/PHPStan/Rules/Generics/data/method-signature-variance-invariant.php @@ -0,0 +1,75 @@ + $b + * @param In> $c + * @param In> $d + * @param In>> $e + * @param In>> $f + * @param Out $g + * @param Out> $h + * @param Out> $i + * @param Out>> $j + * @param Out>> $k + * @param Invariant $l + * @param Invariant> $m + * @param Invariant>> $n + * @return K + */ + function a($a, $b, $c, $d, $e, $f, $g, $h, $i, $j, $k, $l, $m, $n) {} + + /** @return In */ + function b() {} + + /** @return In> */ + function c() {} + + /** @return In> */ + function d() {} + + /** @return In>> */ + function e() {} + + /** @return Out */ + function f() {} + + /** @return Out> */ + function g() {} + + /** @return Out> */ + function h() {} + + /** @return Out>> */ + function i() {} + + /** @return Invariant */ + function j() {} + + /** @return Invariant> */ + function k() {} + + /** @return Invariant>> */ + function l() {} + + /** @return Invariant>> */ + function m() {} +} diff --git a/tests/PHPStan/Rules/Generics/data/method-signature-variance.php b/tests/PHPStan/Rules/Generics/data/method-signature-variance.php index 87bfd65b62..c783c69191 100644 --- a/tests/PHPStan/Rules/Generics/data/method-signature-variance.php +++ b/tests/PHPStan/Rules/Generics/data/method-signature-variance.php @@ -2,10 +2,6 @@ namespace MethodSignatureVariance; -/** @template-contravariant T */ -interface In { -} - /** @template-covariant T */ interface Out { } @@ -15,175 +11,28 @@ interface Invariant { } /** - * @template K + * @template-covariant T + * @template-covariant W of \DateTimeInterface */ -class A { - /** - * @param K $a - * @param In $b - * @param In> $c - * @param In> $d - * @param In>> $e - * @param Out $f - * @param Out> $g - * @param Out> $h - * @param Out>> $i - * @param Invariant $j - * @param Invariant> $k - * @param Invariant>> $l - * @return K - */ - function a($a, $b, $c, $d, $e, $f, $g, $h, $i, $j, $k, $l) {} - - /** @return In */ - function b() {} - - /** @return In> */ - function c() {} - - /** @return In> */ - function d() {} - - /** @return In>> */ - function e() {} - - /** @return Out */ - function f() {} - - /** @return Out> */ - function g() {} - - /** @return Out> */ - function h() {} - - /** @return Out>> */ - function i() {} - - /** @return Invariant */ - function j() {} - - /** @return Invariant> */ - function k() {} - - /** @return Invariant>> */ - function l() {} - - /** @return Invariant>> */ - function m() {} -} - -/** - * @template-contravariant K - */ -class B { +class C { /** - * @param K $a - * @param In $b - * @param In> $c - * @param In> $d - * @param In>> $e - * @param Out $f - * @param Out> $g - * @param Out> $h - * @param Out>> $i - * @param Invariant $j - * @param Invariant> $k - * @param Invariant>> $l - * @return K + * @param Out $a + * @param Invariant $b + * @param T $c + * @param W $d + * @return T */ - function a($a, $b, $c, $d, $e, $f, $g, $h, $i, $j, $k, $l) {} - - /** @return In */ - function b() {} - - /** @return In> */ - function c() {} - - /** @return In> */ - function d() {} - - /** @return In>> */ - function e() {} - - /** @return Out */ - function f() {} - - /** @return Out> */ - function g() {} - - /** @return Out> */ - function h() {} - - /** @return Out>> */ - function i() {} - - /** @return Invariant */ - function j() {} - - /** @return Invariant> */ - function k() {} - - /** @return Invariant>> */ - function l() {} - - /** @return Invariant>> */ - function m() {} -} - -/** - * @template-covariant K - */ -class C { + function a($a, $b, $c, $d) { + return $c; + } /** - * @param K $a - * @param In $b - * @param In> $c - * @param In> $d - * @param In>> $e - * @param Out $f - * @param Out> $g - * @param Out> $h - * @param Out>> $i - * @param Invariant $j - * @param Invariant> $k - * @param Invariant>> $l - * @return K + * @template-covariant U + * @param Out $a + * @param Invariant $b + * @param U $c + * @return U */ - function a($a, $b, $c, $d, $e, $f, $g, $h, $i, $j, $k, $l) {} - - /** @return In */ - function b() {} - - /** @return In> */ - function c() {} - - /** @return In> */ - function d() {} - - /** @return In>> */ - function e() {} - - /** @return Out */ - function f() {} - - /** @return Out> */ - function g() {} - - /** @return Out> */ - function h() {} - - /** @return Out>> */ - function i() {} - - /** @return Invariant */ - function j() {} - - /** @return Invariant> */ - function k() {} - - /** @return Invariant>> */ - function l() {} - - /** @return Invariant>> */ - function m() {} + function b($a, $b, $c) { + return $c; + } }