@@ -4,10 +4,9 @@ use parser::{ParseError, TreeSink};
4
4
use rustc_hash:: { FxHashMap , FxHashSet } ;
5
5
use syntax:: {
6
6
ast:: { self , make:: tokens:: doc_comment} ,
7
- tokenize , AstToken , Parse , PreorderWithTokens , SmolStr , SyntaxElement , SyntaxKind ,
7
+ AstToken , Parse , PreorderWithTokens , SmolStr , SyntaxElement , SyntaxKind ,
8
8
SyntaxKind :: * ,
9
- SyntaxNode , SyntaxToken , SyntaxTreeBuilder , TextRange , TextSize , Token as RawToken , WalkEvent ,
10
- T ,
9
+ SyntaxNode , SyntaxToken , SyntaxTreeBuilder , TextRange , TextSize , WalkEvent , T ,
11
10
} ;
12
11
use tt:: buffer:: { Cursor , TokenBuffer } ;
13
12
@@ -69,15 +68,14 @@ pub fn token_tree_to_syntax_node(
69
68
70
69
/// Convert a string to a `TokenTree`
71
70
pub 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 ( ) {
74
73
return None ;
75
74
}
76
75
77
76
let mut conv = RawConvertor {
78
- text,
79
- offset : TextSize :: default ( ) ,
80
- inner : tokens. iter ( ) ,
77
+ lexed : lexed,
78
+ pos : 0 ,
81
79
id_alloc : TokenIdAlloc {
82
80
map : Default :: default ( ) ,
83
81
global_offset : TextSize :: default ( ) ,
@@ -146,7 +144,7 @@ fn convert_tokens<C: TokenConvertor>(conv: &mut C) -> tt::Subtree {
146
144
Some ( it) => it,
147
145
} ;
148
146
149
- let k: SyntaxKind = token. kind ( ) ;
147
+ let k: SyntaxKind = token. kind ( & conv ) ;
150
148
if k == COMMENT {
151
149
if let Some ( tokens) = conv. convert_doc_comment ( & token) {
152
150
// 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 {
199
197
} else {
200
198
let spacing = match conv. peek ( ) {
201
199
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 ! [ '(' ] =>
206
204
{
207
205
tt:: Spacing :: Alone
208
206
}
209
- Some ( next) if next. kind ( ) . is_punct ( ) && next. kind ( ) != UNDERSCORE => {
207
+ Some ( next) if next. kind ( & conv ) . is_punct ( ) && next. kind ( & conv ) != UNDERSCORE => {
210
208
tt:: Spacing :: Joint
211
209
}
212
210
_ => tt:: Spacing :: Alone ,
213
211
} ;
214
- let char = match token. to_char ( ) {
212
+ let char = match token. to_char ( & conv ) {
215
213
Some ( c) => c,
216
214
None => {
217
215
panic ! ( "Token from lexer must be single char: token = {:#?}" , token) ;
@@ -222,7 +220,7 @@ fn convert_tokens<C: TokenConvertor>(conv: &mut C) -> tt::Subtree {
222
220
} else {
223
221
macro_rules! make_leaf {
224
222
( $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( )
226
224
} ;
227
225
}
228
226
let leaf: tt:: Leaf = match k {
@@ -243,7 +241,7 @@ fn convert_tokens<C: TokenConvertor>(conv: &mut C) -> tt::Subtree {
243
241
244
242
let r = TextRange :: at ( range. start ( ) + char_unit, range. len ( ) - char_unit) ;
245
243
let ident = tt:: Leaf :: from ( tt:: Ident {
246
- text : SmolStr :: new ( & token. to_text ( ) [ 1 ..] ) ,
244
+ text : SmolStr :: new ( & token. to_text ( conv ) [ 1 ..] ) ,
247
245
id : conv. id_alloc ( ) . alloc ( r) ,
248
246
} ) ;
249
247
result. push ( ident. into ( ) ) ;
@@ -392,22 +390,21 @@ impl TokenIdAlloc {
392
390
393
391
/// A Raw Token (straightly from lexer) convertor
394
392
struct RawConvertor < ' a > {
395
- text : & ' a str ,
396
- offset : TextSize ,
393
+ lexed : parser :: LexedStr < ' a > ,
394
+ pos : usize ,
397
395
id_alloc : TokenIdAlloc ,
398
- inner : std:: slice:: Iter < ' a , RawToken > ,
399
396
}
400
397
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 ;
403
400
404
- fn to_char ( & self ) -> Option < char > ;
401
+ fn to_char ( & self , ctx : & Ctx ) -> Option < char > ;
405
402
406
- fn to_text ( & self ) -> SmolStr ;
403
+ fn to_text ( & self , ctx : & Ctx ) -> SmolStr ;
407
404
}
408
405
409
- trait TokenConvertor {
410
- type Token : SrcToken ;
406
+ trait TokenConvertor : Sized {
407
+ type Token : SrcToken < Self > ;
411
408
412
409
fn convert_doc_comment ( & self , token : & Self :: Token ) -> Option < Vec < tt:: TokenTree > > ;
413
410
@@ -418,42 +415,45 @@ trait TokenConvertor {
418
415
fn id_alloc ( & mut self ) -> & mut TokenIdAlloc ;
419
416
}
420
417
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 )
424
421
}
425
422
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 ( )
428
425
}
429
426
430
- fn to_text ( & self ) -> SmolStr {
431
- self . 1 . into ( )
427
+ fn to_text ( & self , ctx : & RawConvertor < ' _ > ) -> SmolStr {
428
+ ctx . lexed . text ( * self ) . into ( )
432
429
}
433
430
}
434
431
435
432
impl < ' a > TokenConvertor for RawConvertor < ' a > {
436
- type Token = ( & ' a RawToken , & ' a str ) ;
433
+ type Token = usize ;
437
434
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) )
440
438
}
441
439
442
440
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 ( ) ) ;
446
448
447
- Some ( ( ( token, & self . text [ range ] ) , range) )
449
+ Some ( ( token, range) )
448
450
}
449
451
450
452
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 )
457
457
}
458
458
459
459
fn id_alloc ( & mut self ) -> & mut TokenIdAlloc {
@@ -523,17 +523,17 @@ impl SynToken {
523
523
}
524
524
}
525
525
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 {
528
528
self . token ( ) . kind ( )
529
529
}
530
- fn to_char ( & self ) -> Option < char > {
530
+ fn to_char ( & self , _ctx : & Convertor < ' a > ) -> Option < char > {
531
531
match self {
532
532
SynToken :: Ordinary ( _) => None ,
533
533
SynToken :: Punch ( it, i) => it. text ( ) . chars ( ) . nth ( ( * i) . into ( ) ) ,
534
534
}
535
535
}
536
- fn to_text ( & self ) -> SmolStr {
536
+ fn to_text ( & self , _ctx : & Convertor < ' a > ) -> SmolStr {
537
537
self . token ( ) . text ( ) . into ( )
538
538
}
539
539
}
0 commit comments