Skip to content

Commit

Permalink
Methods and functions marked as #[Pure] but having @throws are cons…
Browse files Browse the repository at this point in the history
…idered to have side effects
  • Loading branch information
ondrejmirtes committed Dec 14, 2020
1 parent 32590a1 commit 7537f81
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 65 deletions.
12 changes: 12 additions & 0 deletions bin/generate-function-metadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@
public function enterNode(Node $node)
{
if ($node instanceof Node\Stmt\Function_) {
if ($node->getDocComment() !== null) {
$phpDoc = $node->getDocComment()->getText();
if (strpos($phpDoc, '@throws') !== false) {
return null;
}
}
foreach ($node->attrGroups as $attrGroup) {
foreach ($attrGroup->attrs as $attr) {
if ($attr->name->toString() === \JetBrains\PhpStorm\Pure::class) {
Expand All @@ -36,6 +42,12 @@ public function enterNode(Node $node)
}

if ($node instanceof Node\Stmt\ClassMethod) {
if ($node->getDocComment() !== null) {
$phpDoc = $node->getDocComment()->getText();
if (strpos($phpDoc, '@throws') !== false) {
return null;
}
}
$class = $node->getAttribute('parent');
if (!$class instanceof Node\Stmt\ClassLike) {
throw new \PHPStan\ShouldNotHappenException($node->name->toString());
Expand Down
65 changes: 0 additions & 65 deletions resources/functionMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -102,46 +102,7 @@
'Exception::getPrevious' => ['hasSideEffects' => false],
'Exception::getTrace' => ['hasSideEffects' => false],
'Exception::getTraceAsString' => ['hasSideEffects' => false],
'Gmagick::getcopyright' => ['hasSideEffects' => false],
'Gmagick::getfilename' => ['hasSideEffects' => false],
'Gmagick::getimagebackgroundcolor' => ['hasSideEffects' => false],
'Gmagick::getimageblueprimary' => ['hasSideEffects' => false],
'Gmagick::getimagebordercolor' => ['hasSideEffects' => false],
'Gmagick::getimagechanneldepth' => ['hasSideEffects' => false],
'Gmagick::getimagecolors' => ['hasSideEffects' => false],
'Gmagick::getimagecolorspace' => ['hasSideEffects' => false],
'Gmagick::getimagecompose' => ['hasSideEffects' => false],
'Gmagick::getimagedelay' => ['hasSideEffects' => false],
'Gmagick::getimagedepth' => ['hasSideEffects' => false],
'Gmagick::getimagedispose' => ['hasSideEffects' => false],
'Gmagick::getimageextrema' => ['hasSideEffects' => false],
'Gmagick::getimagefilename' => ['hasSideEffects' => false],
'Gmagick::getimageformat' => ['hasSideEffects' => false],
'Gmagick::getimagegamma' => ['hasSideEffects' => false],
'Gmagick::getimagegreenprimary' => ['hasSideEffects' => false],
'Gmagick::getimageheight' => ['hasSideEffects' => false],
'Gmagick::getimagehistogram' => ['hasSideEffects' => false],
'Gmagick::getimageindex' => ['hasSideEffects' => false],
'Gmagick::getimageinterlacescheme' => ['hasSideEffects' => false],
'Gmagick::getimageiterations' => ['hasSideEffects' => false],
'Gmagick::getimagematte' => ['hasSideEffects' => false],
'Gmagick::getimagemattecolor' => ['hasSideEffects' => false],
'Gmagick::getimageprofile' => ['hasSideEffects' => false],
'Gmagick::getimageredprimary' => ['hasSideEffects' => false],
'Gmagick::getimagerenderingintent' => ['hasSideEffects' => false],
'Gmagick::getimageresolution' => ['hasSideEffects' => false],
'Gmagick::getimagescene' => ['hasSideEffects' => false],
'Gmagick::getimagesignature' => ['hasSideEffects' => false],
'Gmagick::getimagetype' => ['hasSideEffects' => false],
'Gmagick::getimageunits' => ['hasSideEffects' => false],
'Gmagick::getimagewhitepoint' => ['hasSideEffects' => false],
'Gmagick::getimagewidth' => ['hasSideEffects' => false],
'Gmagick::getpackagename' => ['hasSideEffects' => false],
'Gmagick::getquantumdepth' => ['hasSideEffects' => false],
'Gmagick::getreleasedate' => ['hasSideEffects' => false],
'Gmagick::getsamplingfactors' => ['hasSideEffects' => false],
'Gmagick::getsize' => ['hasSideEffects' => false],
'Gmagick::getversion' => ['hasSideEffects' => false],
'GmagickDraw::getfillcolor' => ['hasSideEffects' => false],
'GmagickDraw::getfillopacity' => ['hasSideEffects' => false],
'GmagickDraw::getfont' => ['hasSideEffects' => false],
Expand All @@ -153,9 +114,6 @@
'GmagickDraw::getstrokewidth' => ['hasSideEffects' => false],
'GmagickDraw::gettextdecoration' => ['hasSideEffects' => false],
'GmagickDraw::gettextencoding' => ['hasSideEffects' => false],
'GmagickPixel::getcolor' => ['hasSideEffects' => false],
'GmagickPixel::getcolorcount' => ['hasSideEffects' => false],
'GmagickPixel::getcolorvalue' => ['hasSideEffects' => false],
'HttpMessage::getBody' => ['hasSideEffects' => false],
'HttpMessage::getHeader' => ['hasSideEffects' => false],
'HttpMessage::getHeaders' => ['hasSideEffects' => false],
Expand Down Expand Up @@ -245,11 +203,9 @@
'Imagick::getImageGamma' => ['hasSideEffects' => false],
'Imagick::getImageGeometry' => ['hasSideEffects' => false],
'Imagick::getImageGravity' => ['hasSideEffects' => false],
'Imagick::getImageGreenPrimary' => ['hasSideEffects' => false],
'Imagick::getImageHeight' => ['hasSideEffects' => false],
'Imagick::getImageHistogram' => ['hasSideEffects' => false],
'Imagick::getImageIndex' => ['hasSideEffects' => false],
'Imagick::getImageInterlaceScheme' => ['hasSideEffects' => false],
'Imagick::getImageInterpolateMethod' => ['hasSideEffects' => false],
'Imagick::getImageIterations' => ['hasSideEffects' => false],
'Imagick::getImageLength' => ['hasSideEffects' => false],
Expand All @@ -263,26 +219,22 @@
'Imagick::getImageProfiles' => ['hasSideEffects' => false],
'Imagick::getImageProperties' => ['hasSideEffects' => false],
'Imagick::getImageProperty' => ['hasSideEffects' => false],
'Imagick::getImageRedPrimary' => ['hasSideEffects' => false],
'Imagick::getImageRegion' => ['hasSideEffects' => false],
'Imagick::getImageRenderingIntent' => ['hasSideEffects' => false],
'Imagick::getImageResolution' => ['hasSideEffects' => false],
'Imagick::getImageScene' => ['hasSideEffects' => false],
'Imagick::getImageSignature' => ['hasSideEffects' => false],
'Imagick::getImageSize' => ['hasSideEffects' => false],
'Imagick::getImageTicksPerSecond' => ['hasSideEffects' => false],
'Imagick::getImageTotalInkDensity' => ['hasSideEffects' => false],
'Imagick::getImageType' => ['hasSideEffects' => false],
'Imagick::getImageUnits' => ['hasSideEffects' => false],
'Imagick::getImageVirtualPixelMethod' => ['hasSideEffects' => false],
'Imagick::getImageWhitePoint' => ['hasSideEffects' => false],
'Imagick::getImageWidth' => ['hasSideEffects' => false],
'Imagick::getImagesBlob' => ['hasSideEffects' => false],
'Imagick::getInterlaceScheme' => ['hasSideEffects' => false],
'Imagick::getIteratorIndex' => ['hasSideEffects' => false],
'Imagick::getNumberImages' => ['hasSideEffects' => false],
'Imagick::getOption' => ['hasSideEffects' => false],
'Imagick::getPage' => ['hasSideEffects' => false],
'Imagick::getPixelIterator' => ['hasSideEffects' => false],
'Imagick::getPixelRegionIterator' => ['hasSideEffects' => false],
'Imagick::getPointSize' => ['hasSideEffects' => false],
Expand Down Expand Up @@ -326,18 +278,11 @@
'ImagickDraw::getTextUnderColor' => ['hasSideEffects' => false],
'ImagickDraw::getVectorGraphics' => ['hasSideEffects' => false],
'ImagickKernel::getMatrix' => ['hasSideEffects' => false],
'ImagickPixel::getColor' => ['hasSideEffects' => false],
'ImagickPixel::getColorAsString' => ['hasSideEffects' => false],
'ImagickPixel::getColorCount' => ['hasSideEffects' => false],
'ImagickPixel::getColorQuantum' => ['hasSideEffects' => false],
'ImagickPixel::getColorValue' => ['hasSideEffects' => false],
'ImagickPixel::getColorValueQuantum' => ['hasSideEffects' => false],
'ImagickPixel::getHSL' => ['hasSideEffects' => false],
'ImagickPixel::getIndex' => ['hasSideEffects' => false],
'ImagickPixelIterator::getCurrentIteratorRow' => ['hasSideEffects' => false],
'ImagickPixelIterator::getIteratorRow' => ['hasSideEffects' => false],
'ImagickPixelIterator::getNextIteratorRow' => ['hasSideEffects' => false],
'ImagickPixelIterator::getPreviousIteratorRow' => ['hasSideEffects' => false],
'IntlBreakIterator::current' => ['hasSideEffects' => false],
'IntlBreakIterator::getErrorCode' => ['hasSideEffects' => false],
'IntlBreakIterator::getErrorMessage' => ['hasSideEffects' => false],
Expand Down Expand Up @@ -441,14 +386,12 @@
'ReflectionClass::getFileName' => ['hasSideEffects' => false],
'ReflectionClass::getInterfaceNames' => ['hasSideEffects' => false],
'ReflectionClass::getInterfaces' => ['hasSideEffects' => false],
'ReflectionClass::getMethod' => ['hasSideEffects' => false],
'ReflectionClass::getMethods' => ['hasSideEffects' => false],
'ReflectionClass::getModifiers' => ['hasSideEffects' => false],
'ReflectionClass::getName' => ['hasSideEffects' => false],
'ReflectionClass::getNamespaceName' => ['hasSideEffects' => false],
'ReflectionClass::getParentClass' => ['hasSideEffects' => false],
'ReflectionClass::getProperties' => ['hasSideEffects' => false],
'ReflectionClass::getProperty' => ['hasSideEffects' => false],
'ReflectionClass::getReflectionConstant' => ['hasSideEffects' => false],
'ReflectionClass::getReflectionConstants' => ['hasSideEffects' => false],
'ReflectionClass::getShortName' => ['hasSideEffects' => false],
Expand Down Expand Up @@ -524,7 +467,6 @@
'ReflectionMethod::getClosure' => ['hasSideEffects' => false],
'ReflectionMethod::getDeclaringClass' => ['hasSideEffects' => false],
'ReflectionMethod::getModifiers' => ['hasSideEffects' => false],
'ReflectionMethod::getPrototype' => ['hasSideEffects' => false],
'ReflectionMethod::isAbstract' => ['hasSideEffects' => false],
'ReflectionMethod::isConstructor' => ['hasSideEffects' => false],
'ReflectionMethod::isDestructor' => ['hasSideEffects' => false],
Expand All @@ -539,8 +481,6 @@
'ReflectionParameter::getClass' => ['hasSideEffects' => false],
'ReflectionParameter::getDeclaringClass' => ['hasSideEffects' => false],
'ReflectionParameter::getDeclaringFunction' => ['hasSideEffects' => false],
'ReflectionParameter::getDefaultValue' => ['hasSideEffects' => false],
'ReflectionParameter::getDefaultValueConstantName' => ['hasSideEffects' => false],
'ReflectionParameter::getName' => ['hasSideEffects' => false],
'ReflectionParameter::getPosition' => ['hasSideEffects' => false],
'ReflectionParameter::getType' => ['hasSideEffects' => false],
Expand Down Expand Up @@ -616,11 +556,6 @@
'UConverter::getStandards' => ['hasSideEffects' => false],
'UConverter::getSubstChars' => ['hasSideEffects' => false],
'UConverter::reasonText' => ['hasSideEffects' => false],
'Zookeeper::getAcl' => ['hasSideEffects' => false],
'Zookeeper::getChildren' => ['hasSideEffects' => false],
'Zookeeper::getClientId' => ['hasSideEffects' => false],
'Zookeeper::getRecvTimeout' => ['hasSideEffects' => false],
'Zookeeper::getState' => ['hasSideEffects' => false],
'_' => ['hasSideEffects' => false],
'abs' => ['hasSideEffects' => false],
'acos' => ['hasSideEffects' => false],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,9 @@ public function testNullsafe(): void
]);
}

public function testBug4232(): void
{
$this->analyse([__DIR__ . '/data/bug-4232.php'], []);
}

}
13 changes: 13 additions & 0 deletions tests/PHPStan/Rules/Methods/data/bug-4232.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace Bug4232;

function (\ReflectionMethod $m): bool
{
try {
$m->getPrototype();
return true;
} catch (\ReflectionException $e) {
return false;
}
};

0 comments on commit 7537f81

Please sign in to comment.