Don't count type assertion CFG vertices in DFA (PY-4609)

Also renamed WRITETYPE vertices to ASSERTTYPE for clarity.
This commit is contained in:
Andrey Vlasovskikh
2011-11-14 16:55:44 +04:00
parent a6b4168a55
commit 68d5c3a1f1
12 changed files with 29 additions and 21 deletions
@@ -20,24 +20,32 @@ public class ReadWriteInstruction extends InstructionImpl {
};
public enum ACCESS {
READ(true, false),
WRITE(false, true),
WRITETYPE(false, true),
READWRITE(true, true);
READ(true, false, false),
WRITE(false, true, false),
ASSERTTYPE(false, false, true),
READWRITE(true, true, false);
private final boolean isWrite;
private final boolean isRead;
private final boolean isAssertType;
ACCESS(boolean read, boolean write) {
ACCESS(boolean read, boolean write, boolean assertType) {
isRead = read;
isWrite = write;
isAssertType = assertType;
}
public boolean isWriteAccess(){
public boolean isWriteAccess() {
return isWrite;
}
public boolean isReadAccess(){
public boolean isReadAccess() {
return isRead;
}
public boolean isAssertTypeAccess() {
return isAssertType;
}
}
private final String myName;
@@ -93,7 +101,7 @@ public class ReadWriteInstruction extends InstructionImpl {
final PsiElement element,
final String name,
final Function<TypeEvalContext, PyType> getType) {
return new ReadWriteInstruction(builder, element, name, ACCESS.WRITETYPE, getType);
return new ReadWriteInstruction(builder, element, name, ACCESS.ASSERTTYPE, getType);
}
@Nullable
@@ -50,7 +50,7 @@ public class PyDefUseUtil {
final PsiElement element = instruction.getElement();
final String name = elementName(element);
final ReadWriteInstruction.ACCESS access = instruction.getAccess();
if (access.isWriteAccess() && Comparing.strEqual(name, var.getName())) {
if ((access.isWriteAccess() || access.isAssertTypeAccess()) && Comparing.strEqual(name, var.getName())) {
result.add(instruction);
return;
}
@@ -5,6 +5,6 @@
4(5) READ ACCESS: isinstance
5(6) READ ACCESS: x
6(7) READ ACCESS: int
7(8) WRITETYPE ACCESS: s
8(9) WRITETYPE ACCESS: x
7(8) ASSERTTYPE ACCESS: s
8(9) ASSERTTYPE ACCESS: x
9() element: null
@@ -4,7 +4,7 @@
3(4) element: PyIfStatement
4(5,10) READ ACCESS: sibling
5(6) element: PyStatementList. Condition: sibling:true
6(7) WRITETYPE ACCESS: sibling
6(7) ASSERTTYPE ACCESS: sibling
7(8) element: PyAssignmentStatement
8(9) element: PySubscriptionExpression
9(10) READ ACCESS: sibling
@@ -5,7 +5,7 @@
4(5) element: PyIfStatement
5(6,9) READ ACCESS: condition
6(7) element: PyStatementList. Condition: condition:true
7(8) WRITETYPE ACCESS: condition
7(8) ASSERTTYPE ACCESS: condition
8(10) element: PyBreakStatement
9(1) element: PyPrintStatement
10() element: null
@@ -5,7 +5,7 @@
4(5) element: PyIfStatement
5(6,9) READ ACCESS: condition
6(7) element: PyStatementList. Condition: condition:true
7(8) WRITETYPE ACCESS: condition
7(8) ASSERTTYPE ACCESS: condition
8(1) element: PyContinueStatement
9(1) element: PyPrintStatement
10() element: null
@@ -2,7 +2,7 @@
1(2) element: PyIfStatement
2(3,13) READ ACCESS: markup
3(4) element: PyStatementList. Condition: markup:true
4(5) WRITETYPE ACCESS: markup
4(5) ASSERTTYPE ACCESS: markup
5(6) element: PyTryExceptStatement
6(7,9) element: PyTryPart
7(8,9) element: PyReturnStatement
@@ -6,7 +6,7 @@
5(6) READ ACCESS: s
6(7,12) READ ACCESS: basestring
7(8) element: PyStatementList. Condition: (isinstance(s, basestring)):true
8(9) WRITETYPE ACCESS: s
8(9) ASSERTTYPE ACCESS: s
9(10) element: PyAssignmentStatement
10(11) READ ACCESS: s
11(16) WRITE ACCESS: s2
@@ -17,7 +17,7 @@
16(17) element: PyIfStatement
17(18,25) READ ACCESS: bbb
18(19) element: PyStatementList. Condition: bbb:true
19(20) WRITETYPE ACCESS: bbb
19(20) ASSERTTYPE ACCESS: bbb
20(21) element: PyAssignmentStatement
21(25) WRITE ACCESS: var
22(23) element: PyElsePart. Condition: aa == bb:false
@@ -5,7 +5,7 @@
4(5) element: PyIfStatement
5(6,9) READ ACCESS: condition
6(7) element: PyStatementList. Condition: condition:true
7(8) WRITETYPE ACCESS: condition
7(8) ASSERTTYPE ACCESS: condition
8(10) element: PyReturnStatement
9(1) element: PyPrintStatement
10() element: null
@@ -4,7 +4,7 @@
3(4) element: PyIfStatement
4(5,10) READ ACCESS: sibling
5(6) element: PyStatementList. Condition: sibling:true
6(7) WRITETYPE ACCESS: sibling
6(7) ASSERTTYPE ACCESS: sibling
7(8) element: PyAssignmentStatement
8(9) element: PySubscriptionExpression
9(10) READ ACCESS: sibling
@@ -12,7 +12,7 @@
11(12) READ ACCESS: status
12(13,27) READ ACCESS: None
13(14) element: PyStatementList. Condition: status is not None:true
14(15) WRITETYPE ACCESS: status
14(15) ASSERTTYPE ACCESS: status
15(16) element: PyPrintStatement
16(27) READ ACCESS: status
17(18) element: PyFinallyPart
@@ -20,7 +20,7 @@
19(20) READ ACCESS: status
20(21,25) READ ACCESS: None
21(22) element: PyStatementList. Condition: status is not None:true
22(23) WRITETYPE ACCESS: status
22(23) ASSERTTYPE ACCESS: status
23(24) element: PyPrintStatement
24(25) READ ACCESS: status
25(26) element: PyExpressionStatement