diff --git a/composer.json b/composer.json index 9e7b607..bca31a6 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,10 @@ "psr-4": { "Readability\\": "src/" } }, "autoload-dev": { - "psr-4": { "Tests\\Readability\\": "tests/" } + "psr-4": { + "Tests\\Readability\\": "tests/", + "Readability\\Maintenance\\": "maintenance/" + } }, "scripts": { "fix": "php-cs-fixer fix --verbose --diff", diff --git a/maintenance/PHPStan/DOMDocumentGetElementDynamicReturnTypeExtension.php b/maintenance/PHPStan/DOMDocumentGetElementDynamicReturnTypeExtension.php new file mode 100644 index 0000000..0196ed0 --- /dev/null +++ b/maintenance/PHPStan/DOMDocumentGetElementDynamicReturnTypeExtension.php @@ -0,0 +1,38 @@ +getName(), + [ + 'createElement', + ], true); + } + + public function getTypeFromMethodCall( + MethodReflection $methodReflection, + MethodCall $methodCall, + Scope $scope + ): ?Type + { + return new ObjectType(JSLikeHTMLElement::class); + } +} diff --git a/maintenance/PHPStan/DOMDocumentGetElementsDynamicReturnTypeExtension.php b/maintenance/PHPStan/DOMDocumentGetElementsDynamicReturnTypeExtension.php new file mode 100644 index 0000000..f7c28bc --- /dev/null +++ b/maintenance/PHPStan/DOMDocumentGetElementsDynamicReturnTypeExtension.php @@ -0,0 +1,39 @@ +getName(), + [ + 'getElementsByTagName', + ], true); + } + + public function getTypeFromMethodCall( + MethodReflection $methodReflection, + MethodCall $methodCall, + Scope $scope + ): ?Type + { + $elementType = new ObjectType(JSLikeHTMLElement::class); + return new GenericObjectType(\DOMNodeList::class, [$elementType]); + } +} diff --git a/maintenance/PHPStan/DOMElementGetElementsDynamicReturnTypeExtension.php b/maintenance/PHPStan/DOMElementGetElementsDynamicReturnTypeExtension.php new file mode 100644 index 0000000..e6a7d34 --- /dev/null +++ b/maintenance/PHPStan/DOMElementGetElementsDynamicReturnTypeExtension.php @@ -0,0 +1,39 @@ +getName(), + [ + 'getElementsByTagName', + ], true); + } + + public function getTypeFromMethodCall( + MethodReflection $methodReflection, + MethodCall $methodCall, + Scope $scope + ): ?Type + { + $elementType = new ObjectType(JSLikeHTMLElement::class); + return new GenericObjectType(\DOMNodeList::class, [$elementType]); + } +} diff --git a/phpstan.dist.neon b/phpstan.dist.neon index 4e2f08f..aca4130 100644 --- a/phpstan.dist.neon +++ b/phpstan.dist.neon @@ -8,9 +8,23 @@ parameters: bootstrapFiles: - vendor/bin/.phpunit/phpunit/vendor/autoload.php - stubFiles: - - stubs/dom.stub - includes: - vendor/phpstan/phpstan-phpunit/extension.neon - vendor/phpstan/phpstan-phpunit/rules.neon + - phar://phpstan.phar/conf/bleedingEdge.neon + +services: + - + class: Readability\Maintenance\PHPStan\DOMDocumentGetElementDynamicReturnTypeExtension + tags: + - phpstan.broker.dynamicMethodReturnTypeExtension + + - + class: Readability\Maintenance\PHPStan\DOMDocumentGetElementsDynamicReturnTypeExtension + tags: + - phpstan.broker.dynamicMethodReturnTypeExtension + + - + class: Readability\Maintenance\PHPStan\DOMElementGetElementsDynamicReturnTypeExtension + tags: + - phpstan.broker.dynamicMethodReturnTypeExtension diff --git a/src/Readability.php b/src/Readability.php index ab4c2d8..b0a4a12 100644 --- a/src/Readability.php +++ b/src/Readability.php @@ -844,7 +844,7 @@ class Readability implements LoggerAwareInterface /** * Get the article title as an H1. * - * @return \DOMElement + * @return JSLikeHTMLElement */ protected function getArticleTitle() { diff --git a/stubs/dom.stub b/stubs/dom.stub deleted file mode 100644 index 09a39d6..0000000 --- a/stubs/dom.stub +++ /dev/null @@ -1,40 +0,0 @@ - - */ - public function getElementsByTagName($name) {} - - /** - * @param string $localName - * @param string $value - * @return JSLikeHTMLElement Officially, this can return false but PHPStan decided to ignore that: - */ - public function createElement($localName, $value = '') {} -} - -class DOMNode -{ - -} - -class DOMElement extends DOMNode -{ - /** - * @param string $name - * @return DOMNodeList - */ - public function getElementsByTagName($name) {} -}