Skip to content

Commit 6a1da08

Browse files
committed
Use transmute to convert an integer to TokenType.
1 parent 93f1c97 commit 6a1da08

File tree

1 file changed

+5
-121
lines changed

1 file changed

+5
-121
lines changed

compiler/rustc_parse/src/parser/token_type.rs

Lines changed: 5 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use rustc_span::symbol::{Symbol, kw, sym};
1616
/// We really want to keep the number of variants to 128 or fewer, so that
1717
/// `TokenTypeSet` can be implemented with a `u128`.
1818
#[derive(Debug, Clone, Copy, PartialEq)]
19+
#[repr(u8)]
1920
pub enum TokenType {
2021
// Expression-operator symbols
2122
Eq,
@@ -146,126 +147,6 @@ pub enum TokenType {
146147
}
147148

148149
impl TokenType {
149-
fn from_u32(val: u32) -> TokenType {
150-
let token_type = match val {
151-
0 => TokenType::Eq,
152-
1 => TokenType::Lt,
153-
2 => TokenType::Le,
154-
3 => TokenType::EqEq,
155-
4 => TokenType::Gt,
156-
5 => TokenType::AndAnd,
157-
6 => TokenType::OrOr,
158-
7 => TokenType::Not,
159-
8 => TokenType::Tilde,
160-
161-
9 => TokenType::Plus,
162-
10 => TokenType::Minus,
163-
11 => TokenType::Star,
164-
12 => TokenType::And,
165-
13 => TokenType::Or,
166-
167-
14 => TokenType::At,
168-
15 => TokenType::Dot,
169-
16 => TokenType::DotDot,
170-
17 => TokenType::DotDotDot,
171-
18 => TokenType::DotDotEq,
172-
19 => TokenType::Comma,
173-
20 => TokenType::Semi,
174-
21 => TokenType::Colon,
175-
22 => TokenType::PathSep,
176-
23 => TokenType::RArrow,
177-
24 => TokenType::FatArrow,
178-
25 => TokenType::Pound,
179-
26 => TokenType::Question,
180-
27 => TokenType::OpenParen,
181-
28 => TokenType::CloseParen,
182-
29 => TokenType::OpenBrace,
183-
30 => TokenType::CloseBrace,
184-
31 => TokenType::OpenBracket,
185-
32 => TokenType::CloseBracket,
186-
33 => TokenType::Eof,
187-
188-
34 => TokenType::Operator,
189-
35 => TokenType::Ident,
190-
36 => TokenType::Lifetime,
191-
37 => TokenType::Path,
192-
38 => TokenType::Type,
193-
39 => TokenType::Const,
194-
195-
40 => TokenType::KwAs,
196-
41 => TokenType::KwAsync,
197-
42 => TokenType::KwAuto,
198-
43 => TokenType::KwAwait,
199-
44 => TokenType::KwBecome,
200-
45 => TokenType::KwBox,
201-
46 => TokenType::KwBreak,
202-
47 => TokenType::KwCatch,
203-
48 => TokenType::KwConst,
204-
49 => TokenType::KwContinue,
205-
50 => TokenType::KwCrate,
206-
51 => TokenType::KwDefault,
207-
52 => TokenType::KwDyn,
208-
53 => TokenType::KwElse,
209-
54 => TokenType::KwEnum,
210-
55 => TokenType::KwExtern,
211-
56 => TokenType::KwFn,
212-
57 => TokenType::KwFor,
213-
58 => TokenType::KwGen,
214-
59 => TokenType::KwIf,
215-
60 => TokenType::KwImpl,
216-
61 => TokenType::KwIn,
217-
62 => TokenType::KwLet,
218-
63 => TokenType::KwLoop,
219-
64 => TokenType::KwMacro,
220-
65 => TokenType::KwMacroRules,
221-
66 => TokenType::KwMatch,
222-
67 => TokenType::KwMod,
223-
68 => TokenType::KwMove,
224-
69 => TokenType::KwMut,
225-
70 => TokenType::KwPub,
226-
71 => TokenType::KwRaw,
227-
72 => TokenType::KwRef,
228-
73 => TokenType::KwReturn,
229-
74 => TokenType::KwReuse,
230-
75 => TokenType::KwSafe,
231-
76 => TokenType::KwSelfUpper,
232-
77 => TokenType::KwStatic,
233-
78 => TokenType::KwStruct,
234-
79 => TokenType::KwTrait,
235-
80 => TokenType::KwTry,
236-
81 => TokenType::KwType,
237-
82 => TokenType::KwUnderscore,
238-
83 => TokenType::KwUnsafe,
239-
84 => TokenType::KwUse,
240-
85 => TokenType::KwWhere,
241-
86 => TokenType::KwWhile,
242-
87 => TokenType::KwYield,
243-
244-
88 => TokenType::SymAttSyntax,
245-
89 => TokenType::SymClobberAbi,
246-
90 => TokenType::SymInlateout,
247-
91 => TokenType::SymInout,
248-
92 => TokenType::SymIs,
249-
93 => TokenType::SymLabel,
250-
94 => TokenType::SymLateout,
251-
95 => TokenType::SymMayUnwind,
252-
96 => TokenType::SymNomem,
253-
97 => TokenType::SymNoreturn,
254-
98 => TokenType::SymNostack,
255-
99 => TokenType::SymOptions,
256-
100 => TokenType::SymOut,
257-
101 => TokenType::SymPreservesFlags,
258-
102 => TokenType::SymPure,
259-
103 => TokenType::SymReadonly,
260-
104 => TokenType::SymSym,
261-
262-
_ => panic!("unhandled value: {val}"),
263-
};
264-
// This assertion will detect if this method and the type definition get out of sync.
265-
assert_eq!(token_type as u32, val);
266-
token_type
267-
}
268-
269150
pub(super) fn is_keyword(&self) -> Option<Symbol> {
270151
match self {
271152
TokenType::KwAs => Some(kw::As),
@@ -614,7 +495,10 @@ impl Iterator for TokenTypeSetIter {
614495
None
615496
} else {
616497
self.0.0 &= !(1 << z); // clear the trailing 1 bit
617-
Some(TokenType::from_u32(z))
498+
499+
// SAFETY: `TokenType` is a `repr(u8)` enum.
500+
let token_type = unsafe { std::mem::transmute(z as u8) };
501+
Some(token_type)
618502
}
619503
}
620504
}

0 commit comments

Comments
 (0)