@@ -96,6 +96,9 @@ final class ResolvedPhpDocBlock
9696 /** @var array<string, bool>|false */
9797 private array |false $ paramsImmediatelyInvokedCallable = false ;
9898
99+ /** @var array<string, bool>|false */
100+ private array |false $ paramsPureUnlessCallableIsImpure = false ;
101+
99102 /** @var array<string, ParamClosureThisTag>|false */
100103 private array |false $ paramClosureThisTags = false ;
101104
@@ -216,6 +219,7 @@ public static function createEmpty(): self
216219 $ self ->paramTags = [];
217220 $ self ->paramOutTags = [];
218221 $ self ->paramsImmediatelyInvokedCallable = [];
222+ $ self ->paramsPureUnlessCallableIsImpure = [];
219223 $ self ->paramClosureThisTags = [];
220224 $ self ->returnTag = null ;
221225 $ self ->throwsTag = null ;
@@ -281,6 +285,7 @@ public function merge(array $parents, array $parentPhpDocBlocks): self
281285 $ result ->paramTags = self ::mergeParamTags ($ this ->getParamTags (), $ parents , $ parentPhpDocBlocks );
282286 $ result ->paramOutTags = self ::mergeParamOutTags ($ this ->getParamOutTags (), $ parents , $ parentPhpDocBlocks );
283287 $ result ->paramsImmediatelyInvokedCallable = self ::mergeParamsImmediatelyInvokedCallable ($ this ->getParamsImmediatelyInvokedCallable (), $ parents , $ parentPhpDocBlocks );
288+ $ result ->paramsPureUnlessCallableIsImpure = self ::mergeParamsPureUnlessCallableIsImpure ($ this ->getParamsPureUnlessCallableIsImpure (), $ parents , $ parentPhpDocBlocks );
284289 $ result ->paramClosureThisTags = self ::mergeParamClosureThisTags ($ this ->getParamClosureThisTags (), $ parents , $ parentPhpDocBlocks );
285290 $ result ->returnTag = self ::mergeReturnTags ($ this ->getReturnTag (), $ classReflection , $ parents , $ parentPhpDocBlocks );
286291 $ result ->throwsTag = self ::mergeThrowsTags ($ this ->getThrowsTag (), $ parents );
@@ -587,6 +592,18 @@ public function getParamsImmediatelyInvokedCallable(): array
587592 return $ this ->paramsImmediatelyInvokedCallable ;
588593 }
589594
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+
590607 /**
591608 * @return array<string, ParamClosureThisTag>
592609 */
@@ -1154,6 +1171,40 @@ private static function mergeOneParentParamImmediatelyInvokedCallable(array $par
11541171 return $ paramsImmediatelyInvokedCallable ;
11551172 }
11561173
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+
11571208 /**
11581209 * @param array<string, ParamClosureThisTag> $paramsClosureThisTags
11591210 * @param array<int, self> $parents
0 commit comments