Reuse if-statements approach for while-statements to understand when and where condition is succeeded/failed (PY-39262)

It allows to assume that under `and` condition all sub-conditions are satisfied.

GitOrigin-RevId: f58ed2706d7eb9c1595415cce57cb8020011b57a
This commit is contained in:
Semyon Proshev
2021-03-21 23:44:52 +03:00
committed by intellij-monorepo-bot
parent 882c5348b3
commit ea9c2c9415
13 changed files with 190 additions and 67 deletions

View File

@@ -0,0 +1,5 @@
while undefined1 and (r := undefined2()):
print(r)
while undefined3 or (r2 := undefined4()):
print(r2)

View File

@@ -0,0 +1,26 @@
0(1) element: null
1(2) element: PyWhileStatement
2(3) element: PyBinaryExpression
3(4,5) READ ACCESS: undefined1
4(13) element: null. Condition: undefined1:false
5(6) element: null. Condition: undefined1:true
6(7) READ ACCESS: undefined2
7(8,9) WRITE ACCESS: r
8(13) element: null. Condition: (r := undefined2()):false
9(10) element: null. Condition: (r := undefined2()):true
10(11) element: PyStatementList. Condition: undefined1 and (r := undefined2()):true
11(12) element: PyPrintStatement
12(1) READ ACCESS: r
13(14) element: PyWhileStatement
14(15) element: PyBinaryExpression
15(16,17) READ ACCESS: undefined3
16(22) element: null. Condition: undefined3:true
17(18) element: null. Condition: undefined3:false
18(19) READ ACCESS: undefined4
19(20,21) WRITE ACCESS: r2
20(25) element: null. Condition: (r2 := undefined4()):false
21(22) element: null. Condition: (r2 := undefined4()):true
22(23) element: PyStatementList. Condition: undefined3 or (r2 := undefined4()):true
23(24) element: PyPrintStatement
24(13) READ ACCESS: r2
25() element: null

View File

@@ -0,0 +1,9 @@
while undefined1 and (r := undefined2()):
print(r)
else:
print("ok")
while undefined3 or (r2 := undefined4()):
print(r2)
else:
print("ok")

View File

@@ -0,0 +1,30 @@
0(1) element: null
1(2) element: PyWhileStatement
2(3) element: PyBinaryExpression
3(4,5) READ ACCESS: undefined1
4(13) element: null. Condition: undefined1:false
5(6) element: null. Condition: undefined1:true
6(7) READ ACCESS: undefined2
7(8,9) WRITE ACCESS: r
8(13) element: null. Condition: (r := undefined2()):false
9(10) element: null. Condition: (r := undefined2()):true
10(11) element: PyStatementList. Condition: undefined1 and (r := undefined2()):true
11(12) element: PyPrintStatement
12(1) READ ACCESS: r
13(14) element: PyElsePart. Condition: undefined1 and (r := undefined2()):false
14(15) element: PyPrintStatement
15(16) element: PyWhileStatement
16(17) element: PyBinaryExpression
17(18,19) READ ACCESS: undefined3
18(24) element: null. Condition: undefined3:true
19(20) element: null. Condition: undefined3:false
20(21) READ ACCESS: undefined4
21(22,23) WRITE ACCESS: r2
22(27) element: null. Condition: (r2 := undefined4()):false
23(24) element: null. Condition: (r2 := undefined4()):true
24(25) element: PyStatementList. Condition: undefined3 or (r2 := undefined4()):true
25(26) element: PyPrintStatement
26(15) READ ACCESS: r2
27(28) element: PyElsePart. Condition: undefined3 or (r2 := undefined4()):false
28(29) element: PyPrintStatement
29() element: null

View File

@@ -16,4 +16,9 @@ while c3:
break
n = 1
else:
o = 1
o = 1
while c4:
m = 1
if m:
break

View File

@@ -4,30 +4,43 @@
3(4) element: PyStatementList. Condition: c1:true
4(5) element: PyAssignmentStatement
5(1) WRITE ACCESS: x
6(7) element: PyAssignmentStatement
7(8) WRITE ACCESS: y
8(9) element: PyWhileStatement
9(10,16) READ ACCESS: c2
10(11) element: PyStatementList. Condition: c2:true
11(12) element: PyAssignmentStatement
12(13) WRITE ACCESS: a
13(18) element: PyBreakStatement
14(15) element: PyAssignmentStatement
15(8) WRITE ACCESS: b
16(17) element: PyAssignmentStatement
17(18) WRITE ACCESS: c
18(19) element: PyWhileStatement
19(20,30) READ ACCESS: c3
20(21) element: PyStatementList. Condition: c3:true
21(22) element: PyAssignmentStatement
22(23) WRITE ACCESS: m
23(24) element: PyIfStatement
24(25,28) READ ACCESS: m
25(26) element: PyStatementList. Condition: m:true
26(27) ASSERTTYPE ACCESS: m
27(32) element: PyBreakStatement
28(29) element: PyAssignmentStatement
29(18) WRITE ACCESS: n
6(7) element: PyElsePart. Condition: c1:false
7(8) element: PyAssignmentStatement
8(9) WRITE ACCESS: y
9(10) element: PyWhileStatement
10(11,17) READ ACCESS: c2
11(12) element: PyStatementList. Condition: c2:true
12(13) element: PyAssignmentStatement
13(14) WRITE ACCESS: a
14(20) element: PyBreakStatement
15(16) element: PyAssignmentStatement
16(9) WRITE ACCESS: b
17(18) element: PyElsePart. Condition: c2:false
18(19) element: PyAssignmentStatement
19(20) WRITE ACCESS: c
20(21) element: PyWhileStatement
21(22,32) READ ACCESS: c3
22(23) element: PyStatementList. Condition: c3:true
23(24) element: PyAssignmentStatement
24(25) WRITE ACCESS: m
25(26) element: PyIfStatement
26(27,30) READ ACCESS: m
27(28) element: PyStatementList. Condition: m:true
28(29) ASSERTTYPE ACCESS: m
29(35) element: PyBreakStatement
30(31) element: PyAssignmentStatement
31(32) WRITE ACCESS: o
32() element: null
31(20) WRITE ACCESS: n
32(33) element: PyElsePart. Condition: c3:false
33(34) element: PyAssignmentStatement
34(35) WRITE ACCESS: o
35(36) element: PyWhileStatement
36(37,45) READ ACCESS: c4
37(38) element: PyStatementList. Condition: c4:true
38(39) element: PyAssignmentStatement
39(40) WRITE ACCESS: m
40(41) element: PyIfStatement
41(42,35) READ ACCESS: m
42(43) element: PyStatementList. Condition: m:true
43(44) ASSERTTYPE ACCESS: m
44(45) element: PyBreakStatement
45() element: null

View File

@@ -2,5 +2,6 @@
1(2) element: PyWhileStatement
2(3) READ ACCESS: True
3(1) element: PyStatementList. Condition: True:true
4(5) element: PyPrintStatement
5() element: null
4(5) element: PyElsePart. Condition: True:false
5(6) element: PyPrintStatement
6() element: null