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.