| # FIDL attributes |
| |
| The following FIDL attributes are supported: |
| |
| * [`@available`](#available) |
| * [`@deprecated`](#deprecated) |
| * [`@discoverable`](#discoverable) |
| * [`@doc`](#doc) |
| * [`@generated_name`](#generated-name) |
| * [`@no_doc`](#nodoc) |
| * [`@selector`](#selector) |
| * [`@transitional`](#transitional) |
| * [`@transport`](#transport) |
| * [`@unknown`](#unknown) |
| |
| ## Scope |
| |
| An attribute precedes a FIDL element, for example: |
| |
| ```fidl |
| {% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/fuchsia.examples.docs/attributes.test.fidl" region_tag="attribute-one" %} |
| ``` |
| |
| It's used to either modify the characteristics of the element, or provide |
| documentation. |
| |
| Note: The attribute applies *only* to the *next* element, not all |
| subsequent ones. |
| Elements after the current one revert to having no attributes. |
| |
| ## Syntax |
| |
| Attributes may include values, and multiple attributes may be stacked, for example: |
| |
| ```fidl |
| {% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/fuchsia.examples.docs/attributes.test.fidl" region_tag="attribute-many" %} |
| ``` |
| |
| Illustrates both aspects: |
| |
| * there are two attributes, `@discoverable` and `@transport`, and |
| * the `@transport` attribute takes a value from the list enumerated below. |
| |
| ## `@available` {#available} |
| |
| **USAGE**: `@available(platform="`_string_`", added=`_version_`, |
| deprecated=`_version_`, removed=`_version_`, removed=`_version_`, |
| note="`_string_`", legacy=`_legacy_`)` |
| |
| **MEANING**: |
| All arguments are optional, but at least one must be provided. |
| |
| * `platform`: Only allowed when the attribute is on the `library` declaration. |
| Must be a valid [library name element][identifiers]. If omitted, defaults to |
| the first element of the library name. |
| * `added`, `deprecated`, `removed`, `replaced`: Must be an integer from 1 to |
| 2^63-1 or the special constant `HEAD`. Cannot be `LEGACY`. |
| * `removed` and `replaced` are mutually exclusive. |
| * Must respect `added <= deprecated < removed` or |
| `added <= deprecated < replaced`. |
| * `note`: Only allowed if `deprecated` is provided. Should contain a brief |
| explanation indicating what to use instead, suitable to be included in |
| compiler error messages. |
| * `legacy`: Only allowed if `removed` is provided or inherited. False by |
| default. If true, the element is included in the `LEGACY` version. |
| |
| See [FIDL versioning](versioning.md) for more details. |
| |
| ## `@deprecated` {#deprecated} |
| |
| **USAGE**: `@deprecated` |
| |
| **MEANING**: |
| See [RFC-0058]. |
| |
| Note: Not implemented. |
| |
| ## `@discoverable` {#discoverable} |
| |
| **USAGE**: `@discoverable(name=`_name_`)` |
| |
| **MEANING**: |
| Assigns a name to use for service discovery. That is to say, a `@discoverable` |
| protocol can be served under the given name, and clients that connect to |
| that protocol can search for it under the same name. This makes it possible to |
| have a client search for the correct name without manually ensuring that the |
| lookup name matches the one passed on the server side. |
| |
| If _name_ is omitted, a name is generated based on the library and protocol name |
| (e.g. `some.library.SomeProtocol`). If _name_ is provided, it must follow the |
| same format. Note that this is **not** the [fully qualified name], which would |
| use a slash (e.g. `some.library/SomeProtocol`). |
| |
| ## `@doc` {#doc} |
| |
| **USAGE**: `@doc("`_string_`")` |
| |
| **MEANING**: |
| In FIDL, comments can start with two ("`//`") or three slashes ("`///`"), |
| or they can be embodied within a `@doc` attribute. |
| The two-slash variant does not propagate the comments to the generated |
| target, whereas both the three-slash and `@doc` variants do. |
| |
| That is: |
| |
| ```fidl |
| {% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/fuchsia.examples.docs/attributes.test.fidl" region_tag="doc-with-slashes" %} |
| ``` |
| |
| and |
| |
| ```fidl |
| {% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/fuchsia.examples.docs/attributes.test.fidl" region_tag="doc-with-attributes" %} |
| ``` |
| |
| have the same effect — one ("`///`") is syntactic sugar for the other. |
| The text of the comment is |
| emitted into the generated code, in a manner compatible with the syntax of |
| the target language. |
| |
| Note: To be identical, the `@doc` version should be `@doc(" Foo\n")`. Note |
| the space before the "Foo" and the line-feed "`\n`". |
| |
| ## `@generated_name` {#generated-name} |
| |
| **USAGE**: `@generated_name("Foo")` |
| |
| **MEANING**: This attribute is used to override the name that `fidlc` reserves |
| for any inline layout. This can be useful when a different name is preferred |
| (for example, to avoid a name conflict with another type). |
| |
| As an example, the following code leads to a name conflict, because both inline |
| layouts reserve the same name of `Options`: |
| |
| ```fidl |
| table StartupConfig { |
| 1: options table { |
| ... |
| }; |
| ... |
| }; |
| |
| table TeardownConfig { |
| 2: options table { |
| ... |
| }; |
| }; |
| ``` |
| |
| One way to disambiguate between the two is to manually specify different |
| generated names: |
| |
| ```fidl |
| table StartupConfig { |
| 1: options |
| @generated_name("StartupOptions") table { |
| ... |
| }; |
| ... |
| }; |
| |
| table TeardownConfig { |
| 1: options |
| @generated_name("TeardownOptions") table { |
| ... |
| }; |
| ... |
| }; |
| ``` |
| |
| ## `@no_doc` {#nodoc} |
| |
| **USAGE**: `@no_doc` |
| |
| **MEANING**: |
| This attribute is used to mark libraries that should be skipped by documentation |
| generation tools. As an example, this attribute is used by generated FIDL |
| libraries, such as by the [driver bind compiler](/docs/development/drivers/concepts/device_driver_model/driver-binding.md). |
| |
| ## `@selector` {#selector} |
| |
| **USAGE**: `@selector("`_selector_`")` |
| |
| **MEANING**: |
| Allows you to change the hashing basis for the method ordinal, see [RFC-0020]. |
| The _selector_ can be either the original method's name (e.g. `SomeMethod`), |
| or the [fully qualified name] (e.g. `some.library/SomeProtocol.SomeMethod`). |
| |
| It can be used to rename a method without breaking ABI compatibility. |
| For example, if we wish to rename the `Investigate` method to `Experiment` |
| in the `Science` interface, we can write: |
| |
| ```fidl |
| {% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/fuchsia.examples.docs/attributes.test.fidl" region_tag="selector-simple" %} |
| ``` |
| |
| The attribute can also be used to handle a method moving from one protocol to |
| another, or to one library to another, or both. For example, consider the method |
| `Productionize` on the `Org` protocol in the `fuchsia.examples.docs` library |
| which was originally named `Discover` on the `Area120` protocol, in the |
| `purple.examples.docs` library: |
| |
| ```fidl |
| {% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/fuchsia.examples.docs/attributes.test.fidl" region_tag="selector-fq-name" %} |
| ``` |
| |
| ## `@transitional` {#transitional} |
| |
| **USAGE**: `@transitional("`_description_`")` |
| |
| **MEANING**: |
| Instructs bindings to generate code that will successfully build, regardless of |
| whether the method is implemented or not. |
| [RFC-0021] contains more details. |
| |
| ## `@transport` {#transport} |
| |
| **USAGE**: `@transport("`_tranportList_`")` |
| |
| **MEANING**: |
| Allows you to select a transport. |
| Provide a comma-separated list of values, selected from: |
| |
| * `Channel` — use a [Zircon channel][channel]. |
| * `Syscall` — transport used to specify that the protocol is used to |
| define Zircon syscalls, rather than typical IPC. |
| |
| The default is `Channel` if none is specified. |
| If you do specify a value or values, then only those values are used (e.g., |
| specifying `@transport("Foo")` disables `Channel` and uses only |
| `Foo`). |
| |
| ## `@unknown` {#unknown} |
| |
| **USAGE**: `@unknown` |
| |
| **MEANING**: |
| `@unknown` can be placed on an enum member to indicate that this member represents |
| a specific unknown placeholder. Its purpose is to make it possible to transition a strict enum |
| that was manually implementing flexible behavior with an extra "unknown" member |
| to transition into a flexible enum: annotating the member representing unknown |
| with the `@unknown` attribute before transitioning to flexible ensures that |
| the `@unknown` member is treated as unknown data, instead of as a |
| known member. Once usages of the `@unknown` member are removed, the member is |
| no longer necessary. |
| |
| <!-- xrefs --> |
| [channel]: /docs/reference/kernel_objects/channel.md |
| [RFC-0020]: /docs/contribute/governance/rfcs/0020_interface_ordinal_hashing.md |
| [RFC-0021]: /docs/contribute/governance/rfcs/0021_soft_transitions_methods_add_remove.md |
| [RFC-0058]: /docs/contribute/governance/rfcs/0058_deprecated_attribute.md |
| [identifiers]: /docs/reference/fidl/language/language.md#identifiers |
| [fully qualified name]: /docs/contribute/governance/rfcs/0043_documentation_comment_format.md#fully-qualified-names |