diff --git a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java index 02176e32c287..3c778d28540a 100644 --- a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java +++ b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java @@ -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 getParameters(@NotNull TypeEvalContext context) { diff --git a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaMethodType.java b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaMethodType.java index dbcc7e2fc8c9..5b496c14a07a 100644 --- a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaMethodType.java +++ b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaMethodType.java @@ -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 getParameters(@NotNull TypeEvalContext context) { diff --git a/python/psi-api/src/com/jetbrains/python/psi/types/PyCallableType.java b/python/psi-api/src/com/jetbrains/python/psi/types/PyCallableType.java index 43261ddba84e..7292391ad4f8 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/types/PyCallableType.java +++ b/python/psi-api/src/com/jetbrains/python/psi/types/PyCallableType.java @@ -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); diff --git a/python/src/com/jetbrains/python/psi/types/PyCallableTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyCallableTypeImpl.java index f417f5aa4c93..9c1d2a649263 100644 --- a/python/src/com/jetbrains/python/psi/types/PyCallableTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyCallableTypeImpl.java @@ -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) { diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java index a63fd46bf3a7..fd1097918dcf 100644 --- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java @@ -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 getParameters(@NotNull TypeEvalContext context) { diff --git a/python/src/com/jetbrains/python/psi/types/PyFunctionType.java b/python/src/com/jetbrains/python/psi/types/PyFunctionType.java index 5e0c35699067..c1e9f3046bc6 100644 --- a/python/src/com/jetbrains/python/psi/types/PyFunctionType.java +++ b/python/src/com/jetbrains/python/psi/types/PyFunctionType.java @@ -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) {