Skip to content

Commit 4a8467b

Browse files
committed
Remove TokResult.
1 parent 8b40ead commit 4a8467b

File tree

3 files changed

+29
-161
lines changed

3 files changed

+29
-161
lines changed

src/libsyntax/ext/base.rs

+1-142
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ use errors::DiagnosticBuilder;
1818
use ext::expand::{self, Invocation, Expansion};
1919
use ext::hygiene::Mark;
2020
use fold::{self, Folder};
21-
use parse;
22-
use parse::parser::{self, Parser};
21+
use parse::{self, parser};
2322
use parse::token;
2423
use parse::token::{InternedString, str_to_ident};
2524
use ptr::P;
@@ -188,146 +187,6 @@ impl<F> AttrProcMacro for F
188187
}
189188
}
190189

191-
pub struct TokResult<'a> {
192-
pub parser: Parser<'a>,
193-
pub span: Span,
194-
}
195-
196-
impl<'a> TokResult<'a> {
197-
// There is quite a lot of overlap here with ParserAnyMacro in ext/tt/macro_rules.rs
198-
// We could probably share more code.
199-
// FIXME(#36641) Unify TokResult and ParserAnyMacro.
200-
fn ensure_complete_parse(&mut self, allow_semi: bool) {
201-
let macro_span = &self.span;
202-
self.parser.ensure_complete_parse(allow_semi, |parser| {
203-
let token_str = parser.this_token_to_string();
204-
let msg = format!("macro expansion ignores token `{}` and any following", token_str);
205-
let span = parser.span;
206-
parser.diagnostic()
207-
.struct_span_err(span, &msg)
208-
.span_note(*macro_span, "caused by the macro expansion here")
209-
.emit();
210-
});
211-
}
212-
}
213-
214-
impl<'a> MacResult for TokResult<'a> {
215-
fn make_items(mut self: Box<Self>) -> Option<SmallVector<P<ast::Item>>> {
216-
if self.parser.sess.span_diagnostic.has_errors() {
217-
return Some(SmallVector::zero());
218-
}
219-
220-
let mut items = SmallVector::zero();
221-
loop {
222-
match self.parser.parse_item() {
223-
Ok(Some(item)) => items.push(item),
224-
Ok(None) => {
225-
self.ensure_complete_parse(false);
226-
return Some(items);
227-
}
228-
Err(mut e) => {
229-
e.emit();
230-
return Some(SmallVector::zero());
231-
}
232-
}
233-
}
234-
}
235-
236-
fn make_impl_items(mut self: Box<Self>) -> Option<SmallVector<ast::ImplItem>> {
237-
let mut items = SmallVector::zero();
238-
loop {
239-
if self.parser.token == token::Eof {
240-
break;
241-
}
242-
match self.parser.parse_impl_item() {
243-
Ok(item) => items.push(item),
244-
Err(mut e) => {
245-
e.emit();
246-
return Some(SmallVector::zero());
247-
}
248-
}
249-
}
250-
self.ensure_complete_parse(false);
251-
Some(items)
252-
}
253-
254-
fn make_trait_items(mut self: Box<Self>) -> Option<SmallVector<ast::TraitItem>> {
255-
let mut items = SmallVector::zero();
256-
loop {
257-
if self.parser.token == token::Eof {
258-
break;
259-
}
260-
match self.parser.parse_trait_item() {
261-
Ok(item) => items.push(item),
262-
Err(mut e) => {
263-
e.emit();
264-
return Some(SmallVector::zero());
265-
}
266-
}
267-
}
268-
self.ensure_complete_parse(false);
269-
Some(items)
270-
}
271-
272-
fn make_expr(mut self: Box<Self>) -> Option<P<ast::Expr>> {
273-
match self.parser.parse_expr() {
274-
Ok(e) => {
275-
self.ensure_complete_parse(true);
276-
Some(e)
277-
}
278-
Err(mut e) => {
279-
e.emit();
280-
Some(DummyResult::raw_expr(self.span))
281-
}
282-
}
283-
}
284-
285-
fn make_pat(mut self: Box<Self>) -> Option<P<ast::Pat>> {
286-
match self.parser.parse_pat() {
287-
Ok(e) => {
288-
self.ensure_complete_parse(false);
289-
Some(e)
290-
}
291-
Err(mut e) => {
292-
e.emit();
293-
Some(P(DummyResult::raw_pat(self.span)))
294-
}
295-
}
296-
}
297-
298-
fn make_stmts(mut self: Box<Self>) -> Option<SmallVector<ast::Stmt>> {
299-
let mut stmts = SmallVector::zero();
300-
loop {
301-
if self.parser.token == token::Eof {
302-
break;
303-
}
304-
match self.parser.parse_full_stmt(false) {
305-
Ok(Some(stmt)) => stmts.push(stmt),
306-
Ok(None) => { /* continue */ }
307-
Err(mut e) => {
308-
e.emit();
309-
return Some(SmallVector::zero());
310-
}
311-
}
312-
}
313-
self.ensure_complete_parse(false);
314-
Some(stmts)
315-
}
316-
317-
fn make_ty(mut self: Box<Self>) -> Option<P<ast::Ty>> {
318-
match self.parser.parse_ty() {
319-
Ok(e) => {
320-
self.ensure_complete_parse(false);
321-
Some(e)
322-
}
323-
Err(mut e) => {
324-
e.emit();
325-
Some(DummyResult::raw_ty(self.span))
326-
}
327-
}
328-
}
329-
}
330-
331190
/// Represents a thing that maps token trees to Macro Results
332191
pub trait TTMacroExpander {
333192
fn expand<'cx>(&self,

src/libsyntax/ext/expand.rs

+27-18
Original file line numberDiff line numberDiff line change
@@ -325,14 +325,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
325325
let item_toks = TokenStream::from_tts(tts_for_item(&item, &self.cx.parse_sess));
326326

327327
let tok_result = mac.expand(self.cx, attr.span, attr_toks, item_toks);
328-
let parser = self.cx.new_parser_from_tts(&tok_result.to_tts());
329-
let result = Box::new(TokResult { parser: parser, span: attr.span });
330-
331-
kind.make_from(result).unwrap_or_else(|| {
332-
let msg = format!("macro could not be expanded into {} position", kind.name());
333-
self.cx.span_err(attr.span, &msg);
334-
kind.dummy(attr.span)
335-
})
328+
self.parse_expansion(tok_result, kind, attr.span)
336329
}
337330
_ => unreachable!(),
338331
}
@@ -429,14 +422,9 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
429422
},
430423
});
431424

432-
433-
let tok_result = expandfun.expand(self.cx,
434-
span,
435-
TokenStream::from_tts(marked_tts));
436-
let parser = self.cx.new_parser_from_tts(&tok_result.to_tts());
437-
let result = Box::new(TokResult { parser: parser, span: span });
438-
// FIXME better span info.
439-
kind.make_from(result).map(|i| i.fold_with(&mut ChangeSpan { span: span }))
425+
let toks = TokenStream::from_tts(marked_tts);
426+
let tok_result = expandfun.expand(self.cx, span, toks);
427+
Some(self.parse_expansion(tok_result, kind, span))
440428
}
441429
};
442430

@@ -454,10 +442,31 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
454442
expn_id: Some(self.cx.backtrace()),
455443
})
456444
}
445+
446+
fn parse_expansion(&mut self, toks: TokenStream, kind: ExpansionKind, span: Span) -> Expansion {
447+
let mut parser = self.cx.new_parser_from_tts(&toks.to_tts());
448+
let expansion = match parser.parse_expansion(kind, false) {
449+
Ok(expansion) => expansion,
450+
Err(mut err) => {
451+
err.emit();
452+
return kind.dummy(span);
453+
}
454+
};
455+
parser.ensure_complete_parse(kind == ExpansionKind::Expr, |parser| {
456+
let msg = format!("macro expansion ignores token `{}` and any following",
457+
parser.this_token_to_string());
458+
parser.diagnostic().struct_span_err(parser.span, &msg)
459+
.span_note(span, "caused by the macro expansion here")
460+
.emit();
461+
});
462+
// FIXME better span info
463+
expansion.fold_with(&mut ChangeSpan { span: span })
464+
}
457465
}
458466

459467
impl<'a> Parser<'a> {
460-
pub fn parse_expansion(&mut self, kind: ExpansionKind) -> PResult<'a, Expansion> {
468+
pub fn parse_expansion(&mut self, kind: ExpansionKind, macro_legacy_warnings: bool)
469+
-> PResult<'a, Expansion> {
461470
Ok(match kind {
462471
ExpansionKind::Items => {
463472
let mut items = SmallVector::zero();
@@ -483,7 +492,7 @@ impl<'a> Parser<'a> {
483492
ExpansionKind::Stmts => {
484493
let mut stmts = SmallVector::zero();
485494
while self.token != token::Eof {
486-
if let Some(stmt) = self.parse_full_stmt(true)? {
495+
if let Some(stmt) = self.parse_full_stmt(macro_legacy_warnings)? {
487496
stmts.push(stmt);
488497
}
489498
}

src/libsyntax/ext/tt/macro_rules.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ impl<'a> ParserAnyMacro<'a> {
6363
}
6464

6565
pub fn make(mut self: Box<ParserAnyMacro<'a>>, kind: ExpansionKind) -> Expansion {
66-
let expansion = panictry!(self.parser.parse_expansion(kind));
66+
let expansion = panictry!(self.parser.parse_expansion(kind, true));
6767
self.ensure_complete_parse(kind == ExpansionKind::Expr, kind.name());
6868
expansion
6969
}

0 commit comments

Comments
 (0)