Unverified Commit e8d47396 authored by Robin Freyler's avatar Robin Freyler Committed by GitHub
Browse files

Implement new trait definition codegen 🚀 (#665)

* fix spelling error in docs

* remove commented-out code

* move query_amount_{constructors,messages} utilities into own functions

* implement codegen for constructor decoder enum type

* slightly refactor AcceptsPayments and EnablesDynamicStorageAllocator

* fix bug that spans of ink! trait messages have not been registered

* add codegen for ExecuteDispatchable for constructor decoder

* add codegen for expr to query if any ink! message if payable

* implement preliminary codegen for new ink! dispatch entry points

* add ink_lang::execute_constructor_2 utility dispatch function

* demand ExecuteDispatch trait impl from generated decoder types

* trait-incrementer constructor now takes and sets initial value

* apply rustfmt

* implement message decoder type codegen for new dispatch

* enable entry point codegen for new dispatch

* fix doc comment

* remove old dispatch codegen

* rename dispatch2 module to dispatch

* apply rustfmt

* generate dispatch info trait impls always

They are useful generally and not only when compiled as root contract.

* no longer generate unnecessary braces in new dispatch codegen

* adjust UI tests for new dispatch codegen

* no longer derive core::fmt::Debug for dispatch decoder types

This fixes a doc test since this implied a Debug bound on all message and constructor inputs.

* fix bug in dispatcher utility method

* remove all no longer needed types and traits from ink_lang crate

Due to the new ink! codegen many of these definitions have become deprecated or obsolete.

* fix UI test

* silence non-minimal bool clippy warning in expanded code

* fix bug in dispatch codegen

Only check for payment if message is not payable and not all messages are not payable, too.

* add IsDocAttribute::extract_docs utility method for ink! IR

* overhaul ink! metadata codegen

This now properly takes into consideration the payable and selector properties of ink! trait messages.

* silence bad clippy warning

* rename execute_{message_2, constructor_2} to execute_{message, constructor}

* make ink! root contract messages revert state when returning Result::Err(_)

* fix some formatting issues

* extend is_result_{type, err} unit tests

* improve error messages for invalid ink! input and output types

This checks for ink! constructor and message inputs to be scale::Decode + 'static and for ink! output types to be scale::Encode + 'static.
Also added new UI tests to assert that this works for ink! message and constructor inputs.

* add missing UI test expectation files

* add UI tests for many ink! message and constructor inputs and outputs

* move noop contract UI test

* normalize UI test

* add passing UI tests for payable and selector properties

* improve passing ink! message selector UI test

* add passing UI test for ink! constructor selector property

* add UI tests for ink! storage structs with various fields

* add passing UI tests for ink! events

* add passing packed ink! storage struct UI test

* improve macro hygiene in StorageLayout derive impl

* add no-implicit-prelude passing UI test

Currently disabled since static_assertions dependency has macro hygiene problems with respect to no_implicit_prelude.

* add impl alias passing UI test

* modernize passing UI test for ink! storage struct derives

* modernize flipper example contract passing UI test

* add new trait-flipper example passing UI test

* add new passing UI test for #[ink(impl)] property

* rename 03-incrementer-contract UI test

* modernize example incrementer passing UI test

* apply rustfmt to UI test

* fix a doc test in ink_storage_derive crate

* add passing UI test for trait based incrementer example ink! smart contract

* apply rustfmt to UI test

* add passing UI tests for #[ink::contract] configs

* add passing UI test for #[ink::contract(env = ..)] config

* modernize env-access passing UI test

* modernize passing UI test to assert Rust items are properly expanded

* add passing UI test to assert existence of aliases for all env types

* rename remaining passing UI tests

* move commented out UI test to top

* move passing UI contract example tests to end

* fix StorageLayout derive unit tests

* replace vec! by plain old arrays in StorageLayout derive expansion

* remove plenty of usages of vec! macro in the ink! codebase

* improve macro hygiene in call_builder codegen

* slightly reformat erc20 UI test

* add ink! event passing UI tests

* move minimal ink! smart contract UI test case to front

* modernize simple definition UI test

* add simple no-implicit-prelude UI test for ink::trait_definition macro

The test case is disabled for now since the currently used parity-scale-codec produces macro hygiene errors.

* add some #[ink::trait_definition] UI tests

* rename #[ink::trait_definition] UI tests

* add UI tests for #[ink::trait_definition] with async and const messages

* add more UI tests for #[ink::trait_definition]

* normalize #[ink::trait_definition] UI tests

* normalize some UI tests

* add new UI tests for #[ink::trait_definition]

* add more UI tests for #[ink::trait_definition]

* add more UI tests for #[ink::trait_definition]

* generate guards for scale::Codec message inputs and outputs for ink! trait definitions

* add UI tests for non-codec message inputs and outputs for #[ink::trait_definition]

* fix spelling issue

* apply rustfmt to test case

* fix some spelling issues

* implement ink! trait message selector and payable property guards

* add UI tests for ink! trait message payable and selector property guards

* add passing UI tests for payable and selector property guards

* fix ERC-1155 example ink! smart contract

The contract broke due to ink! now checking if selectors of ink! trait message definitions and implemented ink! trait messages match.

* disallow #[ink(namespace)] property on ink! trait impl blocks

* add UI tests for #[ink(namespace)] attribute

* fix unit tests that make use of #[ink(namespace = ..)]

* update UI test case expectations

* use "diff" crate feature of trybuild crate

* fix some ink! specific error messages

* fix and improve some attribute error messages

* modernize failing #[ink::contract] UI tests

* fix some UI tests

* use wildcards in UI test inclusion pattern

* rename InkTraitDefinitionRegistry -> TraitDefinitionRegistry

* fix some tests

* apply rustfmt

* rename ink_lang::type_check module to codegen and make it a folder

* rename BaseEvent trait to ContractEventBase

* replace static_assertions usage by custom solution

This leads to fewer dependencies and also to better error messages.

* remove static_assertions dependency from ink_lang

* apply rustfmt

* fix some examples

* move TraitMessage{Payable,Selector} into codegen submodule

* remove superflous True trait from ink_lang

* add ExecuteMessageConfig

* refactor ink_lang dispatch definitions

* add show-codegen-docs crate feature to ink_lang to unhide the codegen module

* fix docs and add doc example tests to IsSameType

* add doc example tests to DispatchInput and DispatchOutput types

* fix spelling issues

* fix trait definition UI tests

* rename TraitImplementer -> TraitImplementedById and move into codegen module

* apply rustfmt

* move ImpliesReturn to ink_lang::codegen module and improve doc comments

* remove re-export of ImpliesReturn from ink_lang

It is now exported from the ink_lang::codegen sub module.

* fix spelling issues

* fix UI tests

* move ink! trait definition codegen definitions into trait_def submodule

* move TraitDefinitionRegistry into new ink_lang::reflect module

* unhide docs for TraitDefinitionRegistry

* enable no-implicit-prelude UI test

* add doc comment to reflect module

* update docs of TraitDefinitionRegistry

* move definitions for dispatch reflections into reflect submodule

* add usage example to COntractAmountDispatchables reflect trait

* add doc comment note to ContractAmountDispatchables trait

* add enforced newline to docs

* improve docs

* update docs for ContractDispatchableMessages trait

* improve doc test

* update docs of ContractDispatchableConstructors trait

* apply rustfmt

* fix hunspell dict

* remove non-existing optional UI test comments

* merge UI tests into one fat one

This (hopefully) fixes the flaky codecov CI for now ...

* use new selector_id! macro instead of raw values in doc tests

* add usage docs to DispatchableMessageInfo trait

* improve doc test

* add usage example to DispatchableConstructorInfo trait docs

* add note and usage example for ContractMessageDecoder docs

* add usage example to ContractConstructorDecoder docs

* improve docs of some reflect types in ink_lang

* improve docs

* move TraitMessageInfo into reflect submodule

* remove invalid static_assertions imports

* take &mut [u8; 32] instead of &mut [u8] for blake2b output

* make local_id of trait_def equal to selector of the message identifier

* modernize payable_message UI trait_def passing test

* add usage example to TraitMessageInfo trait

* fix composed selector calculation for empty ink! trait namespaces

* apply rustfmt

* extend usage example for TraitMessageInfo trait docs

* hopefully fix some weird spelling issues

* make ink! trait definitions actually use the namespace config

* extend usage example for TraitMessageInfo docs

* rework some ink! trait definition passing UI tests

* add new passing UI test for ink! trait definitions concerning namespaces

* add fail UI tests for ink! trait definitions concerning overlapping selectors

* move ContractName into reflect sub-module and add docs and usage example

* move ContractEnv trait to reflect module and add extensive docs and usage examples

* apply clippy suggestions

* move ContractReference trait to reflect module

* apply rustfmt

* fix some usage doc tests

* add extensive docs and usage example to ContractReference trait

* improve docs

* improve docs (2)

* move DispatchError to the reflect submodule

* add new event topic guards codegen to ink! codegen

* apply rustfmt and fix PhantomData import

* re-export RespectTopicLimit trait

* modernize trait_erc20 example contract

* move Env and StaticEnv into ink_lang::codegen module

* conditionally import EmitEvent trait anonymously for ink! impl blocks

* fix some UI tests

* move EmitEvent trait to ink_lang::codegen module

* fix UI tests

* fix UI tests

* add passing UI test for self.env() and Self::env() syntax

* add failing UI tests for missing #[ink(impl)] annotation

* move ContractEventBase trait to ink_lang::reflect submodule

* apply rustfmt

* add usage example to ContractEventBase docs

* move TraitModulePath to ink_lang::reflect submodule

* move ink! trait call builder codegen facilities to ink_lang::codegen submodule

* move ContractCallBuilder to ink_lang::codegen submodule

* move IsSameType and identity_type into ink_lang::codegen::utils module

* rename identity_type to consume_type

* apply rustfmt

* add usage examples to consume_type docs (+ missing rename)

* fix codegen to allow for environmental type usage in ink! trait definitions

* add UI test that uses environmental types in ink! trait definition

* apply rustfmt

* remove unused Selector::unique_id method

* remove Selector::from_bytes

Users should use Selector's From<[u8;4]> implementation instead.

* rename Selector::new -> Selector::compute

* fix some UI tests for rename

* change API: Selector::as_bytes -> Selector::to_bytes and return by value

* add payability to hunspell dict

* use ink! trait info object instead of uniqe trait ID for TraitCallForwarderFor trait

* adjust UI tests

* apply rustfmt

* remove TraitUniqueId trait

* remove TraitImplementedById and utilities to compute ink! trait verify hash

* remove unused CannotCallTraitConstructor variant

* Update to using trybuild version 1.0.49

This forces most or all of the failure UI tests to be adjusted slightly.

* add comment that explains why we have both result checks in execution

* introduce DecodeDispatch trait

This replaces the bare use of scale::Decode for ink! constructor and message decoders.
The advantage is that it can return DispatchError instead of scale::Error.
Also adds new UI test and docs with a usage example.

* use selector_bytes! in UI test

* slightly improve fail UI tests

* fix warning in passing UI test

* add new UI test to guard against trait message selector overlaps

* move UI tests from ink_lang_macro to ink_lang crate directory

* adjust UI tests after moving

* remove unused dev-dependencies from ink_lang_macro after moving UI tests

* fix compilation error with Wasm target

* fix CI with formatting checks for UI tests

* add unpayable to hunspell dictionary

* fix hunspell spelling issues

* move ink-experimental-engine to ink_lang crate

Used by unique topics test.

* update UI tests for new nightly compiler

* add missing fixed UI tests

* fix spelling issue in UI test

* add docs explaining usage of AccumulatorRef et.al. in delegator example

* extend is_result unit tests

* re-add pretty assertions

* normalize used version in ink-metadata crate

* add skeleton for ink! 3.0-rc7 in RELEASES

* add release information about this PR to RELEASES.md

* use ink! 3.0-rc6 in multisig example contract

* fix docs

* remove commented out code

* use unzip to partition input_bindings and input_types (thanks andrew!)

* improve #[ink(extension)] missing parameter error message
parent d85565ee
Pipeline #163034 failed with stages
in 13 minutes and 22 seconds