@@ -95,7 +95,7 @@ pub fn token_tree_to_syntax_node(
9595 parser:: Step :: Token { kind, n_input_tokens : n_raw_tokens } => {
9696 tree_sink. token ( kind, n_raw_tokens)
9797 }
98- parser:: Step :: FloatSplit { .. } => tree_sink. token ( SyntaxKind :: FLOAT_NUMBER , 1 ) ,
98+ parser:: Step :: FloatSplit { has_pseudo_dot } => tree_sink. float_split ( has_pseudo_dot ) ,
9999 parser:: Step :: Enter { kind } => tree_sink. start_node ( kind) ,
100100 parser:: Step :: Exit => tree_sink. finish_node ( ) ,
101101 parser:: Step :: Error { msg } => tree_sink. error ( msg. to_string ( ) ) ,
@@ -797,6 +797,41 @@ fn delim_to_str(d: tt::DelimiterKind, closing: bool) -> Option<&'static str> {
797797}
798798
799799impl < ' a > TtTreeSink < ' a > {
800+ fn float_split ( & mut self , has_pseudo_dot : bool ) {
801+ let ( text, _span) = match self . cursor . token_tree ( ) {
802+ Some ( tt:: buffer:: TokenTreeRef :: Leaf ( tt:: Leaf :: Literal ( lit) , _) ) => {
803+ ( lit. text . as_str ( ) , lit. span )
804+ }
805+ _ => unreachable ! ( ) ,
806+ } ;
807+ match text. split_once ( '.' ) {
808+ Some ( ( left, right) ) => {
809+ assert ! ( !left. is_empty( ) ) ;
810+ self . inner . start_node ( SyntaxKind :: NAME_REF ) ;
811+ self . inner . token ( SyntaxKind :: INT_NUMBER , left) ;
812+ self . inner . finish_node ( ) ;
813+
814+ // here we move the exit up, the original exit has been deleted in process
815+ self . inner . finish_node ( ) ;
816+
817+ self . inner . token ( SyntaxKind :: DOT , "." ) ;
818+
819+ if has_pseudo_dot {
820+ assert ! ( right. is_empty( ) ) ;
821+ } else {
822+ self . inner . start_node ( SyntaxKind :: NAME_REF ) ;
823+ self . inner . token ( SyntaxKind :: INT_NUMBER , right) ;
824+ self . inner . finish_node ( ) ;
825+
826+ // the parser creates an unbalanced start node, we are required to close it here
827+ self . inner . finish_node ( ) ;
828+ }
829+ }
830+ None => unreachable ! ( ) ,
831+ }
832+ self . cursor = self . cursor . bump ( ) ;
833+ }
834+
800835 fn token ( & mut self , kind : SyntaxKind , mut n_tokens : u8 ) {
801836 if kind == LIFETIME_IDENT {
802837 n_tokens = 2 ;
0 commit comments