Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 1bc3305

Browse files
author
Jonas Schievink
committed
Split float literal tokens at the .
1 parent 502c519 commit 1bc3305

File tree

23 files changed

+157
-72
lines changed

23 files changed

+157
-72
lines changed

crates/ide/src/syntax_highlighting/highlight.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub(super) fn token(sema: &Semantics<RootDatabase>, token: SyntaxToken) -> Optio
3030
INT_NUMBER if token.ancestors().nth(1).map(|it| it.kind()) == Some(FIELD_EXPR) => {
3131
SymbolKind::Field.into()
3232
}
33-
INT_NUMBER | FLOAT_NUMBER => HlTag::NumericLiteral.into(),
33+
INT_NUMBER | FLOAT_NUMBER_PART => HlTag::NumericLiteral.into(),
3434
BYTE => HlTag::ByteLiteral.into(),
3535
CHAR => HlTag::CharLiteral.into(),
3636
IDENT if token.parent().and_then(ast::TokenTree::cast).is_some() => {

crates/ide/src/syntax_highlighting/test_data/highlight_strings.html

Lines changed: 7 additions & 7 deletions
Large diffs are not rendered by default.

crates/mbe/src/syntax_bridge.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,35 @@ fn convert_tokens<C: TokenConvertor>(conv: &mut C) -> tt::Subtree {
260260
IDENT => make_leaf!(Ident),
261261
UNDERSCORE => make_leaf!(Ident),
262262
k if k.is_keyword() => make_leaf!(Ident),
263+
FLOAT_NUMBER_PART => {
264+
// Reassemble a split-up float token.
265+
let mut range = range;
266+
let mut text = token.to_text(conv).to_string();
267+
if let Some(dot) = conv.peek() {
268+
if dot.kind(conv) == DOT {
269+
let (_, dot_range) = conv.bump().unwrap();
270+
text += &*dot.to_text(conv);
271+
range = TextRange::new(range.start(), dot_range.end());
272+
273+
if let Some(tail) = conv.peek() {
274+
if tail.kind(conv) == FLOAT_NUMBER_PART {
275+
let (_, tail_range) = conv.bump().unwrap();
276+
text += &*tail.to_text(conv);
277+
range = TextRange::new(range.start(), tail_range.end());
278+
}
279+
}
280+
}
281+
}
282+
283+
result.push(
284+
tt::Leaf::from(tt::Literal {
285+
id: conv.id_alloc().alloc(range, synth_id),
286+
text: text.into(),
287+
})
288+
.into(),
289+
);
290+
continue;
291+
}
263292
k if k.is_literal() => make_leaf!(Literal),
264293
LIFETIME_IDENT => {
265294
let char_unit = TextSize::of('\'');

crates/mbe/src/to_parser_input.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,13 @@ pub(crate) fn to_parser_input(buffer: &TokenBuffer) -> parser::Input {
3535
let is_negated = lit.text.starts_with('-');
3636
let inner_text = &lit.text[if is_negated { 1 } else { 0 }..];
3737

38-
let kind = parser::LexedStr::single_token(inner_text)
39-
.map(|(kind, _error)| kind)
40-
.filter(|kind| {
41-
kind.is_literal()
42-
&& (!is_negated || matches!(kind, FLOAT_NUMBER | INT_NUMBER))
43-
})
44-
.unwrap_or_else(|| panic!("Fail to convert given literal {:#?}", &lit));
45-
46-
res.push(kind);
38+
let lexed_str = parser::LexedStr::new(inner_text);
39+
if lexed_str.is_empty() {
40+
panic!("failed to convert literal: {:?}", lit);
41+
}
42+
for i in 0..lexed_str.len() {
43+
res.push(lexed_str.kind(i));
44+
}
4745
}
4846
tt::Leaf::Ident(ident) => match ident.text.as_ref() {
4947
"_" => res.push(T![_]),

crates/parser/src/grammar.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ fn name_ref(p: &mut Parser) {
318318
}
319319

320320
fn name_ref_or_index(p: &mut Parser) {
321-
assert!(p.at(IDENT) || p.at(INT_NUMBER));
321+
assert!(p.at(IDENT) || p.at(INT_NUMBER) || p.at(FLOAT_NUMBER_PART));
322322
let m = p.start();
323323
p.bump_any();
324324
m.complete(p, NAME_REF);

crates/parser/src/grammar/expressions.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -475,11 +475,8 @@ fn field_expr(p: &mut Parser, lhs: CompletedMarker) -> CompletedMarker {
475475
assert!(p.at(T![.]));
476476
let m = lhs.precede(p);
477477
p.bump(T![.]);
478-
if p.at(IDENT) || p.at(INT_NUMBER) {
478+
if p.at(IDENT) || p.at(INT_NUMBER) || p.at(FLOAT_NUMBER_PART) {
479479
name_ref_or_index(p);
480-
} else if p.at(FLOAT_NUMBER) {
481-
// FIXME: How to recover and instead parse INT + T![.]?
482-
p.bump_any();
483480
} else {
484481
p.error("expected field name or number");
485482
}

crates/parser/src/grammar/expressions/atom.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub(crate) const LITERAL_FIRST: TokenSet = TokenSet::new(&[
1717
T![true],
1818
T![false],
1919
INT_NUMBER,
20-
FLOAT_NUMBER,
20+
FLOAT_NUMBER_PART,
2121
BYTE,
2222
CHAR,
2323
STRING,
@@ -29,11 +29,19 @@ pub(crate) fn literal(p: &mut Parser) -> Option<CompletedMarker> {
2929
return None;
3030
}
3131
let m = p.start();
32-
if p.at(FLOAT_NUMBER) {
32+
if p.at(FLOAT_NUMBER_PART) {
33+
// Floats can be up to 3 tokens: 2 `FLOAT_NUMBER_PART`s separated by 1 `DOT`
3334
let f = p.start();
34-
p.bump(FLOAT_NUMBER);
35+
p.bump(FLOAT_NUMBER_PART);
36+
if p.at(DOT) {
37+
p.bump(DOT);
38+
if p.at(FLOAT_NUMBER_PART) {
39+
p.bump(FLOAT_NUMBER_PART);
40+
}
41+
}
3542
f.complete(p, FLOAT_LITERAL);
3643
} else {
44+
// Everything else is just one token.
3745
p.bump_any();
3846
}
3947
Some(m.complete(p, LITERAL))

crates/parser/src/grammar/patterns.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ fn atom_pat(p: &mut Parser, recovery_set: TokenSet) -> Option<CompletedMarker> {
140140
}
141141

142142
fn is_literal_pat_start(p: &Parser) -> bool {
143-
p.at(T![-]) && (p.nth(1) == INT_NUMBER || p.nth(1) == FLOAT_NUMBER)
143+
p.at(T![-]) && (p.nth(1) == INT_NUMBER || p.nth(1) == FLOAT_NUMBER_PART)
144144
|| p.at_ts(expressions::LITERAL_FIRST)
145145
}
146146

crates/parser/src/lexed_str.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ impl<'a> Converter<'a> {
177177

178178
rustc_lexer::TokenKind::RawIdent => IDENT,
179179
rustc_lexer::TokenKind::Literal { kind, .. } => {
180-
self.extend_literal(token_text.len(), kind);
180+
self.extend_literal(token_text, kind);
181181
return;
182182
}
183183

@@ -223,7 +223,7 @@ impl<'a> Converter<'a> {
223223
self.push(syntax_kind, token_text.len(), err);
224224
}
225225

226-
fn extend_literal(&mut self, len: usize, kind: &rustc_lexer::LiteralKind) {
226+
fn extend_literal(&mut self, token_text: &str, kind: &rustc_lexer::LiteralKind) {
227227
let mut err = "";
228228

229229
let syntax_kind = match *kind {
@@ -237,7 +237,22 @@ impl<'a> Converter<'a> {
237237
if empty_exponent {
238238
err = "Missing digits after the exponent symbol";
239239
}
240-
FLOAT_NUMBER
240+
241+
// In order to correctly parse nested tuple accesses like `tup.0.0`, where the `0.0`
242+
// is lexed as a float, we split floats that contain a `.` into 3 tokens.
243+
if let Some((before, after)) = token_text.split_once('.') {
244+
let err = if err.is_empty() { None } else { Some(err) };
245+
if !before.is_empty() {
246+
self.push(FLOAT_NUMBER_PART, before.len(), None);
247+
}
248+
self.push(DOT, 1, None);
249+
if !after.is_empty() {
250+
self.push(FLOAT_NUMBER_PART, after.len(), err);
251+
}
252+
return;
253+
}
254+
255+
FLOAT_NUMBER_PART
241256
}
242257
rustc_lexer::LiteralKind::Char { terminated } => {
243258
if !terminated {
@@ -295,6 +310,6 @@ impl<'a> Converter<'a> {
295310
};
296311

297312
let err = if err.is_empty() { None } else { Some(err) };
298-
self.push(syntax_kind, len, err);
313+
self.push(syntax_kind, token_text.len(), err);
299314
}
300315
}

crates/parser/src/syntax_kind/generated.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ pub enum SyntaxKind {
110110
RAW_KW,
111111
MACRO_RULES_KW,
112112
INT_NUMBER,
113-
FLOAT_NUMBER,
113+
FLOAT_NUMBER_PART,
114114
CHAR,
115115
BYTE,
116116
STRING,
@@ -287,7 +287,7 @@ impl SyntaxKind {
287287
}
288288
pub fn is_literal(self) -> bool {
289289
match self {
290-
INT_NUMBER | FLOAT_NUMBER | CHAR | BYTE | STRING | BYTE_STRING => true,
290+
INT_NUMBER | FLOAT_NUMBER_PART | CHAR | BYTE | STRING | BYTE_STRING => true,
291291
_ => false,
292292
}
293293
}
@@ -387,5 +387,5 @@ impl SyntaxKind {
387387
}
388388
}
389389
#[macro_export]
390-
macro_rules ! T { [;] => { $ crate :: SyntaxKind :: SEMICOLON } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_CURLY } ; ['}'] => { $ crate :: SyntaxKind :: R_CURLY } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; [<] => { $ crate :: SyntaxKind :: L_ANGLE } ; [>] => { $ crate :: SyntaxKind :: R_ANGLE } ; [@] => { $ crate :: SyntaxKind :: AT } ; [#] => { $ crate :: SyntaxKind :: POUND } ; [~] => { $ crate :: SyntaxKind :: TILDE } ; [?] => { $ crate :: SyntaxKind :: QUESTION } ; [$] => { $ crate :: SyntaxKind :: DOLLAR } ; [&] => { $ crate :: SyntaxKind :: AMP } ; [|] => { $ crate :: SyntaxKind :: PIPE } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [*] => { $ crate :: SyntaxKind :: STAR } ; [/] => { $ crate :: SyntaxKind :: SLASH } ; [^] => { $ crate :: SyntaxKind :: CARET } ; [%] => { $ crate :: SyntaxKind :: PERCENT } ; [_] => { $ crate :: SyntaxKind :: UNDERSCORE } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [..] => { $ crate :: SyntaxKind :: DOT2 } ; [...] => { $ crate :: SyntaxKind :: DOT3 } ; [..=] => { $ crate :: SyntaxKind :: DOT2EQ } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLON2 } ; [=] => { $ crate :: SyntaxKind :: EQ } ; [==] => { $ crate :: SyntaxKind :: EQ2 } ; [=>] => { $ crate :: SyntaxKind :: FAT_ARROW } ; [!] => { $ crate :: SyntaxKind :: BANG } ; [!=] => { $ crate :: SyntaxKind :: NEQ } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [->] => { $ crate :: SyntaxKind :: THIN_ARROW } ; [<=] => { $ crate :: SyntaxKind :: LTEQ } ; [>=] => { $ crate :: SyntaxKind :: GTEQ } ; [+=] => { $ crate :: SyntaxKind :: PLUSEQ } ; [-=] => { $ crate :: SyntaxKind :: MINUSEQ } ; [|=] => { $ crate :: SyntaxKind :: PIPEEQ } ; [&=] => { $ crate :: SyntaxKind :: AMPEQ } ; [^=] => { $ crate :: SyntaxKind :: CARETEQ } ; [/=] => { $ crate :: SyntaxKind :: SLASHEQ } ; [*=] => { $ crate :: SyntaxKind :: STAREQ } ; [%=] => { $ crate :: SyntaxKind :: PERCENTEQ } ; [&&] => { $ crate :: SyntaxKind :: AMP2 } ; [||] => { $ crate :: SyntaxKind :: PIPE2 } ; [<<] => { $ crate :: SyntaxKind :: SHL } ; [>>] => { $ crate :: SyntaxKind :: SHR } ; [<<=] => { $ crate :: SyntaxKind :: SHLEQ } ; [>>=] => { $ crate :: SyntaxKind :: SHREQ } ; [as] => { $ crate :: SyntaxKind :: AS_KW } ; [async] => { $ crate :: SyntaxKind :: ASYNC_KW } ; [await] => { $ crate :: SyntaxKind :: AWAIT_KW } ; [box] => { $ crate :: SyntaxKind :: BOX_KW } ; [break] => { $ crate :: SyntaxKind :: BREAK_KW } ; [const] => { $ crate :: SyntaxKind :: CONST_KW } ; [continue] => { $ crate :: SyntaxKind :: CONTINUE_KW } ; [crate] => { $ crate :: SyntaxKind :: CRATE_KW } ; [dyn] => { $ crate :: SyntaxKind :: DYN_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [enum] => { $ crate :: SyntaxKind :: ENUM_KW } ; [extern] => { $ crate :: SyntaxKind :: EXTERN_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [fn] => { $ crate :: SyntaxKind :: FN_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [impl] => { $ crate :: SyntaxKind :: IMPL_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [let] => { $ crate :: SyntaxKind :: LET_KW } ; [loop] => { $ crate :: SyntaxKind :: LOOP_KW } ; [macro] => { $ crate :: SyntaxKind :: MACRO_KW } ; [match] => { $ crate :: SyntaxKind :: MATCH_KW } ; [mod] => { $ crate :: SyntaxKind :: MOD_KW } ; [move] => { $ crate :: SyntaxKind :: MOVE_KW } ; [mut] => { $ crate :: SyntaxKind :: MUT_KW } ; [pub] => { $ crate :: SyntaxKind :: PUB_KW } ; [ref] => { $ crate :: SyntaxKind :: REF_KW } ; [return] => { $ crate :: SyntaxKind :: RETURN_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [Self] => { $ crate :: SyntaxKind :: SELF_TYPE_KW } ; [static] => { $ crate :: SyntaxKind :: STATIC_KW } ; [struct] => { $ crate :: SyntaxKind :: STRUCT_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [trait] => { $ crate :: SyntaxKind :: TRAIT_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [try] => { $ crate :: SyntaxKind :: TRY_KW } ; [type] => { $ crate :: SyntaxKind :: TYPE_KW } ; [unsafe] => { $ crate :: SyntaxKind :: UNSAFE_KW } ; [use] => { $ crate :: SyntaxKind :: USE_KW } ; [where] => { $ crate :: SyntaxKind :: WHERE_KW } ; [while] => { $ crate :: SyntaxKind :: WHILE_KW } ; [yield] => { $ crate :: SyntaxKind :: YIELD_KW } ; [auto] => { $ crate :: SyntaxKind :: AUTO_KW } ; [default] => { $ crate :: SyntaxKind :: DEFAULT_KW } ; [existential] => { $ crate :: SyntaxKind :: EXISTENTIAL_KW } ; [union] => { $ crate :: SyntaxKind :: UNION_KW } ; [raw] => { $ crate :: SyntaxKind :: RAW_KW } ; [macro_rules] => { $ crate :: SyntaxKind :: MACRO_RULES_KW } ; [lifetime_ident] => { $ crate :: SyntaxKind :: LIFETIME_IDENT } ; [ident] => { $ crate :: SyntaxKind :: IDENT } ; [shebang] => { $ crate :: SyntaxKind :: SHEBANG } ; [float_number] => { $ crate :: SyntaxKind :: FLOAT_NUMBER } ; }
390+
macro_rules ! T { [;] => { $ crate :: SyntaxKind :: SEMICOLON } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_CURLY } ; ['}'] => { $ crate :: SyntaxKind :: R_CURLY } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; [<] => { $ crate :: SyntaxKind :: L_ANGLE } ; [>] => { $ crate :: SyntaxKind :: R_ANGLE } ; [@] => { $ crate :: SyntaxKind :: AT } ; [#] => { $ crate :: SyntaxKind :: POUND } ; [~] => { $ crate :: SyntaxKind :: TILDE } ; [?] => { $ crate :: SyntaxKind :: QUESTION } ; [$] => { $ crate :: SyntaxKind :: DOLLAR } ; [&] => { $ crate :: SyntaxKind :: AMP } ; [|] => { $ crate :: SyntaxKind :: PIPE } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [*] => { $ crate :: SyntaxKind :: STAR } ; [/] => { $ crate :: SyntaxKind :: SLASH } ; [^] => { $ crate :: SyntaxKind :: CARET } ; [%] => { $ crate :: SyntaxKind :: PERCENT } ; [_] => { $ crate :: SyntaxKind :: UNDERSCORE } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [..] => { $ crate :: SyntaxKind :: DOT2 } ; [...] => { $ crate :: SyntaxKind :: DOT3 } ; [..=] => { $ crate :: SyntaxKind :: DOT2EQ } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLON2 } ; [=] => { $ crate :: SyntaxKind :: EQ } ; [==] => { $ crate :: SyntaxKind :: EQ2 } ; [=>] => { $ crate :: SyntaxKind :: FAT_ARROW } ; [!] => { $ crate :: SyntaxKind :: BANG } ; [!=] => { $ crate :: SyntaxKind :: NEQ } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [->] => { $ crate :: SyntaxKind :: THIN_ARROW } ; [<=] => { $ crate :: SyntaxKind :: LTEQ } ; [>=] => { $ crate :: SyntaxKind :: GTEQ } ; [+=] => { $ crate :: SyntaxKind :: PLUSEQ } ; [-=] => { $ crate :: SyntaxKind :: MINUSEQ } ; [|=] => { $ crate :: SyntaxKind :: PIPEEQ } ; [&=] => { $ crate :: SyntaxKind :: AMPEQ } ; [^=] => { $ crate :: SyntaxKind :: CARETEQ } ; [/=] => { $ crate :: SyntaxKind :: SLASHEQ } ; [*=] => { $ crate :: SyntaxKind :: STAREQ } ; [%=] => { $ crate :: SyntaxKind :: PERCENTEQ } ; [&&] => { $ crate :: SyntaxKind :: AMP2 } ; [||] => { $ crate :: SyntaxKind :: PIPE2 } ; [<<] => { $ crate :: SyntaxKind :: SHL } ; [>>] => { $ crate :: SyntaxKind :: SHR } ; [<<=] => { $ crate :: SyntaxKind :: SHLEQ } ; [>>=] => { $ crate :: SyntaxKind :: SHREQ } ; [as] => { $ crate :: SyntaxKind :: AS_KW } ; [async] => { $ crate :: SyntaxKind :: ASYNC_KW } ; [await] => { $ crate :: SyntaxKind :: AWAIT_KW } ; [box] => { $ crate :: SyntaxKind :: BOX_KW } ; [break] => { $ crate :: SyntaxKind :: BREAK_KW } ; [const] => { $ crate :: SyntaxKind :: CONST_KW } ; [continue] => { $ crate :: SyntaxKind :: CONTINUE_KW } ; [crate] => { $ crate :: SyntaxKind :: CRATE_KW } ; [dyn] => { $ crate :: SyntaxKind :: DYN_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [enum] => { $ crate :: SyntaxKind :: ENUM_KW } ; [extern] => { $ crate :: SyntaxKind :: EXTERN_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [fn] => { $ crate :: SyntaxKind :: FN_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [impl] => { $ crate :: SyntaxKind :: IMPL_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [let] => { $ crate :: SyntaxKind :: LET_KW } ; [loop] => { $ crate :: SyntaxKind :: LOOP_KW } ; [macro] => { $ crate :: SyntaxKind :: MACRO_KW } ; [match] => { $ crate :: SyntaxKind :: MATCH_KW } ; [mod] => { $ crate :: SyntaxKind :: MOD_KW } ; [move] => { $ crate :: SyntaxKind :: MOVE_KW } ; [mut] => { $ crate :: SyntaxKind :: MUT_KW } ; [pub] => { $ crate :: SyntaxKind :: PUB_KW } ; [ref] => { $ crate :: SyntaxKind :: REF_KW } ; [return] => { $ crate :: SyntaxKind :: RETURN_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [Self] => { $ crate :: SyntaxKind :: SELF_TYPE_KW } ; [static] => { $ crate :: SyntaxKind :: STATIC_KW } ; [struct] => { $ crate :: SyntaxKind :: STRUCT_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [trait] => { $ crate :: SyntaxKind :: TRAIT_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [try] => { $ crate :: SyntaxKind :: TRY_KW } ; [type] => { $ crate :: SyntaxKind :: TYPE_KW } ; [unsafe] => { $ crate :: SyntaxKind :: UNSAFE_KW } ; [use] => { $ crate :: SyntaxKind :: USE_KW } ; [where] => { $ crate :: SyntaxKind :: WHERE_KW } ; [while] => { $ crate :: SyntaxKind :: WHILE_KW } ; [yield] => { $ crate :: SyntaxKind :: YIELD_KW } ; [auto] => { $ crate :: SyntaxKind :: AUTO_KW } ; [default] => { $ crate :: SyntaxKind :: DEFAULT_KW } ; [existential] => { $ crate :: SyntaxKind :: EXISTENTIAL_KW } ; [union] => { $ crate :: SyntaxKind :: UNION_KW } ; [raw] => { $ crate :: SyntaxKind :: RAW_KW } ; [macro_rules] => { $ crate :: SyntaxKind :: MACRO_RULES_KW } ; [lifetime_ident] => { $ crate :: SyntaxKind :: LIFETIME_IDENT } ; [ident] => { $ crate :: SyntaxKind :: IDENT } ; [shebang] => { $ crate :: SyntaxKind :: SHEBANG } ; [float_number_part] => { $ crate :: SyntaxKind :: FLOAT_NUMBER_PART } ; }
391391
pub use T;

0 commit comments

Comments
 (0)