1-- in.cue --
2// Allow lookup in partially evaluated struct as long as the end result is
3// concrete.
4A: {
5 a: {
6 parent: ""
7 children: [for k, v in A if v.parent == k {k}]
8 }
9 b: {
10 parent: "a"
11 children: [for k, v in A if v.parent == k {k}]
12 }
13}
14
15// This should result in an incomplete error (a reference cycle error classifies
16// as incomplete).
17B: {
18 a: {
19 parent: ""
20 children: [for k, v in B for _, w in v.children {k}]
21 }
22}
23
24// Issue #486
25Issue486: {
26 A: {
27 a: {
28 parent: ""
29 children: [...string]
30 }
31 b: {
32 parent: "a"
33 children: [...string]
34 }
35 c: {
36 parent: "b"
37 children: [...string]
38 }
39 }
40
41 A: [Name=string]: {
42 children: [
43 for k, v in A
44 if v.parent == Name {
45 k
46 },
47 ]
48 }
49}
50
51// Issue #1666
52issue1666: {
53 #E: {
54 f1: [string]: #E | [...#E]
55 f2: [string]: t: #E
56 }
57
58 _e: #E
59 _e: f2: a: _
60
61 e: _e & {
62 f1: {
63 for fk, s in _e.f2 {
64 (fk): s.t
65 }
66 }
67 }
68}
69
70// Issue #779: bidirectional projection
71// Should be allowed as long as the set of fields is not modified as a result
72// of a comprehension.
73issue779: {
74 X: Y.message
75 STATE: {
76 for k, v in Y {
77 if k != "message" {
78 "\(k)": v
79 }
80 }
81 }
82 Y: STATE & { message: X }
83 X: "test"
84 STATE: { code: 101 }
85}
86
87// Comprehension ends up inserting in the same arcs over which it
88// is iterating. This is fine as long as the set is not altered.
89// Issue #1934
90selfReferential: T1: {
91 S: d: "bar"
92
93 T: e: S: a: "foo"
94
95 for s, v in S for t, _ in T {
96 T: (t): S: (s): v
97 }
98}
99
100// selfReferential comprehenion for list.
101// Issue #1934
102selfReferential: list: {
103 panels: [
104 for i, _ in panels {
105 id: i
106 }
107 ]
108 panels: [{}, {}, {}]
109}
110
111selfReferential: insertionError: {
112 A: {
113 foo: 1
114 for x in A {
115 // May not insert foo3. Use dynamic references to force the
116 // comprehension to be evaluated in the struct in which it is
117 // defined.
118 ("foo3"): 1
119 }
120 }
121}
122
123// A comprehension should not recursively evaluated arcs, so that a
124// structural cycle can be avoided when unnecessary.
125selfReferential: acrossOr: t1: p1: {
126 o: #Output & { retry: reject: "ok" }
127
128 #AllOutputs: {
129 reject: string
130 resource: string
131 retry: #Output
132 }
133
134 #Output: or([for name, config in #AllOutputs {
135 (name): config
136 }])
137}
138
139selfReferential: acrossOr: t1: p2: {
140 #Output: or([for name, config in #AllOutputs {
141 (name): config
142 }])
143
144 o: #Output & { retry: reject: "ok" }
145
146 #AllOutputs: {
147 reject: string
148 resource: string
149 retry: #Output
150 }
151}
152
153selfReferential: acrossOr: t1: p3: {
154 #Output: or([for name, config in #AllOutputs {
155 (name): config
156 }])
157
158 #AllOutputs: {
159 reject: string
160 resource: string
161 retry: #Output
162 }
163
164 o: #Output & { retry: reject: "ok" }
165}
166
167selfReferential: acrossOr: t2: p1: {
168 d: or([for x, y in #A { y }])
169 o: d & { b: 2 }
170 #A: {
171 d1: int
172 d2: string
173 d3: b: d
174 }
175}
176
177selfReferential: acrossOr: t2: p2: {
178 o: d & { b: 2 }
179 d: or([for x, y in #A { y }])
180 #A: {
181 d1: int
182 d2: string
183 d3: b: d
184 }
185}
186
187selfReferential: acrossOr: t2: p3: {
188 o: d & { b: 2 }
189 #A: {
190 d1: int
191 d2: string
192 d3: b: d
193 }
194 d: or([for x, y in #A { y }])
195}
196
197issue1881: p1: {
198 o: #Output & { retry: output: reject: "ok" }
199
200 #AllOutputs: {
201 reject: string
202 resource: string
203 retry: output: #Output
204 }
205
206 #Output: or([for name, config in #AllOutputs {
207 (name): config
208 }])
209}
210
211issue1881: p2: {
212 #AllOutputs: {
213 reject: string
214 resource: string
215 retry: output: #Output
216 }
217
218 o: #Output & { retry: output: reject: "ok" }
219
220 #Output: or([for name, config in #AllOutputs {
221 (name): config
222 }])
223}
224
225issue1881: p3: {
226 #AllOutputs: {
227 reject: string
228 resource: string
229 retry: output: #Output
230 }
231
232 #Output: or([for name, config in #AllOutputs {
233 (name): config
234 }])
235
236 o: #Output & { retry: output: reject: "ok" }
237}
238
239siblingInsertion: t1: p1: {
240 D: "logging": _
241 deployment: _
242
243 for k, v in deployment
244 for k1, v2 in v.env2 {
245 deployment: (k): env: (k1): v2
246 }
247
248 for id, v in D {
249 deployment: (id): env2: ENV: "True"
250 }
251}
252
253siblingInsertion: t1: p2: {
254 D: "logging": _
255 deployment: _
256
257 for id, v in D {
258 deployment: (id): env2: ENV: "True"
259 }
260
261 for k, v in deployment
262 for k1, v2 in v.env2 {
263 deployment: (k): env: (k1): v2
264 }
265}
266
267siblingInsertion: t2: p1: {
268 D: "logging": _
269 deployment: _
270
271 for k, v in deployment {
272 for k1, v2 in v.env2 {
273 deployment: (k): env: (k1): v2
274 }
275 }
276
277 for id, v in D {
278 deployment: (id): env2: ENV: "True"
279 }
280}
281
282siblingInsertion: t2: p2: {
283 D: "logging": _
284 deployment: _
285
286 for k, v in deployment {
287 for k1, v2 in v.env2 {
288 deployment: (k): env: (k1): v2
289 }
290 }
291
292 for id, v in D {
293 deployment: (id): env2: ENV: "True"
294 }
295}
296
297// Issue #1407
298// Ensure there is a useful error message.
299selfReferential: fail: {
300 a: {}
301 b: a.x != ""
302 if b {
303 }
304}
305
306// avoid infinite recursion
307issue2367: {
308 a: _
309 for x in [a] {a: x}
310}
311
312-- out/eval/stats --
313Leaks: 50
314Freed: 1270
315Reused: 1260
316Allocs: 60
317Retain: 145
318
319Unifications: 832
320Conjuncts: 2525
321Disjuncts: 1404
322-- out/eval --
323Errors:
324selfReferential.insertionError.A: field foo3 not allowed by earlier comprehension or reference cycle
325
326Result:
327(_|_){
328 // [eval]
329 A: (struct){
330 a: (struct){
331 parent: (string){ "" }
332 children: (#list){
333 }
334 }
335 b: (struct){
336 parent: (string){ "a" }
337 children: (#list){
338 }
339 }
340 }
341 B: (struct){
342 a: (struct){
343 parent: (string){ "" }
344 children: (#list){
345 }
346 }
347 }
348 Issue486: (struct){
349 A: (struct){
350 a: (struct){
351 parent: (string){ "" }
352 children: (#list){
353 0: (string){ "b" }
354 }
355 }
356 b: (struct){
357 parent: (string){ "a" }
358 children: (#list){
359 0: (string){ "c" }
360 }
361 }
362 c: (struct){
363 parent: (string){ "b" }
364 children: (#list){
365 }
366 }
367 }
368 }
369 issue1666: (struct){
370 #E: (#struct){
371 f1: (#struct){
372 }
373 f2: (#struct){
374 }
375 }
376 _e: (#struct){
377 f1: (#struct){
378 }
379 f2: (#struct){
380 a: (#struct){
381 t: (#struct){
382 f1: (#struct){
383 }
384 f2: (#struct){
385 }
386 }
387 }
388 }
389 }
390 e: (#struct){
391 f1: (#struct){
392 a: (#struct){
393 f1: (#struct){
394 }
395 f2: (#struct){
396 }
397 }
398 }
399 f2: (#struct){
400 a: (#struct){
401 t: (#struct){
402 f1: (#struct){
403 }
404 f2: (#struct){
405 }
406 }
407 }
408 }
409 }
410 }
411 issue779: (struct){
412 X: (string){ "test" }
413 STATE: (struct){
414 code: (int){ 101 }
415 }
416 Y: (struct){
417 message: (string){ "test" }
418 code: (int){ 101 }
419 }
420 }
421 selfReferential: (_|_){
422 // [eval]
423 T1: (struct){
424 S: (struct){
425 d: (string){ "bar" }
426 }
427 T: (struct){
428 e: (struct){
429 S: (struct){
430 a: (string){ "foo" }
431 d: (string){ "bar" }
432 }
433 }
434 }
435 }
436 list: (struct){
437 panels: (#list){
438 0: (struct){
439 id: (int){ 0 }
440 }
441 1: (struct){
442 id: (int){ 1 }
443 }
444 2: (struct){
445 id: (int){ 2 }
446 }
447 }
448 }
449 insertionError: (_|_){
450 // [eval]
451 A: (_|_){
452 // [eval] selfReferential.insertionError.A: field foo3 not allowed by earlier comprehension or reference cycle
453 foo: (int){ 1 }
454 foo3: (int){ 1 }
455 }
456 }
457 acrossOr: (struct){
458 t1: (struct){
459 p1: (struct){
460 o: (#struct){
461 retry: (#struct){
462 reject: (string){ "ok" }
463 }
464 }
465 #AllOutputs: (#struct){
466 reject: (string){ string }
467 resource: (string){ string }
468 retry: (#struct){ |((#struct){
469 reject: (string){ string }
470 }, (#struct){
471 resource: (string){ string }
472 }) }
473 }
474 #Output: (#struct){ |((#struct){
475 reject: (string){ string }
476 }, (#struct){
477 resource: (string){ string }
478 }) }
479 }
480 p2: (struct){
481 #Output: (#struct){ |((#struct){
482 reject: (string){ string }
483 }, (#struct){
484 resource: (string){ string }
485 }) }
486 o: (#struct){
487 retry: (#struct){
488 reject: (string){ "ok" }
489 }
490 }
491 #AllOutputs: (#struct){
492 reject: (string){ string }
493 resource: (string){ string }
494 retry: (#struct){ |((#struct){
495 reject: (string){ string }
496 }, (#struct){
497 resource: (string){ string }
498 }) }
499 }
500 }
501 p3: (struct){
502 #Output: (#struct){ |((#struct){
503 reject: (string){ string }
504 }, (#struct){
505 resource: (string){ string }
506 }) }
507 #AllOutputs: (#struct){
508 reject: (string){ string }
509 resource: (string){ string }
510 retry: (#struct){ |((#struct){
511 reject: (string){ string }
512 }, (#struct){
513 resource: (string){ string }
514 }) }
515 }
516 o: (#struct){
517 retry: (#struct){
518 reject: (string){ "ok" }
519 }
520 }
521 }
522 }
523 t2: (struct){
524 p1: (struct){
525 d: ((int|string)){ |((int){ int }, (string){ string }) }
526 o: (struct){
527 b: (int){ 2 }
528 }
529 #A: (#struct){
530 d1: (int){ int }
531 d2: (string){ string }
532 d3: (#struct){
533 b: ((int|string)){ |((int){ int }, (string){ string }) }
534 }
535 }
536 }
537 p2: (struct){
538 o: (struct){
539 b: (int){ 2 }
540 }
541 d: ((int|string)){ |((int){ int }, (string){ string }) }
542 #A: (#struct){
543 d1: (int){ int }
544 d2: (string){ string }
545 d3: (#struct){
546 b: ((int|string)){ |((int){ int }, (string){ string }) }
547 }
548 }
549 }
550 p3: (struct){
551 o: (struct){
552 b: (int){ 2 }
553 }
554 #A: (#struct){
555 d1: (int){ int }
556 d2: (string){ string }
557 d3: (#struct){
558 b: ((int|string)){ |((int){ int }, (string){ string }) }
559 }
560 }
561 d: ((int|string)){ |((int){ int }, (string){ string }) }
562 }
563 }
564 }
565 fail: (_|_){
566 // [incomplete] selfReferential.fail.b: undefined field: x:
567 // ./in.cue:300:7
568 a: (struct){
569 }
570 b: (_|_){
571 // [incomplete] selfReferential.fail.b: undefined field: x:
572 // ./in.cue:300:7
573 }
574 }
575 }
576 issue1881: (struct){
577 p1: (struct){
578 o: (#struct){
579 retry: (#struct){
580 output: (#struct){
581 reject: (string){ "ok" }
582 }
583 }
584 }
585 #AllOutputs: (#struct){
586 reject: (string){ string }
587 resource: (string){ string }
588 retry: (#struct){
589 output: (#struct){ |((#struct){
590 reject: (string){ string }
591 }, (#struct){
592 resource: (string){ string }
593 }) }
594 }
595 }
596 #Output: (#struct){ |((#struct){
597 reject: (string){ string }
598 }, (#struct){
599 resource: (string){ string }
600 }) }
601 }
602 p2: (struct){
603 #AllOutputs: (#struct){
604 reject: (string){ string }
605 resource: (string){ string }
606 retry: (#struct){
607 output: (#struct){ |((#struct){
608 reject: (string){ string }
609 }, (#struct){
610 resource: (string){ string }
611 }) }
612 }
613 }
614 o: (#struct){
615 retry: (#struct){
616 output: (#struct){
617 reject: (string){ "ok" }
618 }
619 }
620 }
621 #Output: (#struct){ |((#struct){
622 reject: (string){ string }
623 }, (#struct){
624 resource: (string){ string }
625 }) }
626 }
627 p3: (struct){
628 #AllOutputs: (#struct){
629 reject: (string){ string }
630 resource: (string){ string }
631 retry: (#struct){
632 output: (#struct){ |((#struct){
633 reject: (string){ string }
634 }, (#struct){
635 resource: (string){ string }
636 }) }
637 }
638 }
639 #Output: (#struct){ |((#struct){
640 reject: (string){ string }
641 }, (#struct){
642 resource: (string){ string }
643 }) }
644 o: (#struct){
645 retry: (#struct){
646 output: (#struct){
647 reject: (string){ "ok" }
648 }
649 }
650 }
651 }
652 }
653 siblingInsertion: (struct){
654 t1: (struct){
655 p1: (struct){
656 D: (struct){
657 logging: (_){ _ }
658 }
659 deployment: (struct){
660 logging: (struct){
661 env2: (struct){
662 ENV: (string){ "True" }
663 }
664 env: (struct){
665 ENV: (string){ "True" }
666 }
667 }
668 }
669 }
670 p2: (struct){
671 D: (struct){
672 logging: (_){ _ }
673 }
674 deployment: (struct){
675 logging: (struct){
676 env2: (struct){
677 ENV: (string){ "True" }
678 }
679 env: (struct){
680 ENV: (string){ "True" }
681 }
682 }
683 }
684 }
685 }
686 t2: (struct){
687 p1: (struct){
688 D: (struct){
689 logging: (_){ _ }
690 }
691 deployment: (struct){
692 logging: (struct){
693 env2: (struct){
694 ENV: (string){ "True" }
695 }
696 env: (struct){
697 ENV: (string){ "True" }
698 }
699 }
700 }
701 }
702 p2: (struct){
703 D: (struct){
704 logging: (_){ _ }
705 }
706 deployment: (struct){
707 logging: (struct){
708 env2: (struct){
709 ENV: (string){ "True" }
710 }
711 env: (struct){
712 ENV: (string){ "True" }
713 }
714 }
715 }
716 }
717 }
718 }
719 issue2367: (struct){
720 a: (_){ _ }
721 }
722}
723-- out/compile --
724--- in.cue
725{
726 A: {
727 a: {
728 parent: ""
729 children: [
730 for k, v in 〈3;A〉 if (〈0;v〉.parent == 〈0;k〉) {
731 〈1;k〉
732 },
733 ]
734 }
735 b: {
736 parent: "a"
737 children: [
738 for k, v in 〈3;A〉 if (〈0;v〉.parent == 〈0;k〉) {
739 〈1;k〉
740 },
741 ]
742 }
743 }
744 B: {
745 a: {
746 parent: ""
747 children: [
748 for k, v in 〈3;B〉 for _, w in 〈0;v〉.children {
749 〈2;k〉
750 },
751 ]
752 }
753 }
754 Issue486: {
755 A: {
756 a: {
757 parent: ""
758 children: [
759 ...string,
760 ]
761 }
762 b: {
763 parent: "a"
764 children: [
765 ...string,
766 ]
767 }
768 c: {
769 parent: "b"
770 children: [
771 ...string,
772 ]
773 }
774 }
775 A: {
776 [string]: {
777 children: [
778 for k, v in 〈3;A〉 if (〈0;v〉.parent == 〈3;-〉) {
779 〈1;k〉
780 },
781 ]
782 }
783 }
784 }
785 issue1666: {
786 #E: {
787 f1: {
788 [string]: (〈2;#E〉|[
789 ...〈3;#E〉,
790 ])
791 }
792 f2: {
793 [string]: {
794 t: 〈3;#E〉
795 }
796 }
797 }
798 _e: 〈0;#E〉
799 _e: {
800 f2: {
801 a: _
802 }
803 }
804 e: (〈0;_e〉 & {
805 f1: {
806 for fk, s in 〈2;_e〉.f2 {
807 〈1;fk〉: 〈1;s〉.t
808 }
809 }
810 })
811 }
812 issue779: {
813 X: 〈0;Y〉.message
814 STATE: {
815 for k, v in 〈1;Y〉 {
816 if (〈1;k〉 != "message") {
817 "\(〈2;k〉)": 〈2;v〉
818 }
819 }
820 }
821 Y: (〈0;STATE〉 & {
822 message: 〈1;X〉
823 })
824 X: "test"
825 STATE: {
826 code: 101
827 }
828 }
829 selfReferential: {
830 T1: {
831 S: {
832 d: "bar"
833 }
834 T: {
835 e: {
836 S: {
837 a: "foo"
838 }
839 }
840 }
841 for s, v in 〈0;S〉 for t, _ in 〈1;T〉 {
842 T: {
843 〈2;t〉: {
844 S: {
845 〈5;s〉: 〈5;v〉
846 }
847 }
848 }
849 }
850 }
851 }
852 selfReferential: {
853 list: {
854 panels: [
855 for i, _ in 〈1;panels〉 {
856 id: 〈1;i〉
857 },
858 ]
859 panels: [
860 {},
861 {},
862 {},
863 ]
864 }
865 }
866 selfReferential: {
867 insertionError: {
868 A: {
869 foo: 1
870 for _, x in 〈1;A〉 {
871 "foo3": 1
872 }
873 }
874 }
875 }
876 selfReferential: {
877 acrossOr: {
878 t1: {
879 p1: {
880 o: (〈0;#Output〉 & {
881 retry: {
882 reject: "ok"
883 }
884 })
885 #AllOutputs: {
886 reject: string
887 resource: string
888 retry: 〈1;#Output〉
889 }
890 #Output: or([
891 for name, config in 〈1;#AllOutputs〉 {
892 〈1;name〉: 〈1;config〉
893 },
894 ])
895 }
896 }
897 }
898 }
899 selfReferential: {
900 acrossOr: {
901 t1: {
902 p2: {
903 #Output: or([
904 for name, config in 〈1;#AllOutputs〉 {
905 〈1;name〉: 〈1;config〉
906 },
907 ])
908 o: (〈0;#Output〉 & {
909 retry: {
910 reject: "ok"
911 }
912 })
913 #AllOutputs: {
914 reject: string
915 resource: string
916 retry: 〈1;#Output〉
917 }
918 }
919 }
920 }
921 }
922 selfReferential: {
923 acrossOr: {
924 t1: {
925 p3: {
926 #Output: or([
927 for name, config in 〈1;#AllOutputs〉 {
928 〈1;name〉: 〈1;config〉
929 },
930 ])
931 #AllOutputs: {
932 reject: string
933 resource: string
934 retry: 〈1;#Output〉
935 }
936 o: (〈0;#Output〉 & {
937 retry: {
938 reject: "ok"
939 }
940 })
941 }
942 }
943 }
944 }
945 selfReferential: {
946 acrossOr: {
947 t2: {
948 p1: {
949 d: or([
950 for x, y in 〈1;#A〉 {
951 〈1;y〉
952 },
953 ])
954 o: (〈0;d〉 & {
955 b: 2
956 })
957 #A: {
958 d1: int
959 d2: string
960 d3: {
961 b: 〈2;d〉
962 }
963 }
964 }
965 }
966 }
967 }
968 selfReferential: {
969 acrossOr: {
970 t2: {
971 p2: {
972 o: (〈0;d〉 & {
973 b: 2
974 })
975 d: or([
976 for x, y in 〈1;#A〉 {
977 〈1;y〉
978 },
979 ])
980 #A: {
981 d1: int
982 d2: string
983 d3: {
984 b: 〈2;d〉
985 }
986 }
987 }
988 }
989 }
990 }
991 selfReferential: {
992 acrossOr: {
993 t2: {
994 p3: {
995 o: (〈0;d〉 & {
996 b: 2
997 })
998 #A: {
999 d1: int
1000 d2: string
1001 d3: {
1002 b: 〈2;d〉
1003 }
1004 }
1005 d: or([
1006 for x, y in 〈1;#A〉 {
1007 〈1;y〉
1008 },
1009 ])
1010 }
1011 }
1012 }
1013 }
1014 issue1881: {
1015 p1: {
1016 o: (〈0;#Output〉 & {
1017 retry: {
1018 output: {
1019 reject: "ok"
1020 }
1021 }
1022 })
1023 #AllOutputs: {
1024 reject: string
1025 resource: string
1026 retry: {
1027 output: 〈2;#Output〉
1028 }
1029 }
1030 #Output: or([
1031 for name, config in 〈1;#AllOutputs〉 {
1032 〈1;name〉: 〈1;config〉
1033 },
1034 ])
1035 }
1036 }
1037 issue1881: {
1038 p2: {
1039 #AllOutputs: {
1040 reject: string
1041 resource: string
1042 retry: {
1043 output: 〈2;#Output〉
1044 }
1045 }
1046 o: (〈0;#Output〉 & {
1047 retry: {
1048 output: {
1049 reject: "ok"
1050 }
1051 }
1052 })
1053 #Output: or([
1054 for name, config in 〈1;#AllOutputs〉 {
1055 〈1;name〉: 〈1;config〉
1056 },
1057 ])
1058 }
1059 }
1060 issue1881: {
1061 p3: {
1062 #AllOutputs: {
1063 reject: string
1064 resource: string
1065 retry: {
1066 output: 〈2;#Output〉
1067 }
1068 }
1069 #Output: or([
1070 for name, config in 〈1;#AllOutputs〉 {
1071 〈1;name〉: 〈1;config〉
1072 },
1073 ])
1074 o: (〈0;#Output〉 & {
1075 retry: {
1076 output: {
1077 reject: "ok"
1078 }
1079 }
1080 })
1081 }
1082 }
1083 siblingInsertion: {
1084 t1: {
1085 p1: {
1086 D: {
1087 logging: _
1088 }
1089 deployment: _
1090 for k, v in 〈0;deployment〉 for k1, v2 in 〈0;v〉.env2 {
1091 deployment: {
1092 〈3;k〉: {
1093 env: {
1094 〈4;k1〉: 〈4;v2〉
1095 }
1096 }
1097 }
1098 }
1099 for id, v in 〈0;D〉 {
1100 deployment: {
1101 〈2;id〉: {
1102 env2: {
1103 ENV: "True"
1104 }
1105 }
1106 }
1107 }
1108 }
1109 }
1110 }
1111 siblingInsertion: {
1112 t1: {
1113 p2: {
1114 D: {
1115 logging: _
1116 }
1117 deployment: _
1118 for id, v in 〈0;D〉 {
1119 deployment: {
1120 〈2;id〉: {
1121 env2: {
1122 ENV: "True"
1123 }
1124 }
1125 }
1126 }
1127 for k, v in 〈0;deployment〉 for k1, v2 in 〈0;v〉.env2 {
1128 deployment: {
1129 〈3;k〉: {
1130 env: {
1131 〈4;k1〉: 〈4;v2〉
1132 }
1133 }
1134 }
1135 }
1136 }
1137 }
1138 }
1139 siblingInsertion: {
1140 t2: {
1141 p1: {
1142 D: {
1143 logging: _
1144 }
1145 deployment: _
1146 for k, v in 〈0;deployment〉 {
1147 for k1, v2 in 〈1;v〉.env2 {
1148 deployment: {
1149 〈4;k〉: {
1150 env: {
1151 〈4;k1〉: 〈4;v2〉
1152 }
1153 }
1154 }
1155 }
1156 }
1157 for id, v in 〈0;D〉 {
1158 deployment: {
1159 〈2;id〉: {
1160 env2: {
1161 ENV: "True"
1162 }
1163 }
1164 }
1165 }
1166 }
1167 }
1168 }
1169 siblingInsertion: {
1170 t2: {
1171 p2: {
1172 D: {
1173 logging: _
1174 }
1175 deployment: _
1176 for k, v in 〈0;deployment〉 {
1177 for k1, v2 in 〈1;v〉.env2 {
1178 deployment: {
1179 〈4;k〉: {
1180 env: {
1181 〈4;k1〉: 〈4;v2〉
1182 }
1183 }
1184 }
1185 }
1186 }
1187 for id, v in 〈0;D〉 {
1188 deployment: {
1189 〈2;id〉: {
1190 env2: {
1191 ENV: "True"
1192 }
1193 }
1194 }
1195 }
1196 }
1197 }
1198 }
1199 selfReferential: {
1200 fail: {
1201 a: {}
1202 b: (〈0;a〉.x != "")
1203 if 〈0;b〉 {}
1204 }
1205 }
1206 issue2367: {
1207 a: _
1208 for _, x in [
1209 〈1;a〉,
1210 ] {
1211 a: 〈1;x〉
1212 }
1213 }
1214}
View as plain text