Skip to content

Commit

Permalink
Fixes path issue in derive-impl (paritytech#1823)
Browse files Browse the repository at this point in the history
Needs sam0x17/macro_magic#13

The associated PR allows the export of tokens from macro_magic at the
specified path. This fixes the path issue in derive-impl. Now, we can
import the default config using the standard rust syntax:

```rust
use frame_system::config_preludes::TestDefaultConfig;

[derive_impl(TestDefaultConfig as frame_system::DefaultConfig)]
impl frame_system::DefaultConfig for Test {
   //....
}
```
  • Loading branch information
gupnik authored Oct 11, 2023
1 parent 6355416 commit 4e50ba5
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 12 deletions.
7 changes: 4 additions & 3 deletions substrate/frame/examples/default-config/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
//! Study the following types:
//!
//! - [`pallet::DefaultConfig`], and how it differs from [`pallet::Config`].
//! - [`pallet::config_preludes::TestDefaultConfig`] and how it implements
//! - [`struct@pallet::config_preludes::TestDefaultConfig`] and how it implements
//! [`pallet::DefaultConfig`].
//! - Notice how [`pallet::DefaultConfig`] is independent of [`frame_system::Config`].

Expand Down Expand Up @@ -83,11 +83,12 @@ pub mod pallet {
// This will help use not need to disambiguate anything when using `derive_impl`.
use super::*;
use frame_support::derive_impl;
use frame_system::config_preludes::TestDefaultConfig as SystemTestDefaultConfig;

/// A type providing default configurations for this pallet in testing environment.
pub struct TestDefaultConfig;

#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)]
#[derive_impl(SystemTestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)]
impl frame_system::DefaultConfig for TestDefaultConfig {}

#[frame_support::register_default_impl(TestDefaultConfig)]
Expand All @@ -109,7 +110,7 @@ pub mod pallet {
/// example, we simple derive `frame_system::config_preludes::TestDefaultConfig` again.
pub struct OtherDefaultConfig;

#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)]
#[derive_impl(SystemTestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)]
impl frame_system::DefaultConfig for OtherDefaultConfig {}

#[frame_support::register_default_impl(OtherDefaultConfig)]
Expand Down
6 changes: 3 additions & 3 deletions substrate/frame/support/procedural/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ mod transactional;
mod tt_macro;

use frame_support_procedural_tools::generate_crate_access_2018;
use macro_magic::import_tokens_attr;
use macro_magic::{import_tokens_attr, import_tokens_attr_verbatim};
use proc_macro::TokenStream;
use quote::{quote, ToTokens};
use std::{cell::RefCell, str::FromStr};
Expand Down Expand Up @@ -751,7 +751,7 @@ pub fn storage_alias(attributes: TokenStream, input: TokenStream) -> TokenStream
/// Items that lack a `syn::Ident` for whatever reason are first checked to see if they exist,
/// verbatim, in the local/destination trait before they are copied over, so you should not need to
/// worry about collisions between identical unnamed items.
#[import_tokens_attr {
#[import_tokens_attr_verbatim {
format!(
"{}::macro_magic",
match generate_crate_access_2018("frame-support") {
Expand Down Expand Up @@ -868,7 +868,7 @@ pub fn register_default_impl(attrs: TokenStream, tokens: TokenStream) -> TokenSt
attrs,
item_impl.to_token_stream(),
true,
true,
false,
) {
Ok(tokens) => tokens.into(),
Err(err) => err.to_compile_error().into(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
error: cannot find macro `__export_tokens_tt_tiger` in this scope
--> tests/derive_impl_ui/bad_default_impl_path.rs:59:1
error: cannot find macro `Tiger` in this scope
--> tests/derive_impl_ui/bad_default_impl_path.rs:59:15
|
59 | #[derive_impl(Tiger as Animal)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this error originates in the macro `frame_support::macro_magic::forward_tokens` (in Nightly builds, run with -Z macro-backtrace for more info)
| ^^^^^
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ error[E0412]: cannot find type `RuntimeCall` in this scope
35 | #[derive_impl(Pallet)] // Injects type RuntimeCall = RuntimeCall;
| ---------------------- in this macro invocation
|
= note: this error originates in the macro `__export_tokens_tt_pallet` which comes from the expansion of the macro `frame_support::macro_magic::forward_tokens` (in Nightly builds, run with -Z macro-backtrace for more info)
= note: this error originates in the macro `Pallet` which comes from the expansion of the macro `frame_support::macro_magic::forward_tokens_verbatim` (in Nightly builds, run with -Z macro-backtrace for more info)

0 comments on commit 4e50ba5

Please sign in to comment.