bpo-40967: Remove deprecated asyncio.Task.current_task() and asyncio.Task.all_tasks() (GH-20874)



diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst
index 21824ca..bac99b7 100644
--- a/Doc/library/asyncio-task.rst
+++ b/Doc/library/asyncio-task.rst
@@ -962,31 +962,6 @@
 
       .. versionadded:: 3.8
 
-   .. classmethod:: all_tasks(loop=None)
-
-      Return a set of all tasks for an event loop.
-
-      By default all tasks for the current event loop are returned.
-      If *loop* is ``None``, the :func:`get_event_loop` function
-      is used to get the current loop.
-
-      .. deprecated-removed:: 3.7 3.9
-
-         Do not call this as a task method. Use the :func:`asyncio.all_tasks`
-         function instead.
-
-   .. classmethod:: current_task(loop=None)
-
-      Return the currently running task or ``None``.
-
-      If *loop* is ``None``, the :func:`get_event_loop` function
-      is used to get the current loop.
-
-      .. deprecated-removed:: 3.7 3.9
-
-         Do not call this as a task method.  Use the
-         :func:`asyncio.current_task` function instead.
-
 
 .. _asyncio_generator_based_coro:
 
diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst
index 15fca8f..165ce69 100644
--- a/Doc/whatsnew/3.9.rst
+++ b/Doc/whatsnew/3.9.rst
@@ -878,6 +878,11 @@
   deprecated since 2006, and only returning ``False`` when it's called.
   (Contributed by Batuhan Taskaya in :issue:`40208`)
 
+* The :meth:`asyncio.Task.current_task` and :meth:`asyncio.Task.all_tasks` have
+  have been removed. They were deprecated since Python 3.7 and you can use
+  :func:`asyncio.current_task` and :func:`asyncio.all_tasks` instead.
+  (Contributed by Rémi Lapeyre in :issue:`40967`)
+
 
 Porting to Python 3.9
 =====================
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
index 21b98b6..5e0692e 100644
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -113,34 +113,6 @@
     # status is still pending
     _log_destroy_pending = True
 
-    @classmethod
-    def current_task(cls, loop=None):
-        """Return the currently running task in an event loop or None.
-
-        By default the current task for the current event loop is returned.
-
-        None is returned when called not in the context of a Task.
-        """
-        warnings.warn("Task.current_task() is deprecated since Python 3.7, "
-                      "use asyncio.current_task() instead",
-                      DeprecationWarning,
-                      stacklevel=2)
-        if loop is None:
-            loop = events.get_event_loop()
-        return current_task(loop)
-
-    @classmethod
-    def all_tasks(cls, loop=None):
-        """Return a set of all tasks for an event loop.
-
-        By default all tasks for the current event loop are returned.
-        """
-        warnings.warn("Task.all_tasks() is deprecated since Python 3.7, "
-                      "use asyncio.all_tasks() instead",
-                      DeprecationWarning,
-                      stacklevel=2)
-        return _all_tasks_compat(loop)
-
     def __init__(self, coro, *, loop=None, name=None):
         super().__init__(loop=loop)
         if self._source_traceback:
diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py
index 3734013..f9db066 100644
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -1943,32 +1943,6 @@
         self.assertEqual(res, 'test')
         self.assertIsNone(t2.result())
 
-
-    def test_current_task_deprecated(self):
-        Task = self.__class__.Task
-
-        with self.assertWarns(DeprecationWarning):
-            self.assertIsNone(Task.current_task(loop=self.loop))
-
-        async def coro(loop):
-            with self.assertWarns(DeprecationWarning):
-                self.assertIs(Task.current_task(loop=loop), task)
-
-            # See http://bugs.python.org/issue29271 for details:
-            asyncio.set_event_loop(loop)
-            try:
-                with self.assertWarns(DeprecationWarning):
-                    self.assertIs(Task.current_task(None), task)
-                with self.assertWarns(DeprecationWarning):
-                    self.assertIs(Task.current_task(), task)
-            finally:
-                asyncio.set_event_loop(None)
-
-        task = self.new_task(self.loop, coro(self.loop))
-        self.loop.run_until_complete(task)
-        with self.assertWarns(DeprecationWarning):
-            self.assertIsNone(Task.current_task(loop=self.loop))
-
     def test_current_task(self):
         self.assertIsNone(asyncio.current_task(loop=self.loop))
 
@@ -2305,16 +2279,6 @@
         self.assertIsInstance(exception, Exception)
         self.assertEqual(exception.args, ("foo", ))
 
-    def test_all_tasks_deprecated(self):
-        Task = self.__class__.Task
-
-        async def coro():
-            with self.assertWarns(DeprecationWarning):
-                assert Task.all_tasks(self.loop) == {t}
-
-        t = self.new_task(self.loop, coro())
-        self.loop.run_until_complete(t)
-
     def test_log_destroyed_pending_task(self):
         Task = self.__class__.Task
 
@@ -2337,15 +2301,7 @@
 
         self.assertEqual(asyncio.all_tasks(loop=self.loop), {task})
 
-        # See http://bugs.python.org/issue29271 for details:
-        asyncio.set_event_loop(self.loop)
-        try:
-            with self.assertWarns(DeprecationWarning):
-                self.assertEqual(Task.all_tasks(), {task})
-            with self.assertWarns(DeprecationWarning):
-                self.assertEqual(Task.all_tasks(None), {task})
-        finally:
-            asyncio.set_event_loop(None)
+        asyncio.set_event_loop(None)
 
         # execute the task so it waits for future
         self.loop._run_once()
@@ -3043,8 +2999,6 @@
         self.assertEqual(asyncio.all_tasks(loop), set())
         self._register_task(task)
         self.assertEqual(asyncio.all_tasks(loop), set())
-        with self.assertWarns(DeprecationWarning):
-            self.assertEqual(asyncio.Task.all_tasks(loop), {task})
         self._unregister_task(task)
 
     def test__enter_task(self):
diff --git a/Misc/NEWS.d/next/Library/2020-06-15-00-13-57.bpo-40967._dx3OO.rst b/Misc/NEWS.d/next/Library/2020-06-15-00-13-57.bpo-40967._dx3OO.rst
new file mode 100644
index 0000000..4694d99
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-06-15-00-13-57.bpo-40967._dx3OO.rst
@@ -0,0 +1,2 @@
+Removed :meth:`asyncio.Task.current_task` and
+:meth:`asyncio.Task.all_tasks`. Patch contributed by Rémi Lapeyre.
diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c
index 0454f9c..b378742 100644
--- a/Modules/_asynciomodule.c
+++ b/Modules/_asynciomodule.c
@@ -13,10 +13,8 @@
 _Py_IDENTIFIER(__asyncio_running_event_loop__);
 _Py_IDENTIFIER(_asyncio_future_blocking);
 _Py_IDENTIFIER(add_done_callback);
-_Py_IDENTIFIER(_all_tasks_compat);
 _Py_IDENTIFIER(call_soon);
 _Py_IDENTIFIER(cancel);
-_Py_IDENTIFIER(current_task);
 _Py_IDENTIFIER(get_event_loop);
 _Py_IDENTIFIER(send);
 _Py_IDENTIFIER(throw);
@@ -2183,91 +2181,6 @@
 }
 
 /*[clinic input]
-@classmethod
-_asyncio.Task.current_task
-
-    loop: object = None
-
-Return the currently running task in an event loop or None.
-
-By default the current task for the current event loop is returned.
-
-None is returned when called not in the context of a Task.
-[clinic start generated code]*/
-
-static PyObject *
-_asyncio_Task_current_task_impl(PyTypeObject *type, PyObject *loop)
-/*[clinic end generated code: output=99fbe7332c516e03 input=cd14770c5b79c7eb]*/
-{
-    PyObject *ret;
-    PyObject *current_task_func;
-
-    if (PyErr_WarnEx(PyExc_DeprecationWarning,
-                     "Task.current_task() is deprecated, " \
-                     "use asyncio.current_task() instead",
-                     1) < 0) {
-        return NULL;
-    }
-
-    current_task_func = _PyObject_GetAttrId(asyncio_mod, &PyId_current_task);
-    if (current_task_func == NULL) {
-        return NULL;
-    }
-
-    if (loop == Py_None) {
-        loop = get_event_loop();
-        if (loop == NULL) {
-            Py_DECREF(current_task_func);
-            return NULL;
-        }
-        ret = PyObject_CallOneArg(current_task_func, loop);
-        Py_DECREF(current_task_func);
-        Py_DECREF(loop);
-        return ret;
-    }
-    else {
-        ret = PyObject_CallOneArg(current_task_func, loop);
-        Py_DECREF(current_task_func);
-        return ret;
-    }
-}
-
-/*[clinic input]
-@classmethod
-_asyncio.Task.all_tasks
-
-    loop: object = None
-
-Return a set of all tasks for an event loop.
-
-By default all tasks for the current event loop are returned.
-[clinic start generated code]*/
-
-static PyObject *
-_asyncio_Task_all_tasks_impl(PyTypeObject *type, PyObject *loop)
-/*[clinic end generated code: output=11f9b20749ccca5d input=497f80bc9ce726b5]*/
-{
-    PyObject *res;
-    PyObject *all_tasks_func;
-
-    if (PyErr_WarnEx(PyExc_DeprecationWarning,
-                     "Task.all_tasks() is deprecated, " \
-                     "use asyncio.all_tasks() instead",
-                     1) < 0) {
-        return NULL;
-    }
-
-    all_tasks_func = _PyObject_GetAttrId(asyncio_mod, &PyId__all_tasks_compat);
-    if (all_tasks_func == NULL) {
-        return NULL;
-    }
-
-    res = PyObject_CallOneArg(all_tasks_func, loop);
-    Py_DECREF(all_tasks_func);
-    return res;
-}
-
-/*[clinic input]
 _asyncio.Task._make_cancelled_error
 
 Create the CancelledError to raise if the Task is cancelled.
@@ -2587,8 +2500,6 @@
     _ASYNCIO_FUTURE_DONE_METHODDEF
     _ASYNCIO_TASK_SET_RESULT_METHODDEF
     _ASYNCIO_TASK_SET_EXCEPTION_METHODDEF
-    _ASYNCIO_TASK_CURRENT_TASK_METHODDEF
-    _ASYNCIO_TASK_ALL_TASKS_METHODDEF
     _ASYNCIO_TASK_CANCEL_METHODDEF
     _ASYNCIO_TASK_GET_STACK_METHODDEF
     _ASYNCIO_TASK_PRINT_STACK_METHODDEF
diff --git a/Modules/clinic/_asynciomodule.c.h b/Modules/clinic/_asynciomodule.c.h
index d3e59a4..a071efc 100644
--- a/Modules/clinic/_asynciomodule.c.h
+++ b/Modules/clinic/_asynciomodule.c.h
@@ -355,86 +355,6 @@
     return return_value;
 }
 
-PyDoc_STRVAR(_asyncio_Task_current_task__doc__,
-"current_task($type, /, loop=None)\n"
-"--\n"
-"\n"
-"Return the currently running task in an event loop or None.\n"
-"\n"
-"By default the current task for the current event loop is returned.\n"
-"\n"
-"None is returned when called not in the context of a Task.");
-
-#define _ASYNCIO_TASK_CURRENT_TASK_METHODDEF    \
-    {"current_task", (PyCFunction)(void(*)(void))_asyncio_Task_current_task, METH_FASTCALL|METH_KEYWORDS|METH_CLASS, _asyncio_Task_current_task__doc__},
-
-static PyObject *
-_asyncio_Task_current_task_impl(PyTypeObject *type, PyObject *loop);
-
-static PyObject *
-_asyncio_Task_current_task(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
-{
-    PyObject *return_value = NULL;
-    static const char * const _keywords[] = {"loop", NULL};
-    static _PyArg_Parser _parser = {NULL, _keywords, "current_task", 0};
-    PyObject *argsbuf[1];
-    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
-    PyObject *loop = Py_None;
-
-    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
-    if (!args) {
-        goto exit;
-    }
-    if (!noptargs) {
-        goto skip_optional_pos;
-    }
-    loop = args[0];
-skip_optional_pos:
-    return_value = _asyncio_Task_current_task_impl(type, loop);
-
-exit:
-    return return_value;
-}
-
-PyDoc_STRVAR(_asyncio_Task_all_tasks__doc__,
-"all_tasks($type, /, loop=None)\n"
-"--\n"
-"\n"
-"Return a set of all tasks for an event loop.\n"
-"\n"
-"By default all tasks for the current event loop are returned.");
-
-#define _ASYNCIO_TASK_ALL_TASKS_METHODDEF    \
-    {"all_tasks", (PyCFunction)(void(*)(void))_asyncio_Task_all_tasks, METH_FASTCALL|METH_KEYWORDS|METH_CLASS, _asyncio_Task_all_tasks__doc__},
-
-static PyObject *
-_asyncio_Task_all_tasks_impl(PyTypeObject *type, PyObject *loop);
-
-static PyObject *
-_asyncio_Task_all_tasks(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
-{
-    PyObject *return_value = NULL;
-    static const char * const _keywords[] = {"loop", NULL};
-    static _PyArg_Parser _parser = {NULL, _keywords, "all_tasks", 0};
-    PyObject *argsbuf[1];
-    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
-    PyObject *loop = Py_None;
-
-    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
-    if (!args) {
-        goto exit;
-    }
-    if (!noptargs) {
-        goto skip_optional_pos;
-    }
-    loop = args[0];
-skip_optional_pos:
-    return_value = _asyncio_Task_all_tasks_impl(type, loop);
-
-exit:
-    return return_value;
-}
-
 PyDoc_STRVAR(_asyncio_Task__make_cancelled_error__doc__,
 "_make_cancelled_error($self, /)\n"
 "--\n"
@@ -912,4 +832,4 @@
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=0e5c1eb8b692977b input=a9049054013a1b77]*/
+/*[clinic end generated code: output=d0fc522bcbff9d61 input=a9049054013a1b77]*/