12
12
13
13
#[ cfg( feature = "unstable" ) ]
14
14
extern crate proc_macro;
15
- #[ cfg( feature = "unstable" ) ]
16
- use proc_macro:: TokenStream ;
17
15
18
16
#[ cfg( not( feature = "unstable" ) ) ]
19
17
#[ macro_use]
20
18
extern crate proc_macro_hack;
21
19
20
+ extern crate proc_macro2;
22
21
extern crate syn;
23
22
24
23
#[ macro_use]
@@ -27,14 +26,15 @@ extern crate quote;
27
26
extern crate unindent;
28
27
use unindent:: * ;
29
28
30
- use syn:: { TokenTree , Token , Lit } ;
29
+ use proc_macro2:: TokenStream ;
30
+ use syn:: { Lit , LitStr , LitByteStr } ;
31
31
32
32
use std:: fmt:: Debug ;
33
33
use std:: str:: FromStr ;
34
34
35
35
#[ cfg( feature = "unstable" ) ]
36
36
#[ proc_macro]
37
- pub fn indoc ( input : TokenStream ) -> TokenStream {
37
+ pub fn indoc ( input : proc_macro :: TokenStream ) -> proc_macro :: TokenStream {
38
38
expand ( & input)
39
39
}
40
40
@@ -50,34 +50,33 @@ fn expand<T, R>(input: &T) -> R
50
50
R : FromStr ,
51
51
R :: Err : Debug
52
52
{
53
- let source = input. to_string ( ) ;
54
-
55
- let tts = syn:: parse_token_trees ( & source) . unwrap ( ) ;
53
+ let source = input. to_string ( ) . parse :: < TokenStream > ( ) . unwrap ( ) ;
56
54
57
- if tts. len ( ) != 1 {
58
- panic ! ( "argument must be a single string literal, but got {} arguments" , tts. len( ) ) ;
55
+ let len = source. clone ( ) . into_iter ( ) . count ( ) ;
56
+ if len != 1 {
57
+ panic ! ( "argument must be a single string literal, but got {} arguments" , len) ;
59
58
}
60
59
61
- let tt = tts. into_iter ( ) . next ( ) . unwrap ( ) ;
62
-
63
- let mut lit = match tt {
64
- TokenTree :: Token ( Token :: Literal ( lit) ) => lit,
65
- _ => {
60
+ let lit = match syn:: parse2 :: < Lit > ( source) {
61
+ Ok ( lit) => lit,
62
+ Err ( _) => {
66
63
panic ! ( "argument must be a single string literal" ) ;
67
64
}
68
65
} ;
69
66
70
- match lit {
71
- Lit :: Str ( ref mut s, _style) => {
72
- * s = unindent ( s) ;
67
+ let lit = match lit {
68
+ Lit :: Str ( lit) => {
69
+ let v = unindent ( & lit. value ( ) ) ;
70
+ Lit :: Str ( LitStr :: new ( & v, lit. span ( ) ) )
73
71
}
74
- Lit :: ByteStr ( ref mut v, _style) => {
75
- * v = unindent_bytes ( v) ;
72
+ Lit :: ByteStr ( lit) => {
73
+ let v = unindent_bytes ( & lit. value ( ) ) ;
74
+ Lit :: ByteStr ( LitByteStr :: new ( & v, lit. span ( ) ) )
76
75
}
77
76
_ => {
78
77
panic ! ( "argument must be a single string literal" ) ;
79
78
}
80
- }
79
+ } ;
81
80
82
- quote ! ( #lit) . parse ( ) . unwrap ( )
81
+ quote ! ( #lit) . to_string ( ) . parse ( ) . unwrap ( )
83
82
}
0 commit comments