From ca3e5d2c19f8ddb2f7f968408e36968c6e28772b Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Sun, 8 Dec 2024 22:21:09 +0000 Subject: [PATCH] Fix issues by copying code from Ondrej --- stubs/dom.stub | 12 ++++++-- .../Analyser/nsrt/DOMLegacyNamedNodeNap.php | 2 ++ .../data/dom-legacy-ext-template-nodes.php | 28 +++++-------------- 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/stubs/dom.stub b/stubs/dom.stub index a7935e2de5..755247c942 100644 --- a/stubs/dom.stub +++ b/stubs/dom.stub @@ -37,7 +37,6 @@ class DOMNode /** * @phpstan-assert-if-true DOMNamedNodeMap $this->attributes - * @phpstan-assert-if-false null $this->attributes */ public function hasAttributes(): bool {} } @@ -48,6 +47,12 @@ class DOMElement extends DOMNode /** @var DOMDocument */ public $ownerDocument; + /** + * @readonly + * @var DOMNamedNodeMap|null + */ + public $attributes; + /** * @param string $name * @return DOMNodeList @@ -64,11 +69,12 @@ class DOMElement extends DOMNode /** * @template-covariant T of string * @param T $qualifiedName - * @phpstan-assert-if-true DOMAttr|DOMNameSpaceNode $this->getAttributeNode($qualifiedName) + * @phpstan-assert-if-true =DOMAttr $this->getAttributeNode($qualifiedName) + * @phpstan-assert-if-true =DOMNamedNodeMap $this->attributes */ public function hasAttribute(string $qualifiedName): bool {} - public function getAttributeNode(string $qualifiedName): DOMAttr|DOMNameSpaceNode|false {} + public function getAttributeNode(string $qualifiedName): DOMAttr|false {} } /** diff --git a/tests/PHPStan/Analyser/nsrt/DOMLegacyNamedNodeNap.php b/tests/PHPStan/Analyser/nsrt/DOMLegacyNamedNodeNap.php index dacab6d5b2..69bc94a93e 100644 --- a/tests/PHPStan/Analyser/nsrt/DOMLegacyNamedNodeNap.php +++ b/tests/PHPStan/Analyser/nsrt/DOMLegacyNamedNodeNap.php @@ -22,6 +22,7 @@ public function basic_node(DOMNode $node): void { public function element_node(DOMElement $element): void { + assertType('DOMNamedNodeMap|null', $element->attributes); if ($element->hasAttribute('class')) { assertType('DOMNamedNodeMap', $element->attributes); $attribute = $element->getAttributeNode('class'); @@ -34,6 +35,7 @@ public function element_node(DOMElement $element): void public function element_node_attribute_fetch_via_attributes_property(DOMElement $element): void { + assertType('DOMNamedNodeMap|null', $element->attributes); if ($element->hasAttribute('class')) { assertType('DOMNamedNodeMap', $element->attributes); $attribute = $element->attributes->getNamedItem('class'); diff --git a/tests/PHPStan/Rules/Properties/data/dom-legacy-ext-template-nodes.php b/tests/PHPStan/Rules/Properties/data/dom-legacy-ext-template-nodes.php index 53f7ccd263..ad39d72ab4 100644 --- a/tests/PHPStan/Rules/Properties/data/dom-legacy-ext-template-nodes.php +++ b/tests/PHPStan/Rules/Properties/data/dom-legacy-ext-template-nodes.php @@ -1,38 +1,24 @@ hasAttributes()) { - assertType(DOMNamedNodeMap::class . '<' . DOMAttr::class . '>', $node->attributes); - } else { - assertType('null', $node->attributes); - } + var_dump($node->attributes); } function element_node(\DOMElement $element): void { if ($element->hasAttribute('class')) { - assertType(DOMNamedNodeMap::class . '<' . DOMAttr::class . '>', $element->attributes); $attribute = $element->getAttributeNode('class'); - assertType(DOMAttr::class, $attribute); - assertType('string', $attribute->value); - } else { - assertType('DOMNamedNodeMap::class . '<' . DOMAttr::class . '>'|null', $element->attributes); + echo $attribute->value; } } function element_node_attribute_fetch_via_attributes_property(\DOMElement $element): void { - if ($element->hasAttribute('class')) { - assertType(DOMNamedNodeMap::class . '<' . DOMAttr::class . '>', $element->attributes); - $attribute = $element->attributes->getNamedItem('class'); - if ($attribute === null) { - return; - } - assertType(DOMAttr::class, $attribute); - assertType('string', $attribute->value); - } else { - assertType('DOMNamedNodeMap::class . '<' . DOMAttr::class . '>'|null', $element->attributes); + $attribute = $element->attributes->getNamedItem('class'); + if ($attribute === null) { + return; } + echo $attribute->value; }