Handle interpolated paths in pattern parsing. Fixes #3007.

We might need to use is_ident_or_path in a for other places too.
This commit is contained in:
Eric Holk 2012-08-06 13:09:10 -07:00
parent 4544c015b3
commit 517ad983f9
3 changed files with 12 additions and 3 deletions

View File

@ -73,7 +73,8 @@ fn generic_extension(cx: ext_ctxt, sp: span, arg: ~[ast::token_tree],
~[rhs]);
let p = parser(cx.parse_sess(), cx.cfg(),
trncbr as reader, SOURCE_FILE);
return mr_expr(p.parse_expr());
let e = p.parse_expr();
return mr_expr(e);
}
failure(sp, msg) => if sp.lo >= best_fail_spot.lo {
best_fail_spot = sp;

View File

@ -3,7 +3,8 @@
import result::result;
import either::{either, left, right};
import std::map::{hashmap, str_hash};
import token::{can_begin_expr, is_ident, is_plain_ident, INTERPOLATED};
import token::{can_begin_expr, is_ident, is_ident_or_path, is_plain_ident,
INTERPOLATED};
import codemap::{span,fss_none};
import util::interner;
import ast_util::{spanned, respan, mk_sp, ident_to_path, operator_prec};
@ -1748,7 +1749,7 @@ fn parse_pat(refutable: bool) -> @pat {
}
}
tok => {
if !is_ident(tok) ||
if !is_ident_or_path(tok) ||
self.is_keyword(~"true") || self.is_keyword(~"false") {
let val = self.parse_expr_res(RESTRICT_NO_BAR_OP);
if self.eat_keyword(~"to") {

View File

@ -262,6 +262,13 @@ fn is_lit(t: token) -> bool {
alt t { IDENT(_, _) => true, _ => false }
}
pure fn is_ident_or_path(t: token) -> bool {
alt t {
IDENT(_, _) | INTERPOLATED(nt_path(*)) => true,
_ => false
}
}
pure fn is_plain_ident(t: token) -> bool {
alt t { IDENT(_, false) => true, _ => false }
}