PY-22094 Include assert statements in CFG to resolve names in f-strings inside

Otherwise it's impossible to flow-sensitively resolve names referenced
inside such f-strings since we use the containing statement as the anchor
node in the graph.
This commit is contained in:
Mikhail Golubev
2017-03-28 15:55:45 +02:00
parent 8954f34691
commit 1d3eda1e2d
6 changed files with 35 additions and 20 deletions

View File

@@ -765,6 +765,7 @@ public class PyControlFlowBuilder extends PyRecursiveElementVisitor {
}
public void visitPyAssertStatement(final PyAssertStatement node) {
myBuilder.startNode(node);
super.visitPyAssertStatement(node);
final PyExpression[] args = node.getArguments();
// assert False

View File

@@ -1,10 +1,11 @@
0(1) element: null
1(2) READ ACCESS: isinstance
2(3) READ ACCESS: s
3(4) READ ACCESS: basestring
4(5) READ ACCESS: isinstance
5(6) READ ACCESS: x
6(7) READ ACCESS: int
7(8) ASSERTTYPE ACCESS: s
8(9) ASSERTTYPE ACCESS: x
9() element: null
1(2) element: PyAssertStatement
2(3) READ ACCESS: isinstance
3(4) READ ACCESS: s
4(5) READ ACCESS: basestring
5(6) READ ACCESS: isinstance
6(7) READ ACCESS: x
7(8) READ ACCESS: int
8(9) ASSERTTYPE ACCESS: s
9(10) ASSERTTYPE ACCESS: x
10() element: null

View File

@@ -1,6 +1,8 @@
0(1) element: null
1(5) READ ACCESS: false
2(3) element: PyPrintStatement
3(5) READ ACCESS: False
4(5) element: PyPrintStatement
5() element: null
1(2) element: PyAssertStatement
2(7) READ ACCESS: false
3(4) element: PyPrintStatement
4(5) element: PyAssertStatement
5(7) READ ACCESS: False
6(7) element: PyPrintStatement
7() element: null

View File

@@ -1,7 +1,9 @@
0(1) element: null
1(6) READ ACCESS: False
2(3) element: PyPrintStatement
3(4) READ ACCESS: False
4(6) READ ACCESS: f
5(6) element: PyPrintStatement
6() element: null
1(2) element: PyAssertStatement
2(8) READ ACCESS: False
3(4) element: PyPrintStatement
4(5) element: PyAssertStatement
5(6) READ ACCESS: False
6(8) READ ACCESS: f
7(8) element: PyPrintStatement
8() element: null

View File

@@ -0,0 +1,4 @@
def test(name: str) -> int:
assert name is not None, f'{name} is None'
# <ref>
return len(name)

View File

@@ -118,4 +118,9 @@ public class PyInjectionResolveTest extends PyResolveTestCase {
public void testFunctionTypeCommentReturnTypeReference() {
assertResolvesTo(PyClass.class, "MyClass");
}
// PY-22094
public void testFStringInsideAssertStatement() {
runWithLanguageLevel(LanguageLevel.PYTHON36, () -> assertResolvesTo(PyParameter.class, "name"));
}
}