@@ -8,7 +8,6 @@ use std::cmp;
8
8
use std:: collections:: HashMap ;
9
9
use std:: fmt;
10
10
use std:: iter;
11
- use std:: marker:: PhantomData ;
12
11
use std:: rc:: Rc ;
13
12
use std:: str:: FromStr ;
14
13
use std:: vec;
@@ -105,13 +104,7 @@ impl fmt::Display for TokenStream {
105
104
Spacing :: Joint => joint = true ,
106
105
}
107
106
}
108
- TokenTree :: Literal ( ref tt) => {
109
- write ! ( f, "{}" , tt) ?;
110
- // handle comments
111
- if tt. inner . 0 . starts_with ( "/" ) {
112
- write ! ( f, "\n " ) ?;
113
- }
114
- }
107
+ TokenTree :: Literal ( ref tt) => write ! ( f, "{}" , tt) ?,
115
108
}
116
109
}
117
110
@@ -404,16 +397,16 @@ impl Span {
404
397
#[ derive( Copy , Clone ) ]
405
398
pub struct Term {
406
399
intern : usize ,
407
- not_send_sync : PhantomData < * const ( ) > ,
400
+ span : Span ,
408
401
}
409
402
410
403
thread_local ! ( static SYMBOLS : RefCell <Interner > = RefCell :: new( Interner :: new( ) ) ) ;
411
404
412
405
impl Term {
413
- pub fn intern ( string : & str ) -> Term {
406
+ pub fn new ( string : & str , span : Span ) -> Term {
414
407
Term {
415
408
intern : SYMBOLS . with ( |s| s. borrow_mut ( ) . intern ( string) ) ,
416
- not_send_sync : PhantomData ,
409
+ span ,
417
410
}
418
411
}
419
412
@@ -424,6 +417,14 @@ impl Term {
424
417
unsafe { & * ( s as * const str ) }
425
418
} )
426
419
}
420
+
421
+ pub fn span ( & self ) -> Span {
422
+ self . span
423
+ }
424
+
425
+ pub fn set_span ( & mut self , span : Span ) {
426
+ self . span = span;
427
+ }
427
428
}
428
429
429
430
impl fmt:: Debug for Term {
@@ -471,18 +472,28 @@ impl Interner {
471
472
}
472
473
473
474
#[ derive( Clone , Debug ) ]
474
- pub struct Literal ( String ) ;
475
+ pub struct Literal {
476
+ text : String ,
477
+ span : Span ,
478
+ }
475
479
476
480
impl Literal {
481
+ fn _new ( text : String ) -> Literal {
482
+ Literal {
483
+ text,
484
+ span : Span :: call_site ( ) ,
485
+ }
486
+ }
487
+
477
488
pub fn byte_char ( byte : u8 ) -> Literal {
478
489
match byte {
479
- 0 => Literal ( format ! ( "b'\\ 0'" ) ) ,
480
- b'\"' => Literal ( format ! ( "b'\" '" ) ) ,
490
+ 0 => Literal :: _new ( format ! ( "b'\\ 0'" ) ) ,
491
+ b'\"' => Literal :: _new ( format ! ( "b'\" '" ) ) ,
481
492
n => {
482
493
let mut escaped = "b'" . to_string ( ) ;
483
494
escaped. extend ( ascii:: escape_default ( n) . map ( |c| c as char ) ) ;
484
495
escaped. push ( '\'' ) ;
485
- Literal ( escaped)
496
+ Literal :: _new ( escaped)
486
497
}
487
498
}
488
499
}
@@ -502,11 +513,7 @@ impl Literal {
502
513
}
503
514
}
504
515
escaped. push ( '"' ) ;
505
- Literal ( escaped)
506
- }
507
-
508
- pub fn doccomment ( s : & str ) -> Literal {
509
- Literal ( s. to_string ( ) )
516
+ Literal :: _new ( escaped)
510
517
}
511
518
512
519
pub fn float ( n : f64 ) -> Literal {
@@ -517,45 +524,33 @@ impl Literal {
517
524
if !s. contains ( '.' ) {
518
525
s += ".0" ;
519
526
}
520
- Literal ( s)
527
+ Literal :: _new ( s)
521
528
}
522
529
523
530
pub fn integer ( s : i64 ) -> Literal {
524
- Literal ( s. to_string ( ) )
531
+ Literal :: _new ( s. to_string ( ) )
525
532
}
526
533
527
- pub fn raw_string ( s : & str , pounds : usize ) -> Literal {
528
- let mut ret = format ! ( "r" ) ;
529
- ret. extend ( ( 0 ..pounds) . map ( |_| "#" ) ) ;
530
- ret. push ( '"' ) ;
531
- ret. push_str ( s) ;
532
- ret. push ( '"' ) ;
533
- ret. extend ( ( 0 ..pounds) . map ( |_| "#" ) ) ;
534
- Literal ( ret)
534
+ pub fn span ( & self ) -> Span {
535
+ self . span
535
536
}
536
537
537
- pub fn raw_byte_string ( s : & str , pounds : usize ) -> Literal {
538
- let mut ret = format ! ( "br" ) ;
539
- ret. extend ( ( 0 ..pounds) . map ( |_| "#" ) ) ;
540
- ret. push ( '"' ) ;
541
- ret. push_str ( s) ;
542
- ret. push ( '"' ) ;
543
- ret. extend ( ( 0 ..pounds) . map ( |_| "#" ) ) ;
544
- Literal ( ret)
538
+ pub fn set_span ( & mut self , span : Span ) {
539
+ self . span = span;
545
540
}
546
541
}
547
542
548
543
impl fmt:: Display for Literal {
549
544
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
550
- self . 0 . fmt ( f)
545
+ self . text . fmt ( f)
551
546
}
552
547
}
553
548
554
549
macro_rules! ints {
555
550
( $( $t: ty, ) * ) => { $(
556
551
impl From <$t> for Literal {
557
552
fn from( t: $t) -> Literal {
558
- Literal ( format!( concat!( "{}" , stringify!( $t) ) , t) )
553
+ Literal :: _new ( format!( concat!( "{}" , stringify!( $t) ) , t) )
559
554
}
560
555
}
561
556
) * }
@@ -572,7 +567,7 @@ macro_rules! floats {
572
567
fn from( t: $t) -> Literal {
573
568
assert!( !t. is_nan( ) ) ;
574
569
assert!( !t. is_infinite( ) ) ;
575
- Literal ( format!( concat!( "{}" , stringify!( $t) ) , t) )
570
+ Literal :: _new ( format!( concat!( "{}" , stringify!( $t) ) , t) )
576
571
}
577
572
}
578
573
) * }
@@ -589,13 +584,13 @@ impl<'a> From<&'a str> for Literal {
589
584
. collect :: < String > ( ) ;
590
585
s. push ( '"' ) ;
591
586
s. insert ( 0 , '"' ) ;
592
- Literal ( s)
587
+ Literal :: _new ( s)
593
588
}
594
589
}
595
590
596
591
impl From < char > for Literal {
597
592
fn from ( t : char ) -> Literal {
598
- Literal ( format ! ( "'{}'" , t. escape_default( ) . collect:: <String >( ) ) )
593
+ Literal :: _new ( format ! ( "'{}'" , t. escape_default( ) . collect:: <String >( ) ) )
599
594
}
600
595
}
601
596
@@ -710,7 +705,7 @@ fn literal(input: Cursor) -> PResult<::Literal> {
710
705
let end = start + len;
711
706
Ok ( (
712
707
a,
713
- :: Literal :: _new ( Literal ( input. rest [ start..end] . to_string ( ) ) ) ,
708
+ :: Literal :: _new ( Literal :: _new ( input. rest [ start..end] . to_string ( ) ) ) ,
714
709
) )
715
710
}
716
711
Err ( LexError ) => Err ( LexError ) ,
0 commit comments