Skip to content

Commit 4f3e4ba

Browse files
committed
fix: fix syntax bridge panic when spilting float
1 parent 1649637 commit 4f3e4ba

2 files changed

Lines changed: 64 additions & 2 deletions

File tree

crates/syntax-bridge/src/lib.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -903,7 +903,20 @@ impl TtTreeSink<'_> {
903903
}
904904
self.text_pos += TextSize::of(text);
905905
}
906-
None => unreachable!(),
906+
None => {
907+
self.error("illegal float literal".to_owned());
908+
self.inner.start_node(SyntaxKind::ERROR);
909+
self.inner.token(SyntaxKind::FLOAT_NUMBER, text);
910+
self.token_map.push(self.text_pos + TextSize::of(text), span);
911+
self.inner.finish_node();
912+
self.inner.finish_node();
913+
914+
if !has_pseudo_dot {
915+
self.inner.finish_node();
916+
}
917+
918+
self.text_pos += TextSize::of(text);
919+
}
907920
}
908921
self.cursor.bump();
909922
}

crates/syntax-bridge/src/tests.rs

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use expect_test::expect;
12
use rustc_hash::FxHashMap;
23
use span::Span;
34
use syntax::{AstNode, ast};
@@ -7,7 +8,7 @@ use tt::{Leaf, Punct, Spacing, buffer::Cursor};
78
use crate::{
89
DocCommentDesugarMode,
910
dummy_test_span_utils::{DUMMY, DummyTestSpanMap},
10-
syntax_node_to_token_tree,
11+
parse_to_token_tree_static_span, syntax_node_to_token_tree, token_tree_to_syntax_node,
1112
};
1213

1314
fn check_punct_spacing(fixture: &str) {
@@ -97,3 +98,51 @@ fn main() {
9798
"#,
9899
);
99100
}
101+
102+
#[test]
103+
fn scientific_notation_field_access_recovers() {
104+
let tt = parse_to_token_tree_static_span(
105+
span::Edition::CURRENT,
106+
DUMMY,
107+
r#"
108+
fn main() {
109+
s.00E+10;
110+
}
111+
"#,
112+
)
113+
.unwrap();
114+
115+
let (parse, _) = token_tree_to_syntax_node(&tt, parser::TopEntryPoint::SourceFile, &mut |_| {
116+
span::Edition::CURRENT
117+
});
118+
let parse = parse.cast::<ast::SourceFile>().unwrap();
119+
120+
expect![[r#"
121+
SOURCE_FILE@0..19
122+
FN@0..19
123+
FN_KW@0..2 "fn"
124+
NAME@2..6
125+
IDENT@2..6 "main"
126+
PARAM_LIST@6..8
127+
L_PAREN@6..7 "("
128+
R_PAREN@7..8 ")"
129+
BLOCK_EXPR@8..19
130+
STMT_LIST@8..19
131+
L_CURLY@8..9 "{"
132+
EXPR_STMT@9..18
133+
FIELD_EXPR@9..17
134+
FIELD_EXPR@9..17
135+
PATH_EXPR@9..10
136+
PATH@9..10
137+
PATH_SEGMENT@9..10
138+
NAME_REF@9..10
139+
IDENT@9..10 "s"
140+
DOT@10..11 "."
141+
ERROR@11..17
142+
FLOAT_NUMBER@11..17 "00E+10"
143+
SEMICOLON@17..18 ";"
144+
R_CURLY@18..19 "}"
145+
error 11..11: illegal float literal
146+
"#]]
147+
.assert_eq(&parse.debug_dump());
148+
}

0 commit comments

Comments
 (0)