|
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