1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package adt
21
22
23
24
25
26
27 import (
28 "fmt"
29
30 "cuelang.org/go/cue/ast"
31 "cuelang.org/go/cue/errors"
32 "cuelang.org/go/cue/stats"
33 "cuelang.org/go/cue/token"
34 )
35
36
37
38
39
40
41
42
43
44
45 func (c *OpContext) Stats() *stats.Counts {
46 return &c.stats
47 }
48
49
50
51
52
53
54
55
56
57 var structSentinel = &StructMarker{}
58
59 var incompleteSentinel = &Bottom{
60 Code: IncompleteError,
61 Err: errors.Newf(token.NoPos, "incomplete"),
62 }
63
64
65
66
67
68
69
70
71
72
73
74
75
76 func (c *OpContext) evaluate(v *Vertex, r Resolver, state combinedFlags) Value {
77 if v.isUndefined() {
78
79 c.unify(v, state)
80
81 if v.ArcType == ArcPending {
82 if v.status == evaluating {
83 for ; v.Parent != nil && v.ArcType == ArcPending; v = v.Parent {
84 }
85 err := c.Newf("cycle with field %v", r)
86 b := &Bottom{Code: CycleError, Err: err}
87 v.setValue(c, v.status, b)
88 return b
89
90
91
92
93
94
95 }
96 c.undefinedFieldError(v, IncompleteError)
97 return nil
98 }
99 }
100
101 if n := v.state; n != nil {
102 if n.errs != nil && !n.errs.IsIncomplete() {
103 return n.errs
104 }
105 if n.scalar != nil && isCyclePlaceholder(v.BaseValue) {
106 return n.scalar
107 }
108 }
109
110 switch x := v.BaseValue.(type) {
111 case *Bottom:
112 if x.IsIncomplete() {
113 c.AddBottom(x)
114 return nil
115 }
116 return x
117
118 case nil:
119 if v.state != nil {
120 switch x := v.state.getValidators(finalized).(type) {
121 case Value:
122 return x
123 default:
124 w := *v
125 w.BaseValue = x
126 return &w
127 }
128 }
129
130
131 return nil
132 }
133
134 if v.status < finalized && v.state != nil {
135
136
137
138
139
140 if !v.state.done() || v.state.errs != nil {
141 v.state.addNotify(c.vertex, nil)
142 }
143 }
144
145 return v
146 }
147
148
149
150
151
152
153 func (c *OpContext) unify(v *Vertex, flags combinedFlags) {
154 if c.isDevVersion() {
155 requires, mode := flags.conditions(), flags.runMode()
156 v.unify(c, requires, mode)
157 return
158 }
159
160
161 if Debug {
162 c.nest++
163 c.Logf(v, "Unify")
164 defer func() {
165 c.Logf(v, "END Unify")
166 c.nest--
167 }()
168 }
169
170
171
172 n := v.getNodeContext(c, 1)
173 defer v.freeNode(n)
174
175 state := flags.vertexStatus()
176
177
178 if n != nil && v.Parent != nil && v.Parent.state != nil {
179 n.depth = v.Parent.state.depth + 1
180 }
181
182 if state <= v.Status() &&
183 state == partial &&
184 v.isDefined() &&
185 n != nil && n.scalar != nil {
186 return
187 }
188
189 switch v.Status() {
190 case evaluating:
191 n.insertConjuncts(state)
192 return
193
194 case evaluatingArcs:
195 Assertf(v.status > 0, "unexpected status %d", v.status)
196 return
197
198 case 0:
199 if v.Label.IsDef() {
200 v.Closed = true
201 }
202
203 if v.Parent != nil {
204 if v.Parent.Closed {
205 v.Closed = true
206 }
207 }
208
209 defer c.PopArc(c.PushArc(v))
210
211 v.updateStatus(evaluating)
212
213 if p := v.Parent; p != nil && p.state != nil && v.Label.IsString() {
214 for _, s := range p.state.node.Structs {
215 if s.Disable {
216 continue
217 }
218 s.MatchAndInsert(n.ctx, v)
219 }
220 }
221
222 c.stats.Unifications++
223
224
225
226
227
228
229
230
231
232 v.BaseValue = cycle
233
234 if c.HasErr() {
235 n.addBottom(c.errs)
236 }
237
238
239
240 n.conjuncts = n.conjuncts[:0]
241
242 for i, c := range v.Conjuncts {
243 n.addConjunction(c, i)
244 }
245 if n.insertConjuncts(state) {
246 n.maybeSetCache()
247 v.updateStatus(partial)
248 return
249 }
250
251 fallthrough
252
253 case partial, conjuncts:
254
255
256
257
258 if v.status == conjuncts && (n.hasErr() || !n.checkClosed(state)) {
259 if err := n.getErr(); err != nil {
260 b, _ := v.BaseValue.(*Bottom)
261 v.BaseValue = CombineErrors(nil, b, err)
262 }
263 break
264 }
265
266 defer c.PopArc(c.PushArc(v))
267
268 n.insertConjuncts(state)
269
270 v.status = evaluating
271
272
273 for n.maybeSetCache(); n.expandOne(partial); n.maybeSetCache() {
274 }
275
276 n.doNotify()
277
278 if !n.done() {
279 switch {
280 case state < conjuncts:
281 n.node.updateStatus(partial)
282 return
283
284 case state == conjuncts:
285 if err := n.incompleteErrors(true); err != nil && err.Code < CycleError {
286 n.node.AddErr(c, err)
287 } else {
288 n.node.updateStatus(partial)
289 }
290 return
291 }
292 }
293
294
295
296 disState := state
297 if len(n.disjunctions) > 0 && disState != finalized {
298 disState = finalized
299 }
300 n.expandDisjuncts(disState, n, maybeDefault, false, true)
301
302 n.finalizeDisjuncts()
303
304 switch len(n.disjuncts) {
305 case 0:
306 case 1:
307 x := n.disjuncts[0].result
308 x.state = nil
309 x.cyclicReferences = n.node.cyclicReferences
310 *v = x
311
312 default:
313 d := n.createDisjunct()
314 v.BaseValue = d
315
316
317 for _, d := range d.Values {
318 d, ok := d.(*Vertex)
319 if !ok {
320 continue
321 }
322
323
324 d.Conjuncts = nil
325
326
327
328
329 for _, a := range d.Arcs {
330 for _, x := range a.Conjuncts {
331
332
333 for env := x.Env; env != nil && env.Vertex == v; env = env.Up {
334 env.Vertex = d
335 }
336 }
337 }
338 }
339 v.Arcs = nil
340 v.ChildErrors = nil
341
342
343 }
344
345
346
347
348 v.state = n
349
350
351
352 if !n.done() {
353 if err := n.incompleteErrors(true); err != nil {
354 b, _ := n.node.BaseValue.(*Bottom)
355 if b != err {
356 err = CombineErrors(n.ctx.src, b, err)
357 }
358 n.node.BaseValue = err
359 }
360 }
361
362 assertStructuralCycle(n)
363
364 if state != finalized {
365 return
366 }
367
368 if v.BaseValue == nil {
369 v.BaseValue = n.getValidators(finalized)
370 }
371
372
373 v.updateStatus(finalized)
374
375 case finalized:
376 }
377 }
378
379
380 func (n *nodeContext) insertConjuncts(state vertexStatus) bool {
381 unreachableForDev(n.ctx)
382
383
384 if state == partial {
385 for n.conjunctsPartialPos < len(n.conjuncts) {
386 c := &n.conjuncts[n.conjunctsPartialPos]
387 n.conjunctsPartialPos++
388 if c.done {
389 continue
390 }
391 if v, ok := c.C.Elem().(Value); ok && IsConcrete(v) {
392 c.done = true
393 n.addValueConjunct(c.C.Env, v, c.C.CloseInfo)
394 }
395 }
396 if n.scalar != nil && n.node.isDefined() {
397 return true
398 }
399 }
400 for n.conjunctsPos < len(n.conjuncts) {
401 nInfos := len(n.node.Structs)
402 p := &n.conjuncts[n.conjunctsPos]
403 n.conjunctsPos++
404 if p.done {
405 continue
406 }
407
408
409
410
411 n.addExprConjunct(p.C, partial)
412 p.done = true
413
414
415
416 for i := nInfos; i < len(n.node.Structs); i++ {
417 n.node.Conjuncts[p.index].CloseInfo.FieldTypes |= n.node.Structs[i].types
418 }
419 }
420 return false
421 }
422
423
424
425
426
427
428
429 func (n *nodeContext) finalizeDisjuncts() {
430 a := n.disjuncts
431 if len(a) == 0 {
432 return
433 }
434 k := 0
435 for i, d := range a {
436 switch d.finalDone() {
437 case true:
438 a[k], a[i] = d, a[k]
439 k++
440 default:
441 if err := d.incompleteErrors(true); err != nil {
442 n.disjunctErrs = append(n.disjunctErrs, err)
443 }
444 }
445 d.free()
446 }
447 if k == 0 {
448 n.makeError()
449 }
450 n.disjuncts = a[:k]
451 }
452
453 func (n *nodeContext) doNotify() {
454 if n.errs == nil || len(n.notify) == 0 {
455 return
456 }
457 for _, rec := range n.notify {
458 v := rec.v
459 if v.state == nil {
460 if b, ok := v.BaseValue.(*Bottom); ok {
461 v.BaseValue = CombineErrors(nil, b, n.errs)
462 } else {
463 v.BaseValue = n.errs
464 }
465 } else {
466 v.state.addBottom(n.errs)
467 }
468 }
469 n.notify = n.notify[:0]
470 }
471
472 func (n *nodeContext) postDisjunct(state vertexStatus) {
473 ctx := n.ctx
474 unreachableForDev(ctx)
475
476 for {
477
478 for n.maybeSetCache(); n.expandOne(state); n.maybeSetCache() {
479 }
480
481 if !n.addLists(oldOnly(state)) {
482 break
483 }
484 }
485
486 if n.aStruct != nil {
487 n.updateNodeType(StructKind, n.aStruct, n.aStructID)
488 }
489
490 if len(n.selfComprehensions) > 0 {
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514 n.node.LockArcs = true
515
516 n.injectSelfComprehensions(state)
517 }
518
519 for n.expandOne(state) {
520 }
521
522 switch err := n.getErr(); {
523 case err != nil:
524 if err.Code < IncompleteError && n.node.ArcType == ArcPending {
525 n.node.ArcType = ArcMember
526 }
527 n.node.BaseValue = err
528 n.errs = nil
529
530 default:
531 if isCyclePlaceholder(n.node.BaseValue) {
532 if !n.done() {
533 n.node.BaseValue = n.incompleteErrors(true)
534 } else {
535 n.node.BaseValue = nil
536 }
537 }
538
539
540
541
542
543
544
545
546
547
548
549
550
551 n.validateValue(state)
552
553 v := n.node.Value()
554
555
556 skip := n.skipNonMonotonicChecks()
557 if v != nil && IsConcrete(v) && !skip {
558 for _, v := range n.checks {
559
560
561
562 if b := ctx.Validate(v, n.node); b != nil {
563 n.addBottom(b)
564 }
565 }
566 }
567
568 if v == nil {
569 break
570 }
571
572 switch {
573 case v.Kind() == ListKind:
574 for _, a := range n.node.Arcs {
575 if a.Label.Typ() == StringLabel && a.IsDefined(ctx) {
576 n.addErr(ctx.Newf("list may not have regular fields"))
577
578
579 }
580 }
581
582
583
584
585
586
587
588
589
590 }
591 }
592
593 n.completeArcs(state)
594 }
595
596
597
598
599
600
601
602
603 func (n *nodeContext) validateValue(state vertexStatus) {
604 ctx := n.ctx
605
606
607
608
609 markStruct := false
610 if n.aStruct != nil {
611 markStruct = true
612 } else if len(n.node.Structs) > 0 {
613 markStruct = n.kind&StructKind != 0 && !n.hasTop
614 }
615 v := n.node.Value()
616 if n.node.BaseValue == nil && markStruct {
617 n.node.BaseValue = &StructMarker{}
618 v = n.node
619 }
620 if v != nil && IsConcrete(v) {
621
622
623
624 if n.lowerBound != nil {
625 if b := ctx.Validate(n.lowerBound, v); b != nil {
626
627
628
629 if e, _ := b.Err.(*ValueError); e != nil {
630 e.AddPosition(n.lowerBound)
631 e.AddPosition(v)
632 }
633 n.addBottom(b)
634 }
635 }
636 if n.upperBound != nil {
637 if b := ctx.Validate(n.upperBound, v); b != nil {
638
639
640
641 if e, _ := b.Err.(*ValueError); e != nil {
642 e.AddPosition(n.upperBound)
643 e.AddPosition(v)
644 }
645 n.addBottom(b)
646 }
647 }
648
649 } else if state == finalized {
650 n.node.BaseValue = n.getValidators(finalized)
651 }
652 }
653
654
655
656 func (n *nodeContext) incompleteErrors(final bool) *Bottom {
657
658 var err *Bottom
659 for _, d := range n.dynamicFields {
660 err = CombineErrors(nil, err, d.err)
661 }
662 for _, c := range n.comprehensions {
663 if c.err == nil {
664 continue
665 }
666 err = CombineErrors(nil, err, c.err)
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684 if final && c.vertex != nil && c.vertex.status != finalized {
685 c.vertex.state.addBottom(err)
686 c.vertex = nil
687 }
688 }
689 for _, c := range n.selfComprehensions {
690 if c.err == nil {
691 continue
692 }
693
694 err = CombineErrors(nil, err, c.err)
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712 if c.vertex != nil && c.vertex.status != finalized {
713 c.vertex.state.addBottom(err)
714 c.vertex = nil
715 }
716 }
717 for _, x := range n.exprs {
718 err = CombineErrors(nil, err, x.err)
719 }
720 if err == nil {
721
722 err = incompleteSentinel
723 }
724 if err.Code < IncompleteError {
725 n.node.ArcType = ArcMember
726 }
727 return err
728 }
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748 func (n *nodeContext) checkClosed(state vertexStatus) bool {
749 unreachableForDev(n.ctx)
750
751 ignore := state != finalized || n.skipNonMonotonicChecks()
752
753 v := n.node
754 if !v.Label.IsInt() && v.Parent != nil && !ignore && v.ArcType <= ArcRequired {
755 ctx := n.ctx
756
757 if _, err := verifyArc2(ctx, v.Label, v, v.Closed); err != nil {
758
759
760
761
762 v.SetValue(ctx, err)
763 return false
764 }
765 }
766 return true
767 }
768
769 func (n *nodeContext) completeArcs(state vertexStatus) {
770 unreachableForDev(n.ctx)
771
772 if DebugSort > 0 {
773 DebugSortArcs(n.ctx, n.node)
774 }
775
776 if n.node.hasAllConjuncts || n.node.Parent == nil {
777 n.node.setParentDone()
778 }
779
780
781
782
783
784
785 if state <= conjuncts &&
786
787 n.node.status <= state+1 &&
788 (!n.node.hasPendingArc || n.node.ArcType == ArcMember) {
789
790 n.node.updateStatus(conjuncts)
791 return
792 }
793
794 n.node.updateStatus(evaluatingArcs)
795
796 ctx := n.ctx
797
798 if !assertStructuralCycle(n) {
799 k := 0
800
801 for _, a := range n.node.Arcs {
802
803
804 n.node.updateStatus(evaluatingArcs)
805
806 wasVoid := a.ArcType == ArcPending
807
808 ctx.unify(a, oldOnly(finalized))
809
810 if a.ArcType == ArcPending {
811 continue
812 }
813
814
815
816 if !a.Label.IsLet() && a.ArcType <= ArcRequired {
817
818 if state == finalized && a.status < finalized {
819 state = conjuncts
820 }
821
822 if err, _ := a.BaseValue.(*Bottom); err != nil {
823 n.node.AddChildError(err)
824 }
825 }
826
827 n.node.Arcs[k] = a
828 k++
829
830 switch {
831 case a.ArcType > ArcRequired, !a.Label.IsString():
832 case n.kind&StructKind == 0:
833 if !n.node.IsErr() {
834 n.reportFieldMismatch(pos(a.Value()), nil, a.Label, n.node.Value())
835 }
836 case !wasVoid:
837 case n.kind == TopKind:
838
839
840
841
842
843
844
845
846
847
848 if _, ok := n.node.BaseValue.(*Bottom); !ok {
849 n.node.BaseValue = &StructMarker{}
850 n.kind = StructKind
851 }
852 }
853 }
854 n.node.Arcs = n.node.Arcs[:k]
855
856 for _, c := range n.postChecks {
857 f := ctx.PushState(c.env, c.expr.Source())
858
859
860
861
862 v := ctx.evalState(c.expr, oldOnly(finalized))
863 v, _ = ctx.getDefault(v)
864 v = Unwrap(v)
865
866 switch _, isError := v.(*Bottom); {
867 case isError == c.expectError:
868 default:
869 n.node.AddErr(ctx, &Bottom{
870 Src: c.expr.Source(),
871 Code: CycleError,
872 Err: ctx.NewPosf(pos(c.expr),
873 "circular dependency in evaluation of conditionals: %v changed after evaluation",
874 ctx.Str(c.expr)),
875 })
876 }
877
878 ctx.PopState(f)
879 }
880 }
881
882 if err := n.getErr(); err != nil {
883 n.errs = nil
884 if b, _ := n.node.BaseValue.(*Bottom); b != nil {
885 err = CombineErrors(nil, b, err)
886 }
887 n.node.BaseValue = err
888 }
889
890 b, hasErr := n.node.BaseValue.(*Bottom)
891 if !hasErr && b != cycle {
892 n.checkClosed(state)
893 }
894
895
896
897
898
899
900 k := 0
901 for _, s := range n.node.Structs {
902 if s.initialized {
903 n.node.Structs[k] = s
904 k++
905 }
906 }
907 n.node.Structs = n.node.Structs[:k]
908
909 n.node.updateStatus(finalized)
910 }
911
912
913
914 var cycle = &Bottom{
915 Err: errors.Newf(token.NoPos, "cycle error"),
916 Code: CycleError,
917 }
918
919 func isCyclePlaceholder(v BaseValue) bool {
920 return v == cycle
921 }
922
923 func (n *nodeContext) createDisjunct() *Disjunction {
924 a := make([]Value, len(n.disjuncts))
925 p := 0
926 hasDefaults := false
927 for i, x := range n.disjuncts {
928 v := new(Vertex)
929 *v = x.result
930 v.state = nil
931 switch x.defaultMode {
932 case isDefault:
933 a[i] = a[p]
934 a[p] = v
935 p++
936 hasDefaults = true
937
938 case notDefault:
939 hasDefaults = true
940 fallthrough
941 case maybeDefault:
942 a[i] = v
943 }
944 }
945
946
947
948
949
950 return &Disjunction{
951 Values: a,
952 NumDefaults: p,
953 HasDefaults: hasDefaults,
954 }
955 }
956
957 type arcKey struct {
958 arc *Vertex
959 id CloseInfo
960 }
961
962
963
964
965
966 type nodeContext struct {
967 nextFree *nodeContext
968 refCount int
969
970
971
972 node *Vertex
973
974 nodeContextState
975
976 scheduler
977
978
979
980
981
982
983 arcMap []arcKey
984
985
986
987 notify []receiver
988
989
990
991 conjuncts []conjunct
992 cyclicConjuncts []cyclicConjunct
993
994 dynamicFields []envDynamic
995 comprehensions []envYield
996 selfComprehensions []envYield
997
998
999 lists []envList
1000 vLists []*Vertex
1001 exprs []envExpr
1002
1003 checks []Validator
1004 postChecks []envCheck
1005
1006
1007 disjunctions []envDisjunct
1008
1009
1010
1011
1012
1013 usedDefault []defaultInfo
1014
1015 disjuncts []*nodeContext
1016 buffer []*nodeContext
1017 disjunctErrs []*Bottom
1018
1019
1020 snapshot Vertex
1021
1022
1023
1024 result Vertex
1025 }
1026
1027 type conjunct struct {
1028 C Conjunct
1029
1030
1031
1032
1033 done bool
1034 index int
1035 }
1036
1037 type nodeContextState struct {
1038
1039
1040 hasTop bool
1041 hasCycle bool
1042 hasNonCycle bool
1043
1044 depth int32
1045 defaultMode defaultMode
1046
1047
1048
1049 kind Kind
1050 kindExpr Expr
1051 kindID CloseInfo
1052
1053
1054 scalar Value
1055 scalarID CloseInfo
1056
1057 aStruct Expr
1058 aStructID CloseInfo
1059
1060
1061 listIsClosed bool
1062 maxListLen int
1063 maxNode Expr
1064
1065 lowerBound *BoundValue
1066 upperBound *BoundValue
1067 errs *Bottom
1068
1069
1070
1071
1072
1073
1074 conjunctsPos int
1075
1076
1077 conjunctsPartialPos int
1078
1079 arcPos int
1080 }
1081
1082
1083 type receiver struct {
1084 v *Vertex
1085 cc *closeContext
1086 }
1087
1088
1089
1090
1091 func (n *nodeContext) Logf(format string, args ...interface{}) {
1092 n.ctx.Logf(n.node, format, args...)
1093 }
1094
1095 type defaultInfo struct {
1096
1097
1098 parentMode defaultMode
1099
1100
1101 nestedMode defaultMode
1102
1103 origMode defaultMode
1104 }
1105
1106 func (n *nodeContext) addNotify(v *Vertex, cc *closeContext) {
1107 unreachableForDev(n.ctx)
1108
1109 if v != nil && !n.node.hasAllConjuncts {
1110 n.notify = append(n.notify, receiver{v, cc})
1111 }
1112 }
1113
1114 func (n *nodeContext) clone() *nodeContext {
1115 d := n.ctx.newNodeContext(n.node)
1116
1117 d.refCount++
1118
1119 d.ctx = n.ctx
1120 d.node = n.node
1121
1122 d.nodeContextState = n.nodeContextState
1123
1124 d.arcMap = append(d.arcMap, n.arcMap...)
1125 d.notify = append(d.notify, n.notify...)
1126
1127 n.scheduler.cloneInto(&d.scheduler)
1128
1129 d.conjuncts = append(d.conjuncts, n.conjuncts...)
1130 d.cyclicConjuncts = append(d.cyclicConjuncts, n.cyclicConjuncts...)
1131 d.dynamicFields = append(d.dynamicFields, n.dynamicFields...)
1132 d.comprehensions = append(d.comprehensions, n.comprehensions...)
1133 d.selfComprehensions = append(d.selfComprehensions, n.selfComprehensions...)
1134 d.lists = append(d.lists, n.lists...)
1135 d.vLists = append(d.vLists, n.vLists...)
1136 d.exprs = append(d.exprs, n.exprs...)
1137 d.checks = append(d.checks, n.checks...)
1138 d.postChecks = append(d.postChecks, n.postChecks...)
1139
1140 d.usedDefault = append(d.usedDefault, n.usedDefault...)
1141
1142
1143
1144
1145 return d
1146 }
1147
1148 func (c *OpContext) newNodeContext(node *Vertex) *nodeContext {
1149 if n := c.freeListNode; n != nil {
1150 c.stats.Reused++
1151 c.freeListNode = n.nextFree
1152
1153 *n = nodeContext{
1154 scheduler: scheduler{ctx: c},
1155 node: node,
1156 nodeContextState: nodeContextState{
1157 kind: TopKind,
1158 },
1159 arcMap: n.arcMap[:0],
1160 conjuncts: n.conjuncts[:0],
1161 cyclicConjuncts: n.cyclicConjuncts[:0],
1162 notify: n.notify[:0],
1163 checks: n.checks[:0],
1164 postChecks: n.postChecks[:0],
1165 dynamicFields: n.dynamicFields[:0],
1166 comprehensions: n.comprehensions[:0],
1167 selfComprehensions: n.selfComprehensions[:0],
1168 lists: n.lists[:0],
1169 vLists: n.vLists[:0],
1170 exprs: n.exprs[:0],
1171 disjunctions: n.disjunctions[:0],
1172 usedDefault: n.usedDefault[:0],
1173 disjunctErrs: n.disjunctErrs[:0],
1174 disjuncts: n.disjuncts[:0],
1175 buffer: n.buffer[:0],
1176 }
1177 n.scheduler.clear()
1178 n.scheduler.node = n
1179
1180 return n
1181 }
1182 c.stats.Allocs++
1183
1184 n := &nodeContext{
1185 scheduler: scheduler{
1186 ctx: c,
1187 },
1188 node: node,
1189
1190 nodeContextState: nodeContextState{kind: TopKind},
1191 }
1192 n.scheduler.node = n
1193 return n
1194 }
1195
1196 func (v *Vertex) getNodeContext(c *OpContext, ref int) *nodeContext {
1197 unreachableForDev(c)
1198
1199 if v.state == nil {
1200 if v.status == finalized {
1201 return nil
1202 }
1203 v.state = c.newNodeContext(v)
1204 } else if v.state.node != v {
1205 panic("getNodeContext: nodeContext out of sync")
1206 }
1207 v.state.refCount += ref
1208 return v.state
1209 }
1210
1211 func (v *Vertex) freeNode(n *nodeContext) {
1212 if n == nil {
1213 return
1214 }
1215 if n.node != v {
1216 panic("freeNode: unpaired free")
1217 }
1218 if v.state != nil && v.state != n {
1219 panic("freeNode: nodeContext out of sync")
1220 }
1221 if n.refCount--; n.refCount == 0 {
1222 if v.status == finalized {
1223 v.freeNodeState()
1224 } else {
1225 n.ctx.stats.Retained++
1226 }
1227 }
1228 }
1229
1230 func (v *Vertex) freeNodeState() {
1231 if v.state == nil {
1232 return
1233 }
1234 state := v.state
1235 v.state = nil
1236
1237 state.ctx.freeNodeContext(state)
1238 }
1239
1240 func (n *nodeContext) free() {
1241 if n.refCount--; n.refCount == 0 {
1242 n.ctx.freeNodeContext(n)
1243 }
1244 }
1245
1246 func (c *OpContext) freeNodeContext(n *nodeContext) {
1247 c.stats.Freed++
1248 n.nextFree = c.freeListNode
1249 c.freeListNode = n
1250 n.node = nil
1251 n.refCount = 0
1252 n.scheduler.clear()
1253 }
1254
1255
1256
1257 func (n *nodeContext) reportConflict(
1258 v1, v2 Node,
1259 k1, k2 Kind,
1260 ids ...CloseInfo) {
1261
1262 ctx := n.ctx
1263
1264 var err *ValueError
1265 if k1 == k2 {
1266 err = ctx.NewPosf(token.NoPos, "conflicting values %s and %s", v1, v2)
1267 } else {
1268 err = ctx.NewPosf(token.NoPos,
1269 "conflicting values %s and %s (mismatched types %s and %s)",
1270 v1, v2, k1, k2)
1271 }
1272
1273 err.AddPosition(v1)
1274 err.AddPosition(v2)
1275 for _, id := range ids {
1276 err.AddClosedPositions(id)
1277 }
1278
1279 n.addErr(err)
1280 }
1281
1282
1283
1284 func (n *nodeContext) reportFieldMismatch(
1285 p token.Pos,
1286 s *StructLit,
1287 f Feature,
1288 scalar Expr,
1289 id ...CloseInfo) {
1290
1291 ctx := n.ctx
1292
1293 if f == InvalidLabel {
1294 for _, a := range s.Decls {
1295 if x, ok := a.(*Field); ok && x.Label.IsRegular() {
1296 f = x.Label
1297 p = pos(x)
1298 break
1299 }
1300 }
1301 if f == InvalidLabel {
1302 n.reportConflict(scalar, s, n.kind, StructKind, id...)
1303 return
1304 }
1305 }
1306
1307 err := ctx.NewPosf(p, "cannot combine regular field %q with %v", f, scalar)
1308
1309 if s != nil {
1310 err.AddPosition(s)
1311 }
1312
1313 for _, ci := range id {
1314 err.AddClosedPositions(ci)
1315 }
1316
1317 n.addErr(err)
1318 }
1319
1320 func (n *nodeContext) updateNodeType(k Kind, v Expr, id CloseInfo) bool {
1321 ctx := n.ctx
1322 kind := n.kind & k
1323
1324 switch {
1325 case n.kind == BottomKind,
1326 k == BottomKind:
1327 return false
1328
1329 case kind != BottomKind:
1330
1331
1332
1333
1334
1335
1336
1337
1338 case n.kindExpr != nil:
1339 n.reportConflict(n.kindExpr, v, n.kind, k, n.kindID, id)
1340
1341 default:
1342 n.addErr(ctx.Newf(
1343 "conflicting value %s (mismatched types %s and %s)",
1344 v, n.kind, k))
1345 }
1346
1347 if n.kind != kind || n.kindExpr == nil {
1348 n.kindExpr = v
1349 }
1350 n.kind = kind
1351 return kind != BottomKind
1352 }
1353
1354 func (n *nodeContext) done() bool {
1355
1356
1357 return len(n.dynamicFields) == 0 &&
1358 len(n.comprehensions) == 0 &&
1359 len(n.exprs) == 0
1360 }
1361
1362
1363
1364 func (n *nodeContext) finalDone() bool {
1365
1366 for _, x := range n.exprs {
1367 if x.err.Code != CycleError {
1368 return false
1369 }
1370 }
1371 return len(n.dynamicFields) == 0 &&
1372 len(n.comprehensions) == 0 &&
1373 len(n.selfComprehensions) == 0
1374 }
1375
1376
1377
1378 func (n *nodeContext) hasErr() bool {
1379 if n.node.ChildErrors != nil {
1380 return true
1381 }
1382 if n.node.status > evaluating && n.node.IsErr() {
1383 return true
1384 }
1385 return n.ctx.HasErr() || n.errs != nil
1386 }
1387
1388 func (n *nodeContext) getErr() *Bottom {
1389 n.errs = CombineErrors(nil, n.errs, n.ctx.Err())
1390 return n.errs
1391 }
1392
1393
1394 func (n *nodeContext) getValidators(state vertexStatus) BaseValue {
1395 ctx := n.ctx
1396
1397 a := []Value{}
1398
1399
1400
1401 kind := TopKind
1402 if n.lowerBound != nil {
1403 a = append(a, n.lowerBound)
1404 kind &= n.lowerBound.Kind()
1405 }
1406 if n.upperBound != nil {
1407 a = append(a, n.upperBound)
1408 kind &= n.upperBound.Kind()
1409 }
1410 for _, c := range n.checks {
1411
1412 if b, _ := c.(*BoundValue); b != nil && b.Op == NotEqualOp {
1413 if n.upperBound != nil &&
1414 SimplifyBounds(ctx, n.kind, n.upperBound, b) != nil {
1415 continue
1416 }
1417 if n.lowerBound != nil &&
1418 SimplifyBounds(ctx, n.kind, n.lowerBound, b) != nil {
1419 continue
1420 }
1421 }
1422 a = append(a, c)
1423 kind &= c.Kind()
1424 }
1425
1426 if kind&^n.kind != 0 {
1427 a = append(a, &BasicType{
1428 Src: n.kindExpr.Source(),
1429 K: n.kind,
1430 })
1431 }
1432
1433 var v BaseValue
1434 switch len(a) {
1435 case 0:
1436
1437 if state >= conjuncts || n.kind&^CompositKind == 0 {
1438 v = &BasicType{K: n.kind}
1439 }
1440
1441 case 1:
1442 v = a[0]
1443
1444 default:
1445 v = &Conjunction{Values: a}
1446 }
1447
1448 return v
1449 }
1450
1451
1452 func (n *nodeContext) maybeSetCache() {
1453
1454
1455 _, isErr := n.node.BaseValue.(*Bottom)
1456 if n.scalar != nil && (!isErr || isCyclePlaceholder(n.node.BaseValue)) {
1457 n.node.BaseValue = n.scalar
1458 }
1459
1460
1461
1462
1463 }
1464
1465 type envExpr struct {
1466 c Conjunct
1467 err *Bottom
1468 }
1469
1470 type envDynamic struct {
1471 env *Environment
1472 field *DynamicField
1473 id CloseInfo
1474 err *Bottom
1475 }
1476
1477 type envList struct {
1478 env *Environment
1479 list *ListLit
1480 n int64
1481 elipsis *Ellipsis
1482 id CloseInfo
1483 ignore bool
1484 self bool
1485 index int
1486 }
1487
1488 type envCheck struct {
1489 env *Environment
1490 expr Expr
1491 expectError bool
1492 }
1493
1494 func (n *nodeContext) addBottom(b *Bottom) {
1495 n.errs = CombineErrors(nil, n.errs, b)
1496
1497
1498
1499 }
1500
1501 func (n *nodeContext) addErr(err errors.Error) {
1502 if err != nil {
1503 n.addBottom(&Bottom{Err: err})
1504 }
1505 }
1506
1507
1508
1509
1510 func (n *nodeContext) addExprConjunct(v Conjunct, state vertexStatus) {
1511 unreachableForDev(n.ctx)
1512
1513 env := v.Env
1514 id := v.CloseInfo
1515
1516 switch x := v.Elem().(type) {
1517 case *Vertex:
1518 if x.IsData() {
1519 n.addValueConjunct(env, x, id)
1520 } else {
1521 n.addVertexConjuncts(v, x, true)
1522 }
1523
1524 case Value:
1525 n.addValueConjunct(env, x, id)
1526
1527 case *BinaryExpr:
1528 if x.Op == AndOp {
1529 n.addExprConjunct(MakeConjunct(env, x.X, id), state)
1530 n.addExprConjunct(MakeConjunct(env, x.Y, id), state)
1531 return
1532 } else {
1533 n.evalExpr(v, state)
1534 }
1535
1536 case *StructLit:
1537 n.addStruct(env, x, id)
1538
1539 case *ListLit:
1540 childEnv := &Environment{
1541 Up: env,
1542 Vertex: n.node,
1543 }
1544 n.lists = append(n.lists, envList{env: childEnv, list: x, id: id})
1545
1546 case *DisjunctionExpr:
1547 n.addDisjunction(env, x, id)
1548
1549 case *Comprehension:
1550
1551 n.insertComprehension(env, x, id)
1552 return
1553
1554 default:
1555
1556 n.evalExpr(v, state)
1557 }
1558 n.ctx.stats.Conjuncts++
1559 }
1560
1561
1562
1563 func (n *nodeContext) evalExpr(v Conjunct, state vertexStatus) {
1564 unreachableForDev(n.ctx)
1565
1566
1567 ctx := n.ctx
1568
1569 closeID := v.CloseInfo
1570
1571 switch x := v.Expr().(type) {
1572 case Resolver:
1573
1574
1575
1576
1577 if state == finalized {
1578 state = conjuncts
1579 }
1580 arc, err := ctx.resolveState(v, x, oldOnly(state))
1581 if err != nil && (!err.IsIncomplete() || err.Permanent) {
1582 n.addBottom(err)
1583 break
1584 }
1585 if arc == nil {
1586 n.exprs = append(n.exprs, envExpr{v, err})
1587 break
1588 }
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602 if arc.status == conjuncts && arc != n.node && arc.hasAllConjuncts {
1603 arc.Finalize(ctx)
1604 }
1605
1606 ci, skip := n.markCycle(arc, v.Env, x, v.CloseInfo)
1607 if skip {
1608 return
1609 }
1610 v.CloseInfo = ci
1611
1612 n.addVertexConjuncts(v, arc, false)
1613
1614 case Evaluator:
1615
1616
1617 val := ctx.evaluateRec(v, oldOnly(partial))
1618 if b, ok := val.(*Bottom); ok &&
1619 b.IsIncomplete() {
1620 n.exprs = append(n.exprs, envExpr{v, b})
1621 break
1622 }
1623
1624 if v, ok := val.(*Vertex); ok {
1625
1626
1627 b, ok := v.BaseValue.(*Bottom)
1628 if ok && b.IsIncomplete() && len(v.Conjuncts) > 0 {
1629 for _, c := range v.Conjuncts {
1630 c.CloseInfo = closeID
1631 n.addExprConjunct(c, state)
1632 }
1633 break
1634 }
1635 }
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649 n.addValueConjunct(v.Env, val, closeID)
1650
1651 default:
1652 panic(fmt.Sprintf("unknown expression of type %T", x))
1653 }
1654 }
1655
1656 func (n *nodeContext) addVertexConjuncts(c Conjunct, arc *Vertex, inline bool) {
1657 unreachableForDev(n.ctx)
1658
1659 closeInfo := c.CloseInfo
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680 ckey := closeInfo
1681 ckey.Refs = nil
1682 ckey.Inline = false
1683 key := arcKey{arc, ckey}
1684 for _, k := range n.arcMap {
1685 if key == k {
1686 return
1687 }
1688 }
1689 n.arcMap = append(n.arcMap, key)
1690
1691 status := arc.status
1692
1693 switch status {
1694 case evaluating:
1695
1696
1697
1698
1699
1700
1701
1702 if arc == n.node {
1703
1704
1705
1706 return
1707 }
1708
1709 case evaluatingArcs:
1710
1711
1712 }
1713
1714
1715
1716
1717
1718
1719
1720 x := c.Expr()
1721 if !inline || arc.IsClosedStruct() || arc.IsClosedList() {
1722 closeInfo = closeInfo.SpawnRef(arc, IsDef(x), x)
1723 }
1724
1725 if arc.status == 0 && !inline {
1726
1727
1728
1729
1730
1731
1732 n.ctx.unify(arc, oldOnly(partial))
1733 }
1734
1735
1736 if n.node == arc {
1737 return
1738 }
1739
1740 if arc.state != nil {
1741 arc.state.addNotify(n.node, nil)
1742 }
1743
1744 for _, c := range arc.Conjuncts {
1745
1746
1747
1748 c.CloseInfo = closeInfo
1749 n.addExprConjunct(c, partial)
1750 }
1751 }
1752
1753 func (n *nodeContext) addValueConjunct(env *Environment, v Value, id CloseInfo) {
1754 n.updateCyclicStatus(id)
1755
1756 ctx := n.ctx
1757
1758 if x, ok := v.(*Vertex); ok {
1759 if m, ok := x.BaseValue.(*StructMarker); ok {
1760 n.aStruct = x
1761 n.aStructID = id
1762 if m.NeedClose {
1763 id.IsClosed = true
1764 }
1765 }
1766
1767 if !x.IsData() {
1768
1769 if isComplexStruct(ctx, x) {
1770
1771 n.addVertexConjuncts(MakeConjunct(env, x, id), x, true)
1772 return
1773 }
1774
1775 for _, c := range x.Conjuncts {
1776 c.CloseInfo = id
1777 n.addExprConjunct(c, partial)
1778 }
1779 return
1780 }
1781
1782
1783 switch v := x.BaseValue.(type) {
1784 default:
1785 panic(fmt.Sprintf("invalid type %T", x.BaseValue))
1786
1787 case *ListMarker:
1788 n.vLists = append(n.vLists, x)
1789 return
1790
1791 case *StructMarker:
1792
1793 case Value:
1794 n.addValueConjunct(env, v, id)
1795 }
1796
1797 if len(x.Arcs) == 0 {
1798 return
1799 }
1800
1801 s := &StructLit{}
1802
1803
1804 n.node.AddStruct(s, env, id)
1805 n.node.Structs = append(n.node.Structs, x.Structs...)
1806
1807 for _, a := range x.Arcs {
1808 if !a.definitelyExists() {
1809 continue
1810 }
1811
1812 c := MakeConjunct(nil, a, id)
1813 n.insertField(a.Label, a.ArcType, c)
1814 s.MarkField(a.Label)
1815 }
1816 return
1817 }
1818
1819 switch b := v.(type) {
1820 case *Bottom:
1821 n.addBottom(b)
1822 return
1823 case *Builtin:
1824 if v := b.BareValidator(); v != nil {
1825 n.addValueConjunct(env, v, id)
1826 return
1827 }
1828 }
1829
1830 if !n.updateNodeType(v.Kind(), v, id) {
1831 return
1832 }
1833
1834 switch x := v.(type) {
1835 case *Disjunction:
1836 n.addDisjunctionValue(env, x, id)
1837
1838 case *Conjunction:
1839 for _, x := range x.Values {
1840 n.addValueConjunct(env, x, id)
1841 }
1842
1843 case *Top:
1844 n.hasTop = true
1845
1846 case *BasicType:
1847
1848
1849 case *BoundValue:
1850 switch x.Op {
1851 case LessThanOp, LessEqualOp:
1852 if y := n.upperBound; y != nil {
1853 n.upperBound = nil
1854 v := SimplifyBounds(ctx, n.kind, x, y)
1855 if err := valueError(v); err != nil {
1856 err.AddPosition(v)
1857 err.AddPosition(n.upperBound)
1858 err.AddClosedPositions(id)
1859 }
1860 n.addValueConjunct(env, v, id)
1861 return
1862 }
1863 n.upperBound = x
1864
1865 case GreaterThanOp, GreaterEqualOp:
1866 if y := n.lowerBound; y != nil {
1867 n.lowerBound = nil
1868 v := SimplifyBounds(ctx, n.kind, x, y)
1869 if err := valueError(v); err != nil {
1870 err.AddPosition(v)
1871 err.AddPosition(n.lowerBound)
1872 err.AddClosedPositions(id)
1873 }
1874 n.addValueConjunct(env, v, id)
1875 return
1876 }
1877 n.lowerBound = x
1878
1879 case EqualOp, NotEqualOp, MatchOp, NotMatchOp:
1880
1881 k := 0
1882 match := false
1883 for _, c := range n.checks {
1884 if y, ok := c.(*BoundValue); ok {
1885 switch z := SimplifyBounds(ctx, n.kind, x, y); {
1886 case z == y:
1887 match = true
1888 case z == x:
1889 continue
1890 }
1891 }
1892 n.checks[k] = c
1893 k++
1894 }
1895 n.checks = n.checks[:k]
1896 if !match {
1897 n.checks = append(n.checks, x)
1898 }
1899 return
1900 }
1901
1902 case Validator:
1903
1904 for i, y := range n.checks {
1905 if b := SimplifyValidator(ctx, x, y); b != nil {
1906 n.checks[i] = b
1907 return
1908 }
1909 }
1910 n.updateNodeType(x.Kind(), x, id)
1911 n.checks = append(n.checks, x)
1912
1913 case *Vertex:
1914
1915
1916 case Value:
1917 if y := n.scalar; y != nil {
1918 if b, ok := BinOp(ctx, EqualOp, x, y).(*Bool); !ok || !b.B {
1919 n.reportConflict(x, y, x.Kind(), y.Kind(), n.scalarID, id)
1920 }
1921
1922
1923
1924 break
1925 }
1926 n.scalar = x
1927 n.scalarID = id
1928 if n.node.status >= conjuncts {
1929 n.node.BaseValue = x
1930 }
1931
1932 default:
1933 panic(fmt.Sprintf("unknown value type %T", x))
1934 }
1935
1936 if n.lowerBound != nil && n.upperBound != nil {
1937 if u := SimplifyBounds(ctx, n.kind, n.lowerBound, n.upperBound); u != nil {
1938 if err := valueError(u); err != nil {
1939 err.AddPosition(n.lowerBound)
1940 err.AddPosition(n.upperBound)
1941 err.AddClosedPositions(id)
1942 }
1943 n.lowerBound = nil
1944 n.upperBound = nil
1945 n.addValueConjunct(env, u, id)
1946 }
1947 }
1948 }
1949
1950 func valueError(v Value) *ValueError {
1951 if v == nil {
1952 return nil
1953 }
1954 b, _ := v.(*Bottom)
1955 if b == nil {
1956 return nil
1957 }
1958 err, _ := b.Err.(*ValueError)
1959 if err == nil {
1960 return nil
1961 }
1962 return err
1963 }
1964
1965
1966
1967
1968
1969
1970
1971 func (n *nodeContext) addStruct(
1972 env *Environment,
1973 s *StructLit,
1974 closeInfo CloseInfo) {
1975
1976 n.updateCyclicStatus(closeInfo)
1977
1978
1979
1980
1981
1982
1983 childEnv := &Environment{
1984 Up: env,
1985 Vertex: n.node,
1986 }
1987
1988 s.Init()
1989
1990 if s.HasEmbed && !s.IsFile() {
1991 closeInfo = closeInfo.SpawnGroup(nil)
1992 }
1993
1994 parent := n.node.AddStruct(s, childEnv, closeInfo)
1995 closeInfo.IsClosed = false
1996
1997 parent.Disable = true
1998
1999 for _, d := range s.Decls {
2000 switch x := d.(type) {
2001 case *Field:
2002 if x.Label.IsString() && x.ArcType == ArcMember {
2003 n.aStruct = s
2004 n.aStructID = closeInfo
2005 }
2006 n.insertField(x.Label, x.ArcType, MakeConjunct(childEnv, x, closeInfo))
2007
2008 case *LetField:
2009 arc := n.insertField(x.Label, ArcMember, MakeConjunct(childEnv, x, closeInfo))
2010 if x.IsMulti {
2011 arc.MultiLet = x.IsMulti
2012 }
2013
2014 case *DynamicField:
2015 n.aStruct = s
2016 n.aStructID = closeInfo
2017 n.dynamicFields = append(n.dynamicFields, envDynamic{childEnv, x, closeInfo, nil})
2018
2019 case *Comprehension:
2020 n.insertComprehension(childEnv, x, closeInfo)
2021
2022 case Expr:
2023
2024
2025
2026
2027 id := closeInfo.SpawnEmbed(x)
2028
2029 c := MakeConjunct(childEnv, x, id)
2030 n.addExprConjunct(c, partial)
2031
2032 case *BulkOptionalField, *Ellipsis:
2033
2034
2035
2036
2037 default:
2038 panic("unreachable")
2039 }
2040 }
2041
2042 if !s.HasEmbed {
2043 n.aStruct = s
2044 n.aStructID = closeInfo
2045 }
2046
2047 parent.Disable = false
2048
2049 }
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062 func (n *nodeContext) insertField(f Feature, mode ArcType, x Conjunct) *Vertex {
2063 ctx := n.ctx
2064 if ctx.isDevVersion() {
2065 return n.insertArc(f, mode, x, x.CloseInfo, true)
2066 }
2067
2068 arc, isNew := n.node.GetArc(ctx, f, mode)
2069 if f.IsLet() && !isNew {
2070 arc.MultiLet = true
2071 return arc
2072 }
2073 if arc.hasConjunct(x) {
2074 return arc
2075 }
2076
2077 switch {
2078 case arc.state != nil:
2079 arc.state.addConjunctDynamic(x)
2080
2081 case arc.IsUnprocessed() || arc.status != finalized:
2082 arc.addConjunctUnchecked(x)
2083
2084 default:
2085 n.addBottom(&Bottom{
2086 Code: IncompleteError,
2087 Err: ctx.NewPosf(pos(x.Field()),
2088 "cannot add field %s: was already used",
2089 f.SelectorString(ctx)),
2090 })
2091 }
2092 return arc
2093 }
2094
2095 func (n *nodeContext) insertFieldUnchecked(f Feature, mode ArcType, x Conjunct) *Vertex {
2096 ctx := n.ctx
2097 if ctx.isDevVersion() {
2098 return n.insertArc(f, mode, x, x.CloseInfo, false)
2099 }
2100
2101 arc, isNew := n.node.GetArc(ctx, f, mode)
2102 if f.IsLet() && !isNew {
2103 arc.MultiLet = true
2104 return arc
2105 }
2106 arc.addConjunctUnchecked(x)
2107 return arc
2108 }
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123 func (n *nodeContext) expandOne(state vertexStatus) (done bool) {
2124 unreachableForDev(n.ctx)
2125
2126
2127 if n.done() || (n.hasCycle && !n.hasNonCycle) {
2128 return false
2129 }
2130
2131 var progress bool
2132
2133 if progress = n.injectDynamic(); progress {
2134 return true
2135 }
2136
2137 if progress = n.injectComprehensions(state); progress {
2138 return true
2139 }
2140
2141
2142
2143
2144
2145 exprs := n.exprs
2146 n.exprs = n.exprs[:0]
2147 for _, x := range exprs {
2148 n.addExprConjunct(x.c, state)
2149
2150
2151 }
2152 if len(n.exprs) < len(exprs) {
2153 return true
2154 }
2155
2156
2157
2158 return false
2159 }
2160
2161
2162 func (n *nodeContext) injectDynamic() (progress bool) {
2163 unreachableForDev(n.ctx)
2164
2165 ctx := n.ctx
2166 k := 0
2167
2168 a := n.dynamicFields
2169 for _, d := range n.dynamicFields {
2170 var f Feature
2171 x := d.field.Key
2172
2173 s := ctx.PushState(d.env, x.Source())
2174 v := ctx.evalState(x, oldOnly(finalized))
2175 b := ctx.PopState(s)
2176
2177 if b != nil && b.IsIncomplete() {
2178 d.err, _ = v.(*Bottom)
2179 a[k] = d
2180 k++
2181 continue
2182 }
2183 if b, _ := v.(*Bottom); b != nil {
2184 n.addValueConjunct(nil, b, d.id)
2185 continue
2186 }
2187 f = ctx.Label(d.field.Key, v)
2188 if f.IsInt() {
2189 n.addErr(ctx.NewPosf(pos(d.field.Key), "integer fields not supported"))
2190 }
2191 n.insertField(f, d.field.ArcType, MakeConjunct(d.env, d.field, d.id))
2192 }
2193
2194 progress = k < len(n.dynamicFields)
2195
2196 n.dynamicFields = a[:k]
2197
2198 return progress
2199 }
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215 func (n *nodeContext) addLists(state combinedFlags) (progress bool) {
2216 if len(n.lists) == 0 && len(n.vLists) == 0 {
2217 return false
2218 }
2219
2220 var oneOfTheLists Expr
2221 var anID CloseInfo
2222
2223 isOpen := true
2224 max := 0
2225 var maxNode Expr
2226
2227 if m, ok := n.node.BaseValue.(*ListMarker); ok {
2228 isOpen = m.IsOpen
2229 max = len(n.node.Arcs)
2230 }
2231
2232 c := n.ctx
2233
2234 for _, l := range n.vLists {
2235
2236
2237 oneOfTheLists = l
2238
2239 elems := l.Elems()
2240 isClosed := l.IsClosedList()
2241
2242 switch {
2243 case len(elems) < max:
2244 if isClosed {
2245 n.invalidListLength(len(elems), max, l, maxNode)
2246 continue
2247 }
2248
2249 case len(elems) > max:
2250 if !isOpen {
2251 n.invalidListLength(max, len(elems), maxNode, l)
2252 continue
2253 }
2254 isOpen = !isClosed
2255 max = len(elems)
2256 maxNode = l
2257
2258 case isClosed:
2259 isOpen = false
2260 maxNode = l
2261 }
2262
2263 for _, a := range elems {
2264 if a.Conjuncts == nil {
2265 n.insertField(a.Label, ArcMember, MakeRootConjunct(nil, a))
2266 continue
2267 }
2268 for _, c := range a.Conjuncts {
2269 n.insertField(a.Label, ArcMember, c)
2270 }
2271 }
2272 }
2273
2274 outer:
2275
2276 for i := 0; i < len(n.lists); i++ {
2277 l := n.lists[i]
2278
2279 n.updateCyclicStatus(l.id)
2280
2281 if l.self {
2282 n.node.LockArcs = true
2283 }
2284
2285 index := int64(0)
2286 hasComprehension := false
2287 for j, elem := range l.list.Elems {
2288 switch x := elem.(type) {
2289 case *Comprehension:
2290 err := c.yield(nil, l.env, x, state, func(e *Environment) {
2291 label, err := MakeLabel(x.Source(), index, IntLabel)
2292 n.addErr(err)
2293 index++
2294 c := MakeConjunct(e, x.Value, l.id)
2295 n.insertField(label, ArcMember, c)
2296 })
2297 hasComprehension = true
2298 if err != nil {
2299 if err.ForCycle && !l.self {
2300
2301
2302
2303 n.lists[i].ignore = true
2304 l.self = true
2305 n.lists = append(n.lists, l)
2306 } else {
2307 n.addBottom(err)
2308 }
2309 continue outer
2310 }
2311
2312 case *Ellipsis:
2313 if j != len(l.list.Elems)-1 {
2314 n.addErr(c.Newf("ellipsis must be last element in list"))
2315 }
2316
2317 n.lists[i].elipsis = x
2318
2319 default:
2320 label, err := MakeLabel(x.Source(), index, IntLabel)
2321 n.addErr(err)
2322 index++
2323 n.insertField(label, ArcMember, MakeConjunct(l.env, x, l.id))
2324 }
2325
2326
2327 if !isOpen && int(index) > max {
2328 n.invalidListLength(max, len(l.list.Elems), maxNode, l.list)
2329 continue outer
2330 }
2331 }
2332
2333 oneOfTheLists = l.list
2334 anID = l.id
2335
2336 switch closed := n.lists[i].elipsis == nil; {
2337 case int(index) < max:
2338 if closed {
2339 n.invalidListLength(int(index), max, l.list, maxNode)
2340 continue
2341 }
2342
2343 case int(index) > max,
2344 closed && isOpen,
2345 (!closed == isOpen) && !hasComprehension:
2346 max = int(index)
2347 maxNode = l.list
2348 isOpen = !closed
2349 }
2350
2351 n.lists[i].n = index
2352 }
2353
2354
2355 elems := n.node.Elems()
2356 for _, l := range n.vLists {
2357 if !l.IsClosedList() {
2358 continue
2359 }
2360
2361 newElems := l.Elems()
2362 if len(newElems) >= len(elems) {
2363 continue
2364 }
2365
2366 for _, arc := range elems[len(newElems):] {
2367 l.MatchAndInsert(c, arc)
2368 }
2369 }
2370
2371 for _, l := range n.lists {
2372 if l.elipsis == nil || l.ignore {
2373 continue
2374 }
2375
2376 s := l.list.info
2377 if s == nil {
2378 s = &StructLit{Decls: []Decl{l.elipsis}}
2379 s.Init()
2380 l.list.info = s
2381 }
2382 info := n.node.AddStruct(s, l.env, l.id)
2383
2384 for _, arc := range elems[l.n:] {
2385 info.MatchAndInsert(c, arc)
2386 }
2387 }
2388
2389 sources := []ast.Expr{}
2390
2391 for _, l := range n.lists {
2392 if l.elipsis == nil || l.ignore {
2393 continue
2394 }
2395 if src, _ := l.elipsis.Source().(ast.Expr); src != nil {
2396 sources = append(sources, src)
2397 }
2398 }
2399
2400 if m, ok := n.node.BaseValue.(*ListMarker); !ok {
2401 n.node.setValue(c, partial, &ListMarker{
2402 Src: ast.NewBinExpr(token.AND, sources...),
2403 IsOpen: isOpen,
2404 })
2405 } else {
2406 if expr, _ := m.Src.(ast.Expr); expr != nil {
2407 sources = append(sources, expr)
2408 }
2409 m.Src = ast.NewBinExpr(token.AND, sources...)
2410 m.IsOpen = m.IsOpen && isOpen
2411 }
2412
2413 n.lists = n.lists[:0]
2414 n.vLists = n.vLists[:0]
2415
2416 n.updateNodeType(ListKind, oneOfTheLists, anID)
2417
2418 return true
2419 }
2420
2421 func (n *nodeContext) invalidListLength(na, nb int, a, b Expr) {
2422 n.addErr(n.ctx.Newf("incompatible list lengths (%d and %d)", na, nb))
2423 }
2424
View as plain text