@@ -8,6 +8,7 @@ class VerbosityLevel
88 private const TYPE_ONLY = 1 ;
99 private const VALUE = 2 ;
1010 private const PRECISE = 3 ;
11+ private const CACHE = 4 ;
1112
1213 /** @var self[] */
1314 private static $ registry ;
@@ -41,6 +42,11 @@ public static function precise(): self
4142 return self ::create (self ::PRECISE );
4243 }
4344
45+ public static function cache (): self
46+ {
47+ return self ::create (self ::CACHE );
48+ }
49+
4450 public static function getRecommendedLevelByType (Type $ type ): self
4551 {
4652 if (TypeUtils::containsCallable ($ type ) || count (TypeUtils::getConstantArrays ($ type )) > 0 ) {
@@ -54,23 +60,45 @@ public static function getRecommendedLevelByType(Type $type): self
5460 * @param callable(): string $typeOnlyCallback
5561 * @param callable(): string $valueCallback
5662 * @param callable(): string|null $preciseCallback
63+ * @param callable(): string|null $cacheCallback
5764 * @return string
5865 */
5966 public function handle (
6067 callable $ typeOnlyCallback ,
6168 callable $ valueCallback ,
62- ?callable $ preciseCallback = null
69+ ?callable $ preciseCallback = null ,
70+ ?callable $ cacheCallback = null
6371 ): string
6472 {
6573 if ($ this ->value === self ::TYPE_ONLY ) {
6674 return $ typeOnlyCallback ();
6775 }
6876
69- if ($ this ->value === self ::VALUE || $ preciseCallback === null ) {
77+ if ($ this ->value === self ::VALUE ) {
78+ return $ valueCallback ();
79+ }
80+
81+ if ($ this ->value === self ::PRECISE ) {
82+ if ($ preciseCallback !== null ) {
83+ return $ preciseCallback ();
84+ }
85+
86+ return $ valueCallback ();
87+ }
88+
89+ if ($ this ->value === self ::CACHE ) {
90+ if ($ cacheCallback !== null ) {
91+ return $ cacheCallback ();
92+ }
93+
94+ if ($ preciseCallback !== null ) {
95+ return $ preciseCallback ();
96+ }
97+
7098 return $ valueCallback ();
7199 }
72100
73- return $ preciseCallback ();
101+ throw new \ PHPStan \ ShouldNotHappenException ();
74102 }
75103
76104}
0 commit comments