From 1cdfe027656705b225815650de3ca92ea069be18 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 15 May 2022 20:46:56 +0200 Subject: [PATCH] add String_::fromString() method by convention --- grammar/php5.y | 6 ++---- grammar/php7.y | 3 +-- lib/PhpParser/Node/Scalar/String_.php | 8 ++++++++ lib/PhpParser/Parser/Php5.php | 6 ++---- lib/PhpParser/Parser/Php7.php | 3 +-- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/grammar/php5.y b/grammar/php5.y index 6fbf2c3e03..069c15b8ab 100644 --- a/grammar/php5.y +++ b/grammar/php5.y @@ -692,8 +692,7 @@ scalar_dereference: | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' { $attrs = attributes(); $attrs['kind'] = strKind($1); - $attrs['rawValue'] = $1; - $$ = Expr\ArrayDimFetch[new Scalar\String_(Scalar\String_::parse($1), $attrs), $3]; } + $$ = Expr\ArrayDimFetch[Scalar\String_::fromString($1, $attrs), $3]; } | constant '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | scalar_dereference '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } /* alternative array syntax missing intentionally */ @@ -799,8 +798,7 @@ common_scalar: | T_CONSTANT_ENCAPSED_STRING { $attrs = attributes(); $attrs['kind'] = strKind($1); - $attrs['rawValue'] = $1; - $$ = new Scalar\String_(Scalar\String_::parse($1, false), $attrs); } + $$ = Scalar\String_::fromString($1, $attrs, false); } | T_LINE { $$ = Scalar\MagicConst\Line[]; } | T_FILE { $$ = Scalar\MagicConst\File[]; } | T_DIR { $$ = Scalar\MagicConst\Dir[]; } diff --git a/grammar/php7.y b/grammar/php7.y index f8c4c9e5da..61a8b3e219 100644 --- a/grammar/php7.y +++ b/grammar/php7.y @@ -1017,8 +1017,7 @@ dereferencable_scalar: | T_CONSTANT_ENCAPSED_STRING { $attrs = attributes(); $attrs['kind'] = strKind($1); - $attrs['rawValue'] = $1; - $$ = new Scalar\String_(Scalar\String_::parse($1), $attrs); } + $$ = Scalar\String_::fromString($1, $attrs); } | '"' encaps_list '"' { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); } diff --git a/lib/PhpParser/Node/Scalar/String_.php b/lib/PhpParser/Node/Scalar/String_.php index 8a6d93a474..0fa9e525a9 100644 --- a/lib/PhpParser/Node/Scalar/String_.php +++ b/lib/PhpParser/Node/Scalar/String_.php @@ -42,6 +42,14 @@ public function getSubNodeNames() : array { return ['value']; } + public function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = true): self + { + $attributes['rawValue'] = $str; + $string = self::parse($str, $parseUnicodeEscape); + + return new self($string, $attributes); + } + /** * @internal * diff --git a/lib/PhpParser/Parser/Php5.php b/lib/PhpParser/Parser/Php5.php index e84ee1830e..f71683204f 100644 --- a/lib/PhpParser/Parser/Php5.php +++ b/lib/PhpParser/Parser/Php5.php @@ -2149,8 +2149,7 @@ protected function initReduceCallbacks() { 392 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(4-1)][0] === "'" || ($this->semStack[$stackPos-(4-1)][1] === "'" && ($this->semStack[$stackPos-(4-1)][0] === 'b' || $this->semStack[$stackPos-(4-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED); - $attrs['rawValue'] = $this->semStack[$stackPos-(4-1)]; - $this->semValue = new Expr\ArrayDimFetch(new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(4-1)]), $attrs), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch(Scalar\String_::fromString($this->semStack[$stackPos-(4-1)], $attrs), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 393 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); @@ -2282,8 +2281,7 @@ protected function initReduceCallbacks() { 435 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(1-1)][0] === "'" || ($this->semStack[$stackPos-(1-1)][1] === "'" && ($this->semStack[$stackPos-(1-1)][0] === 'b' || $this->semStack[$stackPos-(1-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED); - $attrs['rawValue'] = $this->semStack[$stackPos-(1-1)]; - $this->semValue = new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(1-1)], false), $attrs); + $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $attrs, false); }, 436 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); diff --git a/lib/PhpParser/Parser/Php7.php b/lib/PhpParser/Parser/Php7.php index 7710ef8d06..2d9dc2c413 100644 --- a/lib/PhpParser/Parser/Php7.php +++ b/lib/PhpParser/Parser/Php7.php @@ -2545,8 +2545,7 @@ protected function initReduceCallbacks() { 512 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(1-1)][0] === "'" || ($this->semStack[$stackPos-(1-1)][1] === "'" && ($this->semStack[$stackPos-(1-1)][0] === 'b' || $this->semStack[$stackPos-(1-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED); - $attrs['rawValue'] = $this->semStack[$stackPos-(1-1)]; - $this->semValue = new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(1-1)]), $attrs); + $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $attrs); }, 513 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED;