@@ -96,6 +96,9 @@ final class ResolvedPhpDocBlock
96
96
/** @var array<string, bool>|false */
97
97
private array |false $ paramsImmediatelyInvokedCallable = false ;
98
98
99
+ /** @var array<string, bool>|false */
100
+ private array |false $ paramsPureUnlessCallableIsImpure = false ;
101
+
99
102
/** @var array<string, ParamClosureThisTag>|false */
100
103
private array |false $ paramClosureThisTags = false ;
101
104
@@ -216,6 +219,7 @@ public static function createEmpty(): self
216
219
$ self ->paramTags = [];
217
220
$ self ->paramOutTags = [];
218
221
$ self ->paramsImmediatelyInvokedCallable = [];
222
+ $ self ->paramsPureUnlessCallableIsImpure = [];
219
223
$ self ->paramClosureThisTags = [];
220
224
$ self ->returnTag = null ;
221
225
$ self ->throwsTag = null ;
@@ -281,6 +285,7 @@ public function merge(array $parents, array $parentPhpDocBlocks): self
281
285
$ result ->paramTags = self ::mergeParamTags ($ this ->getParamTags (), $ parents , $ parentPhpDocBlocks );
282
286
$ result ->paramOutTags = self ::mergeParamOutTags ($ this ->getParamOutTags (), $ parents , $ parentPhpDocBlocks );
283
287
$ result ->paramsImmediatelyInvokedCallable = self ::mergeParamsImmediatelyInvokedCallable ($ this ->getParamsImmediatelyInvokedCallable (), $ parents , $ parentPhpDocBlocks );
288
+ $ result ->paramsPureUnlessCallableIsImpure = self ::mergeParamsPureUnlessCallableIsImpure ($ this ->getParamsPureUnlessCallableIsImpure (), $ parents , $ parentPhpDocBlocks );
284
289
$ result ->paramClosureThisTags = self ::mergeParamClosureThisTags ($ this ->getParamClosureThisTags (), $ parents , $ parentPhpDocBlocks );
285
290
$ result ->returnTag = self ::mergeReturnTags ($ this ->getReturnTag (), $ classReflection , $ parents , $ parentPhpDocBlocks );
286
291
$ result ->throwsTag = self ::mergeThrowsTags ($ this ->getThrowsTag (), $ parents );
@@ -587,6 +592,18 @@ public function getParamsImmediatelyInvokedCallable(): array
587
592
return $ this ->paramsImmediatelyInvokedCallable ;
588
593
}
589
594
595
+ /**
596
+ * @return array<string, bool>
597
+ */
598
+ public function getParamsPureUnlessCallableIsImpure (): array
599
+ {
600
+ if ($ this ->paramsPureUnlessCallableIsImpure === false ) {
601
+ $ this ->paramsPureUnlessCallableIsImpure = $ this ->phpDocNodeResolver ->resolveParamPureUnlessCallableIsImpure ($ this ->phpDocNode );
602
+ }
603
+
604
+ return $ this ->paramsPureUnlessCallableIsImpure ;
605
+ }
606
+
590
607
/**
591
608
* @return array<string, ParamClosureThisTag>
592
609
*/
@@ -1154,6 +1171,40 @@ private static function mergeOneParentParamImmediatelyInvokedCallable(array $par
1154
1171
return $ paramsImmediatelyInvokedCallable ;
1155
1172
}
1156
1173
1174
+ /**
1175
+ * @param array<string, bool> $paramsPureUnlessCallableIsImpure
1176
+ * @param array<int, self> $parents
1177
+ * @param array<int, PhpDocBlock> $parentPhpDocBlocks
1178
+ * @return array<string, bool>
1179
+ */
1180
+ private static function mergeParamsPureUnlessCallableIsImpure (array $ paramsPureUnlessCallableIsImpure , array $ parents , array $ parentPhpDocBlocks ): array
1181
+ {
1182
+ foreach ($ parents as $ i => $ parent ) {
1183
+ $ paramsPureUnlessCallableIsImpure = self ::mergeOneParentParamPureUnlessCallableIsImpure ($ paramsPureUnlessCallableIsImpure , $ parent , $ parentPhpDocBlocks [$ i ]);
1184
+ }
1185
+
1186
+ return $ paramsPureUnlessCallableIsImpure ;
1187
+ }
1188
+
1189
+ /**
1190
+ * @param array<string, bool> $paramsPureUnlessCallableIsImpure
1191
+ * @return array<string, bool>
1192
+ */
1193
+ private static function mergeOneParentParamPureUnlessCallableIsImpure (array $ paramsPureUnlessCallableIsImpure , self $ parent , PhpDocBlock $ phpDocBlock ): array
1194
+ {
1195
+ $ parentPureUnlessCallableIsImpure = $ phpDocBlock ->transformArrayKeysWithParameterNameMapping ($ parent ->getParamsPureUnlessCallableIsImpure ());
1196
+
1197
+ foreach ($ parentPureUnlessCallableIsImpure as $ name => $ parentIsPureUnlessCallableIsImpure ) {
1198
+ if (array_key_exists ($ name , $ paramsPureUnlessCallableIsImpure )) {
1199
+ continue ;
1200
+ }
1201
+
1202
+ $ paramsPureUnlessCallableIsImpure [$ name ] = $ parentIsPureUnlessCallableIsImpure ;
1203
+ }
1204
+
1205
+ return $ paramsPureUnlessCallableIsImpure ;
1206
+ }
1207
+
1157
1208
/**
1158
1209
* @param array<string, ParamClosureThisTag> $paramsClosureThisTags
1159
1210
* @param array<int, self> $parents
0 commit comments