Added PyCallableType.getReturnType() for forthcoming return types caching

This commit is contained in:
Andrey Vlasovskikh
2014-03-03 12:34:02 +04:00
parent f65c54659a
commit 1f721bbb79
6 changed files with 43 additions and 7 deletions
@@ -104,13 +104,19 @@ public class PyJavaClassType implements PyClassLikeType {
@Nullable
@Override
public PyType getCallType(@NotNull TypeEvalContext context, @Nullable PyQualifiedExpression callSite) {
public PyType getReturnType(@NotNull TypeEvalContext context) {
if (myDefinition) {
return new PyJavaClassType(myClass, false);
}
return null;
}
@Nullable
@Override
public PyType getCallType(@NotNull TypeEvalContext context, @Nullable PyQualifiedExpression callSite) {
return getReturnType(context);
}
@Nullable
@Override
public List<PyCallableParameter> getParameters(@NotNull TypeEvalContext context) {
@@ -52,10 +52,16 @@ public class PyJavaMethodType implements PyCallableType {
@Nullable
@Override
public PyType getCallType(@NotNull TypeEvalContext context, @Nullable PyQualifiedExpression callSite) {
public PyType getReturnType(@NotNull TypeEvalContext context) {
return PyJavaTypeProvider.asPyType(myMethod.getReturnType());
}
@Nullable
@Override
public PyType getCallType(@NotNull TypeEvalContext context, @Nullable PyQualifiedExpression callSite) {
return getReturnType(context);
}
@Nullable
@Override
public List<PyCallableParameter> getParameters(@NotNull TypeEvalContext context) {
@@ -34,11 +34,15 @@ public interface PyCallableType extends PyType {
boolean isCallable();
/**
* Returns the type which is the result of calling an instance of this type.
* Returns the return type of a function independent of a call site.
*
* @return the call result type or null if invalid.
* @param context
* @param callSite
* For example, it may return a generic type.
*/
@Nullable
PyType getReturnType(@NotNull TypeEvalContext context);
/**
* Returns the type which is the result of calling an instance of this type.
*/
@Nullable
PyType getCallType(@NotNull TypeEvalContext context, @Nullable PyQualifiedExpression callSite);
@@ -47,6 +47,13 @@ public class PyCallableTypeImpl implements PyCallableType {
return true;
}
@Nullable
@Override
public PyType getReturnType(@NotNull TypeEvalContext context) {
// TODO: Check that this return type doesn't depend on the call site for all PyCallableTypeImpl objects
return myReturnType;
}
@Nullable
@Override
public PyType getCallType(@NotNull TypeEvalContext context, @Nullable PyQualifiedExpression callSite) {
@@ -307,13 +307,19 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType {
@Nullable
@Override
public PyType getCallType(@NotNull TypeEvalContext context, @Nullable PyQualifiedExpression callSite) {
public PyType getReturnType(@NotNull TypeEvalContext context) {
if (isDefinition()) {
return new PyClassTypeImpl(getPyClass(), false);
}
return null;
}
@Nullable
@Override
public PyType getCallType(@NotNull TypeEvalContext context, @Nullable PyQualifiedExpression callSite) {
return getReturnType(context);
}
@Nullable
@Override
public List<PyCallableParameter> getParameters(@NotNull TypeEvalContext context) {
@@ -44,6 +44,13 @@ public class PyFunctionType implements PyCallableType {
return true;
}
@Nullable
@Override
public PyType getReturnType(@NotNull TypeEvalContext context) {
// TODO: Make Callable.getReturnType() call site independent, extract getCallType()
return myCallable.getReturnType(context, null);
}
@Nullable
@Override
public PyType getCallType(@NotNull TypeEvalContext context, @Nullable PyQualifiedExpression callSite) {