|
13 | 13 | class VarianceCheck
|
14 | 14 | {
|
15 | 15 |
|
| 16 | + public function __construct( |
| 17 | + private bool $checkParamOutVariance, |
| 18 | + ) |
| 19 | + { |
| 20 | + } |
| 21 | + |
16 | 22 | /** @return RuleError[] */
|
17 | 23 | public function checkParametersAcceptor(
|
18 | 24 | ParametersAcceptorWithPhpDocs $parametersAcceptor,
|
19 | 25 | string $parameterTypeMessage,
|
| 26 | + string $parameterOutTypeMessage, |
20 | 27 | string $returnTypeMessage,
|
21 | 28 | string $generalMessage,
|
22 | 29 | bool $isStatic,
|
@@ -44,20 +51,35 @@ public function checkParametersAcceptor(
|
44 | 51 | return $errors;
|
45 | 52 | }
|
46 | 53 |
|
| 54 | + $covariant = TemplateTypeVariance::createCovariant(); |
| 55 | + $parameterVariance = $isStatic |
| 56 | + ? TemplateTypeVariance::createStatic() |
| 57 | + : TemplateTypeVariance::createContravariant(); |
| 58 | + |
47 | 59 | foreach ($parametersAcceptor->getParameters() as $parameterReflection) {
|
48 |
| - $variance = $isStatic |
49 |
| - ? TemplateTypeVariance::createStatic() |
50 |
| - : TemplateTypeVariance::createContravariant(); |
51 | 60 | $type = $parameterReflection->getType();
|
52 | 61 | $message = sprintf($parameterTypeMessage, $parameterReflection->getName());
|
53 |
| - foreach ($this->check($variance, $type, $message) as $error) { |
| 62 | + foreach ($this->check($parameterVariance, $type, $message) as $error) { |
| 63 | + $errors[] = $error; |
| 64 | + } |
| 65 | + |
| 66 | + if (!$this->checkParamOutVariance) { |
| 67 | + continue; |
| 68 | + } |
| 69 | + |
| 70 | + $paramOutType = $parameterReflection->getOutType(); |
| 71 | + if ($paramOutType === null) { |
| 72 | + continue; |
| 73 | + } |
| 74 | + |
| 75 | + $outMessage = sprintf($parameterOutTypeMessage, $parameterReflection->getName()); |
| 76 | + foreach ($this->check($covariant, $paramOutType, $outMessage) as $error) { |
54 | 77 | $errors[] = $error;
|
55 | 78 | }
|
56 | 79 | }
|
57 | 80 |
|
58 |
| - $variance = TemplateTypeVariance::createCovariant(); |
59 | 81 | $type = $parametersAcceptor->getReturnType();
|
60 |
| - foreach ($this->check($variance, $type, $returnTypeMessage) as $error) { |
| 82 | + foreach ($this->check($covariant, $type, $returnTypeMessage) as $error) { |
61 | 83 | $errors[] = $error;
|
62 | 84 | }
|
63 | 85 |
|
|
0 commit comments