@@ -100,6 +100,9 @@ final class ResolvedPhpDocBlock
100100 /** @var array<string, bool>|false */
101101 private array |false $ paramsPureUnlessCallableIsImpure = false ;
102102
103+ /** @var array<string, bool>|false */
104+ private array |false $ paramsPureUnlessParameterPassed = false ;
105+
103106 /** @var array<string, ParamClosureThisTag>|false */
104107 private array |false $ paramClosureThisTags = false ;
105108
@@ -225,6 +228,7 @@ public static function createEmpty(): self
225228 $ self ->paramOutTags = [];
226229 $ self ->paramsImmediatelyInvokedCallable = [];
227230 $ self ->paramsPureUnlessCallableIsImpure = [];
231+ $ self ->paramsPureUnlessParameterPassed = [];
228232 $ self ->paramClosureThisTags = [];
229233 $ self ->returnTag = null ;
230234 $ self ->throwsTag = null ;
@@ -282,6 +286,7 @@ public function merge(ResolvedPhpDocBlock $parent, InheritedPhpDocParameterMappi
282286 $ result ->paramOutTags = self ::mergeParamOutTags ($ this ->getParamOutTags (), $ parent , $ parameterMapping , $ parentClass );
283287 $ result ->paramsImmediatelyInvokedCallable = self ::mergeParamsImmediatelyInvokedCallable ($ this ->getParamsImmediatelyInvokedCallable (), $ parent , $ parameterMapping );
284288 $ result ->paramsPureUnlessCallableIsImpure = self ::mergeParamsPureUnlessCallableIsImpure ($ this ->getParamsPureUnlessCallableIsImpure (), $ parent , $ parameterMapping );
289+ $ result ->paramsPureUnlessParameterPassed = self ::mergeParamsPureUnlessParameterPassed ($ this ->getParamsPureUnlessParameterPassed (), $ parent , $ parameterMapping );
285290 $ result ->paramClosureThisTags = self ::mergeParamClosureThisTags ($ this ->getParamClosureThisTags (), $ parent , $ parameterMapping , $ parentClass );
286291 $ result ->returnTag = self ::mergeReturnTags ($ this ->getReturnTag (), $ declaringClass , $ parent , $ parameterMapping , $ parentClass );
287292 $ result ->throwsTag = self ::mergeThrowsTags ($ this ->getThrowsTag (), $ parent );
@@ -606,6 +611,18 @@ public function getParamsPureUnlessCallableIsImpure(): array
606611 return $ this ->paramsPureUnlessCallableIsImpure ;
607612 }
608613
614+ /**
615+ * @return array<string, bool>
616+ */
617+ public function getParamsPureUnlessParameterPassed (): array
618+ {
619+ if ($ this ->paramsPureUnlessParameterPassed === false ) {
620+ $ this ->paramsPureUnlessParameterPassed = $ this ->phpDocNodeResolver ->resolveParamPureUnlessParameterPassed ($ this ->phpDocNode );
621+ }
622+
623+ return $ this ->paramsPureUnlessParameterPassed ;
624+ }
625+
609626 /**
610627 * @return array<string, ParamClosureThisTag>
611628 */
@@ -1135,6 +1152,34 @@ private static function mergeOneParentParamPureUnlessCallableIsImpure(array $par
11351152 return $ paramsPureUnlessCallableIsImpure ;
11361153 }
11371154
1155+ /**
1156+ * @param array<string, bool> $paramsPureUnlessParameterPassed
1157+ * @return array<string, bool>
1158+ */
1159+ private static function mergeParamsPureUnlessParameterPassed (array $ paramsPureUnlessParameterPassed , self $ parent , InheritedPhpDocParameterMapping $ parameterMapping ): array
1160+ {
1161+ return self ::mergeOneParentParamPureUnlessParameterPassed ($ paramsPureUnlessParameterPassed , $ parent , $ parameterMapping );
1162+ }
1163+
1164+ /**
1165+ * @param array<string, bool> $paramsPureUnlessParameterPassed
1166+ * @return array<string, bool>
1167+ */
1168+ private static function mergeOneParentParamPureUnlessParameterPassed (array $ paramsPureUnlessParameterPassed , self $ parent , InheritedPhpDocParameterMapping $ parameterMapping ): array
1169+ {
1170+ $ parentPureUnlessParameterPassed = $ parameterMapping ->transformArrayKeysWithParameterNameMapping ($ parent ->getParamsPureUnlessParameterPassed ());
1171+
1172+ foreach ($ parentPureUnlessParameterPassed as $ name => $ parentIsPureUnlessParameterPassed ) {
1173+ if (array_key_exists ($ name , $ paramsPureUnlessParameterPassed )) {
1174+ continue ;
1175+ }
1176+
1177+ $ paramsPureUnlessParameterPassed [$ name ] = $ parentIsPureUnlessParameterPassed ;
1178+ }
1179+
1180+ return $ paramsPureUnlessParameterPassed ;
1181+ }
1182+
11381183 /**
11391184 * @param array<string, ParamClosureThisTag> $paramsClosureThisTags
11401185 * @return array<string, ParamClosureThisTag>
0 commit comments