From 4b833b0af683fd4a1bfbc175df79bfab1338a178 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Mon, 14 Sep 2015 15:32:21 +0300 Subject: [PATCH] Compatibility inspection for dict unpacking in dict literals --- .../validation/CompatibilityVisitor.java | 22 +++++++++++-------- .../doubleStarUnpacking.py | 2 ++ .../starExpression.py | 2 +- .../PyCompatibilityInspectionTest.java | 4 ++++ 4 files changed, 20 insertions(+), 10 deletions(-) create mode 100644 python/testData/inspections/PyCompatibilityInspection/doubleStarUnpacking.py diff --git a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java index 4a54685dc4fa..d5555f5125e8 100644 --- a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java +++ b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java @@ -172,28 +172,32 @@ public abstract class CompatibilityVisitor extends PyAnnotator { super.visitPyStarExpression(node); if (node.isAssignmentTarget()) { - boolean problem = false; for (LanguageLevel level : myVersionsToProcess) { if (level.isOlderThan(LanguageLevel.PYTHON30)) { - problem = true; + registerProblem(node, "Python versions < 3.0 do not support starred expressions as assignment targets"); break; } } - if (problem) { - registerProblem(node, "Python versions < 3.0 do not support starred expressions as assignment targets"); - } } if (node.isUnpacking()) { - boolean problem = false; for (LanguageLevel level : myVersionsToProcess) { if (level.isOlderThan(LanguageLevel.PYTHON35)) { - problem = true; + registerProblem(node, "Python versions < 3.5 do not support starred expressions in tuples, lists, and sets"); break; } } - if (problem) { - registerProblem(node, "Python version < 3.5 do not support starred expressions in tuples, lists, and sets"); + } + } + + @Override + public void visitPyDoubleStarExpression(PyDoubleStarExpression node) { + super.visitPyDoubleStarExpression(node); + + for (LanguageLevel level : myVersionsToProcess) { + if (level.isOlderThan(LanguageLevel.PYTHON35)) { + registerProblem(node, "Python versions < 3.5 do not support starred expressions in dicts"); + break; } } } diff --git a/python/testData/inspections/PyCompatibilityInspection/doubleStarUnpacking.py b/python/testData/inspections/PyCompatibilityInspection/doubleStarUnpacking.py new file mode 100644 index 000000000000..854a89e53db4 --- /dev/null +++ b/python/testData/inspections/PyCompatibilityInspection/doubleStarUnpacking.py @@ -0,0 +1,2 @@ +xs = {1: 2} +ys = {**xs, 3: 4} diff --git a/python/testData/inspections/PyCompatibilityInspection/starExpression.py b/python/testData/inspections/PyCompatibilityInspection/starExpression.py index 1858b6269208..7e89b2a176e8 100644 --- a/python/testData/inspections/PyCompatibilityInspection/starExpression.py +++ b/python/testData/inspections/PyCompatibilityInspection/starExpression.py @@ -1,2 +1,2 @@ -t = (1, *(2, 3)) +t = (1, *(2, 3)) a, *b, c = t diff --git a/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java index f1617e8be29c..a331c6de0a2e 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyCompatibilityInspectionTest.java @@ -159,6 +159,10 @@ public class PyCompatibilityInspectionTest extends PyTestCase { doTest(LanguageLevel.PYTHON35); } + public void testDoubleStarUnpacking() { + doTest(LanguageLevel.PYTHON35); + } + private void doTest(@NotNull LanguageLevel level) { runWithLanguageLevel(level, new Runnable() { @Override