@@ -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 ) ]
1920pub enum TokenType {
2021 // Expression-operator symbols
2122 Eq ,
@@ -146,126 +147,6 @@ pub enum TokenType {
146147}
147148
148149impl 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