From fe3315c927dbd6595ff1f2d25d69cd995ffe3726 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Thu, 7 Apr 2011 18:16:49 +0400 Subject: [PATCH] fixed PY-3261 Argument equals to default parameter value: qf changes code logic , PY-3260 Argument equals to default parameter value: not available for keyword argument in function call added tests --- .../PyArgumentEqualDefaultInspection.java | 34 +++++++++++++----- .../inspections/ArgumentEqualDefault.py | 3 +- .../inspections/ArgumentEqualDefault_after.py | 3 +- .../PyArgumentEqualDefaultInspection/test.py | 35 ++++++++++++++++++- 4 files changed, 63 insertions(+), 12 deletions(-) diff --git a/python/src/com/jetbrains/python/inspections/PyArgumentEqualDefaultInspection.java b/python/src/com/jetbrains/python/inspections/PyArgumentEqualDefaultInspection.java index d7911af03448..bc3d7826af17 100644 --- a/python/src/com/jetbrains/python/inspections/PyArgumentEqualDefaultInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyArgumentEqualDefaultInspection.java @@ -4,14 +4,13 @@ import com.intellij.codeInspection.ProblemsHolder; import com.intellij.psi.PsiElementVisitor; import com.jetbrains.python.PyBundle; import com.jetbrains.python.actions.RemoveArgumentEqualDefaultQuickFix; -import com.jetbrains.python.psi.PyArgumentList; -import com.jetbrains.python.psi.PyCallExpression; -import com.jetbrains.python.psi.PyExpression; -import com.jetbrains.python.psi.PyNamedParameter; +import com.jetbrains.python.psi.*; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; +import java.util.HashSet; import java.util.Map; +import java.util.Set; /** * User: catherine @@ -46,20 +45,37 @@ public class PyArgumentEqualDefaultInspection extends PyInspection { PyArgumentList list = node.getArgumentList(); if (list == null) return; PyArgumentList.AnalysisResult result = list.analyzeCall(myTypeEvalContext); - checkArguments(result); + checkArguments(result, node.getArguments()); } - private void checkArguments(PyArgumentList.AnalysisResult result) { + private void checkArguments(PyArgumentList.AnalysisResult result, PyExpression[] arguments) { Map mapping = result.getPlainMappedParams(); + Set problemElements = new HashSet(); for (Map.Entry e : mapping.entrySet()) { PyExpression defaultValue = e.getValue().getDefaultValue(); if (defaultValue != null) { - if (e.getKey().getText().equals(defaultValue.getText())) { - registerProblem(e.getKey(), "Argument equals to default parameter value", - new RemoveArgumentEqualDefaultQuickFix()); + PyExpression key = e.getKey(); + String text = e.getKey().getText(); + if (key instanceof PyKeywordArgument && ((PyKeywordArgument)key).getValueExpression() != null) { + text = ((PyKeywordArgument)key).getValueExpression().getText(); + } + if (text.equals(defaultValue.getText())) { + problemElements.add(e.getKey()); } } } + boolean canDelete = true; + for (int i = arguments.length-1; i != -1; --i) { + if (problemElements.contains(arguments[i])) { + if (canDelete) + registerProblem(arguments[i], "Argument equals to default parameter value", + new RemoveArgumentEqualDefaultQuickFix()); + else + registerProblem(arguments[i], "Argument equals to default parameter value"); + + } + if (!(arguments[i] instanceof PyKeywordArgument)) canDelete = false; + } } } } diff --git a/python/testData/inspections/ArgumentEqualDefault.py b/python/testData/inspections/ArgumentEqualDefault.py index 964d0bcb7ffd..275e16df0bd2 100644 --- a/python/testData/inspections/ArgumentEqualDefault.py +++ b/python/testData/inspections/ArgumentEqualDefault.py @@ -1,4 +1,5 @@ def foo(a, b = 345, c = 1): pass -foo(1, 345, 22) \ No newline at end of file +#PY-3261 +foo(1, 345, c=22) \ No newline at end of file diff --git a/python/testData/inspections/ArgumentEqualDefault_after.py b/python/testData/inspections/ArgumentEqualDefault_after.py index 00e31ef94b4c..9ceee8cd11e5 100644 --- a/python/testData/inspections/ArgumentEqualDefault_after.py +++ b/python/testData/inspections/ArgumentEqualDefault_after.py @@ -1,4 +1,5 @@ def foo(a, b = 345, c = 1): pass -foo(1, 22) \ No newline at end of file +#PY-3261 +foo(1, c=22) \ No newline at end of file diff --git a/python/testData/inspections/PyArgumentEqualDefaultInspection/test.py b/python/testData/inspections/PyArgumentEqualDefaultInspection/test.py index f802999c9021..be7fd9fa43e0 100644 --- a/python/testData/inspections/PyArgumentEqualDefaultInspection/test.py +++ b/python/testData/inspections/PyArgumentEqualDefaultInspection/test.py @@ -4,4 +4,37 @@ def foo(a, b = 345, c = 1): foo(1, 345, 22) a = dict() -a.get(1, None) \ No newline at end of file +a.get(1, None) + +def foo(a = None): + pass +foo(a = None) + +def bar(a = 2, b = 3): + pass + +#PY-3260 +bar(a = 2, b = 3) + +class A: + @classmethod + def foo(cls, a = 1): + pass + +a = A() + +a.foo(1) + + +class C(object): + def __init__(self): + self._x = None + + def getx(self): + return self._x + def setx(self, value): + self._x = value + def delx(self): + del self._x + + x = property(getx, None, fdel = delx, doc = "I'm the 'x' property.")