blob: 60bc35da3502638135472723291c5c43f4554873 [file] [log] [blame]
// Ensure that disjunction elimination is not done prematurely.
// Issue #651
-- in.cue --
import "struct"
// Closedness checks should not be triggered too early, or with an improper
// subset of StructInfos. Blindly finalizing partial disjuncts will end up
// doing a closedness check with not all embeddings present, which can lead to
// a field being rejected prematurely.
//
// It should be recursively disabled.
disambiguateClosed: {
b: #Def & a
a: #Def
#Def: { {x: true} | {y: true} }
}
// Checks should never be disabled for field matching.
alwaysCheckMatchers1: {
b: {[=~"^xxxx$"]: int} | null
b: {c: string} | null
b: c: "yyyyy"
}
alwaysCheckPatterns2: {
a: #X
a: b
b: #X
b: c: "yyyyy"
#X: string | {
c: string
{[=~"^xxxx$"]: int}
}
}
nestedNonMonotonic: resolved: n1: {
x: { a: struct.MinFields(2) } | null
x: { a: c: 1 } | null
x: { a: d: 1 } | null
}
nestedNonMonotonic: resolved: n2: {
x: { a: b: struct.MinFields(2) } | null
x: { a: b: c: 1 } | null
x: { a: b: d: 1 } | null
}
nestedNonMonotonic: eliminated: n1: p1: {
x: { a: struct.MaxFields(1) } | null
x: { a: c: 1 } | null
x: { a: d: 1 } | null
}
nestedNonMonotonic: eliminated: n1: p2: {
x: { a: c: 1 } | null
x: { a: struct.MaxFields(1) } | null
x: { a: d: 1 } | null
}
nestedNonMonotonic: eliminated: n1: p2: {
x: { a: c: 1 } | null
x: { a: d: 1 } | null
x: { a: struct.MaxFields(1) } | null
}
nestedNonMonotonic: eliminated: n2: p1: {
x: { a: b: struct.MaxFields(1) } | null
x: { a: b: c: 1 } | null
x: { a: b: d: 1 } | null
}
nestedNonMonotonic: eliminated: n2: p2: {
x: { a: b: c: 1 } | null
x: { a: b: struct.MaxFields(1) } | null
x: { a: b: d: 1 } | null
}
nestedNonMonotonic: eliminated: n2: p2: {
x: { a: b: c: 1 } | null
x: { a: b: d: 1 } | null
x: { a: b: struct.MaxFields(1) } | null
}
nestedNonMonotonic: incomplete: a: n1: p1: {
x: { a: struct.MinFields(2) } | null
x: { a: c: 1 } | null
}
nestedNonMonotonic: incomplete: a: n1: p2: {
x: { a: c: 1 } | null
x: { a: struct.MinFields(2) } | null
}
nestedNonMonotonic: incomplete: a: n2: p1: {
x: { a: b: struct.MinFields(2) } | null
x: { a: b: c: 1 } | null
}
nestedNonMonotonic: incomplete: a: n2: p2: {
x: { a: b: c: 1 } | null
x: { a: b: struct.MinFields(2) } | null
}
nestedNonMonotonic: incomplete: b: n1: p1: {
x: { a: struct.MinFields(3) } | null
x: { a: c: 1 } | null
x: { a: d: 1 } | null
}
nestedNonMonotonic: incomplete: b: n1: p2: {
x: { a: c: 1 } | null
x: { a: struct.MinFields(3) } | null
x: { a: d: 1 } | null
}
nestedNonMonotonic: incomplete: b: n1: p3: {
x: { a: c: 1 } | null
x: { a: d: 1 } | null
x: { a: struct.MinFields(3) } | null
}
nestedNonMonotonic: incomplete: b: n2: p1: {
x: { a: b: struct.MinFields(3) } | null
x: { a: b: c: 1 } | null
x: { a: b: d: 1 } | null
}
nestedNonMonotonic: incomplete: b: n2: p1: {
x: { a: b: c: 1 } | null
x: { a: b: struct.MinFields(3) } | null
x: { a: b: d: 1 } | null
}
nestedNonMonotonic: incomplete: b: n2: p1: {
x: { a: b: c: 1 } | null
x: { a: b: d: 1 } | null
x: { a: b: struct.MinFields(3) } | null
}
preserveClosedness: small: p1: {
#A: #B & {a: string}
#B: {
*{} | {a: string}
*{} | {b: int}
}
}
preserveClosedness: small: p2: {
#A: #B & {a: string}
#B: {
{a: string} | *{}
*{} | {b: int}
}
}
preserveClosedness: medium: p1: {
#A: #B & {a: string}
#B: {
*{} | {a: string} | {b: string}
*{} | {c: int} | {d: string}
}
}
preserveClosedness: medium: p2: {
#A: #B & {a: string}
#B: {
{a: string} | *{} | {b: string}
*{} | {c: int} | {d: string}
}
}
preserveClosedness: medium: p3: {
#A: #B & {a: string}
#B: {
{a: string} | {b: string} | *{}
*{} | {c: int} | {d: string}
}
}
-- out/eval --
(struct){
disambiguateClosed: (struct){
b: (struct){ |((#struct){
x: (bool){ true }
}, (#struct){
y: (bool){ true }
}) }
a: (struct){ |((#struct){
x: (bool){ true }
}, (#struct){
y: (bool){ true }
}) }
#Def: (struct){ |((#struct){
x: (bool){ true }
}, (#struct){
y: (bool){ true }
}) }
}
alwaysCheckMatchers1: (struct){
b: (struct){
c: (string){ "yyyyy" }
}
}
alwaysCheckPatterns2: (struct){
a: (#struct){
c: (string){ "yyyyy" }
}
b: (#struct){
c: (string){ "yyyyy" }
}
#X: ((string|struct)){ |((string){ string }, (#struct){
c: (string){ string }
}) }
}
nestedNonMonotonic: (struct){
resolved: (struct){
n1: (struct){
x: ((null|struct)){ |((struct){
a: (struct){
c: (int){ 1 }
d: (int){ 1 }
}
}, (null){ null }) }
}
n2: (struct){
x: ((null|struct)){ |((struct){
a: (struct){
b: (struct){
c: (int){ 1 }
d: (int){ 1 }
}
}
}, (null){ null }) }
}
}
eliminated: (struct){
n1: (struct){
p1: (struct){
x: (null){ null }
}
p2: (struct){
x: (null){ null }
}
}
n2: (struct){
p1: (struct){
x: (null){ null }
}
p2: (struct){
x: (null){ null }
}
}
}
incomplete: (struct){
a: (struct){
n1: (struct){
p1: (struct){
x: ((null|struct)){ |((struct){
a: (_|_){
// [incomplete] nestedNonMonotonic.incomplete.a.n1.p1.x.a: invalid value {c:1} (does not satisfy struct.MinFields(2)): len(fields) < MinFields(2) (1 < 2):
// ./in.cue:84:13
// ./in.cue:84:30
c: (int){ 1 }
}
}, (null){ null }) }
}
p2: (struct){
x: ((null|struct)){ |((struct){
a: (_|_){
// [incomplete] nestedNonMonotonic.incomplete.a.n1.p2.x.a: invalid value {c:1} (does not satisfy struct.MinFields(2)): len(fields) < MinFields(2) (1 < 2):
// ./in.cue:90:13
// ./in.cue:90:30
c: (int){ 1 }
}
}, (null){ null }) }
}
}
n2: (struct){
p1: (struct){
x: ((null|struct)){ |((struct){
a: (struct){
b: (_|_){
// [incomplete] nestedNonMonotonic.incomplete.a.n2.p1.x.a.b: invalid value {c:1} (does not satisfy struct.MinFields(2)): len(fields) < MinFields(2) (1 < 2):
// ./in.cue:94:16
// ./in.cue:94:33
c: (int){ 1 }
}
}
}, (null){ null }) }
}
p2: (struct){
x: ((null|struct)){ |((struct){
a: (struct){
b: (_|_){
// [incomplete] nestedNonMonotonic.incomplete.a.n2.p2.x.a.b: invalid value {c:1} (does not satisfy struct.MinFields(2)): len(fields) < MinFields(2) (1 < 2):
// ./in.cue:100:16
// ./in.cue:100:33
c: (int){ 1 }
}
}
}, (null){ null }) }
}
}
}
b: (struct){
n1: (struct){
p1: (struct){
x: ((null|struct)){ |((struct){
a: (_|_){
// [incomplete] nestedNonMonotonic.incomplete.b.n1.p1.x.a: invalid value {c:1,d:1} (does not satisfy struct.MinFields(3)): len(fields) < MinFields(3) (2 < 3):
// ./in.cue:105:13
// ./in.cue:105:30
c: (int){ 1 }
d: (int){ 1 }
}
}, (null){ null }) }
}
p2: (struct){
x: ((null|struct)){ |((struct){
a: (_|_){
// [incomplete] nestedNonMonotonic.incomplete.b.n1.p2.x.a: invalid value {c:1,d:1} (does not satisfy struct.MinFields(3)): len(fields) < MinFields(3) (2 < 3):
// ./in.cue:112:13
// ./in.cue:112:30
c: (int){ 1 }
d: (int){ 1 }
}
}, (null){ null }) }
}
p3: (struct){
x: ((null|struct)){ |((struct){
a: (_|_){
// [incomplete] nestedNonMonotonic.incomplete.b.n1.p3.x.a: invalid value {c:1,d:1} (does not satisfy struct.MinFields(3)): len(fields) < MinFields(3) (2 < 3):
// ./in.cue:119:13
// ./in.cue:119:30
c: (int){ 1 }
d: (int){ 1 }
}
}, (null){ null }) }
}
}
n2: (struct){
p1: (struct){
x: ((null|struct)){ |((struct){
a: (struct){
b: (_|_){
// [incomplete] nestedNonMonotonic.incomplete.b.n2.p1.x.a.b: invalid value {c:1,d:1} (does not satisfy struct.MinFields(3)): len(fields) < MinFields(3) (2 < 3):
// ./in.cue:137:16
// ./in.cue:137:33
c: (int){ 1 }
d: (int){ 1 }
}
}
}, (null){ null }) }
}
}
}
}
}
preserveClosedness: (struct){
small: (struct){
p1: (struct){
#A: (struct){ |(*(#struct){
a: (string){ string }
}, (#struct){
a: (string){ string }
b: (int){ int }
}) }
#B: (struct){ |(*(#struct){
}, (#struct){
b: (int){ int }
}, (#struct){
a: (string){ string }
}, (#struct){
a: (string){ string }
b: (int){ int }
}) }
}
p2: (struct){
#A: (struct){ |(*(#struct){
a: (string){ string }
}, (#struct){
a: (string){ string }
b: (int){ int }
}) }
#B: (struct){ |(*(#struct){
}, (#struct){
a: (string){ string }
b: (int){ int }
}, (#struct){
a: (string){ string }
}, (#struct){
b: (int){ int }
}) }
}
}
medium: (struct){
p1: (struct){
#A: (struct){ |(*(#struct){
a: (string){ string }
}, (#struct){
a: (string){ string }
c: (int){ int }
}, (#struct){
a: (string){ string }
d: (string){ string }
}) }
#B: (struct){ |(*(#struct){
}, (#struct){
c: (int){ int }
}, (#struct){
d: (string){ string }
}, (#struct){
a: (string){ string }
}, (#struct){
a: (string){ string }
c: (int){ int }
}, (#struct){
a: (string){ string }
d: (string){ string }
}, (#struct){
b: (string){ string }
}, (#struct){
b: (string){ string }
c: (int){ int }
}, (#struct){
b: (string){ string }
d: (string){ string }
}) }
}
p2: (struct){
#A: (struct){ |(*(#struct){
a: (string){ string }
}, (#struct){
a: (string){ string }
c: (int){ int }
}, (#struct){
a: (string){ string }
d: (string){ string }
}) }
#B: (struct){ |(*(#struct){
}, (#struct){
a: (string){ string }
c: (int){ int }
}, (#struct){
a: (string){ string }
d: (string){ string }
}, (#struct){
a: (string){ string }
}, (#struct){
c: (int){ int }
}, (#struct){
d: (string){ string }
}, (#struct){
b: (string){ string }
}, (#struct){
b: (string){ string }
c: (int){ int }
}, (#struct){
b: (string){ string }
d: (string){ string }
}) }
}
p3: (struct){
#A: (struct){ |(*(#struct){
a: (string){ string }
}, (#struct){
a: (string){ string }
c: (int){ int }
}, (#struct){
a: (string){ string }
d: (string){ string }
}) }
#B: (struct){ |(*(#struct){
}, (#struct){
a: (string){ string }
c: (int){ int }
}, (#struct){
a: (string){ string }
d: (string){ string }
}, (#struct){
b: (string){ string }
}, (#struct){
b: (string){ string }
c: (int){ int }
}, (#struct){
b: (string){ string }
d: (string){ string }
}, (#struct){
a: (string){ string }
}, (#struct){
c: (int){ int }
}, (#struct){
d: (string){ string }
}) }
}
}
}
}
-- out/compile --
--- in.cue
{
disambiguateClosed: {
b: (〈0;#Def & 0;a〉)
a: 0;#Def
#Def: {
({
x: true
}|{
y: true
})
}
}
alwaysCheckMatchers1: {
b: ({
[=~"^xxxx$"]: int
}|null)
b: ({
c: string
}|null)
b: {
c: "yyyyy"
}
}
alwaysCheckPatterns2: {
a: 0;#X
a: 0;b
b: 0;#X
b: {
c: "yyyyy"
}
#X: (string|{
c: string
{
[=~"^xxxx$"]: int
}
})
}
nestedNonMonotonic: {
resolved: {
n1: {
x: ({
a: import;struct〉.MinFields(2)
}|null)
x: ({
a: {
c: 1
}
}|null)
x: ({
a: {
d: 1
}
}|null)
}
}
}
nestedNonMonotonic: {
resolved: {
n2: {
x: ({
a: {
b: import;struct〉.MinFields(2)
}
}|null)
x: ({
a: {
b: {
c: 1
}
}
}|null)
x: ({
a: {
b: {
d: 1
}
}
}|null)
}
}
}
nestedNonMonotonic: {
eliminated: {
n1: {
p1: {
x: ({
a: import;struct〉.MaxFields(1)
}|null)
x: ({
a: {
c: 1
}
}|null)
x: ({
a: {
d: 1
}
}|null)
}
}
}
}
nestedNonMonotonic: {
eliminated: {
n1: {
p2: {
x: ({
a: {
c: 1
}
}|null)
x: ({
a: import;struct〉.MaxFields(1)
}|null)
x: ({
a: {
d: 1
}
}|null)
}
}
}
}
nestedNonMonotonic: {
eliminated: {
n1: {
p2: {
x: ({
a: {
c: 1
}
}|null)
x: ({
a: {
d: 1
}
}|null)
x: ({
a: import;struct〉.MaxFields(1)
}|null)
}
}
}
}
nestedNonMonotonic: {
eliminated: {
n2: {
p1: {
x: ({
a: {
b: import;struct〉.MaxFields(1)
}
}|null)
x: ({
a: {
b: {
c: 1
}
}
}|null)
x: ({
a: {
b: {
d: 1
}
}
}|null)
}
}
}
}
nestedNonMonotonic: {
eliminated: {
n2: {
p2: {
x: ({
a: {
b: {
c: 1
}
}
}|null)
x: ({
a: {
b: import;struct〉.MaxFields(1)
}
}|null)
x: ({
a: {
b: {
d: 1
}
}
}|null)
}
}
}
}
nestedNonMonotonic: {
eliminated: {
n2: {
p2: {
x: ({
a: {
b: {
c: 1
}
}
}|null)
x: ({
a: {
b: {
d: 1
}
}
}|null)
x: ({
a: {
b: import;struct〉.MaxFields(1)
}
}|null)
}
}
}
}
nestedNonMonotonic: {
incomplete: {
a: {
n1: {
p1: {
x: ({
a: import;struct〉.MinFields(2)
}|null)
x: ({
a: {
c: 1
}
}|null)
}
}
}
}
}
nestedNonMonotonic: {
incomplete: {
a: {
n1: {
p2: {
x: ({
a: {
c: 1
}
}|null)
x: ({
a: import;struct〉.MinFields(2)
}|null)
}
}
}
}
}
nestedNonMonotonic: {
incomplete: {
a: {
n2: {
p1: {
x: ({
a: {
b: import;struct〉.MinFields(2)
}
}|null)
x: ({
a: {
b: {
c: 1
}
}
}|null)
}
}
}
}
}
nestedNonMonotonic: {
incomplete: {
a: {
n2: {
p2: {
x: ({
a: {
b: {
c: 1
}
}
}|null)
x: ({
a: {
b: import;struct〉.MinFields(2)
}
}|null)
}
}
}
}
}
nestedNonMonotonic: {
incomplete: {
b: {
n1: {
p1: {
x: ({
a: import;struct〉.MinFields(3)
}|null)
x: ({
a: {
c: 1
}
}|null)
x: ({
a: {
d: 1
}
}|null)
}
}
}
}
}
nestedNonMonotonic: {
incomplete: {
b: {
n1: {
p2: {
x: ({
a: {
c: 1
}
}|null)
x: ({
a: import;struct〉.MinFields(3)
}|null)
x: ({
a: {
d: 1
}
}|null)
}
}
}
}
}
nestedNonMonotonic: {
incomplete: {
b: {
n1: {
p3: {
x: ({
a: {
c: 1
}
}|null)
x: ({
a: {
d: 1
}
}|null)
x: ({
a: import;struct〉.MinFields(3)
}|null)
}
}
}
}
}
nestedNonMonotonic: {
incomplete: {
b: {
n2: {
p1: {
x: ({
a: {
b: import;struct〉.MinFields(3)
}
}|null)
x: ({
a: {
b: {
c: 1
}
}
}|null)
x: ({
a: {
b: {
d: 1
}
}
}|null)
}
}
}
}
}
nestedNonMonotonic: {
incomplete: {
b: {
n2: {
p1: {
x: ({
a: {
b: {
c: 1
}
}
}|null)
x: ({
a: {
b: import;struct〉.MinFields(3)
}
}|null)
x: ({
a: {
b: {
d: 1
}
}
}|null)
}
}
}
}
}
nestedNonMonotonic: {
incomplete: {
b: {
n2: {
p1: {
x: ({
a: {
b: {
c: 1
}
}
}|null)
x: ({
a: {
b: {
d: 1
}
}
}|null)
x: ({
a: {
b: import;struct〉.MinFields(3)
}
}|null)
}
}
}
}
}
preserveClosedness: {
small: {
p1: {
#A: (〈0;#B〉 & {
a: string
})
#B: {
(*{}|{
a: string
})
(*{}|{
b: int
})
}
}
}
}
preserveClosedness: {
small: {
p2: {
#A: (〈0;#B〉 & {
a: string
})
#B: {
({
a: string
}|*{})
(*{}|{
b: int
})
}
}
}
}
preserveClosedness: {
medium: {
p1: {
#A: (〈0;#B〉 & {
a: string
})
#B: {
(*{}|{
a: string
}|{
b: string
})
(*{}|{
c: int
}|{
d: string
})
}
}
}
}
preserveClosedness: {
medium: {
p2: {
#A: (〈0;#B〉 & {
a: string
})
#B: {
({
a: string
}|*{}|{
b: string
})
(*{}|{
c: int
}|{
d: string
})
}
}
}
}
preserveClosedness: {
medium: {
p3: {
#A: (〈0;#B〉 & {
a: string
})
#B: {
({
a: string
}|{
b: string
}|*{})
(*{}|{
c: int
}|{
d: string
})
}
}
}
}
}