diff --git a/python/src/com/jetbrains/python/validation/AssignTargetAnnotator.java b/python/src/com/jetbrains/python/validation/AssignTargetAnnotator.java index 7b80b5cdea16..b55fea30c1f2 100644 --- a/python/src/com/jetbrains/python/validation/AssignTargetAnnotator.java +++ b/python/src/com/jetbrains/python/validation/AssignTargetAnnotator.java @@ -16,7 +16,10 @@ package com.jetbrains.python.validation; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.python.PyNames; +import com.jetbrains.python.codeInsight.controlflow.ScopeOwner; +import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil; import com.jetbrains.python.psi.*; import com.jetbrains.python.sdk.PythonSdkType; import org.jetbrains.annotations.NotNull; @@ -104,6 +107,14 @@ public class AssignTargetAnnotator extends PyAnnotator { errorOnUnparenthesizedAssignmentExpression(node.getValue(), "as annotations for arguments, return values and assignments"); } + @Override + public void visitPyAssignmentExpression(PyAssignmentExpression node) { + final PyComprehensionElement comprehensionElement = PsiTreeUtil.getParentOfType(node, PyComprehensionElement.class, true, ScopeOwner.class); + if (ScopeUtil.getScopeOwner(comprehensionElement) instanceof PyClass) { + getHolder().createErrorAnnotation(node, "Assignment expressions within a comprehension cannot be used in a class body"); + } + } + private void errorOnUnparenthesizedAssignmentExpression(@Nullable PyExpression expression, @NotNull String suffix) { if (expression instanceof PyAssignmentExpression) { getHolder().createErrorAnnotation(expression, "Unparenthesized assignment expressions are prohibited " + suffix); diff --git a/python/testData/highlighting/invalidAssignmentExpressions.py b/python/testData/highlighting/invalidAssignmentExpressions.py index 403617f85532..1be4714b88d8 100644 --- a/python/testData/highlighting/invalidAssignmentExpressions.py +++ b/python/testData/highlighting/invalidAssignmentExpressions.py @@ -20,4 +20,7 @@ def foo(answer: (p := 42) = 5): # Valid, but probably never useful (lambda: x := 1) # INVALID lambda: (x := 1) # Valid, but unlikely to be useful (x := lambda: 1) # Valid -lambda line: (m := re.match(pattern, line)) and m.group(1) # Valid \ No newline at end of file +lambda line: (m := re.match(pattern, line)) and m.group(1) # Valid + +class A: + [y := i for i in range(2)] \ No newline at end of file