diff --git a/python/src/com/jetbrains/python/inspections/PyTypeCheckerInspection.java b/python/src/com/jetbrains/python/inspections/PyTypeCheckerInspection.java index 3c6be927fe1f..cc22e31b92dc 100644 --- a/python/src/com/jetbrains/python/inspections/PyTypeCheckerInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyTypeCheckerInspection.java @@ -91,7 +91,7 @@ public class PyTypeCheckerInspection extends PyInspection { if (annotation != null || typeCommentAnnotation != null) { final PyExpression returnExpr = node.getExpression(); final PyType actual = returnExpr != null ? myTypeEvalContext.getType(returnExpr) : PyNoneType.INSTANCE; - final PyType expected = myTypeEvalContext.getReturnType(function); + final PyType expected = getExpectedReturnType(function); if (!PyTypeChecker.match(expected, actual, myTypeEvalContext)) { final String expectedName = PythonDocumentationProvider.getTypeName(expected, myTypeEvalContext); final String actualName = PythonDocumentationProvider.getTypeName(actual, myTypeEvalContext); @@ -105,6 +105,17 @@ public class PyTypeCheckerInspection extends PyInspection { } } + @Nullable + private PyType getExpectedReturnType(@NotNull PyFunction function) { + final PyType returnType = myTypeEvalContext.getReturnType(function); + + if (returnType instanceof PyCollectionType && PyNames.FAKE_COROUTINE.equals(returnType.getName())) { + return ((PyCollectionType)returnType).getElementTypes(myTypeEvalContext).get(0); + } + + return returnType; + } + @Override public void visitPyFunction(PyFunction node) { final PyAnnotation annotation = node.getAnnotation(); diff --git a/python/testData/inspections/PyTypeCheckerInspection/AsyncFunctionReturnType.py b/python/testData/inspections/PyTypeCheckerInspection/AsyncFunctionReturnType.py new file mode 100644 index 000000000000..680417e7fbb1 --- /dev/null +++ b/python/testData/inspections/PyTypeCheckerInspection/AsyncFunctionReturnType.py @@ -0,0 +1,2 @@ +async def test(self, a) -> int: + return 123 \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java index d4d78e23b29d..c6817ef27c64 100644 --- a/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java @@ -158,4 +158,9 @@ public class Py3TypeCheckerInspectionTest extends PyTestCase { public void testComprehensionsOverAsyncGenerator() { doTest(); } + + // PY-21048 + public void testAsyncFunctionReturnType() { + doTest(); + } }