asyncio, Tulip issue 137: In debug mode, add the traceback where the coroutine
object was created to the "coroutine ... was never yield from" log
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
index 52ca33a..89ec3a4 100644
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -43,6 +43,7 @@
         assert inspect.isgenerator(gen), gen
         self.gen = gen
         self.func = func
+        self._source_traceback = traceback.extract_stack(sys._getframe(1))
 
     def __iter__(self):
         return self
@@ -81,13 +82,13 @@
         gen = getattr(self, 'gen', None)
         frame = getattr(gen, 'gi_frame', None)
         if frame is not None and frame.f_lasti == -1:
-            func = self.func
-            code = func.__code__
-            filename = code.co_filename
-            lineno = code.co_firstlineno
-            logger.error(
-                'Coroutine %r defined at %s:%s was never yielded from',
-                func.__name__, filename, lineno)
+            func = events._format_callback(self.func, ())
+            tb = ''.join(traceback.format_list(self._source_traceback))
+            message = ('Coroutine %s was never yielded from\n'
+                       'Coroutine object created at (most recent call last):\n'
+                       '%s'
+                       % (func, tb.rstrip()))
+            logger.error(message)
 
 
 def coroutine(func):
@@ -112,6 +113,8 @@
         @functools.wraps(func)
         def wrapper(*args, **kwds):
             w = CoroWrapper(coro(*args, **kwds), func)
+            if w._source_traceback:
+                del w._source_traceback[-1]
             w.__name__ = func.__name__
             if _PY35:
                 w.__qualname__ = func.__qualname__