From f9de6651982f5dc21c6a9b94a967cfa6b4508551 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Mon, 14 May 2012 17:48:15 +0400 Subject: [PATCH] =?UTF-8?q?fixed=20PY-3245=20Should=20complain=20about=20n?= =?UTF-8?q?amed=20param=20after=20*args=20on=20Python=20=E2=89=A42.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../python/validation/CompatibilityVisitor.java | 11 +++++++++++ .../PyCompatibilityInspection/callExpression.py | 9 ++++++++- .../inspections/PyArgumentListInspectionTest.java | 8 +++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java index 8e4041e46e75..00aa38f6af19 100644 --- a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java +++ b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java @@ -430,6 +430,17 @@ public abstract class CompatibilityVisitor extends PyAnnotator { super.visitPyCallExpression(node); int len = 0; StringBuilder message = new StringBuilder(myCommonMessage); + + if (myVersionsToProcess.contains(LanguageLevel.PYTHON24) || myVersionsToProcess.contains(LanguageLevel.PYTHON25)) { + boolean hasStar = false; + for (PyExpression argument : node.getArguments()) { + if (hasStar && argument instanceof PyKeywordArgument) { + registerProblem(argument, "Python version < 2.6 doesn't support this syntax. Named parameter cannot appear past *arg or **kwarg."); + } + if (argument instanceof PyStarArgument) hasStar = true; + } + } + for (int i = 0; i != myVersionsToProcess.size(); ++i) { LanguageLevel languageLevel = myVersionsToProcess.get(i); if (!languageLevel.isPy3K()) { diff --git a/python/testData/inspections/PyCompatibilityInspection/callExpression.py b/python/testData/inspections/PyCompatibilityInspection/callExpression.py index 123087b4b582..c7ada52f8196 100644 --- a/python/testData/inspections/PyCompatibilityInspection/callExpression.py +++ b/python/testData/inspections/PyCompatibilityInspection/callExpression.py @@ -6,4 +6,11 @@ class A(B): reduce() all() -buffer() \ No newline at end of file +buffer() + +def foo(a,b,c): + print (a,b,c) + +args=['b'] +foo('a', c='c', *args) # OK +foo('a', *args, c='c') # Not OK \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java index d500dd0d024c..4050f3139e6f 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java @@ -49,7 +49,13 @@ public class PyArgumentListInspectionTest extends PyTestCase { } public void testPy1268() { - doTest(); + PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), LanguageLevel.PYTHON30); + try { + doTest(); + } + finally { + PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), null); + } } public void testInstanceMethodAsLambda() {