Generated code spans now point to callsite parameters (where applicable)
This commit is contained in:
parent
9267a3a222
commit
2dcd791d46
@ -79,8 +79,8 @@ pub use self::ParseResult::*;
|
||||
use self::TokenTreeOrTokenTreeVec::*;
|
||||
|
||||
use ast;
|
||||
use ast::{TokenTree, Name};
|
||||
use codemap::{BytePos, mk_sp, Span};
|
||||
use ast::{TokenTree, Name, Ident};
|
||||
use codemap::{BytePos, mk_sp, Span, Spanned};
|
||||
use codemap;
|
||||
use parse::lexer::*; //resolve bug?
|
||||
use parse::ParseSess;
|
||||
@ -526,7 +526,10 @@ pub fn parse_nt(p: &mut Parser, sp: Span, name: &str) -> Nonterminal {
|
||||
"ty" => token::NtTy(panictry!(p.parse_ty())),
|
||||
// this could be handled like a token, since it is one
|
||||
"ident" => match p.token {
|
||||
token::Ident(sn,b) => { panictry!(p.bump()); token::NtIdent(Box::new(sn),b) }
|
||||
token::Ident(sn,b) => {
|
||||
panictry!(p.bump());
|
||||
token::NtIdent(Box::new(Spanned::<Ident>{node: sn, span: p.span}),b)
|
||||
}
|
||||
_ => {
|
||||
let token_str = pprust::token_to_string(&p.token);
|
||||
panic!(p.fatal(&format!("expected ident, found {}",
|
||||
|
@ -293,8 +293,8 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
|
||||
// (a) idents can be in lots of places, so it'd be a pain
|
||||
// (b) we actually can, since it's a token.
|
||||
MatchedNonterminal(NtIdent(ref sn, b)) => {
|
||||
r.cur_span = sp;
|
||||
r.cur_tok = token::Ident(**sn, b);
|
||||
r.cur_span = sn.span;
|
||||
r.cur_tok = token::Ident(sn.node, b);
|
||||
return ret_val;
|
||||
}
|
||||
MatchedNonterminal(ref other_whole_nt) => {
|
||||
|
@ -663,7 +663,8 @@ pub fn noop_fold_interpolated<T: Folder>(nt: token::Nonterminal, fld: &mut T)
|
||||
token::NtExpr(expr) => token::NtExpr(fld.fold_expr(expr)),
|
||||
token::NtTy(ty) => token::NtTy(fld.fold_ty(ty)),
|
||||
token::NtIdent(id, is_mod_name) =>
|
||||
token::NtIdent(Box::new(fld.fold_ident(*id)), is_mod_name),
|
||||
token::NtIdent(Box::new(Spanned::<Ident>{node: fld.fold_ident(id.node), .. *id}),
|
||||
is_mod_name),
|
||||
token::NtMeta(meta_item) => token::NtMeta(fld.fold_meta_item(meta_item)),
|
||||
token::NtPath(path) => token::NtPath(Box::new(fld.fold_path(*path))),
|
||||
token::NtTT(tt) => token::NtTT(P(fld.fold_tt(&tt))),
|
||||
|
@ -377,7 +377,7 @@ pub enum Nonterminal {
|
||||
NtPat(P<ast::Pat>),
|
||||
NtExpr(P<ast::Expr>),
|
||||
NtTy(P<ast::Ty>),
|
||||
NtIdent(Box<ast::Ident>, IdentStyle),
|
||||
NtIdent(Box<ast::SpannedIdent>, IdentStyle),
|
||||
/// Stuff inside brackets for attributes
|
||||
NtMeta(P<ast::MetaItem>),
|
||||
NtPath(Box<ast::Path>),
|
||||
|
@ -296,7 +296,7 @@ pub fn token_to_string(tok: &Token) -> String {
|
||||
token::NtBlock(ref e) => block_to_string(&**e),
|
||||
token::NtStmt(ref e) => stmt_to_string(&**e),
|
||||
token::NtPat(ref e) => pat_to_string(&**e),
|
||||
token::NtIdent(ref e, _) => ident_to_string(**e),
|
||||
token::NtIdent(ref e, _) => ident_to_string(e.node),
|
||||
token::NtTT(ref e) => tt_to_string(&**e),
|
||||
token::NtArm(ref e) => arm_to_string(&*e),
|
||||
token::NtImplItem(ref e) => impl_item_to_string(&**e),
|
||||
|
23
src/test/compile-fail/macro-parameter-span.rs
Normal file
23
src/test/compile-fail/macro-parameter-span.rs
Normal file
@ -0,0 +1,23 @@
|
||||
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
macro_rules! foo {
|
||||
($id: ident) => {
|
||||
$id
|
||||
}
|
||||
}
|
||||
|
||||
// Testing that the error span points to the parameter 'x' in the callsite,
|
||||
// not to the macro variable '$id'
|
||||
fn main() {
|
||||
foo!(
|
||||
x //~ ERROR unresolved name `x`
|
||||
);
|
||||
}
|
Loading…
Reference in New Issue
Block a user