Merge pull request #1596 from joshrotenberg/rust_edition_2021_support

Rust Edition 2021 Support
This commit is contained in:
Eric Huss 2021-07-06 08:34:18 -07:00 committed by GitHub
commit b571511737
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 62 additions and 6 deletions

View file

@ -63,8 +63,8 @@ Options for the Rust language, relevant to running tests and playground
integration. integration.
- **edition**: Rust edition to use by default for the code snippets. Default - **edition**: Rust edition to use by default for the code snippets. Default
is "2015". Individual code blocks can be controlled with the `edition2015` is "2015". Individual code blocks can be controlled with the `edition2015`,
or `edition2018` annotations, such as: `edition2018` or `edition2021` annotations, such as:
~~~text ~~~text
```rust,edition2015 ```rust,edition2015

View file

@ -274,6 +274,10 @@ impl MDBook {
RustEdition::E2018 => { RustEdition::E2018 => {
cmd.args(&["--edition", "2018"]); cmd.args(&["--edition", "2018"]);
} }
RustEdition::E2021 => {
cmd.args(&["--edition", "2021"])
.args(&["-Z", "unstable-options"]);
}
} }
} }

View file

@ -467,6 +467,9 @@ pub struct RustConfig {
#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)] #[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)]
/// Rust edition to use for the code. /// Rust edition to use for the code.
pub enum RustEdition { pub enum RustEdition {
/// The 2021 edition of Rust
#[serde(rename = "2021")]
E2021,
/// The 2018 edition of Rust /// The 2018 edition of Rust
#[serde(rename = "2018")] #[serde(rename = "2018")]
E2018, E2018,
@ -855,6 +858,26 @@ mod tests {
assert_eq!(got.rust, rust_should_be); assert_eq!(got.rust, rust_should_be);
} }
#[test]
fn edition_2021() {
let src = r#"
[book]
title = "mdBook Documentation"
description = "Create book from markdown files. Like Gitbook but implemented in Rust"
authors = ["Mathieu David"]
src = "./source"
[rust]
edition = "2021"
"#;
let rust_should_be = RustConfig {
edition: Some(RustEdition::E2021),
};
let got = Config::from_str(src).unwrap();
assert_eq!(got.rust, rust_should_be);
}
#[test] #[test]
fn load_arbitrary_output_type() { fn load_arbitrary_output_type() {
#[derive(Debug, Deserialize, PartialEq)] #[derive(Debug, Deserialize, PartialEq)]

View file

@ -836,13 +836,15 @@ fn add_playground_pre(
{ {
let contains_e2015 = classes.contains("edition2015"); let contains_e2015 = classes.contains("edition2015");
let contains_e2018 = classes.contains("edition2018"); let contains_e2018 = classes.contains("edition2018");
let edition_class = if contains_e2015 || contains_e2018 { let contains_e2021 = classes.contains("edition2021");
let edition_class = if contains_e2015 || contains_e2018 || contains_e2021 {
// the user forced edition, we should not overwrite it // the user forced edition, we should not overwrite it
"" ""
} else { } else {
match edition { match edition {
Some(RustEdition::E2015) => " edition2015", Some(RustEdition::E2015) => " edition2015",
Some(RustEdition::E2018) => " edition2018", Some(RustEdition::E2018) => " edition2018",
Some(RustEdition::E2021) => " edition2021",
None => "", None => "",
} }
}; };
@ -1064,4 +1066,28 @@ mod tests {
assert_eq!(&*got, *should_be); assert_eq!(&*got, *should_be);
} }
} }
#[test]
fn add_playground_edition2021() {
let inputs = [
("<code class=\"language-rust\">x()</code>",
"<pre class=\"playground\"><code class=\"language-rust edition2021\">\n<span class=\"boring\">#![allow(unused)]\n</span><span class=\"boring\">fn main() {\n</span>x()\n<span class=\"boring\">}\n</span></code></pre>"),
("<code class=\"language-rust\">fn main() {}</code>",
"<pre class=\"playground\"><code class=\"language-rust edition2021\">fn main() {}\n</code></pre>"),
("<code class=\"language-rust edition2015\">fn main() {}</code>",
"<pre class=\"playground\"><code class=\"language-rust edition2015\">fn main() {}\n</code></pre>"),
("<code class=\"language-rust edition2018\">fn main() {}</code>",
"<pre class=\"playground\"><code class=\"language-rust edition2018\">fn main() {}\n</code></pre>"),
];
for (src, should_be) in &inputs {
let got = add_playground_pre(
src,
&Playground {
editable: true,
..Playground::default()
},
Some(RustEdition::E2021),
);
assert_eq!(&*got, *should_be);
}
}
} }

View file

@ -108,9 +108,12 @@ function playground_text(playground) {
let text = playground_text(code_block); let text = playground_text(code_block);
let classes = code_block.querySelector('code').classList; let classes = code_block.querySelector('code').classList;
let has_2018 = classes.contains("edition2018"); let edition = "2015";
let edition = has_2018 ? "2018" : "2015"; if(classes.contains("edition2018")) {
edition = "2018";
} else if(classes.contains("edition2021")) {
edition = "2021";
}
var params = { var params = {
version: "stable", version: "stable",
optimize: "0", optimize: "0",