|
| 1 | +# Attributes |
| 2 | + |
| 3 | +The Sway compiler supports a list of attributes that perform various operations that are useful for building, testing and documenting Sway programs. Below is a list of all available attributes: |
| 4 | + |
| 5 | +## Allow |
| 6 | + |
| 7 | +The `#[allow(dead_code)]` attribute overrides the check for dead code so that violations will go unreported. |
| 8 | + |
| 9 | +## Doc |
| 10 | + |
| 11 | +The `#[doc(..)]` attribute specifies documentation. |
| 12 | + |
| 13 | +Line doc comments beginning with exactly three slashes `///`, are interpreted as a special syntax for doc attributes. That is, they are equivalent to writing `#[doc("...")]` around the body of the comment, i.e., `/// Foo` turns into `#[doc("Foo")]` |
| 14 | + |
| 15 | +Line comments beginning with `//!` are doc comments that apply to the module of the source file they are in. That is, they are equivalent to writing `#![doc("...")]` around the body of the comment. `//!` module level doc comments should be at the top of Sway files. |
| 16 | + |
| 17 | +Documentation can be generated from doc attributes using `forc doc`. |
| 18 | + |
| 19 | +## Inline |
| 20 | + |
| 21 | +The inline attribute suggests that a copy of the attributed function should be placed in the caller, rather than generating code to call the function where it is defined. |
| 22 | + |
| 23 | +> **Note**: The Sway compiler automatically inlines functions based on internal heuristics. Incorrectly inlining functions can make the program slower, so this attribute should be used with care. |
| 24 | +
|
| 25 | +The `#[inline(never)]` attribute *suggests* that an inline expansion should never be performed. |
| 26 | + |
| 27 | +The `#[inline(always)]` attribute *suggests* that an inline expansion should always be performed. |
| 28 | + |
| 29 | +> **Note**: `#[inline(..)]` in every form is a hint, with no *requirements* |
| 30 | + on the language to place a copy of the attributed function in the caller. |
| 31 | + |
| 32 | +## Payable |
| 33 | + |
| 34 | +The lack of `#[payable]` implies the method is non-payable. When calling an ABI method that is non-payable, the compiler emits an error if the amount of coins forwarded with the call is not guaranteed to be zero. Note that this is strictly a compile-time check and does not incur any runtime cost. |
| 35 | + |
| 36 | +## Storage |
| 37 | + |
| 38 | +In Sway, functions are pure by default but can be opted into impurity via the `storage` function attribute. The `storage` attribute may take `read` and/or `write` arguments indicating which type of access the function requires. |
| 39 | + |
| 40 | +The `#[storage(read)]` attribute indicates that a function requires read access to the storage. |
| 41 | + |
| 42 | +The `#[storage(write)]` attribute indicates that a function requires write access to the storage. |
| 43 | + |
| 44 | +More details in [Purity](../blockchain-development/purity.md). |
| 45 | + |
| 46 | +## Test |
| 47 | + |
| 48 | +The `#[test]` attribute marks a function to be executed as a test. |
| 49 | + |
| 50 | +The `#[test(should_revert)]` attribute marks a function to be executed as a test that should revert. |
| 51 | + |
| 52 | +More details in [Unit Testing](../testing/unit-testing.md). |
0 commit comments