blob: 13fc77369a86777e0a693223fe94b37cf9439cab [file] [log] [blame]
-- in.cue --
self: {
fail: {
a: {
if a.b == _|_ {
b: 1
}
}
}
isConcreteFail: {
a: {
if a.b == _|_ {
b: 1
}
b: int
}
}
isNotConcrete: {
a: {
if a.b != _|_ {
b: 1
}
b: int
}
}
}
mutual: {
noConflicts: {
a: { if b.foo == _|_ { new: "" } }
b: { if a.bar == _|_ { new: "" } }
}
mutualCycleFail: {
b: { if a.bar == _|_ { foo: "" } }
a: { if b.foo == _|_ { bar: "" } }
}
brokenCycleSuccess: {
a: { if b.foo == _|_ { foo: "" } }
b: { if a.bar == _|_ { bar: "" } }
a: bar: ""
}
oneDirectionalConflictFail: {
p1: {
a: { if b.foo == _|_ { bar: "" } }
b: { if a.bar == _|_ { new: "" } }
}
p2: {
a: { if b.foo == _|_ { new: "" } }
b: { if a.bar == _|_ { foo: "" } }
}
}
oneDirectionalBrokenConflictSuccess: {
a: { if b.foo == _|_ { bar: "" } }
b: { if a.bar == _|_ { new: "" } }
b: foo: ""
}
}
sameStruct: {
chainSuccess: {
raises?: {}
if raises == _|_ {
ret: a: 1
}
ret?: {}
if ret != _|_ {
foo: a: 1
}
}
cycleFail: {
raises?: {}
if raises == _|_ {
ret: a: 1
}
ret?: {}
if ret != _|_ {
raises: a: 1
}
}
defCloseSuccess: {
#Example: {
raises?: {
runtime?: string
}
if raises == _|_ {
ret?: _
}
}
expr: #Example & {
ret: 2
}
}
}
// Issue
nestedChain: {
cycleFail: {
if #E.x != _|_ {
#E: y: true
}
if #E.y == _|_ {
#E: x: true
}
#E: [_]: bool
}
brokenCycleSuccess: {
if #E.x != _|_ {
#E: y: true
}
if #E.y == _|_ {
#E: x: true
}
#E: [_]: bool
#E: x: true
}
// TODO: the current algorithm does _not_ handle checking fields that were
// not added in certain situations.
doubleAddfail: {
if #E.x == _|_ {
#E: y: true
}
if #E.y == _|_ {
#E: x: true
}
#E: [_]: bool
}
trippleSuccess: {
if #E.x != _|_ {
#E: y: true
}
if #E.y != _|_ {
z: true
}
#E: x: true
}
}
-- out/eval --
Errors:
mutual.mutualCycleFail.a: cycle: new field bar inserted by if clause that was previously evaluated by another if clause
mutual.oneDirectionalConflictFail.p1.a: cycle: new field bar inserted by if clause that was previously evaluated by another if clause
mutual.oneDirectionalConflictFail.p2.b: cycle: new field foo inserted by if clause that was previously evaluated by another if clause
nestedChain.cycleFail.#E: cycle: new field x inserted by if clause that was previously evaluated by another if clause
sameStruct.cycleFail: cycle: new field raises inserted by if clause that was previously evaluated by another if clause
self.fail.a: cycle: new field b inserted by if clause that was previously evaluated by another if clause
Result:
(_|_){
// [eval]
self: (_|_){
// [eval]
fail: (_|_){
// [eval]
a: (_|_){
// [eval] self.fail.a: cycle: new field b inserted by if clause that was previously evaluated by another if clause
b: (int){ 1 }
}
}
isConcreteFail: (struct){
a: (struct){
b: (int){ 1 }
}
}
isNotConcrete: (struct){
a: (struct){
b: (int){ int }
}
}
}
mutual: (_|_){
// [eval]
noConflicts: (struct){
a: (struct){
new: (string){ "" }
}
b: (struct){
new: (string){ "" }
}
}
mutualCycleFail: (_|_){
// [eval]
b: (struct){
}
a: (_|_){
// [eval] mutual.mutualCycleFail.a: cycle: new field bar inserted by if clause that was previously evaluated by another if clause
bar: (string){ "" }
}
}
brokenCycleSuccess: (struct){
a: (struct){
bar: (string){ "" }
foo: (string){ "" }
}
b: (struct){
}
}
oneDirectionalConflictFail: (_|_){
// [eval]
p1: (_|_){
// [eval]
a: (_|_){
// [eval] mutual.oneDirectionalConflictFail.p1.a: cycle: new field bar inserted by if clause that was previously evaluated by another if clause
bar: (string){ "" }
}
b: (struct){
new: (string){ "" }
}
}
p2: (_|_){
// [eval]
a: (struct){
}
b: (_|_){
// [eval] mutual.oneDirectionalConflictFail.p2.b: cycle: new field foo inserted by if clause that was previously evaluated by another if clause
foo: (string){ "" }
}
}
}
oneDirectionalBrokenConflictSuccess: (struct){
a: (struct){
}
b: (struct){
foo: (string){ "" }
new: (string){ "" }
}
}
}
sameStruct: (_|_){
// [eval]
chainSuccess: (struct){
ret: (struct){
a: (int){ 1 }
}
foo: (struct){
a: (int){ 1 }
}
}
cycleFail: (_|_){
// [eval] sameStruct.cycleFail: cycle: new field raises inserted by if clause that was previously evaluated by another if clause
ret: (struct){
a: (int){ 1 }
}
raises: (struct){
a: (int){ 1 }
}
}
defCloseSuccess: (struct){
#Example: (#struct){
}
expr: (#struct){
ret: (int){ 2 }
}
}
}
nestedChain: (_|_){
// [eval]
cycleFail: (_|_){
// [eval]
#E: (_|_){
// [eval] nestedChain.cycleFail.#E: cycle: new field x inserted by if clause that was previously evaluated by another if clause
x: (bool){ true }
}
}
brokenCycleSuccess: (struct){
#E: (#struct){
x: (bool){ true }
y: (bool){ true }
}
}
doubleAddfail: (struct){
#E: (#struct){
y: (bool){ true }
}
}
trippleSuccess: (struct){
#E: (#struct){
x: (bool){ true }
y: (bool){ true }
}
z: (bool){ true }
}
}
}
-- out/compile --
--- in.cue
{
self: {
fail: {
a: {
if (〈1;a〉.b == _|_(explicit error (_|_ literal) in source)) {
b: 1
}
}
}
isConcreteFail: {
a: {
if (〈1;a〉.b == _|_(explicit error (_|_ literal) in source)) {
b: 1
}
b: int
}
}
isNotConcrete: {
a: {
if (〈1;a〉.b != _|_(explicit error (_|_ literal) in source)) {
b: 1
}
b: int
}
}
}
mutual: {
noConflicts: {
a: {
if (〈1;b〉.foo == _|_(explicit error (_|_ literal) in source)) {
new: ""
}
}
b: {
if (〈1;a〉.bar == _|_(explicit error (_|_ literal) in source)) {
new: ""
}
}
}
mutualCycleFail: {
b: {
if (〈1;a〉.bar == _|_(explicit error (_|_ literal) in source)) {
foo: ""
}
}
a: {
if (〈1;b〉.foo == _|_(explicit error (_|_ literal) in source)) {
bar: ""
}
}
}
brokenCycleSuccess: {
a: {
if (〈1;b〉.foo == _|_(explicit error (_|_ literal) in source)) {
foo: ""
}
}
b: {
if (〈1;a〉.bar == _|_(explicit error (_|_ literal) in source)) {
bar: ""
}
}
a: {
bar: ""
}
}
oneDirectionalConflictFail: {
p1: {
a: {
if (〈1;b〉.foo == _|_(explicit error (_|_ literal) in source)) {
bar: ""
}
}
b: {
if (〈1;a〉.bar == _|_(explicit error (_|_ literal) in source)) {
new: ""
}
}
}
p2: {
a: {
if (〈1;b〉.foo == _|_(explicit error (_|_ literal) in source)) {
new: ""
}
}
b: {
if (〈1;a〉.bar == _|_(explicit error (_|_ literal) in source)) {
foo: ""
}
}
}
}
oneDirectionalBrokenConflictSuccess: {
a: {
if (〈1;b〉.foo == _|_(explicit error (_|_ literal) in source)) {
bar: ""
}
}
b: {
if (〈1;a〉.bar == _|_(explicit error (_|_ literal) in source)) {
new: ""
}
}
b: {
foo: ""
}
}
}
sameStruct: {
chainSuccess: {
raises?: {}
if (〈0;raises == _|_(explicit error (_|_ literal) in source)) {
ret: {
a: 1
}
}
ret?: {}
if (〈0;ret != _|_(explicit error (_|_ literal) in source)) {
foo: {
a: 1
}
}
}
cycleFail: {
raises?: {}
if (〈0;raises == _|_(explicit error (_|_ literal) in source)) {
ret: {
a: 1
}
}
ret?: {}
if (〈0;ret != _|_(explicit error (_|_ literal) in source)) {
raises: {
a: 1
}
}
}
defCloseSuccess: {
#Example: {
raises?: {
runtime?: string
}
if (〈0;raises == _|_(explicit error (_|_ literal) in source)) {
ret?: _
}
}
expr: (〈0;#Example & {
ret: 2
})
}
}
nestedChain: {
cycleFail: {
if (〈0;#E〉.x != _|_(explicit error (_|_ literal) in source)) {
#E: {
y: true
}
}
if (〈0;#E〉.y == _|_(explicit error (_|_ literal) in source)) {
#E: {
x: true
}
}
#E: {
[_]: bool
}
}
brokenCycleSuccess: {
if (〈0;#E〉.x != _|_(explicit error (_|_ literal) in source)) {
#E: {
y: true
}
}
if (〈0;#E〉.y == _|_(explicit error (_|_ literal) in source)) {
#E: {
x: true
}
}
#E: {
[_]: bool
}
#E: {
x: true
}
}
doubleAddfail: {
if (〈0;#E〉.x == _|_(explicit error (_|_ literal) in source)) {
#E: {
y: true
}
}
if (〈0;#E〉.y == _|_(explicit error (_|_ literal) in source)) {
#E: {
x: true
}
}
#E: {
[_]: bool
}
}
trippleSuccess: {
if (〈0;#E〉.x != _|_(explicit error (_|_ literal) in source)) {
#E: {
y: true
}
}
if (〈0;#E〉.y != _|_(explicit error (_|_ literal) in source)) {
z: true
}
#E: {
x: true
}
}
}
}