You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
One thing worth highlighting is that we're preferring to say that we
"declare" (rather than "define") derive macro helper attributes. A
definition is something that says what something is. For these
attributes, though, we're just declaring that they exist.
In revising, we've clarified that the derive macro function must
appear in the root of the crate and that it may be `const` and may use
`extern` (with the allowed ABI) but may not use other qualifiers.
We've also changed the syntax to use `IDENTIFIER` rather than
`SimplePathSegment`. In testing, none of the other things that would
be accepted by the latter are allowed, so it seems more correct in
terms of user-visible behavior to use `IDENTIFIER` here.
Copy file name to clipboardExpand all lines: src/procedural-macros.md
+21-21Lines changed: 21 additions & 21 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -134,10 +134,10 @@ r[macro.proc.derive]
134
134
## The `proc_macro_derive` attribute
135
135
136
136
r[macro.proc.derive.intro]
137
-
The *`proc_macro_derive`[attribute][attributes]*defines a *derive macro*which defines an input for the [`derive` attribute]. These macros can create new [items]given the token stream of a [struct], [enum], or [union]. They can also define[derive macro helper attributes].
137
+
Applying the *`proc_macro_derive`[attribute]* to a function defines a *derive macro*that can be invoked by the [`derive` attribute]. These macros are given the token stream of a [struct], [enum], or [union] definition and can emit new [items] after it. They can also declare and use[derive macro helper attributes].
138
138
139
139
> [!EXAMPLE]
140
-
> The following is an example of a derive macro. Instead of doing anything useful with its input, it just appends a function`answer`.
140
+
> This derive macro ignores its input and appends tokens that define a function.
141
141
>
142
142
> <!-- ignore: test doesn't support proc-macro -->
143
143
> ```rust,ignore
@@ -151,7 +151,7 @@ The *`proc_macro_derive` [attribute][attributes]* defines a *derive macro* which
151
151
> }
152
152
> ```
153
153
>
154
-
> And then using said derive macro:
154
+
> To use it, we might write:
155
155
>
156
156
> <!-- ignore: requires external crates -->
157
157
> ```rust,ignore
@@ -167,63 +167,63 @@ The *`proc_macro_derive` [attribute][attributes]* defines a *derive macro* which
167
167
> ```
168
168
169
169
r[macro.proc.derive.syntax]
170
-
The `proc_macro_derive` attribute uses the following syntax:
170
+
The syntax for the `proc_macro_derive` attribute is:
The [DeriveMacroName] is the name of the derive macro. The optional `attributes`are described in [macro.proc.derive.attributes].
182
+
The name of the derive macro is given by [DeriveMacroName]. The optional `attributes`argument is described in [macro.proc.derive.attributes].
183
183
184
184
r[macro.proc.derive.allowed-positions]
185
-
The `proc_macro_derive` attribute may only be applied to a function with the signature of `pub fn(TokenStream) -> TokenStream` where [`TokenStream`] comes from the [`proc_macro` crate]. It must have the ["Rust" ABI][items.fn.extern]. No other function qualifiers are allowed.
185
+
The `proc_macro_derive` attribute may only be applied to a `pub`function with the [Rust ABI][items.fn.extern] defined in the root of the crate with a type of `fn(TokenStream) -> TokenStream`where [`TokenStream`] comes from the [`proc_macro` crate]. The function may be `const` and may use `extern` to explicitly specify the Rust ABI, but it may not use any other [qualifiers][FunctionQualifiers] (e.g. it may not be `async` or `unsafe`).
186
186
187
187
r[macro.proc.derive.duplicates]
188
-
The `proc_macro_derive` attribute may only be specified once on a function.
188
+
The `proc_macro_derive` attribute may be specified only once on a function.
189
189
190
190
r[macro.proc.derive.namespace]
191
-
The `proc_macro_derive` attribute publicly defines the custom derive in the [macro namespace] in the root of the crate with the name given in the attribute.
191
+
The `proc_macro_derive` attribute publicly defines the derive macro in the [macro namespace] in the root of the crate.
192
192
193
193
r[macro.proc.derive.output]
194
-
The input [`TokenStream`] is the token stream of the item that has the `derive` attribute on it. The output [`TokenStream`] must be a set of items that are then appended to the [module] or [block] that the item from the input [`TokenStream`] is in.
194
+
The input [`TokenStream`] is the token stream of the item to which the `derive` attribute is applied. The output [`TokenStream`] must be a (possibly empty) set of items. These items are appended following the input item within the same [module] or [block].
195
195
196
196
r[macro.proc.derive.attributes]
197
197
### Derive macro helper attributes
198
198
199
199
r[macro.proc.derive.attributes.intro]
200
-
Derive macros can add additional [attributes] into the scope of the [item]they are on. Said attributes are called *derive macro helper attributes*. These attributes are [inert], and their only purpose is to be fed into the derive macro that defined them. That said, they can be seen by all macros.
200
+
Derive macros can declare *derive macro helper attributes* to be used within the scope of the [item]to which the derive macro is applied. These [attributes] are [inert]. While their purpose is to be used by the macro that declared them, they can be seen by any macro.
201
201
202
-
r[macro.proc.derive.attributes.def]
203
-
The way to define helper attributes is to put an `attributes` key in the `proc_macro_derive` macro with a comma separated list of identifiers that are the names of the helper attributes.
202
+
r[macro.proc.derive.attributes.decl]
203
+
A helper attribute for a derive macro is declared by adding its identifier to the `attributes`list in the `proc_macro_derive` attribute.
204
204
205
205
> [!EXAMPLE]
206
-
> The following derive macro defines a helper attribute `helper`, but ultimately doesn't do anything with it.
206
+
> This declares a helper attribute and then ignores it.
207
207
>
208
208
> <!-- ignore: test doesn't support proc-macro -->
0 commit comments