Add new method isKeywordOnly() in PyNamedParameter interface

This commit is contained in:
Mikhail Golubev
2015-05-27 17:27:01 +03:00
parent 6b654df67e
commit 7b260d52fb
3 changed files with 29 additions and 1 deletions
@@ -30,6 +30,14 @@ public interface PyNamedParameter extends PyParameter, PsiNamedElement, PsiNameI
boolean isKeywordContainer();
/**
* Parameter is considered "keyword-only" if it appears after named or unnamed positional vararg parameter.
* See PEP-3102 for more details.
*
* @return whether this parameter is keyword-only
*/
boolean isKeywordOnly();
/**
* @param includeDefaultValue if true, include the default value after an " = ".
* @return Canonical representation of parameter. Includes asterisks for *param and **param, and name.
@@ -295,7 +295,7 @@ public class AddCallSuperQuickFix implements LocalQuickFix {
else if (param.getText().startsWith("*")) {
positionalContainer = param;
}
else if (positionalContainer == null && singleStarParam == null) {
else if (param.getAsNamed() == null || !param.getAsNamed().isKeywordOnly()) {
if (param.hasDefaultValue()) {
myOptionalParams.add(param);
}
@@ -124,6 +124,26 @@ public class PyNamedParameterImpl extends PyBaseElementImpl<PyNamedParameterStub
}
}
@Override
public boolean isKeywordOnly() {
final PyParameterList parameters = getStubOrPsiParentOfType(PyParameterList.class);
if (parameters == null) {
return false;
}
boolean varargSeen = false;
for (PyParameter param : parameters.getParameters()) {
if (param == this) {
break;
}
final PyNamedParameter named = param.getAsNamed();
if ((named != null && named.isPositionalContainer()) || param instanceof PySingleStarParameter) {
varargSeen = true;
break;
}
}
return varargSeen;
}
@Nullable
public PyExpression getDefaultValue() {
final PyNamedParameterStub stub = getStub();