Don't use function annotations in overridden functions in Python 2

Python stubs use Python 3 syntax so it could be the case that a Python 2
class inherits a Python 3 class.
This commit is contained in:
Andrey Vlasovskikh
2017-02-02 01:29:37 +03:00
parent f57968ca51
commit b0b03f3a45
2 changed files with 28 additions and 4 deletions
@@ -204,14 +204,38 @@ public class PyOverrideImplementUtil {
pyFunctionBuilder.decorate(PyNames.PROPERTY);
}
}
final LanguageLevel level = LanguageLevel.forElement(pyClass);
PyAnnotation anno = baseFunction.getAnnotation();
if (anno != null) {
if (anno != null && level.isAtLeast(LanguageLevel.PYTHON30)) {
pyFunctionBuilder.annotation(anno.getText());
}
final TypeEvalContext context = TypeEvalContext.userInitiated(baseFunction.getProject(), baseFunction.getContainingFile());
final List<PyParameter> baseParams = PyUtil.getParameters(baseFunction, context);
for (PyParameter parameter : baseParams) {
pyFunctionBuilder.parameter(parameter.getText());
final PyNamedParameter namedParameter = parameter.getAsNamed();
if (namedParameter != null) {
final StringBuilder parameterBuilder = new StringBuilder();
if (namedParameter.isPositionalContainer()) {
parameterBuilder.append("*");
}
else if (namedParameter.isKeywordContainer()) {
parameterBuilder.append("**");
}
parameterBuilder.append(namedParameter.getName());
final PyAnnotation annotation = namedParameter.getAnnotation();
if (annotation != null && level.isAtLeast(LanguageLevel.PYTHON30)) {
parameterBuilder.append(annotation.getText());
}
final PyExpression defaultValue = namedParameter.getDefaultValue();
if (defaultValue != null) {
parameterBuilder.append("=");
parameterBuilder.append(defaultValue.getText());
}
pyFunctionBuilder.parameter(parameterBuilder.toString());
}
else {
pyFunctionBuilder.parameter(parameter.getText());
}
}
PyClass baseClass = baseFunction.getContainingClass();
@@ -1,3 +1,3 @@
class MyType(type):
def __instancecheck__(cls, instance):
<selection>return super(MyType, cls).__instancecheck__(instance)</selection>
def __instancecheck__(self, instance):
<selection>return super(MyType, self).__instancecheck__(instance)</selection>