internal/third_party/yaml: improve yaml positining

- retain more of the original spacing into the conversion
- store original absolute positions

Change-Id: Id1edbefe1050e1f2dcec3ceb2f8877018b0b5876
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/2562
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/internal/third_party/yaml/decode_test.go b/internal/third_party/yaml/decode_test.go
index 608fe8a..87b72f1 100644
--- a/internal/third_party/yaml/decode_test.go
+++ b/internal/third_party/yaml/decode_test.go
@@ -169,13 +169,24 @@
 	// Block sequence
 	{
 		"seq:\n - A\n - B",
-		`seq: ["A", "B"]`,
+		`seq: [
+	"A",
+	"B",
+]`,
 	}, {
 		"seq:\n - A\n - B\n - C",
-		`seq: ["A", "B", "C"]`,
+		`seq: [
+	"A",
+	"B",
+	"C",
+]`,
 	}, {
 		"seq:\n - A\n - 1\n - C",
-		`seq: ["A", 1, "C"]`,
+		`seq: [
+	"A",
+	1,
+	"C",
+]`,
 	},
 
 	// Literal block scalar
@@ -208,9 +219,7 @@
 	// Structs
 	{
 		"a: {b: c}",
-		`a: {
-	b: "c"
-}`,
+		`a: {b: "c"}`,
 	},
 	{
 		"hello: world",
@@ -232,10 +241,7 @@
 		"a: true",
 	}, {
 		"{ a: 1, b: {c: 1} }",
-		`a: 1
-b: {
-	c: 1
-}`,
+		`a: 1, b: {c: 1}`,
 	},
 
 	// Some cross type conversions
@@ -360,10 +366,13 @@
 		`"1": "\"2\""`,
 	}, {
 		"v:\n- A\n- 'B\n\n  C'\n",
-		`v: ["A", """
+		`v: [
+	"A",
+	"""
 		B
 		C
-		"""]`,
+		""",
+]`,
 	},
 
 	// Explicit tags.
@@ -400,12 +409,9 @@
 d: 2`,
 	}, {
 		"a: &a {c: 1}\nb: *a",
-		`a: {
-	c: 1
-}
+		`a: {c: 1}
 b: {
-	c: 1
-}`,
+	c: 1}`, // TODO fix this spacing. Expansions low priority though.
 	}, {
 		"a: &a [1, 2]\nb: *a",
 		"a: [1, 2]\nb: [1, 2]", // TODO: a: [1, 2], b: a
@@ -458,9 +464,7 @@
 	// issue #295 (allow scalars with colons in flow mappings and sequences)
 	{
 		"a: {b: https://github.com/go-yaml/yaml}",
-		`a: {
-	b: "https://github.com/go-yaml/yaml"
-}`,
+		`a: {b: "https://github.com/go-yaml/yaml"}`,
 	},
 	{
 		"a: [https://github.com/go-yaml/yaml]",
@@ -500,12 +504,45 @@
 	// Ordered maps.
 	{
 		"{b: 2, a: 1, d: 4, c: 3, sub: {e: 5}}",
-		`b: 2
-a: 1
-d: 4
-c: 3
-sub: {
-	e: 5
+		`b: 2, a: 1, d: 4, c: 3, sub: {e: 5}`,
+	},
+
+	// Spacing
+	{
+		`
+a: {}
+c: 1
+d: [
+]
+e: []
+`,
+		`a: {}
+c: 1
+d: [
+]
+e: []`,
+	},
+
+	{
+		`
+a:
+  - { "a": 1, "b": 2 }
+  - { "c": 1, "d": 2 }
+`,
+		`a: [{
+	a: 1, b: 2
+}, {
+	c: 1, d: 2
+}]`,
+	},
+
+	{
+		"a:\n b:\n  c: d\n  e: f\n",
+		`a: {
+	b: {
+		c: "d"
+		e: "f"
+	}
 }`,
 	},