Allow indices as struct literal keys
diff --git a/src/expr.rs b/src/expr.rs
index 5ccb227..ece698c 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -312,7 +312,7 @@
TokenTree, Ty, UnOp};
use attr::parsing::outer_attr;
use generics::parsing::lifetime;
- use ident::parsing::ident;
+ use ident::parsing::{ident, wordlike};
use item::parsing::item;
use lit::parsing::{digits, lit};
use mac::parsing::{mac, token_trees};
@@ -729,7 +729,7 @@
));
named!(field_value -> FieldValue, do_parse!(
- name: ident >>
+ name: wordlike >>
punct!(":") >>
value: expr >>
(FieldValue {
@@ -984,7 +984,7 @@
named!(field_pat -> FieldPat, alt!(
do_parse!(
- ident: ident >>
+ ident: wordlike >>
punct!(":") >>
pat: pat >>
(FieldPat {
diff --git a/src/ident.rs b/src/ident.rs
index e61a11c..dec783a 100644
--- a/src/ident.rs
+++ b/src/ident.rs
@@ -90,6 +90,22 @@
IResult::Done("", input.into())
}
+
+ pub fn wordlike(mut input: &str) -> IResult<&str, Ident> {
+ input = skip_whitespace(input);
+
+ for (i, ch) in input.char_indices() {
+ if !UnicodeXID::is_xid_start(ch) && !UnicodeXID::is_xid_continue(ch) {
+ return if i == 0 {
+ IResult::Error
+ } else {
+ IResult::Done(&input[i..], input[..i].into())
+ };
+ }
+ }
+
+ IResult::Done("", input.into())
+ }
}
#[cfg(feature = "printing")]