@@ -19,13 +19,10 @@ use attr::{ThinAttributes, HasAttrs};
1919use codemap:: { mk_sp, respan, Span , Spanned , DUMMY_SP , ExpnId } ;
2020use abi:: Abi ;
2121use errors;
22- use ext:: base;
23- use ext:: tt:: macro_parser;
2422use parse:: token:: { self , keywords, InternedString } ;
25- use parse:: lexer;
26- use parse:: lexer:: comments:: { doc_comment_style, strip_doc_comment_decoration} ;
2723use print:: pprust;
2824use ptr:: P ;
25+ use tokenstream:: { TokenTree } ;
2926
3027use std:: fmt;
3128use std:: rc:: Rc ;
@@ -1097,193 +1094,6 @@ pub enum CaptureBy {
10971094 Ref ,
10981095}
10991096
1100- /// A delimited sequence of token trees
1101- #[ derive( Clone , PartialEq , Eq , RustcEncodable , RustcDecodable , Hash , Debug ) ]
1102- pub struct Delimited {
1103- /// The type of delimiter
1104- pub delim : token:: DelimToken ,
1105- /// The span covering the opening delimiter
1106- pub open_span : Span ,
1107- /// The delimited sequence of token trees
1108- pub tts : Vec < TokenTree > ,
1109- /// The span covering the closing delimiter
1110- pub close_span : Span ,
1111- }
1112-
1113- impl Delimited {
1114- /// Returns the opening delimiter as a token.
1115- pub fn open_token ( & self ) -> token:: Token {
1116- token:: OpenDelim ( self . delim )
1117- }
1118-
1119- /// Returns the closing delimiter as a token.
1120- pub fn close_token ( & self ) -> token:: Token {
1121- token:: CloseDelim ( self . delim )
1122- }
1123-
1124- /// Returns the opening delimiter as a token tree.
1125- pub fn open_tt ( & self ) -> TokenTree {
1126- TokenTree :: Token ( self . open_span , self . open_token ( ) )
1127- }
1128-
1129- /// Returns the closing delimiter as a token tree.
1130- pub fn close_tt ( & self ) -> TokenTree {
1131- TokenTree :: Token ( self . close_span , self . close_token ( ) )
1132- }
1133- }
1134-
1135- /// A sequence of token trees
1136- #[ derive( Clone , PartialEq , Eq , RustcEncodable , RustcDecodable , Hash , Debug ) ]
1137- pub struct SequenceRepetition {
1138- /// The sequence of token trees
1139- pub tts : Vec < TokenTree > ,
1140- /// The optional separator
1141- pub separator : Option < token:: Token > ,
1142- /// Whether the sequence can be repeated zero (*), or one or more times (+)
1143- pub op : KleeneOp ,
1144- /// The number of `MatchNt`s that appear in the sequence (and subsequences)
1145- pub num_captures : usize ,
1146- }
1147-
1148- /// A Kleene-style [repetition operator](http://en.wikipedia.org/wiki/Kleene_star)
1149- /// for token sequences.
1150- #[ derive( Clone , PartialEq , Eq , RustcEncodable , RustcDecodable , Hash , Debug , Copy ) ]
1151- pub enum KleeneOp {
1152- ZeroOrMore ,
1153- OneOrMore ,
1154- }
1155-
1156- /// When the main rust parser encounters a syntax-extension invocation, it
1157- /// parses the arguments to the invocation as a token-tree. This is a very
1158- /// loose structure, such that all sorts of different AST-fragments can
1159- /// be passed to syntax extensions using a uniform type.
1160- ///
1161- /// If the syntax extension is an MBE macro, it will attempt to match its
1162- /// LHS token tree against the provided token tree, and if it finds a
1163- /// match, will transcribe the RHS token tree, splicing in any captured
1164- /// macro_parser::matched_nonterminals into the `SubstNt`s it finds.
1165- ///
1166- /// The RHS of an MBE macro is the only place `SubstNt`s are substituted.
1167- /// Nothing special happens to misnamed or misplaced `SubstNt`s.
1168- #[ derive( Clone , PartialEq , Eq , RustcEncodable , RustcDecodable , Hash , Debug ) ]
1169- pub enum TokenTree {
1170- /// A single token
1171- Token ( Span , token:: Token ) ,
1172- /// A delimited sequence of token trees
1173- Delimited ( Span , Rc < Delimited > ) ,
1174-
1175- // This only makes sense in MBE macros.
1176-
1177- /// A kleene-style repetition sequence with a span
1178- // FIXME(eddyb) #12938 Use DST.
1179- Sequence ( Span , Rc < SequenceRepetition > ) ,
1180- }
1181-
1182- impl TokenTree {
1183- pub fn len ( & self ) -> usize {
1184- match * self {
1185- TokenTree :: Token ( _, token:: DocComment ( name) ) => {
1186- match doc_comment_style ( & name. as_str ( ) ) {
1187- AttrStyle :: Outer => 2 ,
1188- AttrStyle :: Inner => 3
1189- }
1190- }
1191- TokenTree :: Token ( _, token:: SpecialVarNt ( ..) ) => 2 ,
1192- TokenTree :: Token ( _, token:: MatchNt ( ..) ) => 3 ,
1193- TokenTree :: Delimited ( _, ref delimed) => {
1194- delimed. tts . len ( ) + 2
1195- }
1196- TokenTree :: Sequence ( _, ref seq) => {
1197- seq. tts . len ( )
1198- }
1199- TokenTree :: Token ( ..) => 0
1200- }
1201- }
1202-
1203- pub fn get_tt ( & self , index : usize ) -> TokenTree {
1204- match ( self , index) {
1205- ( & TokenTree :: Token ( sp, token:: DocComment ( _) ) , 0 ) => {
1206- TokenTree :: Token ( sp, token:: Pound )
1207- }
1208- ( & TokenTree :: Token ( sp, token:: DocComment ( name) ) , 1 )
1209- if doc_comment_style ( & name. as_str ( ) ) == AttrStyle :: Inner => {
1210- TokenTree :: Token ( sp, token:: Not )
1211- }
1212- ( & TokenTree :: Token ( sp, token:: DocComment ( name) ) , _) => {
1213- let stripped = strip_doc_comment_decoration ( & name. as_str ( ) ) ;
1214-
1215- // Searches for the occurrences of `"#*` and returns the minimum number of `#`s
1216- // required to wrap the text.
1217- let num_of_hashes = stripped. chars ( ) . scan ( 0 , |cnt, x| {
1218- * cnt = if x == '"' {
1219- 1
1220- } else if * cnt != 0 && x == '#' {
1221- * cnt + 1
1222- } else {
1223- 0
1224- } ;
1225- Some ( * cnt)
1226- } ) . max ( ) . unwrap_or ( 0 ) ;
1227-
1228- TokenTree :: Delimited ( sp, Rc :: new ( Delimited {
1229- delim : token:: Bracket ,
1230- open_span : sp,
1231- tts : vec ! [ TokenTree :: Token ( sp, token:: Ident ( token:: str_to_ident( "doc" ) ) ) ,
1232- TokenTree :: Token ( sp, token:: Eq ) ,
1233- TokenTree :: Token ( sp, token:: Literal (
1234- token:: StrRaw ( token:: intern( & stripped) , num_of_hashes) , None ) ) ] ,
1235- close_span : sp,
1236- } ) )
1237- }
1238- ( & TokenTree :: Delimited ( _, ref delimed) , _) => {
1239- if index == 0 {
1240- return delimed. open_tt ( ) ;
1241- }
1242- if index == delimed. tts . len ( ) + 1 {
1243- return delimed. close_tt ( ) ;
1244- }
1245- delimed. tts [ index - 1 ] . clone ( )
1246- }
1247- ( & TokenTree :: Token ( sp, token:: SpecialVarNt ( var) ) , _) => {
1248- let v = [ TokenTree :: Token ( sp, token:: Dollar ) ,
1249- TokenTree :: Token ( sp, token:: Ident ( token:: str_to_ident ( var. as_str ( ) ) ) ) ] ;
1250- v[ index] . clone ( )
1251- }
1252- ( & TokenTree :: Token ( sp, token:: MatchNt ( name, kind) ) , _) => {
1253- let v = [ TokenTree :: Token ( sp, token:: SubstNt ( name) ) ,
1254- TokenTree :: Token ( sp, token:: Colon ) ,
1255- TokenTree :: Token ( sp, token:: Ident ( kind) ) ] ;
1256- v[ index] . clone ( )
1257- }
1258- ( & TokenTree :: Sequence ( _, ref seq) , _) => {
1259- seq. tts [ index] . clone ( )
1260- }
1261- _ => panic ! ( "Cannot expand a token tree" )
1262- }
1263- }
1264-
1265- /// Returns the `Span` corresponding to this token tree.
1266- pub fn get_span ( & self ) -> Span {
1267- match * self {
1268- TokenTree :: Token ( span, _) => span,
1269- TokenTree :: Delimited ( span, _) => span,
1270- TokenTree :: Sequence ( span, _) => span,
1271- }
1272- }
1273-
1274- /// Use this token tree as a matcher to parse given tts.
1275- pub fn parse ( cx : & base:: ExtCtxt , mtch : & [ TokenTree ] , tts : & [ TokenTree ] )
1276- -> macro_parser:: NamedParseResult {
1277- // `None` is because we're not interpolating
1278- let arg_rdr = lexer:: new_tt_reader_with_doc_flag ( & cx. parse_sess ( ) . span_diagnostic ,
1279- None ,
1280- None ,
1281- tts. iter ( ) . cloned ( ) . collect ( ) ,
1282- true ) ;
1283- macro_parser:: parse ( cx. parse_sess ( ) , cx. cfg ( ) , arg_rdr, mtch)
1284- }
1285- }
1286-
12871097pub type Mac = Spanned < Mac_ > ;
12881098
12891099/// Represents a macro invocation. The Path indicates which macro
0 commit comments