Skip to content

Commit 26ec2c3

Browse files
authored
Merge pull request rust-lang#1764 from ehuss/edition-admonition
Add edition admonitions
2 parents e95ebdf + 05e9434 commit 26ec2c3

23 files changed

+122
-75
lines changed

docs/authoring.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ When assigning rules to new paragraphs, or when modifying rule names, use the fo
9595
* If the rule is naming a specific Rust language construct (e.g. an attribute, standard library type/function, or keyword-introduced concept), use the construct as named in the language, appropriately case-adjusted (but do not replace `_`s with `-`s).
9696
* Other than Rust language concepts with `_`s in the name, use `-` characters to separate words within a "subrule".
9797
* Whenever possible, do not repeat previous components of the rule.
98-
* Edition differences admonitions should typically be named by the edition referenced directly by the rule. If multiple editions are named, use the one for which the behavior is defined by the admonition, and not by a previous paragraph.
98+
* Edition differences admonitions should typically be named by the edition where the behavior changed. You should be able to correspond the dates to the chapters in <https://doc.rust-lang.org/edition-guide/>.
9999
* Target specific admonitions should typically be named by the least specific target property to which they apply (e.g. if a rule affects all x86 CPUs, the rule name should include `x86` rather than separately listing `i586`, `i686` and `x86_64`, and if a rule applies to all ELF platforms, it should be named `elf` rather than listing every ELF OS).
100100
* Use an appropriately descriptive, but short, name if the language does not provide one.
101101

@@ -197,4 +197,10 @@ The reference does not document which targets exist, or the properties of specif
197197

198198
### Editions
199199

200-
The main text and flow should document only the current edition. Whenever there is a difference between editions, the differences should be called out with an "Edition differences" block.
200+
The main text and flow should document only the current edition. Whenever there is a difference between editions, the differences should be called out with an edition block, such as:
201+
202+
```markdown
203+
r[foo.bar.edition2021]
204+
> [!EDITION-2021]
205+
> Describe what changed in 2021.
206+
```

mdbook-spec/src/lib.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,18 @@ impl Spec {
155155
let blockquote = &caps["blockquote"];
156156
let initial_spaces = blockquote.chars().position(|ch| ch != ' ').unwrap_or(0);
157157
let space = &blockquote[..initial_spaces];
158+
if lower.starts_with("edition-") {
159+
let edition = &lower[8..];
160+
return format!("{space}<div class=\"alert alert-edition\">\n\
161+
\n\
162+
{space}> <p class=\"alert-title\">\
163+
<span class=\"alert-title-edition\">{edition}</span> Edition differences</p>\n\
164+
{space} >\n\
165+
{blockquote}\n\
166+
\n\
167+
{space}</div>\n");
168+
}
169+
158170
// These icons are from GitHub, MIT License, see https://github.com/primer/octicons
159171
let svg = match lower.as_str() {
160172
"note" => "<path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path>",

src/abi.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ with the same name (or with a well-known symbol), leading to undefined behavior.
7474
extern "C" fn foo() {}
7575
```
7676

77-
> **Edition differences**: Before the 2024 edition it is allowed to use the `no_mangle` attribute without the `unsafe` qualification.
77+
> [!EDITION-2024]
78+
> Before the 2024 edition it is allowed to use the `no_mangle` attribute without the `unsafe` qualification.
7879
7980
## The `link_section` attribute
8081

@@ -92,7 +93,8 @@ of memory not expecting them, such as mutable data into read-only areas.
9293
pub static VAR1: u32 = 1;
9394
```
9495

95-
> **Edition differences**: Before the 2024 edition it is allowed to use the `link_section` attribute without the `unsafe` qualification.
96+
> [!EDITION-2024]
97+
> Before the 2024 edition it is allowed to use the `link_section` attribute without the `unsafe` qualification.
9698
9799
## The `export_name` attribute
98100

@@ -109,7 +111,8 @@ behavior.
109111
pub fn name_in_rust() { }
110112
```
111113

112-
> **Edition differences**: Before the 2024 edition it is allowed to use the `export_name` attribute without the `unsafe` qualification.
114+
> [!EDITION-2024]
115+
> Before the 2024 edition it is allowed to use the `export_name` attribute without the `unsafe` qualification.
113116
114117
[_MetaNameValueStr_]: attributes.md#meta-item-attribute-syntax
115118
[`static` items]: items/static-items.md

src/destructors.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,8 @@ smallest scope that contains the expression and is one of the following:
215215
> The [scrutinee] of a `match` expression is not a temporary scope, so temporaries in the scrutinee can be dropped after the `match` expression. For example, the temporary for `1` in `match 1 { ref mut z => z };` lives until the end of the statement.
216216
217217
r[destructors.scope.temporary.edition2024]
218-
> **Edition differences**: The 2024 edition added two new temporary scope narrowing rules: `if let` temporaries are dropped before the `else` block, and temporaries of tail expressions of blocks are dropped immediately after the tail expression is evaluated.
218+
> [!EDITION-2024]
219+
> The 2024 edition added two new temporary scope narrowing rules: `if let` temporaries are dropped before the `else` block, and temporaries of tail expressions of blocks are dropped immediately after the tail expression is evaluated.
219220
220221
Some examples:
221222

src/expressions/await-expr.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ More specifically, an await expression has the following effect.
2727
5. If the call to `poll` returns [`Poll::Pending`], then the future returns `Poll::Pending`, suspending its state so that, when the surrounding async context is re-polled,execution returns to step 3;
2828
6. Otherwise the call to `poll` must have returned [`Poll::Ready`], in which case the value contained in the [`Poll::Ready`] variant is used as the result of the `await` expression itself.
2929

30-
> **Edition differences**: Await expressions are only available beginning with Rust 2018.
30+
r[expr.await.edition2018]
31+
> [!EDITION-2018]
32+
> Await expressions are only available beginning with Rust 2018.
3133
3234
r[expr.await.task]
3335
## Task context

src/expressions/block-expr.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,9 @@ The actual data format for this type is unspecified.
114114
> [!NOTE]
115115
> The future type that rustc generates is roughly equivalent to an enum with one variant per `await` point, where each variant stores the data needed to resume from its corresponding point.
116116
117-
> **Edition differences**: Async blocks are only available beginning with Rust 2018.
117+
r[expr.block.async.edition2018]
118+
> [!EDITION-2018]
119+
> Async blocks are only available beginning with Rust 2018.
118120
119121
r[expr.block.async.capture]
120122
### Capture modes

src/expressions/closure-expr.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ async fn example() {
7878
```
7979

8080
r[expr.closure.async.edition2018]
81-
> **Edition differences**: Async closures are only available beginning with Rust 2018.
81+
> [!EDITION-2018]
82+
> Async closures are only available beginning with Rust 2018.
8283
8384
## Example
8485

src/expressions/method-call-expr.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,9 @@ r[expr.method.ambiguous-search]
7979
If a step is reached where there is more than one possible method, such as where generic methods or traits are considered the same, then it is a compiler error.
8080
These cases require a [disambiguating function call syntax] for method and function invocation.
8181
82-
> **Edition differences**: Before the 2021 edition, during the search for visible methods, if the candidate receiver type is an [array type], methods provided by the standard library [`IntoIterator`] trait are ignored.
82+
r[expr.method.edition2021]
83+
> [!EDITION-2021]
84+
> Before the 2021 edition, during the search for visible methods, if the candidate receiver type is an [array type], methods provided by the standard library [`IntoIterator`] trait are ignored.
8385
>
8486
> The edition used for this purpose is determined by the token representing the method name.
8587
>

src/introduction.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,10 @@ These conventions are documented here.
7878

7979
An *example term* is an example of a term being defined.
8080

81-
* Differences in the language by which edition the crate is compiled under are in a blockquote that start with the words "Edition differences:" in **bold**.
81+
* The main text describes the latest stable edition. Differences to previous editions are separated in edition blocks:
8282

83-
> **Edition differences**: In the 2015 edition, this syntax is valid that is disallowed as of the 2018 edition.
83+
> [!EDITION-2018]
84+
> In the 2015 edition, this syntax is valid that is disallowed as of the 2018 edition.
8485
8586
* Notes that contain useful information about the state of the book or point out useful, but mostly out of scope, information are in note blocks.
8687

src/items/associated-items.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,10 +211,9 @@ let circle_shape = Circle::new();
211211
let bounding_box = circle_shape.bounding_box();
212212
```
213213

214-
r[items.associated.fn.params.edition2015]
215-
> **Edition differences**: In the 2015 edition, it is possible to declare trait
216-
> methods with anonymous parameters (e.g. `fn foo(u8)`). This is deprecated and
217-
> an error as of the 2018 edition. All parameters must have an argument name.
214+
r[items.associated.fn.params.edition2018]
215+
> [!EDITION-2018]
216+
> In the 2015 edition, it is possible to declare trait methods with anonymous parameters (e.g. `fn foo(u8)`). This is deprecated and an error as of the 2018 edition. All parameters must have an argument name.
218217
219218
r[items.associated.fn.param-attributes]
220219
#### Attributes on method parameters

0 commit comments

Comments
 (0)