Escape keyword strings in ast.Ref#String

Previously refs like p["not"] would be represented as p.not which does
not parse because 'not' is an invalid variable name. This change ensures
that ref string operands are escape if they are keywords.
This commit is contained in:
Torin Sandall
2018-03-09 08:46:00 -08:00
parent 31950fda8b
commit 2ee8f625f4
2 changed files with 2 additions and 1 deletions
+1 -1
View File
@@ -910,7 +910,7 @@ func (ref Ref) String() string {
switch p := p.Value.(type) {
case String:
str := string(p)
if varRegexp.MatchString(str) && len(buf) > 0 {
if varRegexp.MatchString(str) && len(buf) > 0 && !IsKeyword(str) {
buf = append(buf, "."+str)
} else {
buf = append(buf, "["+p.String()+"]")
+1
View File
@@ -311,6 +311,7 @@ func TestTermString(t *testing.T) {
assertToString(t, RefTerm(VarTerm("foo"), StringTerm("bar")).Value, "foo.bar")
assertToString(t, RefTerm(VarTerm("foo"), StringTerm("bar"), VarTerm("i"), IntNumberTerm(0), StringTerm("baz")).Value, "foo.bar[i][0].baz")
assertToString(t, RefTerm(VarTerm("foo"), BooleanTerm(false), NullTerm(), StringTerm("bar")).Value, "foo[false][null].bar")
assertToString(t, RefTerm(VarTerm("p"), StringTerm("not")).Value, `p["not"]`)
assertToString(t, ArrayTerm().Value, "[]")
assertToString(t, ObjectTerm().Value, "{}")
assertToString(t, SetTerm().Value, "set()")