diff --git a/python/src/com/jetbrains/python/PyBundle.properties b/python/src/com/jetbrains/python/PyBundle.properties
index 0d6ee259270a..b86ab7822356 100644
--- a/python/src/com/jetbrains/python/PyBundle.properties
+++ b/python/src/com/jetbrains/python/PyBundle.properties
@@ -773,7 +773,6 @@ ANN.cant.assign.to.lambda=Can't assign to lambda
ANN.break.outside.loop='break' outside loop
ANN.continue.outside.loop='continue' outside loop
-ANN.cant.continue.in.finally='continue' not supported inside 'finally' clause
ANN.default.except.must.be.last=default 'except:' must be last
ANN.$0.both.global.and.param=Name ''{0}'' used both as a parameter and as a global
diff --git a/python/src/com/jetbrains/python/validation/BreakContinueAnnotator.java b/python/src/com/jetbrains/python/validation/BreakContinueAnnotator.java
index c1e3d5c64dbd..53db2fea7ff4 100644
--- a/python/src/com/jetbrains/python/validation/BreakContinueAnnotator.java
+++ b/python/src/com/jetbrains/python/validation/BreakContinueAnnotator.java
@@ -15,8 +15,8 @@
*/
package com.jetbrains.python.validation;
-import com.intellij.psi.util.PsiTreeUtil;
-import com.jetbrains.python.psi.*;
+import com.jetbrains.python.psi.PyBreakStatement;
+import com.jetbrains.python.psi.PyContinueStatement;
import static com.jetbrains.python.PyBundle.message;
@@ -36,9 +36,5 @@ public class BreakContinueAnnotator extends PyAnnotator {
if (node.getLoopStatement() == null) {
getHolder().createErrorAnnotation(node, message("ANN.continue.outside.loop"));
}
- else if (LanguageLevel.forElement(node).isOlderThan(LanguageLevel.PYTHON38) &&
- PsiTreeUtil.getParentOfType(node, PyFinallyPart.class, false, PyLoopStatement.class) != null) {
- getHolder().createErrorAnnotation(node, message("ANN.cant.continue.in.finally"));
- }
}
}
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java
index 0d5fe2c86511..ba98341701aa 100644
--- a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java
+++ b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java
@@ -709,4 +709,15 @@ public abstract class CompatibilityVisitor extends PyAnnotator {
registerForAllMatchingVersions(level -> level.isOlderThan(LanguageLevel.PYTHON38) && registerForLanguageLevel(level),
" not support assignment expressions", node);
}
+
+ @Override
+ public void visitPyContinueStatement(PyContinueStatement node) {
+ super.visitPyContinueStatement(node);
+
+ if (PsiTreeUtil.getParentOfType(node, PyFinallyPart.class, false, PyLoopStatement.class) != null) {
+ registerForAllMatchingVersions(level -> level.isOlderThan(LanguageLevel.PYTHON38) && registerForLanguageLevel(level),
+ " not support 'continue' inside 'finally' clause",
+ node);
+ }
+ }
}
diff --git a/python/testData/highlighting/continueInFinallyBlockBefore38.py b/python/testData/highlighting/continueInFinallyBlockBefore38.py
index 874c2f1867ac..2c7aac0e8e0d 100644
--- a/python/testData/highlighting/continueInFinallyBlockBefore38.py
+++ b/python/testData/highlighting/continueInFinallyBlockBefore38.py
@@ -2,4 +2,4 @@ while True:
try:
print("a")
finally:
- continue
\ No newline at end of file
+ continue
\ No newline at end of file
diff --git a/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java
index b96fd8367e01..29f6c97f736d 100644
--- a/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java
+++ b/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java
@@ -240,6 +240,18 @@ public class PyCompatibilityInspectionTest extends PyInspectionTestCase {
doTest(LanguageLevel.PYTHON38);
}
+ // PY-36003
+ public void testContinueInFinallyBlock() {
+ runWithLanguageLevel(
+ LanguageLevel.PYTHON38,
+ () -> doTestByText("while True:\n" +
+ " try:\n" +
+ " print(\"a\")\n" +
+ " finally:\n" +
+ " continue")
+ );
+ }
+
private void doTest(@NotNull LanguageLevel level) {
runWithLanguageLevel(level, this::doTest);
}