Skip to content

Commit 7537f81

Browse files
committed
Methods and functions marked as #[Pure] but having @throws are considered to have side effects
1 parent 32590a1 commit 7537f81

4 files changed

Lines changed: 30 additions & 65 deletions

File tree

bin/generate-function-metadata.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@
2525
public function enterNode(Node $node)
2626
{
2727
if ($node instanceof Node\Stmt\Function_) {
28+
if ($node->getDocComment() !== null) {
29+
$phpDoc = $node->getDocComment()->getText();
30+
if (strpos($phpDoc, '@throws') !== false) {
31+
return null;
32+
}
33+
}
2834
foreach ($node->attrGroups as $attrGroup) {
2935
foreach ($attrGroup->attrs as $attr) {
3036
if ($attr->name->toString() === \JetBrains\PhpStorm\Pure::class) {
@@ -36,6 +42,12 @@ public function enterNode(Node $node)
3642
}
3743

3844
if ($node instanceof Node\Stmt\ClassMethod) {
45+
if ($node->getDocComment() !== null) {
46+
$phpDoc = $node->getDocComment()->getText();
47+
if (strpos($phpDoc, '@throws') !== false) {
48+
return null;
49+
}
50+
}
3951
$class = $node->getAttribute('parent');
4052
if (!$class instanceof Node\Stmt\ClassLike) {
4153
throw new \PHPStan\ShouldNotHappenException($node->name->toString());

resources/functionMetadata.php

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -102,46 +102,7 @@
102102
'Exception::getPrevious' => ['hasSideEffects' => false],
103103
'Exception::getTrace' => ['hasSideEffects' => false],
104104
'Exception::getTraceAsString' => ['hasSideEffects' => false],
105-
'Gmagick::getcopyright' => ['hasSideEffects' => false],
106-
'Gmagick::getfilename' => ['hasSideEffects' => false],
107-
'Gmagick::getimagebackgroundcolor' => ['hasSideEffects' => false],
108-
'Gmagick::getimageblueprimary' => ['hasSideEffects' => false],
109-
'Gmagick::getimagebordercolor' => ['hasSideEffects' => false],
110-
'Gmagick::getimagechanneldepth' => ['hasSideEffects' => false],
111-
'Gmagick::getimagecolors' => ['hasSideEffects' => false],
112-
'Gmagick::getimagecolorspace' => ['hasSideEffects' => false],
113-
'Gmagick::getimagecompose' => ['hasSideEffects' => false],
114-
'Gmagick::getimagedelay' => ['hasSideEffects' => false],
115-
'Gmagick::getimagedepth' => ['hasSideEffects' => false],
116-
'Gmagick::getimagedispose' => ['hasSideEffects' => false],
117-
'Gmagick::getimageextrema' => ['hasSideEffects' => false],
118-
'Gmagick::getimagefilename' => ['hasSideEffects' => false],
119-
'Gmagick::getimageformat' => ['hasSideEffects' => false],
120-
'Gmagick::getimagegamma' => ['hasSideEffects' => false],
121-
'Gmagick::getimagegreenprimary' => ['hasSideEffects' => false],
122-
'Gmagick::getimageheight' => ['hasSideEffects' => false],
123-
'Gmagick::getimagehistogram' => ['hasSideEffects' => false],
124-
'Gmagick::getimageindex' => ['hasSideEffects' => false],
125-
'Gmagick::getimageinterlacescheme' => ['hasSideEffects' => false],
126-
'Gmagick::getimageiterations' => ['hasSideEffects' => false],
127-
'Gmagick::getimagematte' => ['hasSideEffects' => false],
128-
'Gmagick::getimagemattecolor' => ['hasSideEffects' => false],
129-
'Gmagick::getimageprofile' => ['hasSideEffects' => false],
130-
'Gmagick::getimageredprimary' => ['hasSideEffects' => false],
131-
'Gmagick::getimagerenderingintent' => ['hasSideEffects' => false],
132-
'Gmagick::getimageresolution' => ['hasSideEffects' => false],
133-
'Gmagick::getimagescene' => ['hasSideEffects' => false],
134-
'Gmagick::getimagesignature' => ['hasSideEffects' => false],
135-
'Gmagick::getimagetype' => ['hasSideEffects' => false],
136105
'Gmagick::getimageunits' => ['hasSideEffects' => false],
137-
'Gmagick::getimagewhitepoint' => ['hasSideEffects' => false],
138-
'Gmagick::getimagewidth' => ['hasSideEffects' => false],
139-
'Gmagick::getpackagename' => ['hasSideEffects' => false],
140-
'Gmagick::getquantumdepth' => ['hasSideEffects' => false],
141-
'Gmagick::getreleasedate' => ['hasSideEffects' => false],
142-
'Gmagick::getsamplingfactors' => ['hasSideEffects' => false],
143-
'Gmagick::getsize' => ['hasSideEffects' => false],
144-
'Gmagick::getversion' => ['hasSideEffects' => false],
145106
'GmagickDraw::getfillcolor' => ['hasSideEffects' => false],
146107
'GmagickDraw::getfillopacity' => ['hasSideEffects' => false],
147108
'GmagickDraw::getfont' => ['hasSideEffects' => false],
@@ -153,9 +114,6 @@
153114
'GmagickDraw::getstrokewidth' => ['hasSideEffects' => false],
154115
'GmagickDraw::gettextdecoration' => ['hasSideEffects' => false],
155116
'GmagickDraw::gettextencoding' => ['hasSideEffects' => false],
156-
'GmagickPixel::getcolor' => ['hasSideEffects' => false],
157-
'GmagickPixel::getcolorcount' => ['hasSideEffects' => false],
158-
'GmagickPixel::getcolorvalue' => ['hasSideEffects' => false],
159117
'HttpMessage::getBody' => ['hasSideEffects' => false],
160118
'HttpMessage::getHeader' => ['hasSideEffects' => false],
161119
'HttpMessage::getHeaders' => ['hasSideEffects' => false],
@@ -245,11 +203,9 @@
245203
'Imagick::getImageGamma' => ['hasSideEffects' => false],
246204
'Imagick::getImageGeometry' => ['hasSideEffects' => false],
247205
'Imagick::getImageGravity' => ['hasSideEffects' => false],
248-
'Imagick::getImageGreenPrimary' => ['hasSideEffects' => false],
249206
'Imagick::getImageHeight' => ['hasSideEffects' => false],
250207
'Imagick::getImageHistogram' => ['hasSideEffects' => false],
251208
'Imagick::getImageIndex' => ['hasSideEffects' => false],
252-
'Imagick::getImageInterlaceScheme' => ['hasSideEffects' => false],
253209
'Imagick::getImageInterpolateMethod' => ['hasSideEffects' => false],
254210
'Imagick::getImageIterations' => ['hasSideEffects' => false],
255211
'Imagick::getImageLength' => ['hasSideEffects' => false],
@@ -263,26 +219,22 @@
263219
'Imagick::getImageProfiles' => ['hasSideEffects' => false],
264220
'Imagick::getImageProperties' => ['hasSideEffects' => false],
265221
'Imagick::getImageProperty' => ['hasSideEffects' => false],
266-
'Imagick::getImageRedPrimary' => ['hasSideEffects' => false],
267222
'Imagick::getImageRegion' => ['hasSideEffects' => false],
268223
'Imagick::getImageRenderingIntent' => ['hasSideEffects' => false],
269224
'Imagick::getImageResolution' => ['hasSideEffects' => false],
270225
'Imagick::getImageScene' => ['hasSideEffects' => false],
271226
'Imagick::getImageSignature' => ['hasSideEffects' => false],
272227
'Imagick::getImageSize' => ['hasSideEffects' => false],
273228
'Imagick::getImageTicksPerSecond' => ['hasSideEffects' => false],
274-
'Imagick::getImageTotalInkDensity' => ['hasSideEffects' => false],
275229
'Imagick::getImageType' => ['hasSideEffects' => false],
276230
'Imagick::getImageUnits' => ['hasSideEffects' => false],
277231
'Imagick::getImageVirtualPixelMethod' => ['hasSideEffects' => false],
278232
'Imagick::getImageWhitePoint' => ['hasSideEffects' => false],
279233
'Imagick::getImageWidth' => ['hasSideEffects' => false],
280-
'Imagick::getImagesBlob' => ['hasSideEffects' => false],
281234
'Imagick::getInterlaceScheme' => ['hasSideEffects' => false],
282235
'Imagick::getIteratorIndex' => ['hasSideEffects' => false],
283236
'Imagick::getNumberImages' => ['hasSideEffects' => false],
284237
'Imagick::getOption' => ['hasSideEffects' => false],
285-
'Imagick::getPage' => ['hasSideEffects' => false],
286238
'Imagick::getPixelIterator' => ['hasSideEffects' => false],
287239
'Imagick::getPixelRegionIterator' => ['hasSideEffects' => false],
288240
'Imagick::getPointSize' => ['hasSideEffects' => false],
@@ -326,18 +278,11 @@
326278
'ImagickDraw::getTextUnderColor' => ['hasSideEffects' => false],
327279
'ImagickDraw::getVectorGraphics' => ['hasSideEffects' => false],
328280
'ImagickKernel::getMatrix' => ['hasSideEffects' => false],
329-
'ImagickPixel::getColor' => ['hasSideEffects' => false],
330281
'ImagickPixel::getColorAsString' => ['hasSideEffects' => false],
331-
'ImagickPixel::getColorCount' => ['hasSideEffects' => false],
332282
'ImagickPixel::getColorQuantum' => ['hasSideEffects' => false],
333-
'ImagickPixel::getColorValue' => ['hasSideEffects' => false],
334283
'ImagickPixel::getColorValueQuantum' => ['hasSideEffects' => false],
335-
'ImagickPixel::getHSL' => ['hasSideEffects' => false],
336284
'ImagickPixel::getIndex' => ['hasSideEffects' => false],
337285
'ImagickPixelIterator::getCurrentIteratorRow' => ['hasSideEffects' => false],
338-
'ImagickPixelIterator::getIteratorRow' => ['hasSideEffects' => false],
339-
'ImagickPixelIterator::getNextIteratorRow' => ['hasSideEffects' => false],
340-
'ImagickPixelIterator::getPreviousIteratorRow' => ['hasSideEffects' => false],
341286
'IntlBreakIterator::current' => ['hasSideEffects' => false],
342287
'IntlBreakIterator::getErrorCode' => ['hasSideEffects' => false],
343288
'IntlBreakIterator::getErrorMessage' => ['hasSideEffects' => false],
@@ -441,14 +386,12 @@
441386
'ReflectionClass::getFileName' => ['hasSideEffects' => false],
442387
'ReflectionClass::getInterfaceNames' => ['hasSideEffects' => false],
443388
'ReflectionClass::getInterfaces' => ['hasSideEffects' => false],
444-
'ReflectionClass::getMethod' => ['hasSideEffects' => false],
445389
'ReflectionClass::getMethods' => ['hasSideEffects' => false],
446390
'ReflectionClass::getModifiers' => ['hasSideEffects' => false],
447391
'ReflectionClass::getName' => ['hasSideEffects' => false],
448392
'ReflectionClass::getNamespaceName' => ['hasSideEffects' => false],
449393
'ReflectionClass::getParentClass' => ['hasSideEffects' => false],
450394
'ReflectionClass::getProperties' => ['hasSideEffects' => false],
451-
'ReflectionClass::getProperty' => ['hasSideEffects' => false],
452395
'ReflectionClass::getReflectionConstant' => ['hasSideEffects' => false],
453396
'ReflectionClass::getReflectionConstants' => ['hasSideEffects' => false],
454397
'ReflectionClass::getShortName' => ['hasSideEffects' => false],
@@ -524,7 +467,6 @@
524467
'ReflectionMethod::getClosure' => ['hasSideEffects' => false],
525468
'ReflectionMethod::getDeclaringClass' => ['hasSideEffects' => false],
526469
'ReflectionMethod::getModifiers' => ['hasSideEffects' => false],
527-
'ReflectionMethod::getPrototype' => ['hasSideEffects' => false],
528470
'ReflectionMethod::isAbstract' => ['hasSideEffects' => false],
529471
'ReflectionMethod::isConstructor' => ['hasSideEffects' => false],
530472
'ReflectionMethod::isDestructor' => ['hasSideEffects' => false],
@@ -539,8 +481,6 @@
539481
'ReflectionParameter::getClass' => ['hasSideEffects' => false],
540482
'ReflectionParameter::getDeclaringClass' => ['hasSideEffects' => false],
541483
'ReflectionParameter::getDeclaringFunction' => ['hasSideEffects' => false],
542-
'ReflectionParameter::getDefaultValue' => ['hasSideEffects' => false],
543-
'ReflectionParameter::getDefaultValueConstantName' => ['hasSideEffects' => false],
544484
'ReflectionParameter::getName' => ['hasSideEffects' => false],
545485
'ReflectionParameter::getPosition' => ['hasSideEffects' => false],
546486
'ReflectionParameter::getType' => ['hasSideEffects' => false],
@@ -616,11 +556,6 @@
616556
'UConverter::getStandards' => ['hasSideEffects' => false],
617557
'UConverter::getSubstChars' => ['hasSideEffects' => false],
618558
'UConverter::reasonText' => ['hasSideEffects' => false],
619-
'Zookeeper::getAcl' => ['hasSideEffects' => false],
620-
'Zookeeper::getChildren' => ['hasSideEffects' => false],
621-
'Zookeeper::getClientId' => ['hasSideEffects' => false],
622-
'Zookeeper::getRecvTimeout' => ['hasSideEffects' => false],
623-
'Zookeeper::getState' => ['hasSideEffects' => false],
624559
'_' => ['hasSideEffects' => false],
625560
'abs' => ['hasSideEffects' => false],
626561
'acos' => ['hasSideEffects' => false],

tests/PHPStan/Rules/Methods/CallToMethodStamentWithoutSideEffectsRuleTest.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,9 @@ public function testNullsafe(): void
4949
]);
5050
}
5151

52+
public function testBug4232(): void
53+
{
54+
$this->analyse([__DIR__ . '/data/bug-4232.php'], []);
55+
}
56+
5257
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Bug4232;
4+
5+
function (\ReflectionMethod $m): bool
6+
{
7+
try {
8+
$m->getPrototype();
9+
return true;
10+
} catch (\ReflectionException $e) {
11+
return false;
12+
}
13+
};

0 commit comments

Comments
 (0)