From: Eric Holk Date: Mon, 6 Aug 2012 20:09:10 +0000 (-0700) Subject: Handle interpolated paths in pattern parsing. Fixes #3007. X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=517ad983f9f5ac7f805dd15cf6c6a156e02e3ec8;hp=4544c015b3bd45b18612ede3e0c091ec3ee27e8a;p=rust.git Handle interpolated paths in pattern parsing. Fixes #3007. We might need to use is_ident_or_path in a for other places too. --- diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index 7655d7c970c..b4fc1f5c484 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -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; diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 71bd87981bc..4a34b667937 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -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") { diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index d69ff7f1668..9e9a3bbca56 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -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 } }