diff --git a/src/comments.md b/src/comments.md index 784e19aff..b855f6f0e 100644 --- a/src/comments.md +++ b/src/comments.md @@ -1,13 +1,51 @@ # Comments +> **Lexer** +> LINE_COMMENT : +>       `//` (~[`/` `!`] | `//`) ~`\n`\* +>    | `//` +> +> BLOCK_COMMENT : +>       `/*` (~[`*` `!`] | `**` | _BlockCommentOrDoc_) +> (_BlockCommentOrDoc_ | ~`*/`)\* `*/` +>    | `/**/` +>    | `/***/` +> +> OUTER_LINE_DOC : +>    `//!` ~[`\n` _IsolatedCR_]\* +> +> OUTER_BLOCK_DOC : +>    `/*!` ( _BlockCommentOrDoc_ | ~[`*/` _IsolatedCR_] )\* `*/` +> +> INNER_LINE_DOC : +>    `///` (~`/` ~[`\n` _IsolatedCR_]\*)? +> +> INNER_BLOCK_DOC : +>    `/**` (~`*` | _BlockCommentOrDoc_ ) +> (_BlockCommentOrDoc_ | ~[`*/` _IsolatedCR_])\* `*/` +> +> _BlockCommentOrDoc_ : +>       BLOCK_COMMENT +>    | OUTER_BLOCK_DOC +>    | INNER_BLOCK_DOC +> +> _IsolatedCR_ : +>    _A `\r` not followed by a `\n`_ + +## Non-doc comments + Comments in Rust code follow the general C++ style of line (`//`) and block (`/* ... */`) comment forms. Nested block comments are supported. -Line comments beginning with exactly _three_ slashes (`///`), and block -comments (`/** ... */`), are interpreted as a special syntax for `doc` -[attributes]. That is, they are equivalent to writing +Non-doc comments are interpreted as a form of whitespace. + +## Doc comments + +Line doc comments beginning with exactly _three_ slashes (`///`), and block +doc comments (`/** ... */`), both inner doc comments, are interpreted as a +special syntax for `doc` [attributes]. That is, they are equivalent to writing `#[doc="..."]` around the body of the comment, i.e., `/// Foo` turns into -`#[doc="Foo"]`. +`#[doc="Foo"]` and `/** Bar */` turns into `#[doc="Bar"]`. Line comments beginning with `//!` and block comments `/*! ... */` are doc comments that apply to the parent of the comment, rather than the item @@ -15,6 +53,73 @@ that follows. 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. -Non-doc comments are interpreted as a form of whitespace. +Isolated CRs (`\r`), i.e. not followed by LF (`\n`), are not allowed in doc +comments. + +## Examples + +```rust +//! A doc comment that applies to the implicit anonymous module of this crate + +pub mod outer_module { + + //! - Inner line doc + //!! - Still an inner line doc (but with a bang at the beginning) + + /*! - Inner block doc */ + /*!! - Still an inner block doc (but with a bang at the beginning) */ + + // - Only a comment + /// - Outer line doc (exactly 3 slashes) + //// - Only a comment + + /* - Only a comment */ + /** - Outer block doc (exactly) 2 asterisks */ + /*** - Only a comment */ + + pub mod inner_module {} + + pub mod nested_comments { + /* In Rust /* we can /* nest comments */ */ */ + + // All three types of block comments can contain or be nested inside + // any other type: + + /* /* */ /** */ /*! */ */ + /*! /* */ /** */ /*! */ */ + /** /* */ /** */ /*! */ */ + pub mod dummy_item {} + } + + pub mod degenerate_cases { + // empty inner line doc + //! + + // empty inner block doc + /*!*/ + + // empty line comment + // + + // empty outer line doc + /// + + // empty block comment + /**/ + + pub mod dummy_item {} + + // empty 2-asterisk block isn't a doc block, it is a block comment + /***/ + + } + + /* The next one isn't allowed because outer doc comments + require an item that will receive the doc */ + + /// Where is my item? +# mod boo {} +} +``` [attributes]: attributes.html