rustc_span/
edition.rs
1use std::fmt;
2use std::str::FromStr;
3
4use rustc_macros::{Decodable, Encodable, HashStable_Generic};
5
6#[derive(Clone, Copy, Hash, PartialEq, PartialOrd, Debug, Encodable, Decodable, Eq)]
8#[derive(HashStable_Generic)]
9pub enum Edition {
10 Edition2015,
20 Edition2018,
22 Edition2021,
24 Edition2024,
26}
27
28pub const ALL_EDITIONS: &[Edition] =
30 &[Edition::Edition2015, Edition::Edition2018, Edition::Edition2021, Edition::Edition2024];
31
32pub const EDITION_NAME_LIST: &str = "2015|2018|2021|2024";
33
34pub const DEFAULT_EDITION: Edition = Edition::Edition2015;
35
36pub const LATEST_STABLE_EDITION: Edition = Edition::Edition2024;
37
38impl fmt::Display for Edition {
39 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
40 let s = match *self {
41 Edition::Edition2015 => "2015",
42 Edition::Edition2018 => "2018",
43 Edition::Edition2021 => "2021",
44 Edition::Edition2024 => "2024",
45 };
46 write!(f, "{s}")
47 }
48}
49
50impl Edition {
51 pub fn lint_name(self) -> &'static str {
52 match self {
53 Edition::Edition2015 => "rust_2015_compatibility",
54 Edition::Edition2018 => "rust_2018_compatibility",
55 Edition::Edition2021 => "rust_2021_compatibility",
56 Edition::Edition2024 => "rust_2024_compatibility",
57 }
58 }
59
60 pub fn is_stable(self) -> bool {
61 match self {
62 Edition::Edition2015 => true,
63 Edition::Edition2018 => true,
64 Edition::Edition2021 => true,
65 Edition::Edition2024 => true,
66 }
67 }
68
69 pub fn is_rust_2015(self) -> bool {
71 self == Edition::Edition2015
72 }
73
74 pub fn at_least_rust_2018(self) -> bool {
76 self >= Edition::Edition2018
77 }
78
79 pub fn at_least_rust_2021(self) -> bool {
81 self >= Edition::Edition2021
82 }
83
84 pub fn at_least_rust_2024(self) -> bool {
86 self >= Edition::Edition2024
87 }
88}
89
90impl FromStr for Edition {
91 type Err = ();
92 fn from_str(s: &str) -> Result<Self, ()> {
93 match s {
94 "2015" => Ok(Edition::Edition2015),
95 "2018" => Ok(Edition::Edition2018),
96 "2021" => Ok(Edition::Edition2021),
97 "2024" => Ok(Edition::Edition2024),
98 _ => Err(()),
99 }
100 }
101}