Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. QuoteAwareConstExprStringNode.php

class QuoteAwareConstExprStringNode

Hierarchy

  • class \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode uses \PHPStan\PhpDocParser\Ast\NodeAttributes
    • class \PHPStan\PhpDocParser\Ast\ConstExpr\QuoteAwareConstExprStringNode extends \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode implements \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode uses \PHPStan\PhpDocParser\Ast\NodeAttributes

Expanded class hierarchy of QuoteAwareConstExprStringNode

File

vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php, line 16

Namespace

PHPStan\PhpDocParser\Ast\ConstExpr
View source
class QuoteAwareConstExprStringNode extends ConstExprStringNode implements ConstExprNode {
    public const SINGLE_QUOTED = 1;
    public const DOUBLE_QUOTED = 2;
    use NodeAttributes;
    
    /** @var self::SINGLE_QUOTED|self::DOUBLE_QUOTED */
    public $quoteType;
    
    /**
     * @param self::SINGLE_QUOTED|self::DOUBLE_QUOTED $quoteType
     */
    public function __construct(string $value, int $quoteType) {
        parent::__construct($value);
        $this->quoteType = $quoteType;
    }
    public function __toString() : string {
        if ($this->quoteType === self::SINGLE_QUOTED) {
            // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1007
            return sprintf("'%s'", addcslashes($this->value, '\'\\'));
        }
        // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1010-L1040
        return sprintf('"%s"', $this->escapeDoubleQuotedString());
    }
    private function escapeDoubleQuotedString() : string {
        $quote = '"';
        $escaped = addcslashes($this->value, "\n\r\t\f\v\$" . $quote . '\\');
        // Escape control characters and non-UTF-8 characters.
        // Regex based on https://stackoverflow.com/a/11709412/385378.
        $regex = '/(
              [\\x00-\\x08\\x0E-\\x1F] # Control characters
            | [\\xC0-\\xC1] # Invalid UTF-8 Bytes
            | [\\xF5-\\xFF] # Invalid UTF-8 Bytes
            | \\xE0(?=[\\x80-\\x9F]) # Overlong encoding of prior code point
            | \\xF0(?=[\\x80-\\x8F]) # Overlong encoding of prior code point
            | [\\xC2-\\xDF](?![\\x80-\\xBF]) # Invalid UTF-8 Sequence Start
            | [\\xE0-\\xEF](?![\\x80-\\xBF]{2}) # Invalid UTF-8 Sequence Start
            | [\\xF0-\\xF4](?![\\x80-\\xBF]{3}) # Invalid UTF-8 Sequence Start
            | (?<=[\\x00-\\x7F\\xF5-\\xFF])[\\x80-\\xBF] # Invalid UTF-8 Sequence Middle
            | (?<![\\xC2-\\xDF]|[\\xE0-\\xEF]|[\\xE0-\\xEF][\\x80-\\xBF]|[\\xF0-\\xF4]|[\\xF0-\\xF4][\\x80-\\xBF]|[\\xF0-\\xF4][\\x80-\\xBF]{2})[\\x80-\\xBF] # Overlong Sequence
            | (?<=[\\xE0-\\xEF])[\\x80-\\xBF](?![\\x80-\\xBF]) # Short 3 byte sequence
            | (?<=[\\xF0-\\xF4])[\\x80-\\xBF](?![\\x80-\\xBF]{2}) # Short 4 byte sequence
            | (?<=[\\xF0-\\xF4][\\x80-\\xBF])[\\x80-\\xBF](?![\\x80-\\xBF]) # Short 4 byte sequence (2)
        )/x';
        return preg_replace_callback($regex, static function ($matches) {
            assert(strlen($matches[0]) === 1);
            $hex = dechex(ord($matches[0]));
            return '\\x' . str_pad($hex, 2, '0', STR_PAD_LEFT);
        }, $escaped);
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
ConstExprStringNode::$value public property @var string 1
NodeAttributes::$attributes private property @var array&lt;string, mixed&gt;
NodeAttributes::getAttribute public function *
NodeAttributes::hasAttribute public function
NodeAttributes::setAttribute public function *
QuoteAwareConstExprStringNode::$quoteType public property @var self::SINGLE_QUOTED|self::DOUBLE_QUOTED
QuoteAwareConstExprStringNode::DOUBLE_QUOTED public constant
QuoteAwareConstExprStringNode::escapeDoubleQuotedString private function
QuoteAwareConstExprStringNode::SINGLE_QUOTED public constant
QuoteAwareConstExprStringNode::__construct public function * Overrides ConstExprStringNode::__construct
QuoteAwareConstExprStringNode::__toString public function Overrides ConstExprStringNode::__toString

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal