r[comments]
Comments
r[comments.syntax]
@root LINE_COMMENT ->
`//` (~[`/` `!` LF] | `//`) ~LF*
| `//`
BLOCK_COMMENT ->
`/*`
( ~[`*` `!`] | `**` | BLOCK_COMMENT_OR_DOC )
( BLOCK_COMMENT_OR_DOC | ~`*/` )*
`*/`
| `/**/`
| `/***/`
@root INNER_LINE_DOC ->
`//!` ~[LF CR]*
INNER_BLOCK_DOC ->
`/*!` ( BLOCK_COMMENT_OR_DOC | ~[`*/` CR] )* `*/`
@root OUTER_LINE_DOC ->
`///` (~`/` ~[LF CR]*)?
OUTER_BLOCK_DOC ->
`/**`
( ~`*` | BLOCK_COMMENT_OR_DOC )
( BLOCK_COMMENT_OR_DOC | ~[`*/` CR] )*
`*/`
@root BLOCK_COMMENT_OR_DOC ->
BLOCK_COMMENT
| OUTER_BLOCK_DOC
| INNER_BLOCK_DOC
r[comments.normal]
Non-doc comments
Comments follow the general C++ style of line (//) and
block (/* ... */) comment forms. Nested block comments are supported.
r[comments.normal.tokenization] Non-doc comments are interpreted as a form of whitespace.
r[comments.doc]
Doc comments
r[comments.doc.syntax]
Line doc comments beginning with exactly three slashes (///), and block
doc comments (/** ... */), both outer doc comments, are interpreted as a
special syntax for doc attributes.
r[comments.doc.attributes]
That is, they are equivalent to writing
#[doc="..."] around the body of the comment, i.e., /// Foo turns into
#[doc="Foo"] and /** Bar */ turns into #[doc="Bar"]. They must therefore
appear before something that accepts an outer attribute.
r[comments.doc.inner-syntax]
Line comments beginning with //! and block comments /*! ... */ are
doc comments that apply to the parent of the comment, rather than the item
that follows.
r[comments.doc.inner-attributes]
That is, they are equivalent to writing #![doc="..."] around
the body of the comment. //! comments are usually used to document
modules that occupy a source file.
r[comments.doc.bare-crs]
The character U+000D (CR) is not allowed in doc comments.
[!NOTE] It is conventional for doc comments to contain Markdown, as expected by
rustdoc. However, the comment syntax does not respect any internal Markdown./** `glob = "*/*.rs";` */terminates the comment at the first*/, and the remaining code would cause a syntax error. This slightly limits the content of block doc comments compared to line doc comments.
[!NOTE] The sequence
U+000D(CR) immediately followed byU+000A(LF) would have been previously transformed into a singleU+000A(LF).
Examples
//! A doc comment that applies to the implicit anonymous module of this crate