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
This commit is contained in:
Ekaterina Tuzova
2011-04-07 18:16:49 +04:00
parent 725ada9e21
commit fe3315c927
4 changed files with 63 additions and 12 deletions
@@ -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<PyExpression, PyNamedParameter> mapping = result.getPlainMappedParams();
Set<PyExpression> problemElements = new HashSet<PyExpression>();
for (Map.Entry<PyExpression, PyNamedParameter> 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;
}
}
}
}
@@ -1,4 +1,5 @@
def foo(a, b = 345, c = 1):
pass
foo(1, <warning descr="Argument equals to default parameter value">345<caret></warning>, 22)
#PY-3261
foo(1, <warning descr="Argument equals to default parameter value">345<caret></warning>, c=22)
@@ -1,4 +1,5 @@
def foo(a, b = 345, c = 1):
pass
foo(1, 22)
#PY-3261
foo(1, c=22)
@@ -4,4 +4,37 @@ def foo(a, b = 345, c = 1):
foo(1, <warning descr="Argument equals to default parameter value">345</warning>, 22)
a = dict()
a.get(1, <warning descr="Argument equals to default parameter value">None</warning>)
a.get(1, <warning descr="Argument equals to default parameter value">None</warning>)
def foo(a = None):
pass
foo(<warning descr="Argument equals to default parameter value">a = None</warning>)
def bar(a = 2, b = 3):
pass
#PY-3260
bar(<warning descr="Argument equals to default parameter value">a = 2</warning>, <warning descr="Argument equals to default parameter value">b = 3</warning>)
class A:
@classmethod
def foo(cls, a = 1):
pass
a = A()
a.foo(<warning descr="Argument equals to default parameter value">1</warning>)
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, <warning descr="Argument equals to default parameter value">None</warning>, fdel = delx, doc = "I'm the 'x' property.")