@@ -99,6 +99,9 @@ final class ResolvedPhpDocBlock
9999 /** @var array<string, bool>|false */
100100 private array |false $ paramsPureUnlessCallableIsImpure = false ;
101101
102+ /** @var array<string, bool>|false */
103+ private array |false $ paramsPureUnlessParameterPassed = false ;
104+
102105 /** @var array<string, ParamClosureThisTag>|false */
103106 private array |false $ paramClosureThisTags = false ;
104107
@@ -224,6 +227,7 @@ public static function createEmpty(): self
224227 $ self ->paramOutTags = [];
225228 $ self ->paramsImmediatelyInvokedCallable = [];
226229 $ self ->paramsPureUnlessCallableIsImpure = [];
230+ $ self ->paramsPureUnlessParameterPassed = [];
227231 $ self ->paramClosureThisTags = [];
228232 $ self ->returnTag = null ;
229233 $ self ->throwsTag = null ;
@@ -281,6 +285,7 @@ public function merge(ResolvedPhpDocBlock $parent, InheritedPhpDocParameterMappi
281285 $ result ->paramOutTags = self ::mergeParamOutTags ($ this ->getParamOutTags (), $ parent , $ parameterMapping , $ parentClass );
282286 $ result ->paramsImmediatelyInvokedCallable = self ::mergeParamsImmediatelyInvokedCallable ($ this ->getParamsImmediatelyInvokedCallable (), $ parent , $ parameterMapping );
283287 $ result ->paramsPureUnlessCallableIsImpure = self ::mergeParamsPureUnlessCallableIsImpure ($ this ->getParamsPureUnlessCallableIsImpure (), $ parent , $ parameterMapping );
288+ $ result ->paramsPureUnlessParameterPassed = self ::mergeParamsPureUnlessParameterPassed ($ this ->getParamsPureUnlessParameterPassed (), $ parent , $ parameterMapping );
284289 $ result ->paramClosureThisTags = self ::mergeParamClosureThisTags ($ this ->getParamClosureThisTags (), $ parent , $ parameterMapping , $ parentClass );
285290 $ result ->returnTag = self ::mergeReturnTags ($ this ->getReturnTag (), $ declaringClass , $ parent , $ parameterMapping , $ parentClass );
286291 $ result ->throwsTag = self ::mergeThrowsTags ($ this ->getThrowsTag (), $ parent );
@@ -601,6 +606,18 @@ public function getParamsPureUnlessCallableIsImpure(): array
601606 return $ this ->paramsPureUnlessCallableIsImpure ;
602607 }
603608
609+ /**
610+ * @return array<string, bool>
611+ */
612+ public function getParamsPureUnlessParameterPassed (): array
613+ {
614+ if ($ this ->paramsPureUnlessParameterPassed === false ) {
615+ $ this ->paramsPureUnlessParameterPassed = $ this ->phpDocNodeResolver ->resolveParamPureUnlessParameterPassed ($ this ->phpDocNode );
616+ }
617+
618+ return $ this ->paramsPureUnlessParameterPassed ;
619+ }
620+
604621 /**
605622 * @return array<string, ParamClosureThisTag>
606623 */
@@ -1130,6 +1147,34 @@ private static function mergeOneParentParamPureUnlessCallableIsImpure(array $par
11301147 return $ paramsPureUnlessCallableIsImpure ;
11311148 }
11321149
1150+ /**
1151+ * @param array<string, bool> $paramsPureUnlessParameterPassed
1152+ * @return array<string, bool>
1153+ */
1154+ private static function mergeParamsPureUnlessParameterPassed (array $ paramsPureUnlessParameterPassed , self $ parent , InheritedPhpDocParameterMapping $ parameterMapping ): array
1155+ {
1156+ return self ::mergeOneParentParamPureUnlessParameterPassed ($ paramsPureUnlessParameterPassed , $ parent , $ parameterMapping );
1157+ }
1158+
1159+ /**
1160+ * @param array<string, bool> $paramsPureUnlessParameterPassed
1161+ * @return array<string, bool>
1162+ */
1163+ private static function mergeOneParentParamPureUnlessParameterPassed (array $ paramsPureUnlessParameterPassed , self $ parent , InheritedPhpDocParameterMapping $ parameterMapping ): array
1164+ {
1165+ $ parentPureUnlessParameterPassed = $ parameterMapping ->transformArrayKeysWithParameterNameMapping ($ parent ->getParamsPureUnlessParameterPassed ());
1166+
1167+ foreach ($ parentPureUnlessParameterPassed as $ name => $ parentIsPureUnlessParameterPassed ) {
1168+ if (array_key_exists ($ name , $ paramsPureUnlessParameterPassed )) {
1169+ continue ;
1170+ }
1171+
1172+ $ paramsPureUnlessParameterPassed [$ name ] = $ parentIsPureUnlessParameterPassed ;
1173+ }
1174+
1175+ return $ paramsPureUnlessParameterPassed ;
1176+ }
1177+
11331178 /**
11341179 * @param array<string, ParamClosureThisTag> $paramsClosureThisTags
11351180 * @return array<string, ParamClosureThisTag>
0 commit comments