diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyElementVisitor.java b/python/psi-api/src/com/jetbrains/python/psi/PyElementVisitor.java index 18444383b3f8..0dd970faf51e 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/PyElementVisitor.java +++ b/python/psi-api/src/com/jetbrains/python/psi/PyElementVisitor.java @@ -257,4 +257,8 @@ public class PyElementVisitor extends PsiElementVisitor { public void visitPyKeywordArgument(PyKeywordArgument node) { visitPyElement(node); } + + public void visitPyWithItem(PyWithItem node) { + visitPyElement(node); + } } diff --git a/python/src/com/jetbrains/python/psi/impl/PyWithItemImpl.java b/python/src/com/jetbrains/python/psi/impl/PyWithItemImpl.java index 6347eae5f95f..2db3c0ad9755 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyWithItemImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyWithItemImpl.java @@ -3,6 +3,7 @@ package com.jetbrains.python.psi.impl; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.jetbrains.python.PyTokenTypes; +import com.jetbrains.python.psi.PyElementVisitor; import com.jetbrains.python.psi.PyExpression; import com.jetbrains.python.psi.PyWithItem; @@ -14,6 +15,11 @@ public class PyWithItemImpl extends PyElementImpl implements PyWithItem { super(astNode); } + @Override + protected void acceptPyVisitor(PyElementVisitor pyVisitor) { + pyVisitor.visitPyWithItem(this); + } + @Override public PyExpression getExpression() { ASTNode[] children = getNode().getChildren(null); diff --git a/python/src/com/jetbrains/python/validation/AssignTargetAnnotator.java b/python/src/com/jetbrains/python/validation/AssignTargetAnnotator.java index e3c7203ba1e2..b47220fed5e5 100644 --- a/python/src/com/jetbrains/python/validation/AssignTargetAnnotator.java +++ b/python/src/com/jetbrains/python/validation/AssignTargetAnnotator.java @@ -12,7 +12,7 @@ import static com.jetbrains.python.PyBundle.message; */ public class AssignTargetAnnotator extends PyAnnotator { private enum Operation { - Assign, AugAssign, Delete, Except, For + Assign, AugAssign, Delete, Except, For, With } @Override @@ -51,6 +51,14 @@ public class AssignTargetAnnotator extends PyAnnotator { } } + @Override + public void visitPyWithItem(PyWithItem node) { + PyExpression target = node.getTarget(); + if (target != null) { + target.accept(new ExprVisitor(Operation.With)); + } + } + private class ExprVisitor extends PyElementVisitor { private final Operation myOp; private final String DELETING_NONE = message("ANN.deleting.none"); diff --git a/python/testData/highlighting/assignmentTargetWith.py b/python/testData/highlighting/assignmentTargetWith.py new file mode 100644 index 000000000000..f516b41c6b1a --- /dev/null +++ b/python/testData/highlighting/assignmentTargetWith.py @@ -0,0 +1,2 @@ +with open("") as my_<: + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java b/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java index de14792f8a33..2797bf34e2ac 100644 --- a/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java +++ b/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java @@ -65,6 +65,11 @@ public class PythonHighlightingTest extends PyTestCase { doTest(true, false); } + public void testAssignmentTargetWith() { // PY-7529 + setLanguageLevel(LanguageLevel.PYTHON27); + doTest(true, false); + } + public void testAssignmentTargets3K() { doTest(LanguageLevel.PYTHON30, true, false); }