From 34ae8b9265a0746d4c757a54253453a75d2c1ef0 Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Thu, 15 Aug 2019 19:00:38 +0300 Subject: [PATCH] Move highlighting `continue` under `finally` to compatibility inspection (PY-36003) GitOrigin-RevId: d644848d69b91c4ee05f1342f804e58ea137aac2 --- python/src/com/jetbrains/python/PyBundle.properties | 1 - .../python/validation/BreakContinueAnnotator.java | 8 ++------ .../python/validation/CompatibilityVisitor.java | 11 +++++++++++ .../highlighting/continueInFinallyBlockBefore38.py | 2 +- .../inspections/PyCompatibilityInspectionTest.java | 12 ++++++++++++ 5 files changed, 26 insertions(+), 8 deletions(-) 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); }