Skip to content

Commit

Permalink
tweak: fix node extension issue
Browse files Browse the repository at this point in the history
  • Loading branch information
g105b committed Jan 2, 2025
1 parent ffbc691 commit 6826fec
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 79 deletions.
80 changes: 3 additions & 77 deletions src/Node.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,85 +2,11 @@
// phpcs:ignoreFile
namespace Gt\Dom;

use DOMNode;

/**
* This class is defined twice to assure backwards compatibility with PHP
* versions from 8.1 through to 8.4 and beyond. When support for <= 8.3 is
* dropped, this strange hack will be removed, as we can all use typed class
* constants.
*/
if(version_compare(PHP_VERSION, "8.4", ">=")) {
class Node extends DOMNode {
use NonDocumentTypeChildNode;
use ChildNode;
use ParentNode;
use RegisteredNodeClass;

const TYPE_ELEMENT = XML_ELEMENT_NODE;
const TYPE_ATTR = XML_ATTRIBUTE_NODE;
const TYPE_TEXT = XML_TEXT_NODE;
const TYPE_CDATA = XML_CDATA_SECTION_NODE;
const TYPE_ENTITY_REF = XML_ENTITY_REF_NODE;
const TYPE_ENTITY = XML_ENTITY_NODE;
const TYPE_PI = XML_PI_NODE;
const TYPE_COMMENT = XML_COMMENT_NODE;
const TYPE_DOCUMENT = XML_DOCUMENT_NODE;
const TYPE_DOCUMENT_TYPE = XML_DOCUMENT_TYPE_NODE;
const TYPE_DOCUMENT_FRAGMENT = XML_DOCUMENT_FRAG_NODE;
const TYPE_NOTATION = XML_NOTATION_NODE;
const TYPE_HTML_DOCUMENT = XML_HTML_DOCUMENT_NODE;
const TYPE_DTD = XML_DTD_NODE;
const TYPE_ELEMENT_DECL = XML_ELEMENT_DECL_NODE;
const TYPE_ATTRIBUTE_DECL = XML_ATTRIBUTE_DECL_NODE;
const TYPE_ENTITY_DECL = XML_ENTITY_DECL_NODE;
const TYPE_NAMESPACE_DECL = XML_NAMESPACE_DECL_NODE;

public const int DOCUMENT_POSITION_DISCONNECTED = 0b000001;
public const int DOCUMENT_POSITION_PRECEDING = 0b000010;
public const int DOCUMENT_POSITION_FOLLOWING = 0b000100;
public const int DOCUMENT_POSITION_CONTAINS = 0b001000;
public const int DOCUMENT_POSITION_CONTAINED_BY = 0b010000;
public const int DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0b100000;

private function __construct() {}
if (version_compare(PHP_VERSION, '8.4', '>=')) {
class Node extends Node84 {
}
}
else {
class Node extends DOMNode {
use NonDocumentTypeChildNode;
use ChildNode;
use ParentNode;
use RegisteredNodeClass;

const TYPE_ELEMENT = XML_ELEMENT_NODE;
const TYPE_ATTR = XML_ATTRIBUTE_NODE;
const TYPE_TEXT = XML_TEXT_NODE;
const TYPE_CDATA = XML_CDATA_SECTION_NODE;
const TYPE_ENTITY_REF = XML_ENTITY_REF_NODE;
const TYPE_ENTITY = XML_ENTITY_NODE;
const TYPE_PI = XML_PI_NODE;
const TYPE_COMMENT = XML_COMMENT_NODE;
const TYPE_DOCUMENT = XML_DOCUMENT_NODE;
const TYPE_DOCUMENT_TYPE = XML_DOCUMENT_TYPE_NODE;
const TYPE_DOCUMENT_FRAGMENT = XML_DOCUMENT_FRAG_NODE;
const TYPE_NOTATION = XML_NOTATION_NODE;
const TYPE_HTML_DOCUMENT = XML_HTML_DOCUMENT_NODE;
const TYPE_DTD = XML_DTD_NODE;
const TYPE_ELEMENT_DECL = XML_ELEMENT_DECL_NODE;
const TYPE_ATTRIBUTE_DECL = XML_ATTRIBUTE_DECL_NODE;
const TYPE_ENTITY_DECL = XML_ENTITY_DECL_NODE;
const TYPE_NAMESPACE_DECL = XML_NAMESPACE_DECL_NODE;

public const DOCUMENT_POSITION_DISCONNECTED = 0b000001;
public const DOCUMENT_POSITION_PRECEDING = 0b000010;
public const DOCUMENT_POSITION_FOLLOWING = 0b000100;
public const DOCUMENT_POSITION_CONTAINS = 0b001000;
public const DOCUMENT_POSITION_CONTAINED_BY = 0b010000;
public const DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0b100000;

private function __construct() {}
class Node extends Node83 {
}
}

// phpcs:enable
39 changes: 39 additions & 0 deletions src/Node83.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php
namespace Gt\Dom;

use DOMNode;

class Node83 extends DOMNode {
use NonDocumentTypeChildNode;
use ChildNode;
use ParentNode;
use RegisteredNodeClass;

const TYPE_ELEMENT = XML_ELEMENT_NODE;
const TYPE_ATTR = XML_ATTRIBUTE_NODE;
const TYPE_TEXT = XML_TEXT_NODE;
const TYPE_CDATA = XML_CDATA_SECTION_NODE;
const TYPE_ENTITY_REF = XML_ENTITY_REF_NODE;
const TYPE_ENTITY = XML_ENTITY_NODE;
const TYPE_PI = XML_PI_NODE;
const TYPE_COMMENT = XML_COMMENT_NODE;
const TYPE_DOCUMENT = XML_DOCUMENT_NODE;
const TYPE_DOCUMENT_TYPE = XML_DOCUMENT_TYPE_NODE;
const TYPE_DOCUMENT_FRAGMENT = XML_DOCUMENT_FRAG_NODE;
const TYPE_NOTATION = XML_NOTATION_NODE;
const TYPE_HTML_DOCUMENT = XML_HTML_DOCUMENT_NODE;
const TYPE_DTD = XML_DTD_NODE;
const TYPE_ELEMENT_DECL = XML_ELEMENT_DECL_NODE;
const TYPE_ATTRIBUTE_DECL = XML_ATTRIBUTE_DECL_NODE;
const TYPE_ENTITY_DECL = XML_ENTITY_DECL_NODE;
const TYPE_NAMESPACE_DECL = XML_NAMESPACE_DECL_NODE;

public const DOCUMENT_POSITION_DISCONNECTED = 0b000001;
public const DOCUMENT_POSITION_PRECEDING = 0b000010;
public const DOCUMENT_POSITION_FOLLOWING = 0b000100;
public const DOCUMENT_POSITION_CONTAINS = 0b001000;
public const DOCUMENT_POSITION_CONTAINED_BY = 0b010000;
public const DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0b100000;

private function __construct() {}
}
39 changes: 39 additions & 0 deletions src/Node84.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php
namespace Gt\Dom;

use DOMNode;

class Node84 extends DOMNode {
use NonDocumentTypeChildNode;
use ChildNode;
use ParentNode;
use RegisteredNodeClass;

const TYPE_ELEMENT = XML_ELEMENT_NODE;
const TYPE_ATTR = XML_ATTRIBUTE_NODE;
const TYPE_TEXT = XML_TEXT_NODE;
const TYPE_CDATA = XML_CDATA_SECTION_NODE;
const TYPE_ENTITY_REF = XML_ENTITY_REF_NODE;
const TYPE_ENTITY = XML_ENTITY_NODE;
const TYPE_PI = XML_PI_NODE;
const TYPE_COMMENT = XML_COMMENT_NODE;
const TYPE_DOCUMENT = XML_DOCUMENT_NODE;
const TYPE_DOCUMENT_TYPE = XML_DOCUMENT_TYPE_NODE;
const TYPE_DOCUMENT_FRAGMENT = XML_DOCUMENT_FRAG_NODE;
const TYPE_NOTATION = XML_NOTATION_NODE;
const TYPE_HTML_DOCUMENT = XML_HTML_DOCUMENT_NODE;
const TYPE_DTD = XML_DTD_NODE;
const TYPE_ELEMENT_DECL = XML_ELEMENT_DECL_NODE;
const TYPE_ATTRIBUTE_DECL = XML_ATTRIBUTE_DECL_NODE;
const TYPE_ENTITY_DECL = XML_ENTITY_DECL_NODE;
const TYPE_NAMESPACE_DECL = XML_NAMESPACE_DECL_NODE;

public const int DOCUMENT_POSITION_DISCONNECTED = 0b000001;

Check failure on line 31 in src/Node84.php

View workflow job for this annotation

GitHub Actions / phpstan (8.1)

Class constants with native types are supported only on PHP 8.3 and later.

Check failure on line 31 in src/Node84.php

View workflow job for this annotation

GitHub Actions / phpstan (8.2)

Class constants with native types are supported only on PHP 8.3 and later.
public const int DOCUMENT_POSITION_PRECEDING = 0b000010;

Check failure on line 32 in src/Node84.php

View workflow job for this annotation

GitHub Actions / phpstan (8.1)

Class constants with native types are supported only on PHP 8.3 and later.

Check failure on line 32 in src/Node84.php

View workflow job for this annotation

GitHub Actions / phpstan (8.2)

Class constants with native types are supported only on PHP 8.3 and later.
public const int DOCUMENT_POSITION_FOLLOWING = 0b000100;

Check failure on line 33 in src/Node84.php

View workflow job for this annotation

GitHub Actions / phpstan (8.1)

Class constants with native types are supported only on PHP 8.3 and later.

Check failure on line 33 in src/Node84.php

View workflow job for this annotation

GitHub Actions / phpstan (8.2)

Class constants with native types are supported only on PHP 8.3 and later.
public const int DOCUMENT_POSITION_CONTAINS = 0b001000;

Check failure on line 34 in src/Node84.php

View workflow job for this annotation

GitHub Actions / phpstan (8.1)

Class constants with native types are supported only on PHP 8.3 and later.

Check failure on line 34 in src/Node84.php

View workflow job for this annotation

GitHub Actions / phpstan (8.2)

Class constants with native types are supported only on PHP 8.3 and later.
public const int DOCUMENT_POSITION_CONTAINED_BY = 0b010000;

Check failure on line 35 in src/Node84.php

View workflow job for this annotation

GitHub Actions / phpstan (8.1)

Class constants with native types are supported only on PHP 8.3 and later.

Check failure on line 35 in src/Node84.php

View workflow job for this annotation

GitHub Actions / phpstan (8.2)

Class constants with native types are supported only on PHP 8.3 and later.
public const int DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0b100000;

Check failure on line 36 in src/Node84.php

View workflow job for this annotation

GitHub Actions / phpstan (8.1)

Class constants with native types are supported only on PHP 8.3 and later.

Check failure on line 36 in src/Node84.php

View workflow job for this annotation

GitHub Actions / phpstan (8.2)

Class constants with native types are supported only on PHP 8.3 and later.

private function __construct() {}
}
3 changes: 1 addition & 2 deletions test/phpunit/NodeTest.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<?php
namespace Gt\Dom\Test;

use Gt\Dom\Exception\ClientSideOnlyFunctionalityException;
use Gt\Dom\Exception\NotFoundErrorException;
use Gt\Dom\HTMLDocument;
use Gt\Dom\Node;
Expand All @@ -13,7 +12,7 @@
class NodeTest extends TestCase {
public function testCanNotConstruct():void {
self::expectException(\Error::class);
self::expectExceptionMessage("Call to private Gt\Dom\Node::__construct()");
self::expectExceptionMessageMatches("/Call to private Gt.Dom.Node[0-9]*::__construct()/");
$className = Node::class;
/** @phpstan-ignore-next-line */
new $className();
Expand Down

0 comments on commit 6826fec

Please sign in to comment.