[FRAME Core] Adds ability to split a pallet across multiple files (#13950)

* Initial setup

* Updates macro_magic version and refactors accordingly

* Removes unwrap from macro

* Splits into multiple sections

* Uses call_site to fix macro hygiene issue

* Initial setup

* Removes unnecessary changes

* Moves template palet back

* Updates cargo.lock

* Moves BagsList inside mod

* Comments access to internal functions for now

* Updates tests

* Uncomments code

* Fixes test

* Moves bags-list to separate crate

* Initial setup

* Removes bags-list changes

* Fix structure

* Minor update

* Addresses review comment

* Adds a couple of UI tests. More to be added

* Adds err files

* Adds test for no pallet

* Adds doc

* Updates versions

* Adds benchmarking

* Updates doc link

* ".git/.scripts/commands/fmt/fmt.sh"

* Minor update

* Adds missing changes

* ".git/.scripts/commands/fmt/fmt.sh"

* Update frame/support/procedural/src/lib.rs

Co-authored-by: Sam Johnson <sam@durosoft.com>

* Addresses review comments

* Addresses review comments

* ".git/.scripts/commands/fmt/fmt.sh"

* Update frame/support/procedural/src/lib.rs

Co-authored-by: Sam Johnson <sam@durosoft.com>

* Update frame/support/procedural/src/lib.rs

Co-authored-by: Sam Johnson <sam@durosoft.com>

* Update frame/support/procedural/src/lib.rs

Co-authored-by: Sam Johnson <sam@durosoft.com>

* Adds UI test for disambiguation

* ".git/.scripts/commands/fmt/fmt.sh"

* Makes clippy happy

* ".git/.scripts/commands/fmt/fmt.sh"

* Fixes frame support test

* Fixes frame support test

* Split items other than storage

* Updates versions

* Fixes some review comments

* Addresses review comments

* ".git/.scripts/commands/fmt/fmt.sh"

* Updates docs

* Adds experimental disclaimer

* ".git/.scripts/commands/fmt/fmt.sh"

* Update frame/support/test/tests/split_ui/no_section_found.rs

Co-authored-by: Sam Johnson <sam@durosoft.com>

* Addresses review comments

* Fixes test

---------

Co-authored-by: command-bot <>
Co-authored-by: command-bot <ci@gitlab.parity.io>
Co-authored-by: Sam Johnson <sam@durosoft.com>
This commit is contained in:
gupnik
2023-06-27 17:42:03 +05:30
committed by GitHub
parent 13cb7ccc57
commit 5d8774016c
23 changed files with 837 additions and 5 deletions
@@ -0,0 +1,17 @@
#![cfg_attr(not(feature = "std"), no_std)]
use frame_support::pallet_macros::*;
#[pallet_section]
mod storages {
#[pallet::storage]
pub type MyStorageMap<T: Config> = StorageMap<_, _, u32, u64>;
}
#[import_section(storages)]
pub mod pallet {
}
fn main() {
}
@@ -0,0 +1,5 @@
error: `#[import_section]` can only be applied to a valid pallet module
--> tests/split_ui/import_without_pallet.rs:12:9
|
12 | pub mod pallet {
| ^^^^^^
@@ -0,0 +1,29 @@
#![cfg_attr(not(feature = "std"), no_std)]
use frame_support::pallet_macros::*;
pub use pallet::*;
#[import_section(storages_dev)]
#[frame_support::pallet(dev_mode)]
pub mod pallet {
use frame_support::pallet_prelude::*;
use frame_system::pallet_prelude::*;
#[pallet::pallet]
pub struct Pallet<T>(_);
#[pallet::config]
pub trait Config: frame_system::Config {}
#[pallet::call]
impl<T: Config> Pallet<T> {
pub fn my_call(_origin: OriginFor<T>) -> DispatchResult {
MyStorageMap::<T>::insert(1, 2);
Ok(())
}
}
}
fn main() {
}
@@ -0,0 +1,13 @@
error[E0432]: unresolved import `pallet`
--> tests/split_ui/no_section_found.rs:5:9
|
5 | pub use pallet::*;
| ^^^^^^ help: a similar path exists: `test_pallet::pallet`
error: cannot find macro `__export_tokens_tt_storages_dev` in this scope
--> tests/split_ui/no_section_found.rs:7:1
|
7 | #[import_section(storages_dev)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this error originates in the macro `frame_support::macro_magic::forward_tokens` (in Nightly builds, run with -Z macro-backtrace for more info)
@@ -0,0 +1,40 @@
#![cfg_attr(not(feature = "std"), no_std)]
use frame_support::pallet_macros::*;
pub use pallet::*;
#[pallet_section]
mod events {
#[pallet::event]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {
SomethingDone,
}
}
#[import_section(events)]
#[frame_support::pallet(dev_mode)]
pub mod pallet {
use frame_support::pallet_prelude::*;
use frame_system::pallet_prelude::*;
#[pallet::pallet]
pub struct Pallet<T>(_);
#[pallet::config]
pub trait Config: frame_system::Config {
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
}
#[pallet::call]
impl<T: Config> Pallet<T> {
pub fn my_call(_origin: OriginFor<T>) -> DispatchResult {
Self::deposit_event(Event::SomethingDone);
Ok(())
}
}
}
fn main() {
}
@@ -0,0 +1,61 @@
#![cfg_attr(not(feature = "std"), no_std)]
use frame_support::pallet_macros::*;
pub use pallet::*;
mod first {
use super::*;
#[pallet_section]
mod section {
#[pallet::event]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {
SomethingDone,
}
}
}
mod second {
use super::*;
#[pallet_section(section2)]
mod section {
#[pallet::error]
pub enum Error<T> {
NoneValue,
}
}
}
#[import_section(first::section)]
#[import_section(second::section2)]
#[frame_support::pallet(dev_mode)]
pub mod pallet {
use frame_support::pallet_prelude::*;
use frame_system::pallet_prelude::*;
#[pallet::pallet]
pub struct Pallet<T>(_);
#[pallet::config]
pub trait Config: frame_system::Config {
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
}
#[pallet::call]
impl<T: Config> Pallet<T> {
pub fn my_call(_origin: OriginFor<T>) -> DispatchResult {
Self::deposit_event(Event::SomethingDone);
Ok(())
}
pub fn my_call_2(_origin: OriginFor<T>) -> DispatchResult {
return Err(Error::<T>::NoneValue.into())
}
}
}
fn main() {
}
@@ -0,0 +1,34 @@
#![cfg_attr(not(feature = "std"), no_std)]
use frame_support::pallet_macros::*;
pub use pallet::*;
#[pallet_section]
mod storages {
#[pallet::storage]
pub type MyStorageMap<T: Config> = StorageMap<_, _, u32, u64>;
}
#[frame_support::pallet(dev_mode)]
pub mod pallet {
use frame_support::pallet_prelude::*;
use frame_system::pallet_prelude::*;
#[pallet::pallet]
pub struct Pallet<T>(_);
#[pallet::config]
pub trait Config: frame_system::Config {}
#[pallet::call]
impl<T: Config> Pallet<T> {
pub fn my_call(_origin: OriginFor<T>) -> DispatchResult {
MyStorageMap::<T>::insert(1, 2);
Ok(())
}
}
}
fn main() {
}
@@ -0,0 +1,8 @@
error[E0433]: failed to resolve: use of undeclared type `MyStorageMap`
--> tests/split_ui/section_not_imported.rs:27:4
|
27 | MyStorageMap::<T>::insert(1, 2);
| ^^^^^^^^^^^^
| |
| use of undeclared type `MyStorageMap`
| help: a struct with a similar name exists: `StorageMap`