@@ -4,10 +4,9 @@ use parser::{ParseError, TreeSink};
44use rustc_hash:: { FxHashMap , FxHashSet } ;
55use syntax:: {
66 ast:: { self , make:: tokens:: doc_comment} ,
7- tokenize , AstToken , Parse , PreorderWithTokens , SmolStr , SyntaxElement , SyntaxKind ,
7+ AstToken , Parse , PreorderWithTokens , SmolStr , SyntaxElement , SyntaxKind ,
88 SyntaxKind :: * ,
9- SyntaxNode , SyntaxToken , SyntaxTreeBuilder , TextRange , TextSize , Token as RawToken , WalkEvent ,
10- T ,
9+ SyntaxNode , SyntaxToken , SyntaxTreeBuilder , TextRange , TextSize , WalkEvent , T ,
1110} ;
1211use tt:: buffer:: { Cursor , TokenBuffer } ;
1312
@@ -69,15 +68,14 @@ pub fn token_tree_to_syntax_node(
6968
7069/// Convert a string to a `TokenTree`
7170pub fn parse_to_token_tree ( text : & str ) -> Option < ( tt:: Subtree , TokenMap ) > {
72- let ( tokens , errors ) = tokenize ( text) ;
73- if ! errors. is_empty ( ) {
71+ let lexed = parser :: LexedStr :: new ( text) ;
72+ if lexed . errors ( ) . next ( ) . is_some ( ) {
7473 return None ;
7574 }
7675
7776 let mut conv = RawConvertor {
78- text,
79- offset : TextSize :: default ( ) ,
80- inner : tokens. iter ( ) ,
77+ lexed : lexed,
78+ pos : 0 ,
8179 id_alloc : TokenIdAlloc {
8280 map : Default :: default ( ) ,
8381 global_offset : TextSize :: default ( ) ,
@@ -146,7 +144,7 @@ fn convert_tokens<C: TokenConvertor>(conv: &mut C) -> tt::Subtree {
146144 Some ( it) => it,
147145 } ;
148146
149- let k: SyntaxKind = token. kind ( ) ;
147+ let k: SyntaxKind = token. kind ( & conv ) ;
150148 if k == COMMENT {
151149 if let Some ( tokens) = conv. convert_doc_comment ( & token) {
152150 // FIXME: There has to be a better way to do this
@@ -199,19 +197,19 @@ fn convert_tokens<C: TokenConvertor>(conv: &mut C) -> tt::Subtree {
199197 } else {
200198 let spacing = match conv. peek ( ) {
201199 Some ( next)
202- if next. kind ( ) . is_trivia ( )
203- || next. kind ( ) == T ! [ '[' ]
204- || next. kind ( ) == T ! [ '{' ]
205- || next. kind ( ) == T ! [ '(' ] =>
200+ if next. kind ( & conv ) . is_trivia ( )
201+ || next. kind ( & conv ) == T ! [ '[' ]
202+ || next. kind ( & conv ) == T ! [ '{' ]
203+ || next. kind ( & conv ) == T ! [ '(' ] =>
206204 {
207205 tt:: Spacing :: Alone
208206 }
209- Some ( next) if next. kind ( ) . is_punct ( ) && next. kind ( ) != UNDERSCORE => {
207+ Some ( next) if next. kind ( & conv ) . is_punct ( ) && next. kind ( & conv ) != UNDERSCORE => {
210208 tt:: Spacing :: Joint
211209 }
212210 _ => tt:: Spacing :: Alone ,
213211 } ;
214- let char = match token. to_char ( ) {
212+ let char = match token. to_char ( & conv ) {
215213 Some ( c) => c,
216214 None => {
217215 panic ! ( "Token from lexer must be single char: token = {:#?}" , token) ;
@@ -222,7 +220,7 @@ fn convert_tokens<C: TokenConvertor>(conv: &mut C) -> tt::Subtree {
222220 } else {
223221 macro_rules! make_leaf {
224222 ( $i: ident) => {
225- tt:: $i { id: conv. id_alloc( ) . alloc( range) , text: token. to_text( ) } . into( )
223+ tt:: $i { id: conv. id_alloc( ) . alloc( range) , text: token. to_text( conv ) } . into( )
226224 } ;
227225 }
228226 let leaf: tt:: Leaf = match k {
@@ -243,7 +241,7 @@ fn convert_tokens<C: TokenConvertor>(conv: &mut C) -> tt::Subtree {
243241
244242 let r = TextRange :: at ( range. start ( ) + char_unit, range. len ( ) - char_unit) ;
245243 let ident = tt:: Leaf :: from ( tt:: Ident {
246- text : SmolStr :: new ( & token. to_text ( ) [ 1 ..] ) ,
244+ text : SmolStr :: new ( & token. to_text ( conv ) [ 1 ..] ) ,
247245 id : conv. id_alloc ( ) . alloc ( r) ,
248246 } ) ;
249247 result. push ( ident. into ( ) ) ;
@@ -392,22 +390,21 @@ impl TokenIdAlloc {
392390
393391/// A Raw Token (straightly from lexer) convertor
394392struct RawConvertor < ' a > {
395- text : & ' a str ,
396- offset : TextSize ,
393+ lexed : parser :: LexedStr < ' a > ,
394+ pos : usize ,
397395 id_alloc : TokenIdAlloc ,
398- inner : std:: slice:: Iter < ' a , RawToken > ,
399396}
400397
401- trait SrcToken : std:: fmt:: Debug {
402- fn kind ( & self ) -> SyntaxKind ;
398+ trait SrcToken < Ctx > : std:: fmt:: Debug {
399+ fn kind ( & self , ctx : & Ctx ) -> SyntaxKind ;
403400
404- fn to_char ( & self ) -> Option < char > ;
401+ fn to_char ( & self , ctx : & Ctx ) -> Option < char > ;
405402
406- fn to_text ( & self ) -> SmolStr ;
403+ fn to_text ( & self , ctx : & Ctx ) -> SmolStr ;
407404}
408405
409- trait TokenConvertor {
410- type Token : SrcToken ;
406+ trait TokenConvertor : Sized {
407+ type Token : SrcToken < Self > ;
411408
412409 fn convert_doc_comment ( & self , token : & Self :: Token ) -> Option < Vec < tt:: TokenTree > > ;
413410
@@ -418,42 +415,45 @@ trait TokenConvertor {
418415 fn id_alloc ( & mut self ) -> & mut TokenIdAlloc ;
419416}
420417
421- impl < ' a > SrcToken for ( & ' a RawToken , & ' a str ) {
422- fn kind ( & self ) -> SyntaxKind {
423- self . 0 . kind
418+ impl < ' a > SrcToken < RawConvertor < ' a > > for usize {
419+ fn kind ( & self , ctx : & RawConvertor < ' a > ) -> SyntaxKind {
420+ ctx . lexed . kind ( * self )
424421 }
425422
426- fn to_char ( & self ) -> Option < char > {
427- self . 1 . chars ( ) . next ( )
423+ fn to_char ( & self , ctx : & RawConvertor < ' a > ) -> Option < char > {
424+ ctx . lexed . text ( * self ) . chars ( ) . next ( )
428425 }
429426
430- fn to_text ( & self ) -> SmolStr {
431- self . 1 . into ( )
427+ fn to_text ( & self , ctx : & RawConvertor < ' _ > ) -> SmolStr {
428+ ctx . lexed . text ( * self ) . into ( )
432429 }
433430}
434431
435432impl < ' a > TokenConvertor for RawConvertor < ' a > {
436- type Token = ( & ' a RawToken , & ' a str ) ;
433+ type Token = usize ;
437434
438- fn convert_doc_comment ( & self , token : & Self :: Token ) -> Option < Vec < tt:: TokenTree > > {
439- convert_doc_comment ( & doc_comment ( token. 1 ) )
435+ fn convert_doc_comment ( & self , token : & usize ) -> Option < Vec < tt:: TokenTree > > {
436+ let text = self . lexed . text ( * token) ;
437+ convert_doc_comment ( & doc_comment ( text) )
440438 }
441439
442440 fn bump ( & mut self ) -> Option < ( Self :: Token , TextRange ) > {
443- let token = self . inner . next ( ) ?;
444- let range = TextRange :: at ( self . offset , token. len ) ;
445- self . offset += token. len ;
441+ if self . pos == self . lexed . len ( ) {
442+ return None ;
443+ }
444+ let token = self . pos ;
445+ self . pos += 1 ;
446+ let range = self . lexed . text_range ( token) ;
447+ let range = TextRange :: new ( range. start . try_into ( ) . unwrap ( ) , range. end . try_into ( ) . unwrap ( ) ) ;
446448
447- Some ( ( ( token, & self . text [ range ] ) , range) )
449+ Some ( ( token, range) )
448450 }
449451
450452 fn peek ( & self ) -> Option < Self :: Token > {
451- let token = self . inner . as_slice ( ) . get ( 0 ) ;
452-
453- token. map ( |it| {
454- let range = TextRange :: at ( self . offset , it. len ) ;
455- ( it, & self . text [ range] )
456- } )
453+ if self . pos == self . lexed . len ( ) {
454+ return None ;
455+ }
456+ Some ( self . pos )
457457 }
458458
459459 fn id_alloc ( & mut self ) -> & mut TokenIdAlloc {
@@ -523,17 +523,17 @@ impl SynToken {
523523 }
524524}
525525
526- impl SrcToken for SynToken {
527- fn kind ( & self ) -> SyntaxKind {
526+ impl < ' a > SrcToken < Convertor < ' a > > for SynToken {
527+ fn kind ( & self , _ctx : & Convertor < ' a > ) -> SyntaxKind {
528528 self . token ( ) . kind ( )
529529 }
530- fn to_char ( & self ) -> Option < char > {
530+ fn to_char ( & self , _ctx : & Convertor < ' a > ) -> Option < char > {
531531 match self {
532532 SynToken :: Ordinary ( _) => None ,
533533 SynToken :: Punch ( it, i) => it. text ( ) . chars ( ) . nth ( ( * i) . into ( ) ) ,
534534 }
535535 }
536- fn to_text ( & self ) -> SmolStr {
536+ fn to_text ( & self , _ctx : & Convertor < ' a > ) -> SmolStr {
537537 self . token ( ) . text ( ) . into ( )
538538 }
539539}
0 commit comments