Skip to content

Commit d4c57a3

Browse files
authored
Messages return TypeSpec directly (#1999)
* Messages return TypeSpec directly * arrange changelog * remove `Option` in `ReturnTypeSpec` + adjust tests * remove rubbish * fix tests * fix docs
1 parent a9401be commit d4c57a3

File tree

5 files changed

+174
-75
lines changed

5 files changed

+174
-75
lines changed

CHANGELOG.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99
### Added
1010
- [E2E] Allow testing with live-chain state - [#1949](https://github.com/paritytech/ink/pull/1949)
1111
- [E2E] Call builders and extra gas margin option - [#1917](https://github.com/paritytech/ink/pull/1917)
12-
- Make `set_code_hash` generic - [#1906](https://github.com/paritytech/ink/pull/1906)
12+
- Linter: `storage_never_freed` lint - [#1932](https://github.com/paritytech/ink/pull/1932)
13+
- Linter: `strict_balance_equality` lint - [#1914](https://github.com/paritytech/ink/pull/1914)
1314
- Clean E2E configuration parsing - [#1922](https://github.com/paritytech/ink/pull/1922)
15+
- Make `set_code_hash` generic - [#1906](https://github.com/paritytech/ink/pull/1906)
1416

1517
### Changed
18+
- Messages return `TypeSpec` directly - #[1999](https://github.com/paritytech/ink/pull/1999)
1619
- Fail when decoding from storage and not all bytes consumed - [#1897](https://github.com/paritytech/ink/pull/1897)
1720
- [E2E] resolve DispatchError error details for dry-runs - [#1944](https://github.com/paritytech/ink/pull/1994)
1821

19-
### Added
20-
- Linter: `storage_never_freed` lint - [#1932](https://github.com/paritytech/ink/pull/1932)
21-
- Linter: `strict_balance_equality` lint - [#1914](https://github.com/paritytech/ink/pull/1914)
2222

2323
## Version 5.0.0-alpha
2424

crates/ink/codegen/src/generator/metadata.rs

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,8 @@ impl Metadata<'_> {
248248
let ident = message.ident();
249249
let args = message.inputs().map(Self::generate_dispatch_argument);
250250
let cfg_attrs = message.get_cfg_attrs(span);
251-
let ret_ty = Self::generate_return_type(Some(&message.wrapped_output()));
251+
let ret_ty =
252+
Self::generate_message_return_type(&message.wrapped_output());
252253
quote_spanned!(span =>
253254
#( #cfg_attrs )*
254255
::ink::metadata::MessageSpec::from_label(::core::stringify!(#ident))
@@ -311,7 +312,7 @@ impl Metadata<'_> {
311312
as #trait_path>::__ink_TraitInfo
312313
as ::ink::reflect::TraitMessageInfo<#local_id>>::SELECTOR
313314
}};
314-
let ret_ty = Self::generate_return_type(Some(&message.wrapped_output()));
315+
let ret_ty = Self::generate_message_return_type(&message.wrapped_output());
315316
let label = [trait_ident.to_string(), message_ident.to_string()].join("::");
316317
quote_spanned!(message_span=>
317318
#( #cfg_attrs )*
@@ -333,19 +334,10 @@ impl Metadata<'_> {
333334
}
334335

335336
/// Generates ink! metadata for the given return type.
336-
fn generate_return_type(ret_ty: Option<&syn::Type>) -> TokenStream2 {
337-
match ret_ty {
338-
None => {
339-
quote! {
340-
::ink::metadata::ReturnTypeSpec::new(::core::option::Option::None)
341-
}
342-
}
343-
Some(ty) => {
344-
let type_spec = Self::generate_type_spec(ty);
345-
quote! {
346-
::ink::metadata::ReturnTypeSpec::new(#type_spec)
347-
}
348-
}
337+
fn generate_message_return_type(ret_ty: &syn::Type) -> TokenStream2 {
338+
let type_spec = Self::generate_type_spec(ret_ty);
339+
quote! {
340+
::ink::metadata::ReturnTypeSpec::new(#type_spec)
349341
}
350342
}
351343

@@ -361,13 +353,13 @@ impl Metadata<'_> {
361353

362354
quote_spanned!(span=>
363355
::ink::metadata::ReturnTypeSpec::new(if #constructor_info::IS_RESULT {
364-
::core::option::Option::Some(::ink::metadata::TypeSpec::with_name_str::<
356+
::ink::metadata::TypeSpec::with_name_str::<
365357
::ink::ConstructorResult<::core::result::Result<(), #constructor_info::Error>>,
366-
>("ink_primitives::ConstructorResult"))
358+
>("ink_primitives::ConstructorResult")
367359
} else {
368-
::core::option::Option::Some(::ink::metadata::TypeSpec::with_name_str::<
360+
::ink::metadata::TypeSpec::with_name_str::<
369361
::ink::ConstructorResult<()>,
370-
>("ink_primitives::ConstructorResult"))
362+
>("ink_primitives::ConstructorResult")
371363
})
372364
)
373365
}

crates/ink/tests/return_type_metadata.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ mod tests {
106106
let message = metadata.spec().messages().iter().next().unwrap();
107107
assert_eq!("TraitDefinition::get_value", message.label());
108108

109-
let type_spec = message.return_type().opt_type().unwrap();
109+
let type_spec = message.return_type().ret_type();
110110
let ty = resolve_type(&metadata, type_spec.ty().id);
111111
let (ok_ty, _) = extract_result(&metadata, ty);
112112

@@ -119,7 +119,7 @@ mod tests {
119119
let constructor = metadata.spec().constructors().iter().next().unwrap();
120120

121121
assert_eq!("try_new", constructor.label());
122-
let type_spec = constructor.return_type().opt_type().unwrap();
122+
let type_spec = constructor.return_type().ret_type();
123123
assert_eq!(
124124
"ink_primitives::ConstructorResult",
125125
format!("{}", type_spec.display_name())

crates/metadata/src/specs.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,7 @@ pub struct ConstructorSpecBuilder<F: Form, Selector, IsPayable, Returns> {
468468
impl<F> ConstructorSpec<F>
469469
where
470470
F: Form,
471+
TypeSpec<F>: Default,
471472
{
472473
/// Creates a new constructor spec builder.
473474
pub fn from_label(
@@ -484,7 +485,7 @@ where
484485
selector: Selector::default(),
485486
payable: Default::default(),
486487
args: Vec::new(),
487-
return_type: ReturnTypeSpec::new(None),
488+
return_type: ReturnTypeSpec::new(TypeSpec::default()),
488489
docs: Vec::new(),
489490
default: false,
490491
},
@@ -668,6 +669,7 @@ mod state {
668669
impl<F> MessageSpec<F>
669670
where
670671
F: Form,
672+
TypeSpec<F>: Default,
671673
{
672674
/// Creates a new message spec builder.
673675
pub fn from_label(
@@ -686,7 +688,7 @@ where
686688
mutates: false,
687689
payable: false,
688690
args: Vec::new(),
689-
return_type: ReturnTypeSpec::new(None),
691+
return_type: ReturnTypeSpec::new(TypeSpec::default()),
690692
docs: Vec::new(),
691693
default: false,
692694
},
@@ -1417,45 +1419,44 @@ where
14171419
#[must_use]
14181420
pub struct ReturnTypeSpec<F: Form = MetaForm> {
14191421
#[serde(rename = "type")]
1420-
opt_type: Option<TypeSpec<F>>,
1422+
ret_type: TypeSpec<F>,
14211423
}
14221424

14231425
impl IntoPortable for ReturnTypeSpec {
14241426
type Output = ReturnTypeSpec<PortableForm>;
14251427

14261428
fn into_portable(self, registry: &mut Registry) -> Self::Output {
14271429
ReturnTypeSpec {
1428-
opt_type: self
1429-
.opt_type
1430-
.map(|opt_type| opt_type.into_portable(registry)),
1430+
ret_type: self.ret_type.into_portable(registry),
14311431
}
14321432
}
14331433
}
14341434

14351435
impl<F> ReturnTypeSpec<F>
14361436
where
14371437
F: Form,
1438+
TypeSpec<F>: Default,
14381439
{
14391440
/// Creates a new return type specification from the given type or `None`.
14401441
///
14411442
/// # Examples
14421443
///
14431444
/// ```no_run
14441445
/// # use ink_metadata::{TypeSpec, ReturnTypeSpec};
1445-
/// <ReturnTypeSpec<scale_info::form::MetaForm>>::new(None); // no return type;
1446+
/// <ReturnTypeSpec<scale_info::form::MetaForm>>::new(TypeSpec::default()); // no return type;
14461447
/// ```
14471448
pub fn new<T>(ty: T) -> Self
14481449
where
1449-
T: Into<Option<TypeSpec<F>>>,
1450+
T: Into<TypeSpec<F>>,
14501451
{
14511452
Self {
1452-
opt_type: ty.into(),
1453+
ret_type: ty.into(),
14531454
}
14541455
}
14551456

1456-
/// Returns the optional return type
1457-
pub fn opt_type(&self) -> Option<&TypeSpec<F>> {
1458-
self.opt_type.as_ref()
1457+
/// Returns the return type
1458+
pub fn ret_type(&self) -> &TypeSpec<F> {
1459+
&self.ret_type
14591460
}
14601461
}
14611462

0 commit comments

Comments
 (0)