From bb6292206253e25a9d90196e7d8917f48ed4498a Mon Sep 17 00:00:00 2001
From: David Tolnay <dtolnay@gmail.com>
Date: Tue, 13 Apr 2021 22:56:57 -0700
Subject: [PATCH 1/2] Add regression test for issue 158

---
 tests/test.rs | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/tests/test.rs b/tests/test.rs
index af33b14..5af9f6d 100644
--- a/tests/test.rs
+++ b/tests/test.rs
@@ -1321,3 +1321,17 @@ pub mod issue154 {
         }
     }
 }
+
+// https://github.com/dtolnay/async-trait/issues/158
+pub mod issue158 {
+    use async_trait::async_trait;
+
+    fn f() {}
+
+    #[async_trait]
+    pub trait Trait {
+        async fn f(&self) {
+            self::f()
+        }
+    }
+}

From 6029cbf375c562ca98fa5748e9d950a8ff93b0e7 Mon Sep 17 00:00:00 2001
From: David Tolnay <dtolnay@gmail.com>
Date: Tue, 13 Apr 2021 23:05:12 -0700
Subject: [PATCH 2/2] Preserve `self` as segment of path

---
 src/receiver.rs | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/receiver.rs b/src/receiver.rs
index 64ab65e..7f837f4 100644
--- a/src/receiver.rs
+++ b/src/receiver.rs
@@ -2,7 +2,7 @@ use proc_macro2::{Group, Span, TokenStream, TokenTree};
 use std::iter::FromIterator;
 use syn::visit_mut::{self, VisitMut};
 use syn::{
-    Block, ExprPath, Ident, Item, Macro, Pat, PatIdent, PatPath, Receiver, Signature, Token,
+    Block, ExprPath, Ident, Item, Macro, Pat, PatIdent, PatPath, Path, Receiver, Signature, Token,
     TypePath,
 };
 
@@ -139,6 +139,16 @@ impl VisitMut for ReplaceSelf {
         self.prepend_underscore_to_self(i);
     }
 
+    fn visit_path_mut(&mut self, p: &mut Path) {
+        if p.segments.len() == 1 {
+            // Replace `self`, but not `self::function`.
+            self.visit_ident_mut(&mut p.segments[0].ident);
+        }
+        for segment in &mut p.segments {
+            self.visit_path_arguments_mut(&mut segment.arguments);
+        }
+    }
+
     fn visit_item_mut(&mut self, i: &mut Item) {
         // Visit `macro_rules!` because locally defined macros can refer to
         // `self`. Otherwise, do not recurse into nested items.