Disallow numbers in Ident
diff --git a/src/expr.rs b/src/expr.rs
index e50cf3a..6ce0390 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -1,8 +1,7 @@
use super::*;
use delimited::Delimited;
-#[cfg(feature = "full")]
use proc_macro2::Span;
-#[cfg(feature = "full")]
+#[cfg(feature = "extra-traits")]
use std::hash::{Hash, Hasher};
ast_enum_of_structs! {
@@ -423,7 +422,6 @@
}
}
-#[cfg(feature = "full")]
ast_enum! {
/// A struct or tuple struct field accessed in a struct literal or field
/// expression.
@@ -435,7 +433,6 @@
}
}
-#[cfg(feature = "full")]
ast_struct! {
/// The index of an unnamed tuple struct field.
pub struct Index #manual_extra_traits {
@@ -444,17 +441,27 @@
}
}
-#[cfg(feature = "full")]
+impl From<usize> for Index {
+ fn from(index: usize) -> Index {
+ assert!(index < std::u32::MAX as usize);
+ Index {
+ index: index as u32,
+ span: Span::default(),
+ }
+ }
+}
+
+#[cfg(feature = "extra-traits")]
impl Eq for Index {}
-#[cfg(feature = "full")]
+#[cfg(feature = "extra-traits")]
impl PartialEq for Index {
fn eq(&self, other: &Self) -> bool {
self.index == other.index
}
}
-#[cfg(feature = "full")]
+#[cfg(feature = "extra-traits")]
impl Hash for Index {
fn hash<H: Hasher>(&self, state: &mut H) {
self.index.hash(state);
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 90a3393..9f4f9cb 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -209,7 +209,7 @@
fn fold_impl_item_type(&mut self, i: ImplItemType) -> ImplItemType { fold_impl_item_type(self, i) }
# [ cfg ( feature = "full" ) ]
fn fold_impl_polarity(&mut self, i: ImplPolarity) -> ImplPolarity { fold_impl_polarity(self, i) }
-# [ cfg ( feature = "full" ) ]
+
fn fold_index(&mut self, i: Index) -> Index { fold_index(self, i) }
# [ cfg ( feature = "full" ) ]
fn fold_item(&mut self, i: Item) -> Item { fold_item(self, i) }
@@ -255,7 +255,7 @@
fn fold_local(&mut self, i: Local) -> Local { fold_local(self, i) }
fn fold_macro(&mut self, i: Macro) -> Macro { fold_macro(self, i) }
-# [ cfg ( feature = "full" ) ]
+
fn fold_member(&mut self, i: Member) -> Member { fold_member(self, i) }
fn fold_meta_item(&mut self, i: MetaItem) -> MetaItem { fold_meta_item(self, i) }
@@ -1660,7 +1660,7 @@
}
}
}
-# [ cfg ( feature = "full" ) ]
+
pub fn fold_index<V: Folder + ?Sized>(_visitor: &mut V, _i: Index) -> Index {
Index {
index: _i . index,
@@ -2003,7 +2003,7 @@
tokens: _i . tokens,
}
}
-# [ cfg ( feature = "full" ) ]
+
pub fn fold_member<V: Folder + ?Sized>(_visitor: &mut V, _i: Member) -> Member {
use ::Member::*;
match _i {
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 1a9609e..3e57446 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -205,7 +205,7 @@
fn visit_impl_item_type(&mut self, i: &'ast ImplItemType) { visit_impl_item_type(self, i) }
# [ cfg ( feature = "full" ) ]
fn visit_impl_polarity(&mut self, i: &'ast ImplPolarity) { visit_impl_polarity(self, i) }
-# [ cfg ( feature = "full" ) ]
+
fn visit_index(&mut self, i: &'ast Index) { visit_index(self, i) }
# [ cfg ( feature = "full" ) ]
fn visit_item(&mut self, i: &'ast Item) { visit_item(self, i) }
@@ -251,7 +251,7 @@
fn visit_local(&mut self, i: &'ast Local) { visit_local(self, i) }
fn visit_macro(&mut self, i: &'ast Macro) { visit_macro(self, i) }
-# [ cfg ( feature = "full" ) ]
+
fn visit_member(&mut self, i: &'ast Member) { visit_member(self, i) }
fn visit_meta_item(&mut self, i: &'ast MetaItem) { visit_meta_item(self, i) }
@@ -1320,7 +1320,7 @@
}
}
}
-# [ cfg ( feature = "full" ) ]
+
pub fn visit_index<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Index) {
// Skipped field _i . index;
_visitor.visit_span(& _i . span);
@@ -1587,7 +1587,7 @@
tokens_helper(_visitor, &(& _i . bang_token).0);
// Skipped field _i . tokens;
}
-# [ cfg ( feature = "full" ) ]
+
pub fn visit_member<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Member) {
use ::Member::*;
match *_i {
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index a82f430..ec32603 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -205,7 +205,7 @@
fn visit_impl_item_type_mut(&mut self, i: &mut ImplItemType) { visit_impl_item_type_mut(self, i) }
# [ cfg ( feature = "full" ) ]
fn visit_impl_polarity_mut(&mut self, i: &mut ImplPolarity) { visit_impl_polarity_mut(self, i) }
-# [ cfg ( feature = "full" ) ]
+
fn visit_index_mut(&mut self, i: &mut Index) { visit_index_mut(self, i) }
# [ cfg ( feature = "full" ) ]
fn visit_item_mut(&mut self, i: &mut Item) { visit_item_mut(self, i) }
@@ -251,7 +251,7 @@
fn visit_local_mut(&mut self, i: &mut Local) { visit_local_mut(self, i) }
fn visit_macro_mut(&mut self, i: &mut Macro) { visit_macro_mut(self, i) }
-# [ cfg ( feature = "full" ) ]
+
fn visit_member_mut(&mut self, i: &mut Member) { visit_member_mut(self, i) }
fn visit_meta_item_mut(&mut self, i: &mut MetaItem) { visit_meta_item_mut(self, i) }
@@ -1320,7 +1320,7 @@
}
}
}
-# [ cfg ( feature = "full" ) ]
+
pub fn visit_index_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Index) {
// Skipped field _i . index;
_visitor.visit_span_mut(& mut _i . span);
@@ -1587,7 +1587,7 @@
tokens_helper(_visitor, &mut (& mut _i . bang_token).0);
// Skipped field _i . tokens;
}
-# [ cfg ( feature = "full" ) ]
+
pub fn visit_member_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Member) {
use ::Member::*;
match *_i {
diff --git a/src/ident.rs b/src/ident.rs
index 3861b41..5d85b48 100644
--- a/src/ident.rs
+++ b/src/ident.rs
@@ -109,6 +109,10 @@
panic!("`_` is not a valid ident; use syn::token::Underscore");
}
+ if s.bytes().all(|digit| digit >= b'0' && digit <= b'9') {
+ panic!("ident cannot be a number, use syn::Index instead");
+ }
+
fn xid_ok(s: &str) -> bool {
let mut chars = s.chars();
let first = chars.next().unwrap();
@@ -123,11 +127,7 @@
true
}
- fn integer_ok(s: &str) -> bool {
- s.bytes().all(|digit| digit >= b'0' && digit <= b'9')
- }
-
- if !(xid_ok(s) || integer_ok(s)) {
+ if !xid_ok(s) {
panic!("{:?} is not a valid ident", s);
}
diff --git a/src/lib.rs b/src/lib.rs
index 8350b7b..71f47cc 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -38,11 +38,11 @@
ExprField, ExprForLoop, ExprGroup, ExprIf, ExprIfLet, ExprInPlace, ExprIndex,
ExprLit, ExprLoop, ExprMacro, ExprMatch, ExprMethodCall, ExprParen, ExprPath, ExprRange,
ExprRepeat, ExprReturn, ExprStruct, ExprTry, ExprTuple, ExprType,
- ExprUnary, ExprUnsafe, ExprWhile, ExprWhileLet, ExprYield};
+ ExprUnary, ExprUnsafe, ExprWhile, ExprWhileLet, ExprYield, Index, Member};
#[cfg(feature = "full")]
-pub use expr::{Arm, BindingMode, Block, CaptureBy, FieldPat, FieldValue, GenericMethodArgument, Index, Local,
- Member, MethodTurbofish, Pat, PatBox, PatIdent, PatLit, PatPath, PatRange, PatRef, PatSlice,
+pub use expr::{Arm, BindingMode, Block, CaptureBy, FieldPat, FieldValue, GenericMethodArgument, Local,
+ MethodTurbofish, Pat, PatBox, PatIdent, PatLit, PatPath, PatRange, PatRef, PatSlice,
PatStruct, PatTuple, PatTupleStruct, PatWild, RangeLimits, Stmt};
mod generics;