From 8e04c38ebfcf2df39926eda707bee1bf78b9d9f7 Mon Sep 17 00:00:00 2001 From: Ben Drucker Date: Tue, 28 Apr 2020 20:38:45 -0700 Subject: hclwrite: handle legacy dot access of numeric indexes --- hclwrite/parser.go | 23 ++++++++++++++++++ hclwrite/parser_test.go | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) (limited to 'hclwrite') diff --git a/hclwrite/parser.go b/hclwrite/parser.go index d6cf532..8e100fb 100644 --- a/hclwrite/parser.go +++ b/hclwrite/parser.go @@ -88,6 +88,16 @@ func (it inputTokens) PartitionType(ty hclsyntax.TokenType) (before, within, aft panic(fmt.Sprintf("didn't find any token of type %s", ty)) } +func (it inputTokens) PartitionTypeOk(ty hclsyntax.TokenType) (before, within, after inputTokens, ok bool) { + for i, t := range it.writerTokens { + if t.Type == ty { + return it.Slice(0, i), it.Slice(i, i+1), it.Slice(i+1, len(it.nativeTokens)), true + } + } + + return inputTokens{}, inputTokens{}, inputTokens{}, false +} + func (it inputTokens) PartitionTypeSingle(ty hclsyntax.TokenType) (before inputTokens, found *Token, after inputTokens) { before, within, after := it.PartitionType(ty) if within.Len() != 1 { @@ -404,6 +414,19 @@ func parseTraversalStep(nativeStep hcl.Traverser, from inputTokens) (before inpu children = step.inTree.children before, from, after = from.Partition(nativeStep.SourceRange()) + if inBefore, dot, from, ok := from.PartitionTypeOk(hclsyntax.TokenDot); ok { + children.AppendUnstructuredTokens(inBefore.Tokens()) + children.AppendUnstructuredTokens(dot.Tokens()) + + valBefore, valToken, valAfter := from.PartitionTypeSingle(hclsyntax.TokenNumberLit) + children.AppendUnstructuredTokens(valBefore.Tokens()) + key := newNumber(valToken) + step.key = children.Append(key) + children.AppendUnstructuredTokens(valAfter.Tokens()) + + return before, newNode(step), after + } + var inBefore, oBrack, keyTokens, cBrack inputTokens inBefore, oBrack, from = from.PartitionType(hclsyntax.TokenOBrack) children.AppendUnstructuredTokens(inBefore.Tokens()) diff --git a/hclwrite/parser_test.go b/hclwrite/parser_test.go index 28b5380..80cb328 100644 --- a/hclwrite/parser_test.go +++ b/hclwrite/parser_test.go @@ -555,6 +555,69 @@ func TestParse(t *testing.T) { }, }, }, + { + "a = foo.0\n", + TestTreeNode{ + Type: "Body", + Children: []TestTreeNode{ + { + Type: "Attribute", + Children: []TestTreeNode{ + { + Type: "comments", + }, + { + Type: "identifier", + Val: "a", + }, + { + Type: "Tokens", + Val: " =", + }, + { + Type: "Expression", + Children: []TestTreeNode{ + { + Type: "Traversal", + Children: []TestTreeNode{ + { + Type: "TraverseName", + Children: []TestTreeNode{ + { + Type: "identifier", + Val: " foo", + }, + }, + }, + { + Type: "TraverseIndex", + Children: []TestTreeNode{ + { + Type: "Tokens", + Val: ".", + }, + { + Type: "number", + Val: "0", + }, + }, + }, + }, + }, + }, + }, + { + Type: "comments", + }, + { + Type: "Tokens", + Val: "\n", + }, + }, + }, + }, + }, + }, { "a = foo[bar]\n", TestTreeNode{ -- cgit v1.2.3 From 8e720e092f946ce76972ad48d251ef7ff7a38ce5 Mon Sep 17 00:00:00 2001 From: Ben Drucker Date: Tue, 28 Apr 2020 21:08:43 -0700 Subject: add for 'foo[bar.baz]' --- hclwrite/parser_test.go | 85 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) (limited to 'hclwrite') diff --git a/hclwrite/parser_test.go b/hclwrite/parser_test.go index 80cb328..9c57c6c 100644 --- a/hclwrite/parser_test.go +++ b/hclwrite/parser_test.go @@ -690,6 +690,91 @@ func TestParse(t *testing.T) { }, }, }, + { + "a = foo[bar.baz]\n", + TestTreeNode{ + Type: "Body", + Children: []TestTreeNode{ + { + Type: "Attribute", + Children: []TestTreeNode{ + { + Type: "comments", + }, + { + Type: "identifier", + Val: "a", + }, + { + Type: "Tokens", + Val: " =", + }, + { + Type: "Expression", + Children: []TestTreeNode{ + { + Type: "Traversal", + Children: []TestTreeNode{ + { + Type: "TraverseName", + Children: []TestTreeNode{ + { + Type: "identifier", + Val: " foo", + }, + }, + }, + }, + }, + { + Type: "Tokens", + Val: "[", + }, + { + Type: "Traversal", + Children: []TestTreeNode{ + { + Type: "TraverseName", + Children: []TestTreeNode{ + { + Type: "identifier", + Val: "bar", + }, + }, + }, + { + Type: "TraverseName", + Children: []TestTreeNode{ + { + Type: "Tokens", + Val: ".", + }, + { + Type: "identifier", + Val: "baz", + }, + }, + }, + }, + }, + { + Type: "Tokens", + Val: "]", + }, + }, + }, + { + Type: "comments", + }, + { + Type: "Tokens", + Val: "\n", + }, + }, + }, + }, + }, + }, { "a = foo[bar].baz\n", TestTreeNode{ -- cgit v1.2.3