Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Commit

Permalink
Improve MultiLocation conversion functions in xcm-procedural (#3690)
Browse files Browse the repository at this point in the history
* Use fully-qualified paths to reference core traits in proc macro

* Ensure a canonicalized v0 MultiLocation first before attempting to convert to v1

* Fix failing test
  • Loading branch information
KiChjang authored Aug 23, 2021
1 parent a1b08f9 commit c954bfc
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 11 deletions.
2 changes: 1 addition & 1 deletion xcm/procedural/src/v0/multilocation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ fn generate_conversion_from_v1() -> TokenStream {
.collect::<TokenStream>();

quote! {
impl TryFrom<crate::v1::MultiLocation> for MultiLocation {
impl core::convert::TryFrom<crate::v1::MultiLocation> for MultiLocation {
type Error = ();
fn try_from(v1: crate::v1::MultiLocation) -> core::result::Result<Self, ()> {
let mut res = MultiLocation::Null;
Expand Down
10 changes: 6 additions & 4 deletions xcm/procedural/src/v1/multilocation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ fn generate_conversion_from_v0() -> TokenStream {
if #( #parent_idents.is_parent() )&&* =>
Ok(MultiLocation {
parents: #parent_count,
interior: #junction_variant( #( #junction_idents.try_into()? ),* ),
interior: #junction_variant( #( core::convert::TryInto::try_into(#junction_idents)? ),* ),
}),
}
})
Expand All @@ -184,16 +184,18 @@ fn generate_conversion_from_v0() -> TokenStream {
Ok(MultiLocation::ancestor(#num_ancestors)),
#intermediate_match_arms
crate::v0::MultiLocation::#variant( #(#idents),* ) =>
Ok( #variant( #( #idents.try_into()? ),* ).into() ),
Ok( #variant( #( core::convert::TryInto::try_into(#idents)? ),* ).into() ),
}
})
.collect::<TokenStream>();

quote! {
impl TryFrom<crate::v0::MultiLocation> for MultiLocation {
impl core::convert::TryFrom<crate::v0::MultiLocation> for MultiLocation {
type Error = ();
fn try_from(v0: crate::v0::MultiLocation) -> core::result::Result<Self, ()> {
fn try_from(mut v0: crate::v0::MultiLocation) -> core::result::Result<Self, ()> {
use Junctions::*;

v0.canonicalize();
match v0 {
crate::v0::MultiLocation::Null => Ok(Here.into()),
#match_variants
Expand Down
2 changes: 1 addition & 1 deletion xcm/src/v0/multi_location.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
//! Cross-Consensus Message format data structures.

use super::Junction;
use core::{convert::TryFrom, mem, result};
use core::{mem, result};
use parity_scale_codec::{self, Decode, Encode};

/// A relative path between state-bearing consensus systems.
Expand Down
7 changes: 2 additions & 5 deletions xcm/src/v1/multilocation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,7 @@
//! Cross-Consensus Message format data structures.

use super::Junction;
use core::{
convert::{TryFrom, TryInto},
mem, result,
};
use core::{convert::TryFrom, mem, result};
use parity_scale_codec::{Decode, Encode};

/// A relative path between state-bearing consensus systems.
Expand Down Expand Up @@ -898,7 +895,7 @@ mod tests {
);
assert_eq!(
v0::MultiLocation::X2(v0::Junction::Parachain(88), v0::Junction::Parent).try_into(),
Err::<MultiLocation, ()>(()),
Ok(MultiLocation::here()),
);
assert_eq!(
v0::MultiLocation::X3(
Expand Down

0 comments on commit c954bfc

Please sign in to comment.