pub token: token::Token,
/// the span of the current token:
pub span: Span,
- /// the span of the prior token:
- pub last_span: Span,
+ /// the span of the previous token:
+ pub prev_span: Span,
pub cfg: CrateConfig,
/// the previous token kind
last_token_kind: LastTokenKind,
cfg: cfg,
token: tok0.tok,
span: span,
- last_span: span,
+ prev_span: span,
last_token_kind: LastTokenKind::Other,
buffer: [
placeholder.clone(),
pub fn unexpected_last<T>(&self, t: &token::Token) -> PResult<'a, T> {
let token_str = Parser::token_to_string(t);
- let last_span = self.last_span;
- Err(self.span_fatal(last_span, &format!("unexpected token: `{}`", token_str)))
+ Err(self.span_fatal(self.prev_span, &format!("unexpected token: `{}`", token_str)))
}
pub fn unexpected<T>(&mut self) -> PResult<'a, T> {
-> PResult<'a, (Span, P<Expr>)> {
expr.map(|e| {
if self.last_token_kind == LastTokenKind::Interpolated {
- (self.last_span, e)
+ (self.prev_span, e)
} else {
(e.span, e)
}
}
_ => {
Err(if self.last_token_kind == LastTokenKind::DocComment {
- self.span_fatal_help(self.last_span,
+ self.span_fatal_help(self.prev_span,
"found a documentation comment that doesn't document anything",
"doc comments must come before what they document, maybe a comment was \
intended with `//`?")
self.bug("attempted to bump the parser past EOF (may be stuck in a loop)");
}
- self.last_span = self.span;
+ self.prev_span = self.span;
// Record last token kind for possible error recovery.
self.last_token_kind = match self.token {
next: token::Token,
lo: BytePos,
hi: BytePos) {
- self.last_span = mk_sp(self.span.lo, lo);
+ self.prev_span = mk_sp(self.span.lo, lo);
// It would be incorrect to record the kind of the current token, but
// fortunately for tokens currently using `bump_with`, the
// last_token_kind will be of no use anyway.
let bounds = self.parse_ty_param_bounds(BoundParsingMode::Modified)?;
if !bounds.iter().any(|b| if let TraitTyParamBound(..) = *b { true } else { false }) {
- let last_span = self.last_span;
- self.span_err(last_span, "at least one trait must be specified");
+ self.span_err(self.prev_span, "at least one trait must be specified");
}
Ok(ast::TyKind::ImplTrait(bounds))
self.expect(&token::Semi)?
}
- let mac = spanned(lo, self.last_span.hi, Mac_ { path: pth, tts: tts });
+ let mac = spanned(lo, self.prev_span.hi, Mac_ { path: pth, tts: tts });
(keywords::Invalid.ident(), ast::TraitItemKind::Macro(mac))
} else {
let (constness, unsafety, abi) = match self.parse_fn_front_matter() {
ident: name,
attrs: attrs,
node: node,
- span: mk_sp(lo, self.last_span.hi),
+ span: mk_sp(lo, self.prev_span.hi),
})
}
// In type grammar, `+` is treated like a binary operator,
// and hence both L and R side are required.
if bounds.is_empty() {
- let last_span = self.last_span;
- self.span_err(last_span,
+ let prev_span = self.prev_span;
+ self.span_err(prev_span,
"at least one type parameter bound \
must be specified");
}
- let sp = mk_sp(lo, self.last_span.hi);
+ let sp = mk_sp(lo, self.prev_span.hi);
let sum = ast::TyKind::ObjectSum(lhs, bounds);
Ok(P(Ty {id: ast::DUMMY_NODE_ID, node: sum, span: sp}))
}
return Err(self.fatal(&msg));
};
- let sp = mk_sp(lo, self.last_span.hi);
+ let sp = mk_sp(lo, self.prev_span.hi);
Ok(P(Ty {id: ast::DUMMY_NODE_ID, node: t, span: sp}))
}
} else if self.eat_keyword(keywords::Const) {
Mutability::Immutable
} else {
- let span = self.last_span;
+ let span = self.prev_span;
self.span_err(span,
"expected mut or const in raw pointer type (use \
`*mut T` or `*const T` as appropriate)");
pat
} else {
debug!("parse_arg_general ident_to_pat");
- let sp = self.last_span;
+ let sp = self.prev_span;
let spanned = Spanned { span: sp, node: keywords::Invalid.ident() };
P(Pat {
id: ast::DUMMY_NODE_ID,
let lit = self.parse_lit_token()?;
lit
};
- Ok(codemap::Spanned { node: lit, span: mk_sp(lo, self.last_span.hi) })
+ Ok(codemap::Spanned { node: lit, span: mk_sp(lo, self.prev_span.hi) })
}
/// matches '-' lit | lit
let minus_present = self.eat(&token::BinOp(token::Minus));
let lo = self.span.lo;
let literal = P(self.parse_lit()?);
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
let expr = self.mk_expr(lo, hi, ExprKind::Lit(literal), ThinVec::new());
if minus_present {
- let minus_hi = self.last_span.hi;
+ let minus_hi = self.prev_span.hi;
let unary = self.mk_unary(UnOp::Neg, expr);
Ok(self.mk_expr(minus_lo, minus_hi, unary, ThinVec::new()))
} else {
/// `<T as U>::F::a::<S>`
pub fn parse_qualified_path(&mut self, mode: PathStyle)
-> PResult<'a, (QSelf, ast::Path)> {
- let span = self.last_span;
+ let span = self.prev_span;
let self_type = self.parse_ty_sum()?;
let mut path = if self.eat_keyword(keywords::As) {
self.parse_path(PathStyle::Type)?
};
path.segments.extend(segments);
- path.span.hi = self.last_span.hi;
+ path.span.hi = self.prev_span.hi;
Ok((qself, path))
}
};
// Assemble the span.
- let span = mk_sp(lo, self.last_span.hi);
+ let span = mk_sp(lo, self.prev_span.hi);
// Assemble the result.
Ok(ast::Path {
bindings: P::from_vec(bindings),
})
} else if self.eat(&token::OpenDelim(token::Paren)) {
- let lo = self.last_span.lo;
+ let lo = self.prev_span.lo;
let inputs = self.parse_seq_to_end(
&token::CloseDelim(token::Paren),
None
};
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
ast::PathParameters::Parenthesized(ast::ParenthesizedParameterData {
span: mk_sp(lo, hi),
pub fn parse_field(&mut self) -> PResult<'a, Field> {
let lo = self.span.lo;
let i = self.parse_field_name()?;
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
self.expect(&token::Colon)?;
let e = self.parse_expr()?;
Ok(ast::Field {
}
self.bump();
- hi = self.last_span.hi;
+ hi = self.prev_span.hi;
return if es.len() == 1 && !trailing_comma {
Ok(self.mk_expr(lo, hi, ExprKind::Paren(es.into_iter().nth(0).unwrap()), attrs))
} else {
ex = ExprKind::Vec(vec!(first_expr));
}
}
- hi = self.last_span.hi;
+ hi = self.prev_span.hi;
}
_ => {
if self.eat_lt() {
return Ok(self.mk_expr(lo, hi, ExprKind::Path(Some(qself), path), attrs));
}
if self.eat_keyword(keywords::Move) {
- let lo = self.last_span.lo;
+ let lo = self.prev_span.lo;
return self.parse_lambda_expr(lo, CaptureBy::Value, attrs);
}
if self.eat_keyword(keywords::If) {
return self.parse_if_expr(attrs);
}
if self.eat_keyword(keywords::For) {
- let lo = self.last_span.lo;
+ let lo = self.prev_span.lo;
return self.parse_for_expr(None, lo, attrs);
}
if self.eat_keyword(keywords::While) {
- let lo = self.last_span.lo;
+ let lo = self.prev_span.lo;
return self.parse_while_expr(None, lo, attrs);
}
if self.token.is_lifetime() {
return Err(self.fatal("expected `while`, `for`, or `loop` after a label"))
}
if self.eat_keyword(keywords::Loop) {
- let lo = self.last_span.lo;
+ let lo = self.prev_span.lo;
return self.parse_loop_expr(None, lo, attrs);
}
if self.eat_keyword(keywords::Continue) {
} else {
ExprKind::Continue(None)
};
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
return Ok(self.mk_expr(lo, hi, ex, attrs));
}
if self.eat_keyword(keywords::Match) {
} else {
ex = ExprKind::Break(None);
}
- hi = self.last_span.hi;
+ hi = self.prev_span.hi;
} else if self.token.is_keyword(keywords::Let) {
// Catch this syntax error here, instead of in `check_strict_keywords`, so
// that we can explicitly mention that let is not to be used as an expression
let tts = self.parse_seq_to_end(&token::CloseDelim(delim),
SeqSep::none(),
|p| p.parse_token_tree())?;
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
return Ok(self.mk_mac_expr(lo, hi, Mac_ { path: pth, tts: tts }, attrs));
}
if self.check(&token::OpenDelim(token::Brace)) {
};
if !bindings.is_empty() {
- let last_span = self.last_span;
- self.span_err(last_span, "type bindings are only permitted on trait paths");
+ let prev_span = self.prev_span;
+ self.span_err(prev_span, "type bindings are only permitted on trait paths");
}
Ok(match self.token {
SeqSep::trailing_allowed(token::Comma),
|p| Ok(p.parse_expr()?)
)?;
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
es.insert(0, self_value);
let id = spanned(ident_span.lo, ident_span.hi, ident);
// Field access.
_ => {
if !tys.is_empty() {
- let last_span = self.last_span;
- self.span_err(last_span,
+ let prev_span = self.prev_span;
+ self.span_err(prev_span,
"field expressions may not \
have type parameters");
}
loop {
// expr?
while self.eat(&token::Question) {
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
e = self.mk_expr(lo, hi, ExprKind::Try(e), ThinVec::new());
}
if self.eat(&token::Dot) {
match self.token {
token::Ident(i) => {
- let dot_pos = self.last_span.hi;
+ let dot_pos = self.prev_span.hi;
hi = self.span.hi;
self.bump();
// A tuple index may not have a suffix
self.expect_no_suffix(sp, "tuple index", suf);
- let dot = self.last_span.hi;
+ let dot = self.prev_span.hi;
hi = self.span.hi;
self.bump();
e = self.mk_expr(lo, hi, field, ThinVec::new());
}
None => {
- let last_span = self.last_span;
- self.span_err(last_span, "invalid tuple or tuple struct index");
+ let prev_span = self.prev_span;
+ self.span_err(prev_span, "invalid tuple or tuple struct index");
}
}
}
token::Literal(token::Float(n), _suf) => {
self.bump();
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let fstr = n.as_str();
- let mut err = self.diagnostic().struct_span_err(last_span,
+ let mut err = self.diagnostic().struct_span_err(prev_span,
&format!("unexpected token: `{}`", n.as_str()));
if fstr.chars().all(|x| "0123456789.".contains(x)) {
let float = match fstr.parse::<f64>().ok() {
let actual = self.this_token_to_string();
self.span_err(self.span, &format!("unexpected token: `{}`", actual));
- let dot_pos = self.last_span.hi;
+ let dot_pos = self.prev_span.hi;
e = self.parse_dot_suffix(keywords::Invalid.ident(),
mk_sp(dot_pos, dot_pos),
e, lo)?;
SeqSep::trailing_allowed(token::Comma),
|p| Ok(p.parse_expr()?)
)?;
- hi = self.last_span.hi;
+ hi = self.prev_span.hi;
let nd = self.mk_call(e, es);
e = self.mk_expr(lo, hi, nd, ThinVec::new());
while let Some(op) = AssocOp::from_token(&self.token) {
let lhs_span = if self.last_token_kind == LastTokenKind::Interpolated {
- self.last_span
+ self.prev_span
} else {
lhs.span
};
if self.check_keyword(keywords::Let) {
return self.parse_if_let_expr(attrs);
}
- let lo = self.last_span.lo;
+ let lo = self.prev_span.lo;
let cond = self.parse_expr_res(Restrictions::RESTRICTION_NO_STRUCT_LITERAL, None)?;
let thn = self.parse_block()?;
let mut els: Option<P<Expr>> = None;
/// Parse an 'if let' expression ('if' token already eaten)
pub fn parse_if_let_expr(&mut self, attrs: ThinVec<Attribute>)
-> PResult<'a, P<Expr>> {
- let lo = self.last_span.lo;
+ let lo = self.prev_span.lo;
self.expect_keyword(keywords::Let)?;
let pat = self.parse_pat()?;
self.expect(&token::Eq)?;
-> PResult<'a, P<Expr>>
{
let decl = self.parse_fn_block_decl()?;
- let decl_hi = self.last_span.hi;
+ let decl_hi = self.prev_span.hi;
let body = match decl.output {
FunctionRetTy::Default(_) => {
// If no explicit return type is given, parse any
let (iattrs, loop_block) = self.parse_inner_attrs_and_block()?;
attrs.extend(iattrs);
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
Ok(self.mk_expr(span_lo, hi,
ExprKind::ForLoop(pat, expr, loop_block, opt_ident),
// `match` token already eaten
fn parse_match_expr(&mut self, mut attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>> {
- let match_span = self.last_span;
- let lo = self.last_span.lo;
+ let match_span = self.prev_span;
+ let lo = self.prev_span.lo;
let discriminant = self.parse_expr_res(Restrictions::RESTRICTION_NO_STRUCT_LITERAL,
None)?;
if let Err(mut e) = self.expect(&token::OpenDelim(token::Brace)) {
}
} else if ddpos.is_some() && self.eat(&token::DotDot) {
// Emit a friendly error, ignore `..` and continue parsing
- self.span_err(self.last_span, "`..` can only be used once per \
+ self.span_err(self.prev_span, "`..` can only be used once per \
tuple or tuple struct pattern");
} else {
fields.push(self.parse_pat()?);
let is_ref = self.eat_keyword(keywords::Ref);
let is_mut = self.eat_keyword(keywords::Mut);
let fieldname = self.parse_ident()?;
- hi = self.last_span.hi;
+ hi = self.prev_span.hi;
let bind_type = match (is_ref, is_mut) {
(true, true) => BindingMode::ByRef(Mutability::Mutable),
(false, true) => BindingMode::ByValue(Mutability::Mutable),
(false, false) => BindingMode::ByValue(Mutability::Immutable),
};
- let fieldpath = codemap::Spanned{span:self.last_span, node:fieldname};
+ let fieldpath = codemap::Spanned{span:self.prev_span, node:fieldname};
let fieldpat = P(ast::Pat{
id: ast::DUMMY_NODE_ID,
node: PatKind::Ident(bind_type, fieldpath, None),
// Parse an unqualified path
(None, self.parse_path(PathStyle::Expr)?)
};
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
Ok(self.mk_expr(lo, hi, ExprKind::Path(qself, path), ThinVec::new()))
} else {
self.parse_pat_literal_maybe_minus()
let tts = self.parse_seq_to_end(&token::CloseDelim(delim),
SeqSep::none(),
|p| p.parse_token_tree())?;
- let mac = spanned(lo, self.last_span.hi, Mac_ { path: path, tts: tts });
+ let mac = spanned(lo, self.prev_span.hi, Mac_ { path: path, tts: tts });
pat = PatKind::Mac(mac);
}
token::DotDotDot => {
// Parse range
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
let begin =
self.mk_expr(lo, hi, ExprKind::Path(qself, path), ThinVec::new());
self.bump();
}
}
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
Ok(P(ast::Pat {
id: ast::DUMMY_NODE_ID,
node: pat,
binding_mode: ast::BindingMode)
-> PResult<'a, PatKind> {
let ident = self.parse_ident()?;
- let last_span = self.last_span;
- let name = codemap::Spanned{span: last_span, node: ident};
+ let prev_span = self.prev_span;
+ let name = codemap::Spanned{span: prev_span, node: ident};
let sub = if self.eat(&token::At) {
Some(self.parse_pat()?)
} else {
// binding mode then we do not end up here, because the lookahead
// will direct us over to parse_enum_variant()
if self.token == token::OpenDelim(token::Paren) {
- let last_span = self.last_span;
return Err(self.span_fatal(
- last_span,
+ self.prev_span,
"expected identifier, found enum pattern"))
}
pat: pat,
init: init,
id: ast::DUMMY_NODE_ID,
- span: mk_sp(lo, self.last_span.hi),
+ span: mk_sp(lo, self.prev_span.hi),
attrs: attrs,
}))
}
self.expect(&token::Colon)?;
let ty = self.parse_ty_sum()?;
Ok(StructField {
- span: mk_sp(lo, self.last_span.hi),
+ span: mk_sp(lo, self.prev_span.hi),
ident: Some(name),
vis: vis,
id: ast::DUMMY_NODE_ID,
_ => "expected item after attributes",
};
- self.span_err(self.last_span, message);
+ self.span_err(self.prev_span, message);
}
/// Parse a statement. This stops just before trailing semicolons on everything but items.
Stmt {
id: ast::DUMMY_NODE_ID,
node: StmtKind::Local(self.parse_local(attrs.into())?),
- span: mk_sp(lo, self.last_span.hi),
+ span: mk_sp(lo, self.prev_span.hi),
}
} else if self.token.is_path_start() && self.token != token::Lt && {
!self.check_keyword(keywords::Union) ||
let expr = if self.check(&token::OpenDelim(token::Brace)) {
self.parse_struct_expr(lo, pth, ThinVec::new())?
} else {
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
self.mk_expr(lo, hi, ExprKind::Path(None, pth), ThinVec::new())
};
return Ok(Some(Stmt {
id: ast::DUMMY_NODE_ID,
node: StmtKind::Expr(expr),
- span: mk_sp(lo, self.last_span.hi),
+ span: mk_sp(lo, self.prev_span.hi),
}));
}
SeqSep::none(),
|p| p.parse_token_tree()
)?;
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
let style = if delim == token::Brace {
MacStmtStyle::Braces
// Require a semicolon or braces.
if style != MacStmtStyle::Braces {
if !self.eat(&token::Semi) {
- let last_span = self.last_span;
- self.span_err(last_span,
+ self.span_err(self.prev_span,
"macros that expand to items must \
either be surrounded with braces or \
followed by a semicolon");
let unused_attrs = |attrs: &[_], s: &mut Self| {
if attrs.len() > 0 {
if s.last_token_kind == LastTokenKind::DocComment {
- s.span_err_help(s.last_span,
+ s.span_err_help(s.prev_span,
"found a documentation comment that doesn't document anything",
"doc comments must come before what they document, maybe a \
comment was intended with `//`?");
let mut stmt_span = stmt.span;
// expand the span to include the semicolon, if it exists
if self.eat(&token::Semi) {
- stmt_span.hi = self.last_span.hi;
+ stmt_span.hi = self.prev_span.hi;
}
e.span_help(stmt_span, "try placing this code inside a block");
}
stmts: stmts,
id: ast::DUMMY_NODE_ID,
rules: s,
- span: mk_sp(lo, self.last_span.hi),
+ span: mk_sp(lo, self.prev_span.hi),
}))
}
stmt = stmt.add_trailing_semicolon();
}
- stmt.span.hi = self.last_span.hi;
+ stmt.span.hi = self.prev_span.hi;
Ok(Some(stmt))
}
if ty_param.default.is_some() {
seen_default = true;
} else if seen_default {
- let last_span = p.last_span;
- p.span_err(last_span,
+ let prev_span = p.prev_span;
+ p.span_err(prev_span,
"type parameters with a default must be trailing");
}
Ok(ty_param)
id: ast::DUMMY_NODE_ID,
predicates: Vec::new(),
},
- span: mk_sp(span_lo, self.last_span.hi),
+ span: mk_sp(span_lo, self.prev_span.hi),
})
} else {
Ok(ast::Generics::default())
let bounds =
self.parse_lifetimes(token::BinOp(token::Plus))?;
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
let span = mk_sp(lo, hi);
where_clause.predicates.push(ast::WherePredicate::RegionPredicate(
if self.eat(&token::Colon) {
let bounds = self.parse_ty_param_bounds(BoundParsingMode::Bare)?;
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
let span = mk_sp(lo, hi);
if bounds.is_empty() {
parsed_something = true;
} else if self.eat(&token::Eq) {
// let ty = try!(self.parse_ty());
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
let span = mk_sp(lo, hi);
// where_clause.predicates.push(
// ast::WherePredicate::EqPredicate(ast::WhereEqPredicate {
"equality constraints are not yet supported \
in where clauses (#20041)");
} else {
- let last_span = self.last_span;
- self.span_err(last_span,
+ let prev_span = self.prev_span;
+ self.span_err(prev_span,
"unexpected token in `where` clause");
}
}
}
if !parsed_something {
- let last_span = self.last_span;
- self.span_err(last_span,
+ let prev_span = self.prev_span;
+ self.span_err(prev_span,
"a `where` clause must have at least one predicate \
in it");
}
fn parse_self_arg(&mut self) -> PResult<'a, Option<Arg>> {
let expect_ident = |this: &mut Self| match this.token {
// Preserve hygienic context.
- token::Ident(ident) => { this.bump(); codemap::respan(this.last_span, ident) }
+ token::Ident(ident) => { this.bump(); codemap::respan(this.prev_span, ident) }
_ => unreachable!()
};
_ => return Ok(None),
};
- let eself = codemap::respan(mk_sp(eself_lo, self.last_span.hi), eself);
+ let eself = codemap::respan(mk_sp(eself_lo, self.prev_span.hi), eself);
Ok(Some(Arg::from_self(eself, eself_ident)))
}
ast::Unsafety,
abi::Abi)> {
let is_const_fn = self.eat_keyword(keywords::Const);
- let const_span = self.last_span;
+ let const_span = self.prev_span;
let unsafety = self.parse_unsafety()?;
let (constness, unsafety, abi) = if is_const_fn {
(respan(const_span, Constness::Const), unsafety, Abi::Rust)
} else {
Abi::Rust
};
- (respan(self.last_span, Constness::NotConst), unsafety, abi)
+ (respan(self.prev_span, Constness::NotConst), unsafety, abi)
};
self.expect_keyword(keywords::Fn)?;
Ok((constness, unsafety, abi))
Ok(ImplItem {
id: ast::DUMMY_NODE_ID,
- span: mk_sp(lo, self.last_span.hi),
+ span: mk_sp(lo, self.prev_span.hi),
ident: name,
vis: vis,
defaultness: defaultness,
if self.token.is_path_start() {
// method macro.
- let last_span = self.last_span;
- self.complain_if_pub_macro(&vis, last_span);
+ let prev_span = self.prev_span;
+ self.complain_if_pub_macro(&vis, prev_span);
let lo = self.span.lo;
let pth = self.parse_path(PathStyle::Mod)?;
self.expect(&token::Semi)?
}
- let mac = spanned(lo, self.last_span.hi, Mac_ { path: pth, tts: tts });
+ let mac = spanned(lo, self.prev_span.hi, Mac_ { path: pth, tts: tts });
Ok((keywords::Invalid.ident(), vec![], ast::ImplItemKind::Macro(mac)))
} else {
let (constness, unsafety, abi) = self.parse_fn_front_matter()?;
Ok(ast::PolyTraitRef {
bound_lifetimes: lifetime_defs,
trait_ref: self.parse_trait_ref()?,
- span: mk_sp(lo, self.last_span.hi),
+ span: mk_sp(lo, self.prev_span.hi),
})
}
// If `allow_path` is false, just parse the `pub` in `pub(path)` (but still parse `pub(crate)`)
fn parse_visibility(&mut self, allow_path: bool) -> PResult<'a, Visibility> {
let pub_crate = |this: &mut Self| {
- let span = this.last_span;
+ let span = this.prev_span;
this.expect(&token::CloseDelim(token::Paren))?;
Ok(Visibility::Crate(span))
};
let hi = if self.span == syntax_pos::DUMMY_SP {
inner_lo
} else {
- self.last_span.hi
+ self.prev_span.hi
};
Ok(ast::Mod {
};
self.expect(&token::Semi)?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
Ok(self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
ItemKind::ExternCrate(maybe_path),
visibility,
}
self.expect(&token::CloseDelim(token::Brace))?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let m = ast::ForeignMod {
abi: abi,
items: foreign_items
};
Ok(self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
keywords::Invalid.ident(),
ItemKind::ForeignMod(m),
visibility,
data: struct_def,
disr_expr: disr_expr,
};
- variants.push(spanned(vlo, self.last_span.hi, vr));
+ variants.push(spanned(vlo, self.prev_span.hi, vr));
if !self.eat(&token::Comma) { break; }
}
match abi::lookup(&s.as_str()) {
Some(abi) => Ok(Some(abi)),
None => {
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
self.span_err(
- last_span,
+ prev_span,
&format!("invalid ABI: expected one of [{}], \
found `{}`",
abi::all_names().join(", "),
let item_ = ItemKind::Use(self.parse_view_path()?);
self.expect(&token::Semi)?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
keywords::Invalid.ident(),
item_,
visibility,
if self.eat_keyword(keywords::Fn) {
// EXTERN FUNCTION ITEM
- let fn_span = self.last_span;
+ let fn_span = self.prev_span;
let abi = opt_abi.unwrap_or(Abi::C);
let (ident, item_, extra_attrs) =
self.parse_item_fn(Unsafety::Normal,
respan(fn_span, Constness::NotConst),
abi)?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
Mutability::Immutable
};
let (ident, item_, extra_attrs) = self.parse_item_const(Some(m))?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
return Ok(Some(item));
}
if self.eat_keyword(keywords::Const) {
- let const_span = self.last_span;
+ let const_span = self.prev_span;
if self.check_keyword(keywords::Fn)
|| (self.check_keyword(keywords::Unsafe)
&& self.look_ahead(1, |t| t.is_keyword(keywords::Fn))) {
self.parse_item_fn(unsafety,
respan(const_span, Constness::Const),
Abi::Rust)?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
// CONST ITEM
if self.eat_keyword(keywords::Mut) {
- let last_span = self.last_span;
- self.diagnostic().struct_span_err(last_span, "const globals cannot be mutable")
+ let prev_span = self.prev_span;
+ self.diagnostic().struct_span_err(prev_span, "const globals cannot be mutable")
.help("did you mean to declare a static?")
.emit();
}
let (ident, item_, extra_attrs) = self.parse_item_const(None)?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
self.expect_keyword(keywords::Trait)?;
let (ident, item_, extra_attrs) =
self.parse_item_trait(ast::Unsafety::Unsafe)?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
self.expect_keyword(keywords::Unsafe)?;
self.expect_keyword(keywords::Impl)?;
let (ident, item_, extra_attrs) = self.parse_item_impl(ast::Unsafety::Unsafe)?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
if self.check_keyword(keywords::Fn) {
// FUNCTION ITEM
self.bump();
- let fn_span = self.last_span;
+ let fn_span = self.prev_span;
let (ident, item_, extra_attrs) =
self.parse_item_fn(Unsafety::Normal,
respan(fn_span, Constness::NotConst),
Abi::Rust)?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
Abi::Rust
};
self.expect_keyword(keywords::Fn)?;
- let fn_span = self.last_span;
+ let fn_span = self.prev_span;
let (ident, item_, extra_attrs) =
self.parse_item_fn(Unsafety::Unsafe,
respan(fn_span, Constness::NotConst),
abi)?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
// MODULE ITEM
let (ident, item_, extra_attrs) =
self.parse_item_mod(&attrs[..])?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
if self.eat_keyword(keywords::Type) {
// TYPE ITEM
let (ident, item_, extra_attrs) = self.parse_item_type()?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
if self.eat_keyword(keywords::Enum) {
// ENUM ITEM
let (ident, item_, extra_attrs) = self.parse_item_enum()?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
// TRAIT ITEM
let (ident, item_, extra_attrs) =
self.parse_item_trait(ast::Unsafety::Normal)?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
if self.eat_keyword(keywords::Impl) {
// IMPL ITEM
let (ident, item_, extra_attrs) = self.parse_item_impl(ast::Unsafety::Normal)?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
if self.eat_keyword(keywords::Struct) {
// STRUCT ITEM
let (ident, item_, extra_attrs) = self.parse_item_struct()?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
// UNION ITEM
self.bump();
let (ident, item_, extra_attrs) = self.parse_item_union()?;
- let last_span = self.last_span;
+ let prev_span = self.prev_span;
let item = self.mk_item(lo,
- last_span.hi,
+ prev_span.hi,
ident,
item_,
visibility,
if macros_allowed && self.token.is_path_start() {
// MACRO INVOCATION ITEM
- let last_span = self.last_span;
- self.complain_if_pub_macro(&visibility, last_span);
+ let prev_span = self.prev_span;
+ self.complain_if_pub_macro(&visibility, prev_span);
let mac_lo = self.span.lo;
|p| p.parse_token_tree())?;
if delim != token::Brace {
if !self.eat(&token::Semi) {
- let last_span = self.last_span;
- self.span_err(last_span,
+ let prev_span = self.prev_span;
+ self.span_err(prev_span,
"macros that expand to items must either \
be surrounded with braces or followed by \
a semicolon");
}
}
- let hi = self.last_span.hi;
+ let hi = self.prev_span.hi;
let mac = spanned(mac_lo, hi, Mac_ { path: pth, tts: tts });
let item = self.mk_item(lo, hi, id, ItemKind::Mac(mac), visibility, attrs);
return Ok(Some(item));
match visibility {
Visibility::Inherited => {}
_ => {
- let last_span = self.last_span;
- return Err(self.span_fatal(last_span, "unmatched visibility `pub`"));
+ let prev_span = self.prev_span;
+ return Err(self.span_fatal(prev_span, "unmatched visibility `pub`"));
}
}
rename: rename,
id: ast::DUMMY_NODE_ID
};
- let hi = this.last_span.hi;
+ let hi = this.prev_span.hi;
Ok(spanned(lo, hi, node))
})
}
// `foo::bar` or `foo::bar as baz`
let rename = self.parse_rename()?.
unwrap_or(prefix.segments.last().unwrap().identifier);
- Ok(P(spanned(lo, self.last_span.hi, ViewPathSimple(rename, prefix))))
+ Ok(P(spanned(lo, self.prev_span.hi, ViewPathSimple(rename, prefix))))
}
}
}
pub fn parse_str(&mut self) -> PResult<'a, (InternedString, StrStyle)> {
match self.parse_optional_str() {
Some((s, style, suf)) => {
- let sp = self.last_span;
+ let sp = self.prev_span;
self.expect_no_suffix(sp, "string literal", suf);
Ok((s, style))
}