Skip to content

Commit 8124183

Browse files
jiripudilondrejmirtes
authored andcommitted
split MethodSignatureVarianceRuleTest datasets and cover template-contravariant
1 parent 91e63c5 commit 8124183

File tree

5 files changed

+351
-36
lines changed

5 files changed

+351
-36
lines changed

tests/PHPStan/Rules/Generics/MethodSignatureVarianceRuleTest.php

Lines changed: 125 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,141 @@ public function testRule(): void
2222
{
2323
$this->analyse([__DIR__ . '/data/method-signature-variance.php'], [
2424
[
25-
'Template type T is declared as covariant, but occurs in contravariant position in parameter a of method MethodSignatureVariance\C::a().',
26-
25,
25+
'Variance annotation is only allowed for type parameters of classes and interfaces, but occurs in template type U in in method MethodSignatureVariance\C::b().',
26+
16,
27+
],
28+
[
29+
'Variance annotation is only allowed for type parameters of classes and interfaces, but occurs in template type U in in method MethodSignatureVariance\C::c().',
30+
22,
2731
],
32+
]);
33+
34+
$this->analyse([__DIR__ . '/data/method-signature-variance-invariant.php'], []);
35+
36+
$this->analyse([__DIR__ . '/data/method-signature-variance-covariant.php'], [
2837
[
29-
'Template type T is declared as covariant, but occurs in invariant position in parameter b of method MethodSignatureVariance\C::a().',
30-
25,
38+
'Template type X is declared as covariant, but occurs in contravariant position in parameter a of method MethodSignatureVariance\Covariant\C::a().',
39+
35,
3140
],
3241
[
33-
'Template type T is declared as covariant, but occurs in contravariant position in parameter c of method MethodSignatureVariance\C::a().',
34-
25,
42+
'Template type X is declared as covariant, but occurs in contravariant position in parameter c of method MethodSignatureVariance\Covariant\C::a().',
43+
35,
3544
],
3645
[
37-
'Template type W is declared as covariant, but occurs in contravariant position in parameter d of method MethodSignatureVariance\C::a().',
38-
25,
46+
'Template type X is declared as covariant, but occurs in invariant position in parameter e of method MethodSignatureVariance\Covariant\C::a().',
47+
35,
3948
],
4049
[
41-
'Variance annotation is only allowed for type parameters of classes and interfaces, but occurs in template type U in in method MethodSignatureVariance\C::b().',
50+
'Template type X is declared as covariant, but occurs in contravariant position in parameter f of method MethodSignatureVariance\Covariant\C::a().',
51+
35,
52+
],
53+
[
54+
'Template type X is declared as covariant, but occurs in contravariant position in parameter h of method MethodSignatureVariance\Covariant\C::a().',
55+
35,
56+
],
57+
[
58+
'Template type X is declared as covariant, but occurs in invariant position in parameter i of method MethodSignatureVariance\Covariant\C::a().',
59+
35,
60+
],
61+
[
62+
'Template type X is declared as covariant, but occurs in invariant position in parameter j of method MethodSignatureVariance\Covariant\C::a().',
4263
35,
4364
],
65+
[
66+
'Template type X is declared as covariant, but occurs in contravariant position in parameter k of method MethodSignatureVariance\Covariant\C::a().',
67+
35,
68+
],
69+
[
70+
'Template type X is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVariance\Covariant\C::c().',
71+
41,
72+
],
73+
[
74+
'Template type X is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVariance\Covariant\C::e().',
75+
47,
76+
],
77+
[
78+
'Template type X is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\Covariant\C::f().',
79+
50,
80+
],
81+
[
82+
'Template type X is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVariance\Covariant\C::h().',
83+
56,
84+
],
85+
[
86+
'Template type X is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\Covariant\C::j().',
87+
62,
88+
],
89+
[
90+
'Template type X is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\Covariant\C::k().',
91+
65,
92+
],
93+
[
94+
'Template type X is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVariance\Covariant\C::l().',
95+
68,
96+
],
97+
]);
98+
99+
$this->analyse([__DIR__ . '/data/method-signature-variance-contravariant.php'], [
100+
[
101+
'Template type X is declared as contravariant, but occurs in covariant position in parameter b of method MethodSignatureVariance\Contravariant\C::a().',
102+
35,
103+
],
104+
[
105+
'Template type X is declared as contravariant, but occurs in covariant position in parameter d of method MethodSignatureVariance\Contravariant\C::a().',
106+
35,
107+
],
108+
[
109+
'Template type X is declared as contravariant, but occurs in invariant position in parameter e of method MethodSignatureVariance\Contravariant\C::a().',
110+
35,
111+
],
112+
[
113+
'Template type X is declared as contravariant, but occurs in covariant position in parameter g of method MethodSignatureVariance\Contravariant\C::a().',
114+
35,
115+
],
116+
[
117+
'Template type X is declared as contravariant, but occurs in invariant position in parameter i of method MethodSignatureVariance\Contravariant\C::a().',
118+
35,
119+
],
120+
[
121+
'Template type X is declared as contravariant, but occurs in invariant position in parameter j of method MethodSignatureVariance\Contravariant\C::a().',
122+
35,
123+
],
124+
[
125+
'Template type X is declared as contravariant, but occurs in covariant position in parameter l of method MethodSignatureVariance\Contravariant\C::a().',
126+
35,
127+
],
128+
[
129+
'Template type X is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVariance\Contravariant\C::b().',
130+
38,
131+
],
132+
[
133+
'Template type X is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVariance\Contravariant\C::d().',
134+
44,
135+
],
136+
[
137+
'Template type X is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\Contravariant\C::f().',
138+
50,
139+
],
140+
[
141+
'Template type X is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVariance\Contravariant\C::g().',
142+
53,
143+
],
144+
[
145+
'Template type X is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVariance\Contravariant\C::i().',
146+
59,
147+
],
148+
[
149+
'Template type X is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\Contravariant\C::j().',
150+
62,
151+
],
152+
[
153+
'Template type X is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\Contravariant\C::k().',
154+
65,
155+
],
156+
[
157+
'Template type X is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVariance\Contravariant\C::m().',
158+
71,
159+
],
44160
]);
45161
}
46162

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
3+
namespace MethodSignatureVariance\Contravariant;
4+
5+
/** @template-contravariant T */
6+
interface In {
7+
}
8+
9+
/** @template-covariant T */
10+
interface Out {
11+
}
12+
13+
/** @template T */
14+
interface Invariant {
15+
}
16+
17+
/**
18+
* @template-contravariant X
19+
*/
20+
class C {
21+
/**
22+
* @param X $a
23+
* @param In<X> $b
24+
* @param In<In<X>> $c
25+
* @param In<Out<X>> $d
26+
* @param In<Invariant<X>> $e
27+
* @param Out<X> $f
28+
* @param Out<In<X>> $g
29+
* @param Out<Out<X>> $h
30+
* @param Out<Invariant<X>> $i
31+
* @param Invariant<X> $j
32+
* @param Invariant<In<X>> $k
33+
* @param Invariant<Out<X>> $l
34+
*/
35+
function a($a, $b, $c, $d, $e, $f, $g, $h, $i, $j, $k, $l) {}
36+
37+
/** @return X */
38+
function b() {}
39+
40+
/** @return In<X> */
41+
function c() {}
42+
43+
/** @return In<In<X>> */
44+
function d() {}
45+
46+
/** @return In<Out<X>> */
47+
function e() {}
48+
49+
/** @return In<Invariant<X>> */
50+
function f() {}
51+
52+
/** @return Out<X> */
53+
function g() {}
54+
55+
/** @return Out<In<X>> */
56+
function h() {}
57+
58+
/** @return Out<Out<X>> */
59+
function i() {}
60+
61+
/** @return Out<Invariant<X>> */
62+
function j() {}
63+
64+
/** @return Invariant<X> */
65+
function k() {}
66+
67+
/** @return Invariant<In<X>> */
68+
function l() {}
69+
70+
/** @return Invariant<Out<X>> */
71+
function m() {}
72+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
3+
namespace MethodSignatureVariance\Covariant;
4+
5+
/** @template-contravariant T */
6+
interface In {
7+
}
8+
9+
/** @template-covariant T */
10+
interface Out {
11+
}
12+
13+
/** @template T */
14+
interface Invariant {
15+
}
16+
17+
/**
18+
* @template-covariant X
19+
*/
20+
class C {
21+
/**
22+
* @param X $a
23+
* @param In<X> $b
24+
* @param In<In<X>> $c
25+
* @param In<Out<X>> $d
26+
* @param In<Invariant<X>> $e
27+
* @param Out<X> $f
28+
* @param Out<In<X>> $g
29+
* @param Out<Out<X>> $h
30+
* @param Out<Invariant<X>> $i
31+
* @param Invariant<X> $j
32+
* @param Invariant<In<X>> $k
33+
* @param Invariant<Out<X>> $l
34+
*/
35+
function a($a, $b, $c, $d, $e, $f, $g, $h, $i, $j, $k, $l) {}
36+
37+
/** @return X */
38+
function b() {}
39+
40+
/** @return In<X> */
41+
function c() {}
42+
43+
/** @return In<In<X>> */
44+
function d() {}
45+
46+
/** @return In<Out<X>> */
47+
function e() {}
48+
49+
/** @return In<Invariant<X>> */
50+
function f() {}
51+
52+
/** @return Out<X> */
53+
function g() {}
54+
55+
/** @return Out<In<X>> */
56+
function h() {}
57+
58+
/** @return Out<Out<X>> */
59+
function i() {}
60+
61+
/** @return Out<Invariant<X>> */
62+
function j() {}
63+
64+
/** @return Invariant<X> */
65+
function k() {}
66+
67+
/** @return Invariant<In<X>> */
68+
function l() {}
69+
70+
/** @return Invariant<Out<X>> */
71+
function m() {}
72+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
3+
namespace MethodSignatureVariance\Invariant;
4+
5+
/** @template-contravariant T */
6+
interface In {
7+
}
8+
9+
/** @template-covariant T */
10+
interface Out {
11+
}
12+
13+
/** @template T */
14+
interface Invariant {
15+
}
16+
17+
/**
18+
* @template X
19+
*/
20+
class C {
21+
/**
22+
* @param X $a
23+
* @param In<X> $b
24+
* @param In<In<X>> $c
25+
* @param In<Out<X>> $d
26+
* @param In<Invariant<X> $e
27+
* @param Out<X> $f
28+
* @param Out<In<X>> $g
29+
* @param Out<Out<X>> $h
30+
* @param Out<Invariant<X> $i
31+
* @param Invariant<X> $j
32+
* @param Invariant<In<X>> $k
33+
* @param Invariant<Out<X>> $l
34+
* @return X
35+
*/
36+
function a($a, $b, $c, $d, $e, $f, $g, $h, $i, $j, $k, $l) {}
37+
38+
/** @return In<X> */
39+
function b() {}
40+
41+
/** @return In<In<X>>*/
42+
function c() {}
43+
44+
/** @return In<Out<X>>*/
45+
function d() {}
46+
47+
/** @return In<Invariant<X> */
48+
function e() {}
49+
50+
/** @return Out<X> */
51+
function f() {}
52+
53+
/** @return Out<In<X>>*/
54+
function g() {}
55+
56+
/** @return Out<Out<X>>*/
57+
function h() {}
58+
59+
/** @return Out<Invariant<X> */
60+
function i() {}
61+
62+
/** @return Invariant<X> */
63+
function j() {}
64+
65+
/** @return Invariant<In<X>>*/
66+
function k() {}
67+
68+
/** @return Invariant<Out<X>>*/
69+
function l() {}
70+
}

0 commit comments

Comments
 (0)