Skip to content

Commit 7444b55

Browse files
committed
Adding exceptional functions
1 parent f48a3f5 commit 7444b55

File tree

2 files changed

+55
-20
lines changed

2 files changed

+55
-20
lines changed

bin/generate-function-metadata.php

+35
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,42 @@ public function enterNode(Node $node)
3636
if ($node instanceof Node\Stmt\Function_) {
3737
assert(isset($node->namespacedName));
3838
$functionName = $node->namespacedName->toLowerString();
39+
3940
foreach ($node->attrGroups as $attrGroup) {
4041
foreach ($attrGroup->attrs as $attr) {
4142
if ($attr->name->toString() !== Pure::class) {
4243
continue;
4344
}
4445

46+
// The following functions have side effects, but their state is managed within the PHPStan scope:
47+
if (in_array($functionName, [
48+
'stat',
49+
'lstat',
50+
'file_exists',
51+
'is_writable',
52+
'is_writeable',
53+
'is_readable',
54+
'is_executable',
55+
'is_file',
56+
'is_dir',
57+
'is_link',
58+
'filectime',
59+
'fileatime',
60+
'filemtime',
61+
'fileinode',
62+
'filegroup',
63+
'fileowner',
64+
'filesize',
65+
'filetype',
66+
'fileperms',
67+
'json_last_error',
68+
'json_last_error_msg',
69+
], true)) {
70+
$this->functions[] = $functionName;
71+
break 2;
72+
}
73+
74+
4575
// PhpStorm stub's #[Pure(true)] means the function has side effects but its return value is important.
4676
// In PHPStan's criteria, these functions are simply considered as ['hasSideEffect' => true].
4777
if (isset($attr->args[0]->value->name->name) && $attr->args[0]->value->name->name === 'true') {
@@ -99,6 +129,11 @@ public function enterNode(Node $node)
99129
}
100130
foreach ($visitor->impureFunctions as $functionName) {
101131
if (array_key_exists($functionName, $metadata)) {
132+
if (in_array($functionName, [
133+
'ob_get_contents',
134+
], true)) {
135+
continue;
136+
}
102137
if ($metadata[$functionName]['hasSideEffects']) {
103138
throw new ShouldNotHappenException($functionName);
104139
}

resources/functionMetadata.php

+20-20
Original file line numberDiff line numberDiff line change
@@ -888,18 +888,18 @@
888888
'fgets' => ['hasSideEffects' => true],
889889
'fgetss' => ['hasSideEffects' => true],
890890
'file' => ['hasSideEffects' => true],
891-
'file_exists' => ['hasSideEffects' => true],
891+
'file_exists' => ['hasSideEffects' => false],
892892
'file_get_contents' => ['hasSideEffects' => true],
893893
'file_put_contents' => ['hasSideEffects' => true],
894-
'fileatime' => ['hasSideEffects' => true],
895-
'filectime' => ['hasSideEffects' => true],
896-
'filegroup' => ['hasSideEffects' => true],
897-
'fileinode' => ['hasSideEffects' => true],
898-
'filemtime' => ['hasSideEffects' => true],
899-
'fileowner' => ['hasSideEffects' => true],
900-
'fileperms' => ['hasSideEffects' => true],
901-
'filesize' => ['hasSideEffects' => true],
902-
'filetype' => ['hasSideEffects' => true],
894+
'fileatime' => ['hasSideEffects' => false],
895+
'filectime' => ['hasSideEffects' => false],
896+
'filegroup' => ['hasSideEffects' => false],
897+
'fileinode' => ['hasSideEffects' => false],
898+
'filemtime' => ['hasSideEffects' => false],
899+
'fileowner' => ['hasSideEffects' => false],
900+
'fileperms' => ['hasSideEffects' => false],
901+
'filesize' => ['hasSideEffects' => false],
902+
'filetype' => ['hasSideEffects' => false],
903903
'filter_has_var' => ['hasSideEffects' => false],
904904
'filter_id' => ['hasSideEffects' => false],
905905
'filter_input' => ['hasSideEffects' => false],
@@ -1223,34 +1223,34 @@
12231223
'is_array' => ['hasSideEffects' => false],
12241224
'is_bool' => ['hasSideEffects' => false],
12251225
'is_countable' => ['hasSideEffects' => false],
1226-
'is_dir' => ['hasSideEffects' => true],
1226+
'is_dir' => ['hasSideEffects' => false],
12271227
'is_double' => ['hasSideEffects' => false],
1228-
'is_executable' => ['hasSideEffects' => true],
1229-
'is_file' => ['hasSideEffects' => true],
1228+
'is_executable' => ['hasSideEffects' => false],
1229+
'is_file' => ['hasSideEffects' => false],
12301230
'is_finite' => ['hasSideEffects' => false],
12311231
'is_float' => ['hasSideEffects' => false],
12321232
'is_infinite' => ['hasSideEffects' => false],
12331233
'is_int' => ['hasSideEffects' => false],
12341234
'is_integer' => ['hasSideEffects' => false],
12351235
'is_iterable' => ['hasSideEffects' => false],
1236-
'is_link' => ['hasSideEffects' => true],
1236+
'is_link' => ['hasSideEffects' => false],
12371237
'is_long' => ['hasSideEffects' => false],
12381238
'is_nan' => ['hasSideEffects' => false],
12391239
'is_null' => ['hasSideEffects' => false],
12401240
'is_numeric' => ['hasSideEffects' => false],
12411241
'is_object' => ['hasSideEffects' => false],
1242-
'is_readable' => ['hasSideEffects' => true],
1242+
'is_readable' => ['hasSideEffects' => false],
12431243
'is_real' => ['hasSideEffects' => false],
12441244
'is_resource' => ['hasSideEffects' => false],
12451245
'is_scalar' => ['hasSideEffects' => false],
12461246
'is_string' => ['hasSideEffects' => false],
12471247
'is_subclass_of' => ['hasSideEffects' => false],
12481248
'is_uploaded_file' => ['hasSideEffects' => true],
1249-
'is_writable' => ['hasSideEffects' => true],
1250-
'is_writeable' => ['hasSideEffects' => true],
1249+
'is_writable' => ['hasSideEffects' => false],
1250+
'is_writeable' => ['hasSideEffects' => false],
12511251
'iterator_count' => ['hasSideEffects' => false],
12521252
'join' => ['hasSideEffects' => false],
1253-
'json_last_error' => ['hasSideEffects' => true],
1253+
'json_last_error' => ['hasSideEffects' => false],
12541254
'json_last_error_msg' => ['hasSideEffects' => false],
12551255
'json_validate' => ['hasSideEffects' => false],
12561256
'key' => ['hasSideEffects' => false],
@@ -1285,7 +1285,7 @@
12851285
'log10' => ['hasSideEffects' => false],
12861286
'log1p' => ['hasSideEffects' => false],
12871287
'long2ip' => ['hasSideEffects' => false],
1288-
'lstat' => ['hasSideEffects' => true],
1288+
'lstat' => ['hasSideEffects' => false],
12891289
'ltrim' => ['hasSideEffects' => false],
12901290
'max' => ['hasSideEffects' => false],
12911291
'mb_check_encoding' => ['hasSideEffects' => false],
@@ -1496,7 +1496,7 @@
14961496
'spl_object_hash' => ['hasSideEffects' => false],
14971497
'sprintf' => ['hasSideEffects' => false],
14981498
'sqrt' => ['hasSideEffects' => false],
1499-
'stat' => ['hasSideEffects' => true],
1499+
'stat' => ['hasSideEffects' => false],
15001500
'str_contains' => ['hasSideEffects' => false],
15011501
'str_decrement' => ['hasSideEffects' => false],
15021502
'str_ends_with' => ['hasSideEffects' => false],

0 commit comments

Comments
 (0)