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
Copy file name to clipboardExpand all lines: src/procedural-macros.md
+21-5Lines changed: 21 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -232,10 +232,8 @@ r[macro.proc.attribute]
232
232
## The `proc_macro_attribute` attribute
233
233
234
234
r[macro.proc.attribute.intro]
235
-
*Attribute macros* define new [outer attributes][attributes] which can be attached to [items], including items in [`extern` blocks], inherent and trait [implementations], and [trait definitions].
235
+
The *`proc_macro_attribute` [attribute][attributes]* defines an *attribute macro* which can be used as an [outer attribute][attributes].
236
236
237
-
r[macro.proc.attribute.def]
238
-
Attribute macros are defined by a [public] [function] with the `proc_macro_attribute` [attribute] that has a signature of `(TokenStream, TokenStream) -> TokenStream`. The first [`TokenStream`] is the delimited token tree following the attribute's name, not including the outer delimiters. If the attribute is written as a bare attribute name, the attribute [`TokenStream`] is empty. The second [`TokenStream`] is the rest of the [item] including other [attributes] on the [item]. The returned [`TokenStream`] replaces the [item] with an arbitrary number of [items].
239
237
> [!EXAMPLE]
240
238
> The following attribute macro takes the input stream and returns it as is, effectively being the no-op of attributes.
241
239
>
@@ -251,8 +249,6 @@ Attribute macros are defined by a [public] [function] with the `proc_macro_a
251
249
> }
252
250
> ```
253
251
254
-
r[macro.proc.attribute.namespace]
255
-
The `proc_macro_attribute` attribute defines the attribute in the [macro namespace] in the root of the crate.
256
252
> [!EXAMPLE]
257
253
> This following example shows the stringified [`TokenStream`s] that the attribute macros see. The output will show in the output of the compiler. The output is shown in the comments after the function prefixed with "out:".
258
254
>
@@ -302,12 +298,32 @@ The `proc_macro_attribute` attribute defines the attribute in the [macro namespa
302
298
> // out: item: "fn invoke4() {}"
303
299
> ```
304
300
301
+
r[macro.proc.attribute.syntax]
302
+
The `proc_macro_attribute` attribute uses the [MetaWord] syntax and thus does not take any inputs.
303
+
304
+
r[macro.proc.attribute.allowed-positions]
305
+
The `proc_macro_attribute` attribute may only be applied to a function with the signature of `pub fn(TokenStream, 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.
305
306
307
+
r[macro.proc.attribute.duplicates]
308
+
The `proc_macro_attribute` attribute may only be specified once on a function.
309
+
310
+
r[macro.proc.attribute.namespace]
311
+
The `proc_macro_attribute` attribute defines the attribute in the [macro namespace] in the root of the crate with the same name as the function.
306
312
313
+
r[macro.proc.attribute.use-positions]
314
+
Attribute macros can only be used on:
307
315
316
+
- [items]
317
+
- items in [`extern` blocks]
318
+
- inherent and trait [implementations]
319
+
- [trait definitions]
308
320
321
+
r[macro.proc.attribute.behavior]
322
+
The first [`TokenStream`] parameter is the delimited token tree following the attribute's name, not including the outer delimiters. If the attribute is written as a bare attribute name, the [`TokenStream`] is empty.
309
323
324
+
The second [`TokenStream`] is the rest of the [item] including other [attributes] on the [item].
310
325
326
+
The returned [`TokenStream`] replaces the [item] with an arbitrary number of [items].
311
327
312
328
r[macro.proc.token]
313
329
## Declarative macro tokens and procedural macro tokens
0 commit comments