diff --git a/CHANGELOG.md b/CHANGELOG.md index 4886e6f8..22b9bb1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Version ??? +- `libp2p-core-derive`: Disambiguate calls to `NetworkBehaviour::inject_event`. + [PR 1543](https://github.com/libp2p/rust-libp2p/pull/1543) + - `libp2p-floodsub`: Allow sent messages seen as subscribed. [PR 1520](https://github.com/libp2p/rust-libp2p/pull/1520) diff --git a/misc/core-derive/src/lib.rs b/misc/core-derive/src/lib.rs index 1153276f..d7d28f15 100644 --- a/misc/core-derive/src/lib.rs +++ b/misc/core-derive/src/lib.rs @@ -293,8 +293,8 @@ fn build_struct(ast: &DeriveInput, data_struct: &DataStruct) -> TokenStream { } Some(match field.ident { - Some(ref i) => quote!{ #elem => self.#i.inject_event(peer_id, connection_id, ev) }, - None => quote!{ #elem => self.#field_n.inject_event(peer_id, connection_id, ev) }, + Some(ref i) => quote!{ #elem => #trait_to_impl::inject_event(&mut self.#i, peer_id, connection_id, ev) }, + None => quote!{ #elem => #trait_to_impl::inject_event(&mut self.#field_n, peer_id, connection_id, ev) }, }) }); diff --git a/misc/core-derive/tests/test.rs b/misc/core-derive/tests/test.rs index e0c5cfdf..b65fb16e 100644 --- a/misc/core-derive/tests/test.rs +++ b/misc/core-derive/tests/test.rs @@ -204,3 +204,35 @@ fn where_clause() { bar: T, } } + +#[test] +fn nested_derives_with_import() { + use libp2p::swarm::NetworkBehaviourEventProcess; + + #[allow(dead_code)] + #[derive(NetworkBehaviour)] + struct Foo { + ping: libp2p::ping::Ping, + } + + #[allow(dead_code)] + #[derive(NetworkBehaviour)] + struct Bar { + foo: Foo, + } + + impl NetworkBehaviourEventProcess for Foo { + fn inject_event(&mut self, _: libp2p::ping::PingEvent) { + } + } + + impl NetworkBehaviourEventProcess<()> for Bar { + fn inject_event(&mut self, _: ()) { + } + } + + #[allow(dead_code)] + fn bar() { + require_net_behaviour::(); + } +}