From 8027d14b9fd5087a0005c252d8a8bbc16186593d Mon Sep 17 00:00:00 2001 From: Dan Willhite Date: Wed, 1 Jun 2016 11:49:04 -0700 Subject: [PATCH] Make path immutable --- types/path.go | 8 ++++++-- types/path_test.go | 12 ++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/types/path.go b/types/path.go index 8462314013..d501fb5f45 100644 --- a/types/path.go +++ b/types/path.go @@ -24,11 +24,15 @@ func NewPath() Path { } func (p Path) AddField(name string) Path { - return append(p, newFieldPart(name)) + p1 := make(Path, len(p), len(p)+1) + copy(p1, p) + return append(p1, newFieldPart(name)) } func (p Path) AddIndex(idx Value) Path { - return append(p, newIndexPart(idx)) + p1 := make(Path, len(p), len(p)+1) + copy(p1, p) + return append(p1, newIndexPart(idx)) } func (p Path) Resolve(v Value) (resolved Value) { diff --git a/types/path_test.go b/types/path_test.go index a0a87e8e9a..19fadf8ba0 100644 --- a/types/path_test.go +++ b/types/path_test.go @@ -103,3 +103,15 @@ func TestPathToString(t *testing.T) { assert.Equal("[\"0\"][\"1\"][\"100\"]", NewPath().AddIndex(NewString("0")).AddIndex(NewString("1")).AddIndex(NewString("100")).String()) assert.Equal(".foo[0].bar[4.5][false]", NewPath().AddField("foo").AddIndex(Number(0)).AddField("bar").AddIndex(Number(4.5)).AddIndex(Bool(false)).String()) } + +func TestPathImmutability(t *testing.T) { + assert := assert.New(t) + p1 := NewPath().AddField("/").AddField("value").AddField("data").AddIndex(Number(1)).AddField("data") + p2 := p1.AddField("x") + p3 := p1.AddField("y") + p4 := p3.AddIndex(Number(19)) + assert.Equal("./.value.data[1].data", p1.String()) + assert.Equal("./.value.data[1].data.x", p2.String()) + assert.Equal("./.value.data[1].data.y", p3.String()) + assert.Equal("./.value.data[1].data.y[19]", p4.String()) +}