@@ -17,8 +17,8 @@ function activeBuffer(): void
1717{
1818 ob_start ();
1919 assertType ('int<1, max> ' , ob_get_level ());
20- assertType ('string ' , ob_get_contents ());
21- assertType ('int ' , ob_get_length ());
20+ assertType ('( string|false) ' , ob_get_contents ());
21+ assertType ('( int|false) ' , ob_get_length ());
2222}
2323
2424function obCleanAndFlushKeepBuffer (): void
@@ -27,17 +27,17 @@ function obCleanAndFlushKeepBuffer(): void
2727 assertType ('int<1, max> ' , ob_get_level ());
2828 ob_clean ();
2929 assertType ('int<1, max> ' , ob_get_level ());
30- assertType ('string ' , ob_get_contents ());
30+ assertType ('( string|false) ' , ob_get_contents ());
3131 ob_flush ();
3232 assertType ('int<1, max> ' , ob_get_level ());
33- assertType ('string ' , ob_get_contents ());
33+ assertType ('( string|false) ' , ob_get_contents ());
3434}
3535
3636function getCleanClosesBuffer (): void
3737{
3838 ob_start ();
3939 assertType ('int<1, max> ' , ob_get_level ());
40- assertType ('string ' , ob_get_clean ());
40+ assertType ('( string|false) ' , ob_get_clean ());
4141 assertType ('int<0, max> ' , ob_get_level ());
4242 assertType ('string|false ' , ob_get_contents ());
4343}
@@ -46,7 +46,7 @@ function getFlushClosesBuffer(): void
4646{
4747 ob_start ();
4848 assertType ('int<1, max> ' , ob_get_level ());
49- assertType ('string ' , ob_get_flush ());
49+ assertType ('( string|false) ' , ob_get_flush ());
5050 assertType ('int<0, max> ' , ob_get_level ());
5151 assertType ('string|false ' , ob_get_contents ());
5252}
@@ -55,7 +55,7 @@ function endCleanClosesBuffer(): void
5555{
5656 ob_start ();
5757 assertType ('int<1, max> ' , ob_get_level ());
58- assertType ('string ' , ob_get_contents ());
58+ assertType ('( string|false) ' , ob_get_contents ());
5959 ob_end_clean ();
6060 assertType ('int<0, max> ' , ob_get_level ());
6161 assertType ('string|false ' , ob_get_contents ());
@@ -65,7 +65,7 @@ function endFlushClosesBuffer(): void
6565{
6666 ob_start ();
6767 assertType ('int<1, max> ' , ob_get_level ());
68- assertType ('string ' , ob_get_contents ());
68+ assertType ('( string|false) ' , ob_get_contents ());
6969 ob_end_flush ();
7070 assertType ('int<0, max> ' , ob_get_level ());
7171 assertType ('string|false ' , ob_get_contents ());
@@ -77,10 +77,10 @@ function nested(): void
7777 assertType ('int<1, max> ' , ob_get_level ());
7878 ob_start ();
7979 assertType ('int<2, max> ' , ob_get_level ());
80- assertType ('string ' , ob_get_contents ());
80+ assertType ('( string|false) ' , ob_get_contents ());
8181 ob_end_clean ();
8282 assertType ('int<1, max> ' , ob_get_level ());
83- assertType ('string ' , ob_get_contents ());
83+ assertType ('( string|false) ' , ob_get_contents ());
8484 ob_end_clean ();
8585 assertType ('int<0, max> ' , ob_get_level ());
8686 assertType ('string|false ' , ob_get_contents ());
@@ -99,15 +99,15 @@ function fullyQualified(): void
9999{
100100 \ob_start ();
101101 assertType ('int<1, max> ' , ob_get_level ());
102- assertType ('string ' , \ob_get_contents ());
103- assertType ('string ' , ob_get_contents ());
102+ assertType ('( string|false) ' , \ob_get_contents ());
103+ assertType ('( string|false) ' , ob_get_contents ());
104104}
105105
106106function levelNarrowedToConstInt (): void
107107{
108108 if (ob_get_level () === 2 ) {
109109 assertType ('2 ' , ob_get_level ());
110- assertType ('string ' , ob_get_clean ());
110+ assertType ('( string|false) ' , ob_get_clean ());
111111 // closing call decrements the const-int level, keeping it exact
112112 assertType ('1 ' , ob_get_level ());
113113 }
@@ -123,18 +123,18 @@ function levelNarrowedToIntRange(): void
123123{
124124 if (ob_get_level () >= 1 ) {
125125 assertType ('int<1, max> ' , ob_get_level ());
126- assertType ('string ' , ob_get_clean ());
126+ assertType ('( string|false) ' , ob_get_clean ());
127127 }
128128}
129129
130130function levelNarrowedToUnionInt (): void
131131{
132132 if (ob_get_level () === 1 || ob_get_level () === 3 ) {
133133 assertType ('1|3 ' , ob_get_level ());
134- assertType ('string ' , ob_get_contents ());
134+ assertType ('( string|false) ' , ob_get_contents ());
135135 ob_start ();
136136 assertType ('2|4 ' , ob_get_level ());
137- assertType ('string ' , ob_get_contents ());
137+ assertType ('( string|false) ' , ob_get_contents ());
138138 }
139139}
140140
@@ -150,7 +150,7 @@ function levelNarrowedToBoundedIntRange(): void
150150{
151151 if (ob_get_level () >= 2 && ob_get_level () <= 5 ) {
152152 assertType ('int<2, 5> ' , ob_get_level ());
153- assertType ('string ' , ob_get_clean ());
153+ assertType ('( string|false) ' , ob_get_clean ());
154154 // closing call shifts the whole range down, preserving the upper bound
155155 assertType ('int<1, 4> ' , ob_get_level ());
156156 }
@@ -180,7 +180,7 @@ function pureCallableKeepsLevel(callable $cb): void
180180 ob_start ();
181181 $ cb ();
182182 assertType ('int<1, max> ' , ob_get_level ());
183- assertType ('string ' , ob_get_clean ());
183+ assertType ('( string|false) ' , ob_get_clean ());
184184}
185185
186186function impureFunctionForgetsLevel (): void
@@ -206,7 +206,7 @@ function pureFunctionKeepsLevel(): void
206206 ob_start ();
207207 $ x =pureFunction ();
208208 assertType ('int<1, max> ' , ob_get_level ());
209- assertType ('string ' , ob_get_clean ());
209+ assertType ('( string|false) ' , ob_get_clean ());
210210}
211211
212212class Service
@@ -245,7 +245,7 @@ function pureMethodKeepsLevel(Service $service): void
245245 ob_start ();
246246 $ x =$ service ->pureMethod ();
247247 assertType ('int<1, max> ' , ob_get_level ());
248- assertType ('string ' , ob_get_clean ());
248+ assertType ('( string|false) ' , ob_get_clean ());
249249}
250250
251251function impureStaticMethodForgetsLevel (): void
@@ -269,23 +269,23 @@ function arrayMapPureCallbackKeepsLevel(array $a): void
269269 ob_start ();
270270 array_map ('strtoupper ' , $ a );
271271 assertType ('int<1, max> ' , ob_get_level ());
272- assertType ('string ' , ob_get_clean ());
272+ assertType ('( string|false) ' , ob_get_clean ());
273273}
274274
275275function laterInvokedCallableKeepsLevel (callable $ cb ): void
276276{
277277 ob_start ();
278278 register_shutdown_function ($ cb );
279279 assertType ('int<1, max> ' , ob_get_level ());
280- assertType ('string ' , ob_get_clean ());
280+ assertType ('( string|false) ' , ob_get_clean ());
281281}
282282
283283function builtinKeepsLevel (): void
284284{
285285 ob_start ();
286286 printf ('hello ' );
287287 assertType ('int<1, max> ' , ob_get_level ());
288- assertType ('string ' , ob_get_clean ());
288+ assertType ('( string|false) ' , ob_get_clean ());
289289}
290290
291291class WithImpureConstructor
@@ -326,15 +326,15 @@ function pureConstructorKeepsLevel(): void
326326 ob_start ();
327327 new WithPureConstructor ();
328328 assertType ('int<1, max> ' , ob_get_level ());
329- assertType ('string ' , ob_get_clean ());
329+ assertType ('( string|false) ' , ob_get_clean ());
330330}
331331
332332function noConstructorKeepsLevel (): void
333333{
334334 ob_start ();
335335 new WithoutConstructor ();
336336 assertType ('int<1, max> ' , ob_get_level ());
337- assertType ('string ' , ob_get_clean ());
337+ assertType ('( string|false) ' , ob_get_clean ());
338338}
339339
340340/** @param class-string $className */
@@ -351,7 +351,7 @@ function builtinConstructorKeepsLevel(): void
351351 ob_start ();
352352 new \ArrayObject ();
353353 assertType ('int<1, max> ' , ob_get_level ());
354- assertType ('string ' , ob_get_clean ());
354+ assertType ('( string|false) ' , ob_get_clean ());
355355}
356356
357357function withRequire (): void
0 commit comments