mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
@@ -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.")
|
||||
|
||||
Reference in New Issue
Block a user