@@ -287,8 +287,15 @@ public function merge(ResolvedPhpDocBlock $parent, InheritedPhpDocParameterMappi
287287 $ result ->paramTags = self ::mergeParamTags ($ this ->getParamTags (), $ parent , $ parameterMapping , $ parentClass );
288288 $ result ->paramOutTags = self ::mergeParamOutTags ($ this ->getParamOutTags (), $ parent , $ parameterMapping , $ parentClass );
289289 $ result ->paramsImmediatelyInvokedCallable = self ::mergeParamsImmediatelyInvokedCallable ($ this ->getParamsImmediatelyInvokedCallable (), $ parent , $ parameterMapping );
290- $ result ->paramsPureUnlessCallableIsImpure = self ::mergeParamsPureUnlessCallableIsImpure ($ this ->getParamsPureUnlessCallableIsImpure (), $ parent , $ parameterMapping );
291- $ result ->paramsPureUnlessParameterPassed = self ::mergeParamsPureUnlessParameterPassed ($ this ->getParamsPureUnlessParameterPassed (), $ parent , $ parameterMapping );
290+ // @phpstan-pure / @phpstan-impure on the method itself replaces the parent's
291+ // conditional purity, so the @pure-unless-* tags are inherited only without them.
292+ if ($ this ->isPure () === null ) {
293+ $ result ->paramsPureUnlessCallableIsImpure = self ::mergeParamsPureUnlessCallableIsImpure ($ this ->getParamsPureUnlessCallableIsImpure (), $ parent , $ parameterMapping );
294+ $ result ->paramsPureUnlessParameterPassed = self ::mergeParamsPureUnlessParameterPassed ($ this ->getParamsPureUnlessParameterPassed (), $ parent , $ parameterMapping );
295+ } else {
296+ $ result ->paramsPureUnlessCallableIsImpure = $ this ->getParamsPureUnlessCallableIsImpure ();
297+ $ result ->paramsPureUnlessParameterPassed = $ this ->getParamsPureUnlessParameterPassed ();
298+ }
292299 $ result ->paramClosureThisTags = self ::mergeParamClosureThisTags ($ this ->getParamClosureThisTags (), $ parent , $ parameterMapping , $ parentClass );
293300 $ result ->returnTag = self ::mergeReturnTags ($ this ->getReturnTag (), $ declaringClass , $ parent , $ parameterMapping , $ parentClass );
294301 $ result ->throwsTag = self ::mergeThrowsTags ($ this ->getThrowsTag (), $ parent , $ parameterMapping );
0 commit comments