summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaria Carolin Chabowski <laria@laria.me>2020-05-01 17:52:50 +0200
committerLaria Carolin Chabowski <laria@laria.me>2020-05-01 17:55:59 +0200
commitec389d3441953bbd7cb27f59df61531ba856fb33 (patch)
treefc642e218ba83860c425464da0c12493e97f40e8
parent6e86cd0f381de60f77845ea4a7b6cbcc5fda4a47 (diff)
downloadste-ec389d3441953bbd7cb27f59df61531ba856fb33.tar.gz
ste-ec389d3441953bbd7cb27f59df61531ba856fb33.tar.bz2
ste-ec389d3441953bbd7cb27f59df61531ba856fb33.zip
Fix parsing `]` as last input char
Previously ] was duplicated in the ouput
-rw-r--r--src/ste/Parser.php18
-rw-r--r--tests/test_trailing_closing_array_bracket/.gitignore3
-rw-r--r--tests/test_trailing_closing_array_bracket/code.php12
-rw-r--r--tests/test_trailing_closing_array_bracket/test.tpl3
-rw-r--r--tests/test_trailing_closing_array_bracket/want3
5 files changed, 35 insertions, 4 deletions
diff --git a/src/ste/Parser.php b/src/ste/Parser.php
index 0280f6d..6e7bf62 100644
--- a/src/ste/Parser.php
+++ b/src/ste/Parser.php
@@ -43,12 +43,21 @@ class Parser
* @param int $n
* @return string
*/
- private function next($n = 1)
+ private function peek($n = 1)
{
if ($n <= 0) {
throw new \InvalidArgumentException("\$n must be > 0");
}
- $c = mb_substr($this->text, $this->off, $n);
+ return mb_substr($this->text, $this->off, $n);
+ }
+
+ /**
+ * @param int $n
+ * @return string
+ */
+ private function next($n = 1)
+ {
+ $c = $this->peek($n);
$this->off = min($this->off + $n, $this->len);
return $c;
}
@@ -455,7 +464,9 @@ class Parser
$arrayfields = array();
- while ($this->next() == "[") {
+ while ($this->peek() == "[") {
+ $this->next();
+
$openedat = $this->off - 1;
$res = $this->parse_text(
self::ESCAPES_DEFAULT, /* Escapes */
@@ -471,7 +482,6 @@ class Parser
$arrayfields[] = $res[0];
}
- $this->back();
return $arrayfields;
}
diff --git a/tests/test_trailing_closing_array_bracket/.gitignore b/tests/test_trailing_closing_array_bracket/.gitignore
new file mode 100644
index 0000000..de2a41b
--- /dev/null
+++ b/tests/test_trailing_closing_array_bracket/.gitignore
@@ -0,0 +1,3 @@
+have
+*.ast
+*.transc.php
diff --git a/tests/test_trailing_closing_array_bracket/code.php b/tests/test_trailing_closing_array_bracket/code.php
new file mode 100644
index 0000000..77f48be
--- /dev/null
+++ b/tests/test_trailing_closing_array_bracket/code.php
@@ -0,0 +1,12 @@
+<?php
+
+use kch42\ste\STECore;
+
+function test_func(STECore $ste)
+{
+ $ste->set_var_by_name("foo", array(
+ "foo",
+ "bar",
+ "baz",
+ ));
+}
diff --git a/tests/test_trailing_closing_array_bracket/test.tpl b/tests/test_trailing_closing_array_bracket/test.tpl
new file mode 100644
index 0000000..68f6caa
--- /dev/null
+++ b/tests/test_trailing_closing_array_bracket/test.tpl
@@ -0,0 +1,3 @@
+$foo[0]
+$foo[1]
+$foo[2] \ No newline at end of file
diff --git a/tests/test_trailing_closing_array_bracket/want b/tests/test_trailing_closing_array_bracket/want
new file mode 100644
index 0000000..86e041d
--- /dev/null
+++ b/tests/test_trailing_closing_array_bracket/want
@@ -0,0 +1,3 @@
+foo
+bar
+baz