Skip to content

Commit 2d8da9d

Browse files
committed
fix: Improve error message returned by Subsume
Previously when Subsume determined that a field did not subsume a previous field, the error returned was: ``` field x not present in <value> ``` which is simply not true. Now a more useful error is returned in this scenario: ``` 31 | 33 does not subsume 32: ./schema.cue:2:25 ./schema.cue:7:25 ``` Resolves: cue-lang#3861 Signed-off-by: Graham Dennis <[email protected]>
1 parent 721ca5d commit 2d8da9d

File tree

2 files changed

+24
-9
lines changed

2 files changed

+24
-9
lines changed

Diff for: internal/core/subsume/subsume.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ func (s *subsumer) getError() (err errors.Error) {
122122
if s.missing != 0 {
123123
s.errf("missing field %q", s.missing.SelectorString(c))
124124
} else if b, ok := unifyValue(c, s.gt, s.lt).(*adt.Bottom); !ok {
125-
s.errf("value not an instance")
125+
s.errf("%v does not subsume %v", s.gt, s.lt)
126126
} else {
127127
s.errs = errors.Append(s.errs, b.Err)
128128
}

Diff for: internal/core/subsume/vertex.go

+23-8
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,19 @@ func (s *subsumer) vertices(x, y *adt.Vertex) bool {
170170
continue
171171
}
172172

173-
s.missing = f
174-
s.gt = a
175-
s.lt = y
173+
if b == nil {
174+
s.missing = f
175+
s.gt = a
176+
s.lt = y
177+
178+
s.errf("field %v not present in %v", f, y)
179+
} else {
180+
s.gt = a
181+
s.lt = b
182+
183+
s.errf("%v in %v does not subsume %v in %v", a, x, b, y)
184+
}
176185

177-
s.errf("field %v not present in %v", f, y)
178186
return false
179187
}
180188

@@ -373,11 +381,18 @@ func (s *subsumer) verticesDev(x, y *adt.Vertex) bool {
373381
continue
374382
}
375383

376-
s.missing = f
377-
s.gt = a
378-
s.lt = y
384+
if b == nil {
385+
s.missing = f
386+
s.gt = a
387+
s.lt = y
388+
389+
s.errf("field %v not present in %v", f, y)
390+
} else {
391+
s.gt = a
392+
s.lt = b
379393

380-
s.errf("field %v not present in %v", f, y)
394+
s.errf("%v does not subsume %v", a, b)
395+
}
381396
return false
382397
}
383398

0 commit comments

Comments
 (0)