@@ -44,6 +44,10 @@ extern crate syntax_pos;
44
44
extern crate rustc_errors;
45
45
extern crate rustc_data_structures;
46
46
47
+ #[ unstable( feature = "proc_macro_internals" , issue = "27812" ) ]
48
+ #[ doc( hidden) ]
49
+ pub mod rustc;
50
+
47
51
mod diagnostic;
48
52
49
53
#[ unstable( feature = "proc_macro_diagnostic" , issue = "38356" ) ]
@@ -54,12 +58,10 @@ use std::path::PathBuf;
54
58
use rustc_data_structures:: sync:: Lrc ;
55
59
use std:: str:: FromStr ;
56
60
57
- use syntax:: ast;
58
61
use syntax:: errors:: DiagnosticBuilder ;
59
62
use syntax:: parse:: { self , token} ;
60
- use syntax:: symbol:: { keywords , Symbol } ;
63
+ use syntax:: symbol:: Symbol ;
61
64
use syntax:: tokenstream;
62
- use syntax:: parse:: lexer:: { self , comments} ;
63
65
use syntax_pos:: { FileMap , Pos , FileName } ;
64
66
65
67
/// The main type provided by this crate, representing an abstract stream of
@@ -784,6 +786,16 @@ impl !Send for Ident {}
784
786
impl !Sync for Ident { }
785
787
786
788
impl Ident {
789
+ fn is_valid ( string : & str ) -> bool {
790
+ let mut chars = string. chars ( ) ;
791
+ if let Some ( start) = chars. next ( ) {
792
+ ( start == '_' || start. is_xid_start ( ) )
793
+ && chars. all ( |cont| cont == '_' || cont. is_xid_continue ( ) )
794
+ } else {
795
+ false
796
+ }
797
+ }
798
+
787
799
/// Creates a new `Ident` with the given `string` as well as the specified
788
800
/// `span`.
789
801
/// The `string` argument must be a valid identifier permitted by the
@@ -805,26 +817,19 @@ impl Ident {
805
817
/// tokens, requires a `Span` to be specified at construction.
806
818
#[ stable( feature = "proc_macro_lib2" , since = "1.29.0" ) ]
807
819
pub fn new ( string : & str , span : Span ) -> Ident {
808
- if !lexer :: is_valid_ident ( string) {
820
+ if !Ident :: is_valid ( string) {
809
821
panic ! ( "`{:?}` is not a valid identifier" , string)
810
822
}
811
- Ident {
812
- sym : Symbol :: intern ( string) ,
813
- span,
814
- is_raw : false ,
815
- }
823
+ Ident :: new_maybe_raw ( string, span, false )
816
824
}
817
825
818
826
/// Same as `Ident::new`, but creates a raw identifier (`r#ident`).
819
827
#[ unstable( feature = "proc_macro_raw_ident" , issue = "38356" ) ]
820
828
pub fn new_raw ( string : & str , span : Span ) -> Ident {
821
- let mut ident = Ident :: new ( string, span) ;
822
- if ident. sym == keywords:: Underscore . name ( ) ||
823
- ast:: Ident :: with_empty_ctxt ( ident. sym ) . is_path_segment_keyword ( ) {
824
- panic ! ( "`{:?}` is not a valid raw identifier" , string)
829
+ if !Ident :: is_valid ( string) {
830
+ panic ! ( "`{:?}` is not a valid identifier" , string)
825
831
}
826
- ident. is_raw = true ;
827
- ident
832
+ Ident :: new_maybe_raw ( string, span, true )
828
833
}
829
834
830
835
/// Returns the span of this `Ident`, encompassing the entire string returned
@@ -861,7 +866,7 @@ impl fmt::Display for Ident {
861
866
#[ stable( feature = "proc_macro_lib2" , since = "1.29.0" ) ]
862
867
pub struct Literal {
863
868
lit : token:: Lit ,
864
- suffix : Option < ast :: Name > ,
869
+ suffix : Option < Symbol > ,
865
870
span : Span ,
866
871
}
867
872
@@ -1109,236 +1114,6 @@ impl fmt::Display for Literal {
1109
1114
}
1110
1115
}
1111
1116
1112
- impl Delimiter {
1113
- fn from_internal ( delim : token:: DelimToken ) -> Delimiter {
1114
- match delim {
1115
- token:: Paren => Delimiter :: Parenthesis ,
1116
- token:: Brace => Delimiter :: Brace ,
1117
- token:: Bracket => Delimiter :: Bracket ,
1118
- token:: NoDelim => Delimiter :: None ,
1119
- }
1120
- }
1121
-
1122
- fn to_internal ( self ) -> token:: DelimToken {
1123
- match self {
1124
- Delimiter :: Parenthesis => token:: Paren ,
1125
- Delimiter :: Brace => token:: Brace ,
1126
- Delimiter :: Bracket => token:: Bracket ,
1127
- Delimiter :: None => token:: NoDelim ,
1128
- }
1129
- }
1130
- }
1131
-
1132
- impl TokenTree {
1133
- fn from_internal ( stream : tokenstream:: TokenStream , stack : & mut Vec < TokenTree > )
1134
- -> TokenTree {
1135
- use syntax:: parse:: token:: * ;
1136
-
1137
- let ( tree, is_joint) = stream. as_tree ( ) ;
1138
- let ( span, token) = match tree {
1139
- tokenstream:: TokenTree :: Token ( span, token) => ( span, token) ,
1140
- tokenstream:: TokenTree :: Delimited ( span, delimed) => {
1141
- let delimiter = Delimiter :: from_internal ( delimed. delim ) ;
1142
- let mut g = Group :: new ( delimiter, TokenStream ( delimed. tts . into ( ) ) ) ;
1143
- g. set_span ( Span ( span) ) ;
1144
- return g. into ( )
1145
- }
1146
- } ;
1147
-
1148
- let op_kind = if is_joint { Spacing :: Joint } else { Spacing :: Alone } ;
1149
- macro_rules! tt {
1150
- ( $e: expr) => ( {
1151
- let mut x = TokenTree :: from( $e) ;
1152
- x. set_span( Span ( span) ) ;
1153
- x
1154
- } )
1155
- }
1156
- macro_rules! op {
1157
- ( $a: expr) => ( tt!( Punct :: new( $a, op_kind) ) ) ;
1158
- ( $a: expr, $b: expr) => ( {
1159
- stack. push( tt!( Punct :: new( $b, op_kind) ) ) ;
1160
- tt!( Punct :: new( $a, Spacing :: Joint ) )
1161
- } ) ;
1162
- ( $a: expr, $b: expr, $c: expr) => ( {
1163
- stack. push( tt!( Punct :: new( $c, op_kind) ) ) ;
1164
- stack. push( tt!( Punct :: new( $b, Spacing :: Joint ) ) ) ;
1165
- tt!( Punct :: new( $a, Spacing :: Joint ) )
1166
- } )
1167
- }
1168
-
1169
- match token {
1170
- Eq => op ! ( '=' ) ,
1171
- Lt => op ! ( '<' ) ,
1172
- Le => op ! ( '<' , '=' ) ,
1173
- EqEq => op ! ( '=' , '=' ) ,
1174
- Ne => op ! ( '!' , '=' ) ,
1175
- Ge => op ! ( '>' , '=' ) ,
1176
- Gt => op ! ( '>' ) ,
1177
- AndAnd => op ! ( '&' , '&' ) ,
1178
- OrOr => op ! ( '|' , '|' ) ,
1179
- Not => op ! ( '!' ) ,
1180
- Tilde => op ! ( '~' ) ,
1181
- BinOp ( Plus ) => op ! ( '+' ) ,
1182
- BinOp ( Minus ) => op ! ( '-' ) ,
1183
- BinOp ( Star ) => op ! ( '*' ) ,
1184
- BinOp ( Slash ) => op ! ( '/' ) ,
1185
- BinOp ( Percent ) => op ! ( '%' ) ,
1186
- BinOp ( Caret ) => op ! ( '^' ) ,
1187
- BinOp ( And ) => op ! ( '&' ) ,
1188
- BinOp ( Or ) => op ! ( '|' ) ,
1189
- BinOp ( Shl ) => op ! ( '<' , '<' ) ,
1190
- BinOp ( Shr ) => op ! ( '>' , '>' ) ,
1191
- BinOpEq ( Plus ) => op ! ( '+' , '=' ) ,
1192
- BinOpEq ( Minus ) => op ! ( '-' , '=' ) ,
1193
- BinOpEq ( Star ) => op ! ( '*' , '=' ) ,
1194
- BinOpEq ( Slash ) => op ! ( '/' , '=' ) ,
1195
- BinOpEq ( Percent ) => op ! ( '%' , '=' ) ,
1196
- BinOpEq ( Caret ) => op ! ( '^' , '=' ) ,
1197
- BinOpEq ( And ) => op ! ( '&' , '=' ) ,
1198
- BinOpEq ( Or ) => op ! ( '|' , '=' ) ,
1199
- BinOpEq ( Shl ) => op ! ( '<' , '<' , '=' ) ,
1200
- BinOpEq ( Shr ) => op ! ( '>' , '>' , '=' ) ,
1201
- At => op ! ( '@' ) ,
1202
- Dot => op ! ( '.' ) ,
1203
- DotDot => op ! ( '.' , '.' ) ,
1204
- DotDotDot => op ! ( '.' , '.' , '.' ) ,
1205
- DotDotEq => op ! ( '.' , '.' , '=' ) ,
1206
- Comma => op ! ( ',' ) ,
1207
- Semi => op ! ( ';' ) ,
1208
- Colon => op ! ( ':' ) ,
1209
- ModSep => op ! ( ':' , ':' ) ,
1210
- RArrow => op ! ( '-' , '>' ) ,
1211
- LArrow => op ! ( '<' , '-' ) ,
1212
- FatArrow => op ! ( '=' , '>' ) ,
1213
- Pound => op ! ( '#' ) ,
1214
- Dollar => op ! ( '$' ) ,
1215
- Question => op ! ( '?' ) ,
1216
- SingleQuote => op ! ( '\'' ) ,
1217
-
1218
- Ident ( ident, false ) => {
1219
- tt ! ( self :: Ident :: new( & ident. as_str( ) , Span ( span) ) )
1220
- }
1221
- Ident ( ident, true ) => {
1222
- tt ! ( self :: Ident :: new_raw( & ident. as_str( ) , Span ( span) ) )
1223
- }
1224
- Lifetime ( ident) => {
1225
- let ident = ident. without_first_quote ( ) ;
1226
- stack. push ( tt ! ( self :: Ident :: new( & ident. as_str( ) , Span ( span) ) ) ) ;
1227
- tt ! ( Punct :: new( '\'' , Spacing :: Joint ) )
1228
- }
1229
- Literal ( lit, suffix) => tt ! ( self :: Literal { lit, suffix, span: Span ( span) } ) ,
1230
- DocComment ( c) => {
1231
- let style = comments:: doc_comment_style ( & c. as_str ( ) ) ;
1232
- let stripped = comments:: strip_doc_comment_decoration ( & c. as_str ( ) ) ;
1233
- let stream = vec ! [
1234
- tt!( self :: Ident :: new( "doc" , Span ( span) ) ) ,
1235
- tt!( Punct :: new( '=' , Spacing :: Alone ) ) ,
1236
- tt!( self :: Literal :: string( & stripped) ) ,
1237
- ] . into_iter ( ) . collect ( ) ;
1238
- stack. push ( tt ! ( Group :: new( Delimiter :: Bracket , stream) ) ) ;
1239
- if style == ast:: AttrStyle :: Inner {
1240
- stack. push ( tt ! ( Punct :: new( '!' , Spacing :: Alone ) ) ) ;
1241
- }
1242
- tt ! ( Punct :: new( '#' , Spacing :: Alone ) )
1243
- }
1244
-
1245
- Interpolated ( _) => {
1246
- __internal:: with_sess ( |sess, _| {
1247
- let tts = token. interpolated_to_tokenstream ( sess, span) ;
1248
- tt ! ( Group :: new( Delimiter :: None , TokenStream ( tts) ) )
1249
- } )
1250
- }
1251
-
1252
- DotEq => op ! ( '.' , '=' ) ,
1253
- OpenDelim ( ..) | CloseDelim ( ..) => unreachable ! ( ) ,
1254
- Whitespace | Comment | Shebang ( ..) | Eof => unreachable ! ( ) ,
1255
- }
1256
- }
1257
-
1258
- fn to_internal ( self ) -> tokenstream:: TokenStream {
1259
- use syntax:: parse:: token:: * ;
1260
- use syntax:: tokenstream:: { TokenTree , Delimited } ;
1261
-
1262
- let ( ch, kind, span) = match self {
1263
- self :: TokenTree :: Punct ( tt) => ( tt. as_char ( ) , tt. spacing ( ) , tt. span ( ) ) ,
1264
- self :: TokenTree :: Group ( tt) => {
1265
- return TokenTree :: Delimited ( tt. span . 0 , Delimited {
1266
- delim : tt. delimiter . to_internal ( ) ,
1267
- tts : tt. stream . 0 . into ( ) ,
1268
- } ) . into ( ) ;
1269
- } ,
1270
- self :: TokenTree :: Ident ( tt) => {
1271
- let token = Ident ( ast:: Ident :: new ( tt. sym , tt. span . 0 ) , tt. is_raw ) ;
1272
- return TokenTree :: Token ( tt. span . 0 , token) . into ( ) ;
1273
- }
1274
- self :: TokenTree :: Literal ( self :: Literal {
1275
- lit : Lit :: Integer ( ref a) ,
1276
- suffix,
1277
- span,
1278
- } )
1279
- if a. as_str ( ) . starts_with ( "-" ) =>
1280
- {
1281
- let minus = BinOp ( BinOpToken :: Minus ) ;
1282
- let integer = Symbol :: intern ( & a. as_str ( ) [ 1 ..] ) ;
1283
- let integer = Literal ( Lit :: Integer ( integer) , suffix) ;
1284
- let a = TokenTree :: Token ( span. 0 , minus) ;
1285
- let b = TokenTree :: Token ( span. 0 , integer) ;
1286
- return vec ! [ a, b] . into_iter ( ) . collect ( )
1287
- }
1288
- self :: TokenTree :: Literal ( self :: Literal {
1289
- lit : Lit :: Float ( ref a) ,
1290
- suffix,
1291
- span,
1292
- } )
1293
- if a. as_str ( ) . starts_with ( "-" ) =>
1294
- {
1295
- let minus = BinOp ( BinOpToken :: Minus ) ;
1296
- let float = Symbol :: intern ( & a. as_str ( ) [ 1 ..] ) ;
1297
- let float = Literal ( Lit :: Float ( float) , suffix) ;
1298
- let a = TokenTree :: Token ( span. 0 , minus) ;
1299
- let b = TokenTree :: Token ( span. 0 , float) ;
1300
- return vec ! [ a, b] . into_iter ( ) . collect ( )
1301
- }
1302
- self :: TokenTree :: Literal ( tt) => {
1303
- let token = Literal ( tt. lit , tt. suffix ) ;
1304
- return TokenTree :: Token ( tt. span . 0 , token) . into ( )
1305
- }
1306
- } ;
1307
-
1308
- let token = match ch {
1309
- '=' => Eq ,
1310
- '<' => Lt ,
1311
- '>' => Gt ,
1312
- '!' => Not ,
1313
- '~' => Tilde ,
1314
- '+' => BinOp ( Plus ) ,
1315
- '-' => BinOp ( Minus ) ,
1316
- '*' => BinOp ( Star ) ,
1317
- '/' => BinOp ( Slash ) ,
1318
- '%' => BinOp ( Percent ) ,
1319
- '^' => BinOp ( Caret ) ,
1320
- '&' => BinOp ( And ) ,
1321
- '|' => BinOp ( Or ) ,
1322
- '@' => At ,
1323
- '.' => Dot ,
1324
- ',' => Comma ,
1325
- ';' => Semi ,
1326
- ':' => Colon ,
1327
- '#' => Pound ,
1328
- '$' => Dollar ,
1329
- '?' => Question ,
1330
- '\'' => SingleQuote ,
1331
- _ => unreachable ! ( ) ,
1332
- } ;
1333
-
1334
- let tree = TokenTree :: Token ( span. 0 , token) ;
1335
- match kind {
1336
- Spacing :: Alone => tree. into ( ) ,
1337
- Spacing :: Joint => tree. joint ( ) ,
1338
- }
1339
- }
1340
- }
1341
-
1342
1117
/// Permanently unstable internal implementation details of this crate. This
1343
1118
/// should not be used.
1344
1119
///
0 commit comments