internal/core/adt: apply Default also to list
A closed list with current elements is the default
of an open list.
Change-Id: I2ea041c979219267d486c0c6fbec5ec9b192f771
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/6653
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
diff --git a/internal/core/adt/context.go b/internal/core/adt/context.go
index f54fd72..29ffed5 100644
--- a/internal/core/adt/context.go
+++ b/internal/core/adt/context.go
@@ -558,7 +558,8 @@
}
// TODO: if the struct was a literal struct, we can also treat it as
// closed and make this a permanent error.
- c.addErrf(code, pos, "undefined field %s", l.SelectorString(c.Runtime))
+ label := l.SelectorString(c.Runtime)
+ c.addErrf(code, pos, "undefined field %s", label)
}
return a
}
diff --git a/internal/core/adt/default.go b/internal/core/adt/default.go
index ae7ca8e..2dd1ff7 100644
--- a/internal/core/adt/default.go
+++ b/internal/core/adt/default.go
@@ -43,35 +43,45 @@
// Default returns the default value or itself if there is no default.
func (v *Vertex) Default() *Vertex {
- d, ok := v.Value.(*Disjunction)
- if !ok {
- return v
- }
-
- var w *Vertex
-
- switch d.NumDefaults {
- case 0:
- return v
- case 1:
- w = d.Values[0]
+ switch d := v.Value.(type) {
default:
- x := *v
- x.Value = &Disjunction{
- Src: d.Src,
- Values: d.Values[:d.NumDefaults],
- NumDefaults: 0,
- }
- w = &x
- }
+ return v
- w.Conjuncts = nil
- for _, c := range v.Conjuncts {
- // TODO: preserve field information.
- expr, _ := stripNonDefaults(c.Expr())
- w.AddConjunct(MakeConjunct(c.Env, expr))
+ case *Disjunction:
+ var w *Vertex
+
+ switch d.NumDefaults {
+ case 0:
+ return v
+ case 1:
+ w = d.Values[0]
+ default:
+ x := *v
+ x.Value = &Disjunction{
+ Src: d.Src,
+ Values: d.Values[:d.NumDefaults],
+ NumDefaults: 0,
+ }
+ w = &x
+ }
+
+ w.Conjuncts = nil
+ for _, c := range v.Conjuncts {
+ // TODO: preserve field information.
+ expr, _ := stripNonDefaults(c.Expr())
+ w.Conjuncts = append(w.Conjuncts, MakeConjunct(c.Env, expr))
+ }
+ return w
+
+ case *ListMarker:
+ m := *d
+ m.IsOpen = false
+
+ w := *v
+ w.Closed = nil
+ w.Value = &m
+ return &w
}
- return w
}
// TODO: this should go: record preexpanded disjunctions in Vertex.