diff --git a/python/psi-api/src/com/jetbrains/python/psi/types/PyCallableParameter.java b/python/psi-api/src/com/jetbrains/python/psi/types/PyCallableParameter.java index 9347e22b3d2d..8df290cc9a41 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/types/PyCallableParameter.java +++ b/python/psi-api/src/com/jetbrains/python/psi/types/PyCallableParameter.java @@ -12,7 +12,7 @@ public interface PyCallableParameter { String getName(); @Nullable - PyType getType(); + PyType getType(@NotNull TypeEvalContext context); @Nullable PyParameter getParameter(); diff --git a/python/src/com/jetbrains/python/documentation/PyTypeModelBuilder.java b/python/src/com/jetbrains/python/documentation/PyTypeModelBuilder.java index 8a37daa6b275..72d6efc50043 100644 --- a/python/src/com/jetbrains/python/documentation/PyTypeModelBuilder.java +++ b/python/src/com/jetbrains/python/documentation/PyTypeModelBuilder.java @@ -209,7 +209,7 @@ public class PyTypeModelBuilder { if (parameters != null) { parameterModels = new ArrayList(); for (PyCallableParameter parameter : parameters) { - parameterModels.add(new ParamType(parameter.getName(), build(parameter.getType(), true))); + parameterModels.add(new ParamType(parameter.getName(), build(parameter.getType(myContext), true))); } } final PyType ret = type.getCallType(myContext, null); diff --git a/python/src/com/jetbrains/python/psi/types/PyCallableParameterImpl.java b/python/src/com/jetbrains/python/psi/types/PyCallableParameterImpl.java index 2d99cdbf20d6..27dbf1bf8d35 100644 --- a/python/src/com/jetbrains/python/psi/types/PyCallableParameterImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyCallableParameterImpl.java @@ -1,6 +1,8 @@ package com.jetbrains.python.psi.types; +import com.jetbrains.python.psi.PyNamedParameter; import com.jetbrains.python.psi.PyParameter; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -17,9 +19,9 @@ public class PyCallableParameterImpl implements PyCallableParameter { myElement = null; } - public PyCallableParameterImpl(@Nullable PyParameter element, @Nullable PyType type) { + public PyCallableParameterImpl(@Nullable PyParameter element) { myName = null; - myType = type; + myType = null; myElement = element; } @@ -37,8 +39,14 @@ public class PyCallableParameterImpl implements PyCallableParameter { @Nullable @Override - public PyType getType() { - return myType; + public PyType getType(@NotNull TypeEvalContext context) { + if (myType != null) { + return myType; + } + else if (myElement instanceof PyNamedParameter) { + return context.getType((PyNamedParameter)myElement); + } + return null; } @Nullable diff --git a/python/src/com/jetbrains/python/psi/types/PyCallableTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyCallableTypeImpl.java index 9e655f9036e9..c1483a2b446b 100644 --- a/python/src/com/jetbrains/python/psi/types/PyCallableTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyCallableTypeImpl.java @@ -70,7 +70,7 @@ public class PyCallableTypeImpl implements PyCallableType { if (param != null) { final StringBuilder builder = new StringBuilder(); final String name = param.getName(); - final PyType type = param.getType(); + final PyType type = param.getType(context); if (name != null) { builder.append(name); if (type != null) { diff --git a/python/src/com/jetbrains/python/psi/types/PyFunctionType.java b/python/src/com/jetbrains/python/psi/types/PyFunctionType.java index fd3e3a8f4d27..43ef7ddcc3f7 100644 --- a/python/src/com/jetbrains/python/psi/types/PyFunctionType.java +++ b/python/src/com/jetbrains/python/psi/types/PyFunctionType.java @@ -39,8 +39,7 @@ public class PyFunctionType implements PyCallableType { public List getParameters(@NotNull TypeEvalContext context) { final List result = new ArrayList(); for (PyParameter parameter : myCallable.getParameterList().getParameters()) { - final PyType type = parameter instanceof PyTypedElement ? context.getType((PyTypedElement)parameter) : null; - result.add(new PyCallableParameterImpl(parameter, type)); + result.add(new PyCallableParameterImpl(parameter)); } return result; } diff --git a/python/src/com/jetbrains/python/psi/types/PyTypeChecker.java b/python/src/com/jetbrains/python/psi/types/PyTypeChecker.java index 92ae7ab35caf..9cd26ffba127 100644 --- a/python/src/com/jetbrains/python/psi/types/PyTypeChecker.java +++ b/python/src/com/jetbrains/python/psi/types/PyTypeChecker.java @@ -152,7 +152,7 @@ public class PyTypeChecker { final PyCallableParameter expectedParam = expectedParameters.get(i); final PyCallableParameter actualParam = actualParameters.get(i); // TODO: Check named and star params, not only positional ones - if (!match(expectedParam.getType(), actualParam.getType(), context, substitutions, recursive)) { + if (!match(expectedParam.getType(context), actualParam.getType(context), context, substitutions, recursive)) { return false; } } @@ -237,7 +237,7 @@ public class PyTypeChecker { if (parameters != null) { for (PyCallableParameter parameter : parameters) { if (parameter != null) { - collectGenerics(parameter.getType(), context, collected, visited); + collectGenerics(parameter.getType(context), context, collected, visited); } } } @@ -284,9 +284,9 @@ public class PyTypeChecker { if (parameters != null) { substParams = new ArrayList(); for (PyCallableParameter parameter : parameters) { - final PyType substType = substitute(parameter.getType(), substitutions, context); + final PyType substType = substitute(parameter.getType(context), substitutions, context); final PyCallableParameter subst = parameter.getParameter() != null ? - new PyCallableParameterImpl(parameter.getParameter(), substType) : + new PyCallableParameterImpl(parameter.getParameter()) : new PyCallableParameterImpl(parameter.getName(), substType); substParams.add(subst); } diff --git a/python/testSrc/com/jetbrains/python/PyTypeParserTest.java b/python/testSrc/com/jetbrains/python/PyTypeParserTest.java index 9407a30d2363..bc1bdc8cb412 100644 --- a/python/testSrc/com/jetbrains/python/PyTypeParserTest.java +++ b/python/testSrc/com/jetbrains/python/PyTypeParserTest.java @@ -234,15 +234,16 @@ public class PyTypeParserTest extends PyTestCase { assertInstanceOf(type, PyCallableType.class); final PyCallableType callableType = (PyCallableType)type; assertNotNull(callableType); - final PyType returnType = callableType.getCallType(getTypeEvalContext(), null); + final TypeEvalContext context = getTypeEvalContext(); + final PyType returnType = callableType.getCallType(context, null); assertInstanceOf(returnType, PyGenericType.class); - final List parameterTypes = callableType.getParameters(getTypeEvalContext()); + final List parameterTypes = callableType.getParameters(context); assertNotNull(parameterTypes); assertEquals(2, parameterTypes.size()); - final PyType type0 = parameterTypes.get(0).getType(); + final PyType type0 = parameterTypes.get(0).getType(context); assertNotNull(type0); assertEquals("int", type0.getName()); - final PyType type1 = parameterTypes.get(1).getType(); + final PyType type1 = parameterTypes.get(1).getType(context); assertNotNull(type1); assertEquals("T", type1.getName()); }