Skip to content

Commit efe3a07

Browse files
committed
Update proc_macro_attribute to the attribute template
1 parent 37f8e90 commit efe3a07

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

src/procedural-macros.md

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -224,10 +224,8 @@ r[macro.proc.attribute]
224224
## The `proc_macro_attribute` attribute
225225

226226
r[macro.proc.attribute.intro]
227-
*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].
227+
The *`proc_macro_attribute` [attribute][attributes]* defines an *attribute macro* which can be used as an [outer attribute][attributes].
228228

229-
r[macro.proc.attribute.def]
230-
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].
231229
> [!EXAMPLE]
232230
> The following attribute macro takes the input stream and returns it as is, effectively being the no-op of attributes.
233231
>
@@ -243,8 +241,6 @@ Attribute macros are defined by a [public] [function] with the `proc_macro_a
243241
> }
244242
> ```
245243
246-
r[macro.proc.attribute.namespace]
247-
The `proc_macro_attribute` attribute defines the attribute in the [macro namespace] in the root of the crate.
248244
> [!EXAMPLE]
249245
> 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:".
250246
>
@@ -294,12 +290,32 @@ The `proc_macro_attribute` attribute defines the attribute in the [macro namespa
294290
> // out: item: "fn invoke4() {}"
295291
> ```
296292
293+
r[macro.proc.attribute.syntax]
294+
The `proc_macro_attribute` attribute uses the [MetaWord] syntax and thus does not take any inputs.
295+
296+
r[macro.proc.attribute.allowed-positions]
297+
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.
297298
299+
r[macro.proc.attribute.duplicates]
300+
The `proc_macro_attribute` attribute may only be specified once on a function.
301+
302+
r[macro.proc.attribute.namespace]
303+
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.
298304
305+
r[macro.proc.attribute.use-positions]
306+
Attribute macros can only be used on:
299307
308+
- [items]
309+
- items in [`extern` blocks]
310+
- inherent and trait [implementations]
311+
- [trait definitions]
300312
313+
r[macro.proc.attribute.behavior]
314+
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.
301315
316+
The second [`TokenStream`] is the rest of the [item] including other [attributes] on the [item].
302317
318+
The returned [`TokenStream`] replaces the [item] with an arbitrary number of [items].
303319
304320
r[macro.proc.token]
305321
## Declarative macro tokens and procedural macro tokens

0 commit comments

Comments
 (0)