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

Commit 502c519

Browse files
author
Jonas Schievink
committed
Wrap float literals in their own node
1 parent 2d5d16f commit 502c519

File tree

13 files changed

+113
-49
lines changed

13 files changed

+113
-49
lines changed

crates/hir-def/src/body/lower.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -972,7 +972,7 @@ impl From<ast::LiteralKind> for Literal {
972972
}
973973
}
974974
LiteralKind::FloatNumber(lit) => {
975-
let ty = lit.suffix().and_then(BuiltinFloat::from_suffix);
975+
let ty = lit.suffix().and_then(|s| BuiltinFloat::from_suffix(&s));
976976
Literal::Float(Default::default(), ty)
977977
}
978978
LiteralKind::ByteString(bs) => {

crates/hir-expand/src/builtin_fn_macro.rs

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@ use base_db::{AnchoredPath, Edition, FileId};
44
use cfg::CfgExpr;
55
use either::Either;
66
use mbe::{parse_exprs_with_sep, parse_to_token_tree};
7-
use syntax::{
8-
ast::{self, AstToken},
9-
SmolStr,
10-
};
7+
use syntax::{ast, SmolStr};
118

129
use crate::{db::AstDatabase, name, quote, ExpandError, ExpandResult, MacroCallId, MacroCallLoc};
1310

@@ -358,14 +355,7 @@ fn unreachable_expand(
358355
}
359356

360357
fn unquote_str(lit: &tt::Literal) -> Option<String> {
361-
let lit = ast::make::tokens::literal(&lit.to_string());
362-
let token = ast::String::cast(lit)?;
363-
token.value().map(|it| it.into_owned())
364-
}
365-
366-
fn unquote_byte_string(lit: &tt::Literal) -> Option<Vec<u8>> {
367-
let lit = ast::make::tokens::literal(&lit.to_string());
368-
let token = ast::ByteString::cast(lit)?;
358+
let token = ast::make::literal(&lit.to_string()).as_string()?;
369359
token.value().map(|it| it.into_owned())
370360
}
371361

@@ -442,12 +432,16 @@ fn concat_bytes_expand(
442432
for (i, t) in tt.token_trees.iter().enumerate() {
443433
match t {
444434
tt::TokenTree::Leaf(tt::Leaf::Literal(lit)) => {
445-
let token = ast::make::tokens::literal(&lit.to_string());
446-
match token.kind() {
447-
syntax::SyntaxKind::BYTE => bytes.push(token.text().to_string()),
448-
syntax::SyntaxKind::BYTE_STRING => {
449-
let components = unquote_byte_string(lit).unwrap_or_else(Vec::new);
450-
components.into_iter().for_each(|x| bytes.push(x.to_string()));
435+
let lit = ast::make::literal(&lit.to_string());
436+
match lit.kind() {
437+
ast::LiteralKind::ByteString(s) => {
438+
s.value()
439+
.unwrap_or_default()
440+
.into_iter()
441+
.for_each(|x| bytes.push(x.to_string()));
442+
}
443+
ast::LiteralKind::Byte => {
444+
bytes.push(lit.to_string());
451445
}
452446
_ => {
453447
err.get_or_insert(mbe::ExpandError::UnexpectedToken.into());
@@ -481,10 +475,10 @@ fn concat_bytes_expand_subtree(
481475
for (ti, tt) in tree.token_trees.iter().enumerate() {
482476
match tt {
483477
tt::TokenTree::Leaf(tt::Leaf::Literal(lit)) => {
484-
let lit = ast::make::tokens::literal(&lit.to_string());
478+
let lit = ast::make::literal(&lit.to_string());
485479
match lit.kind() {
486-
syntax::SyntaxKind::BYTE | syntax::SyntaxKind::INT_NUMBER => {
487-
bytes.push(lit.text().to_string())
480+
ast::LiteralKind::IntNumber(_) | ast::LiteralKind::Byte => {
481+
bytes.push(lit.to_string());
488482
}
489483
_ => {
490484
return Err(mbe::ExpandError::UnexpectedToken.into());

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,13 @@ pub(crate) fn literal(p: &mut Parser) -> Option<CompletedMarker> {
2929
return None;
3030
}
3131
let m = p.start();
32-
p.bump_any();
32+
if p.at(FLOAT_NUMBER) {
33+
let f = p.start();
34+
p.bump(FLOAT_NUMBER);
35+
f.complete(p, FLOAT_LITERAL);
36+
} else {
37+
p.bump_any();
38+
}
3339
Some(m.complete(p, LITERAL))
3440
}
3541

crates/parser/src/syntax_kind/generated.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ pub enum SyntaxKind {
227227
PATH,
228228
PATH_SEGMENT,
229229
LITERAL,
230+
FLOAT_LITERAL,
230231
RENAME,
231232
VISIBILITY,
232233
WHERE_CLAUSE,
@@ -386,5 +387,5 @@ impl SyntaxKind {
386387
}
387388
}
388389
#[macro_export]
389-
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 } ; }
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 } ; }
390391
pub use T;

crates/parser/test_data/parser/inline/ok/0085_expr_literals.rast

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ SOURCE_FILE
5757
EQ "="
5858
WHITESPACE " "
5959
LITERAL
60-
FLOAT_NUMBER "2.0"
60+
FLOAT_LITERAL
61+
FLOAT_NUMBER "2.0"
6162
SEMICOLON ";"
6263
WHITESPACE "\n "
6364
LET_STMT

crates/parser/test_data/parser/ok/0056_neq_in_type.rast

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ SOURCE_FILE
1919
CAST_EXPR
2020
METHOD_CALL_EXPR
2121
LITERAL
22-
FLOAT_NUMBER "1.0f32"
22+
FLOAT_LITERAL
23+
FLOAT_NUMBER "1.0f32"
2324
DOT "."
2425
NAME_REF
2526
IDENT "floor"
@@ -40,7 +41,8 @@ SOURCE_FILE
4041
CAST_EXPR
4142
METHOD_CALL_EXPR
4243
LITERAL
43-
FLOAT_NUMBER "1.0f32"
44+
FLOAT_LITERAL
45+
FLOAT_NUMBER "1.0f32"
4446
DOT "."
4547
NAME_REF
4648
IDENT "floor"

crates/syntax/rust.ungram

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,13 +365,16 @@ MacroExpr =
365365

366366
Literal =
367367
Attr* value:(
368-
'int_number' | 'float_number'
368+
'int_number' | FloatLiteral
369369
| 'string' | 'raw_string'
370370
| 'byte_string' | 'raw_byte_string'
371371
| 'true' | 'false'
372372
| 'char' | 'byte'
373373
)
374374

375+
FloatLiteral =
376+
'float_number'
377+
375378
PathExpr =
376379
Attr* Path
377380

crates/syntax/src/ast/expr_ext.rs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ pub enum LiteralKind {
282282
String(ast::String),
283283
ByteString(ast::ByteString),
284284
IntNumber(ast::IntNumber),
285-
FloatNumber(ast::FloatNumber),
285+
FloatNumber(ast::FloatLiteral),
286286
Char(ast::Char),
287287
Byte(ast::Byte),
288288
Bool(bool),
@@ -297,16 +297,17 @@ impl ast::Literal {
297297
}
298298
pub fn kind(&self) -> LiteralKind {
299299
let token = match self.value() {
300-
rowan::NodeOrToken::Node(_node) => unreachable!(),
300+
rowan::NodeOrToken::Node(node) => {
301+
return LiteralKind::FloatNumber(
302+
ast::FloatLiteral::cast(node).expect("unreachable"),
303+
);
304+
}
301305
rowan::NodeOrToken::Token(token) => token,
302306
};
303307

304308
if let Some(t) = ast::IntNumber::cast(token.clone()) {
305309
return LiteralKind::IntNumber(t);
306310
}
307-
if let Some(t) = ast::FloatNumber::cast(token.clone()) {
308-
return LiteralKind::FloatNumber(t);
309-
}
310311
if let Some(t) = ast::String::cast(token.clone()) {
311312
return LiteralKind::String(t);
312313
}
@@ -326,6 +327,26 @@ impl ast::Literal {
326327
_ => unreachable!(),
327328
}
328329
}
330+
331+
pub fn as_string(&self) -> Option<ast::String> {
332+
match self.kind() {
333+
LiteralKind::String(it) => Some(it),
334+
_ => None,
335+
}
336+
}
337+
338+
pub fn as_byte_string(&self) -> Option<ast::ByteString> {
339+
match self.kind() {
340+
LiteralKind::ByteString(it) => Some(it),
341+
_ => None,
342+
}
343+
}
344+
}
345+
346+
impl ast::FloatLiteral {
347+
pub fn suffix(&self) -> Option<String> {
348+
ast::FloatNumber::cast(self.syntax().last_token()?)?.suffix().map(|s| s.to_string())
349+
}
329350
}
330351

331352
pub enum BlockModifier {

crates/syntax/src/ast/generated/nodes.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,6 +1085,16 @@ impl UnderscoreExpr {
10851085
pub fn underscore_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![_]) }
10861086
}
10871087

1088+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1089+
pub struct FloatLiteral {
1090+
pub(crate) syntax: SyntaxNode,
1091+
}
1092+
impl FloatLiteral {
1093+
pub fn float_number_token(&self) -> Option<SyntaxToken> {
1094+
support::token(&self.syntax, T![float_number])
1095+
}
1096+
}
1097+
10881098
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
10891099
pub struct StmtList {
10901100
pub(crate) syntax: SyntaxNode,
@@ -2719,6 +2729,17 @@ impl AstNode for UnderscoreExpr {
27192729
}
27202730
fn syntax(&self) -> &SyntaxNode { &self.syntax }
27212731
}
2732+
impl AstNode for FloatLiteral {
2733+
fn can_cast(kind: SyntaxKind) -> bool { kind == FLOAT_LITERAL }
2734+
fn cast(syntax: SyntaxNode) -> Option<Self> {
2735+
if Self::can_cast(syntax.kind()) {
2736+
Some(Self { syntax })
2737+
} else {
2738+
None
2739+
}
2740+
}
2741+
fn syntax(&self) -> &SyntaxNode { &self.syntax }
2742+
}
27222743
impl AstNode for StmtList {
27232744
fn can_cast(kind: SyntaxKind) -> bool { kind == STMT_LIST }
27242745
fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -4608,6 +4629,11 @@ impl std::fmt::Display for UnderscoreExpr {
46084629
std::fmt::Display::fmt(self.syntax(), f)
46094630
}
46104631
}
4632+
impl std::fmt::Display for FloatLiteral {
4633+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4634+
std::fmt::Display::fmt(self.syntax(), f)
4635+
}
4636+
}
46114637
impl std::fmt::Display for StmtList {
46124638
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
46134639
std::fmt::Display::fmt(self.syntax(), f)

crates/syntax/src/ast/make.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,11 @@ pub fn struct_(
799799
))
800800
}
801801

802+
pub fn literal(text: &str) -> ast::Literal {
803+
assert_eq!(text.trim(), text);
804+
ast_from_text(&format!("fn f() {{ let _ = {}; }}", text))
805+
}
806+
802807
#[track_caller]
803808
fn ast_from_text<N: AstNode>(text: &str) -> N {
804809
let parse = SourceFile::parse(text);
@@ -827,7 +832,7 @@ pub fn token(kind: SyntaxKind) -> SyntaxToken {
827832
pub mod tokens {
828833
use once_cell::sync::Lazy;
829834

830-
use crate::{ast, AstNode, Parse, SourceFile, SyntaxKind::*, SyntaxToken};
835+
use crate::{AstNode, Parse, SourceFile, SyntaxKind::*, SyntaxToken};
831836

832837
pub(super) static SOURCE_FILE: Lazy<Parse<SourceFile>> = Lazy::new(|| {
833838
SourceFile::parse(
@@ -858,12 +863,6 @@ pub mod tokens {
858863
sf.syntax().first_child_or_token().unwrap().into_token().unwrap()
859864
}
860865

861-
pub fn literal(text: &str) -> SyntaxToken {
862-
assert_eq!(text.trim(), text);
863-
let lit: ast::Literal = super::ast_from_text(&format!("fn f() {{ let _ = {}; }}", text));
864-
lit.syntax().first_child_or_token().unwrap().into_token().unwrap()
865-
}
866-
867866
pub fn single_newline() -> SyntaxToken {
868867
let res = SOURCE_FILE
869868
.tree()

0 commit comments

Comments
 (0)