internal/core/export: add real Final option

Force incomplete errors only when really finalizing.

Fixes a few bugs that are related to formatting
API-generated values. This is a bit hard to test here,
but will fixing things in a followup CL.

Change-Id: Ia75272409c50f048143d0d254d04e625822dd26a
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/9483
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Paul Jolly <paul@myitcv.org.uk>
diff --git a/internal/core/export/export.go b/internal/core/export/export.go
index ae2c0eb..d96ed3c 100644
--- a/internal/core/export/export.go
+++ b/internal/core/export/export.go
@@ -32,11 +32,12 @@
 type Profile struct {
 	Simplify bool
 
+	// Final reports incomplete errors as errors.
+	Final bool
+
 	// TakeDefaults is used in Value mode to drop non-default values.
 	TakeDefaults bool
 
-	// TODO:
-	// IncludeDocs
 	ShowOptional    bool
 	ShowDefinitions bool
 
@@ -65,6 +66,7 @@
 var Final = &Profile{
 	Simplify:     true,
 	TakeDefaults: true,
+	Final:        true,
 }
 
 var Raw = &Profile{
diff --git a/internal/core/export/testdata/let.txtar b/internal/core/export/testdata/let.txtar
index 8044df2..56658f6 100644
--- a/internal/core/export/testdata/let.txtar
+++ b/internal/core/export/testdata/let.txtar
@@ -129,17 +129,8 @@
 			name: "two"
 		}
 	}]
-	let filepath = "kind-\(cfg.name)"
-	files: {
-		"\(filepath)": {
-			patches: cfg
-		}
-	} & {
-		"\(filepath)": {
-			patches: cfg
-		}
-	}
-	y: "foo"
+	files: _|_ // invalid interpolation: invalid interpolation: files: undefined field name (and 3 more errors)
+	y:     "foo"
 }
 == All
 {
diff --git a/internal/core/export/value.go b/internal/core/export/value.go
index 91aeacd..9018af8 100644
--- a/internal/core/export/value.go
+++ b/internal/core/export/value.go
@@ -69,7 +69,7 @@
 				result = e.structComposite(n, attrs)
 			}
 
-		case !x.IsIncomplete() || len(n.Conjuncts) == 0:
+		case !x.IsIncomplete() || len(n.Conjuncts) == 0 || e.cfg.Final:
 			result = e.bottom(x)
 		}