diff --git a/src/generate/rust.rs b/src/generate/rust.rs index 66b9f01..93f8bdf 100644 --- a/src/generate/rust.rs +++ b/src/generate/rust.rs @@ -64,20 +64,18 @@ impl RuleWithNamedFields { .collect(); for (field, paths) in &self.fields { for path in paths { - if path.len() == 0 { - return None; - } - if path.len() == 1 { - if variants[path[0]].name != "" { - return None; + match path[..] { + [] => return None, + [variant] if variants[variant].name != "" => return None, + [variant] => variants[variant].name = field, + // FIXME: use [variant, rest @ ..] when possible. + _ => { + variants[path[0]] + .fields + .entry(&field[..]) + .or_insert_with(OrderSet::new) + .insert(path[1..].to_vec()); } - variants[path[0]].name = field; - } else { - variants[path[0]] - .fields - .entry(&field[..]) - .or_insert_with(OrderSet::new) - .insert(path[1..].to_vec()); } } } @@ -711,17 +709,12 @@ impl Rule { Thunk::new(move |cont| match (self, rc_self_and_rules) { (Rule::Empty, _) => cont, (Rule::Eat(pat), _) => { - // HACK(eddyb) remove extra variables post-NLL let pat = pat.rust_matcher(); - let cont = check(quote!(let Some(_range) = p.input_consume_left(_range, #pat))) - .apply(cont); - cont + check(quote!(let Some(_range) = p.input_consume_left(_range, #pat))).apply(cont) } (Rule::NegativeLookahead(pat), _) => { - // HACK(eddyb) remove extra variables post-NLL let pat = pat.rust_matcher(); - let cont = check(quote!(p.input_consume_left(_range, #pat).is_none())).apply(cont); - cont + check(quote!(p.input_consume_left(_range, #pat).is_none())).apply(cont) } (Rule::Call(r), _) => call(Rc::new(CodeLabel::NamedRule(r.clone()))).apply(cont), (Rule::Concat([left, right]), None) => { diff --git a/src/generate/src.rs b/src/generate/src.rs index 7d64ff6..6b14c8f 100644 --- a/src/generate/src.rs +++ b/src/generate/src.rs @@ -296,10 +296,8 @@ impl Src { }; if new_line { frag.lines.push(Line::default()); - } else { - if !frag.last().is_empty() { - frag.push(Elem::Char(' ', Spacing::Alone)); - } + } else if !frag.last().is_empty() { + frag.push(Elem::Char(' ', Spacing::Alone)); } } } diff --git a/src/indexing_str.rs b/src/indexing_str.rs index f0bc6d8..1cbaf26 100644 --- a/src/indexing_str.rs +++ b/src/indexing_str.rs @@ -33,7 +33,7 @@ unsafe impl Contiguous for Str { self.0.as_ptr() } fn end(&self) -> *const Self::Item { - unsafe { self.begin().offset(self.0.len() as isize) } + unsafe { self.begin().add(self.0.len()) } } fn as_slice(&self) -> &[Self::Item] { self.0.as_bytes() diff --git a/src/runtime.rs b/src/runtime.rs index 365e29e..422ec63 100644 --- a/src/runtime.rs +++ b/src/runtime.rs @@ -61,7 +61,7 @@ impl fmt::Debug for LineColumn { impl LineColumn { fn count(prefix: &str) -> Self { let (line, column) = prefix - .split("\n") + .split('\n') .enumerate() .last() .map_or((0, 0), |(i, s)| (i, s.chars().count())); @@ -407,7 +407,8 @@ impl<'i, C: CodeLabel> Threads<'i, C> { let old = self.seen.iter().rev().next().cloned(); if let Some(old) = old { // TODO also check end point for proper "t.range includes old.range". - if !t.range.contains(old.range.start()).is_some() { + let new_includes_old = t.range.contains(old.range.start()).is_some(); + if !new_includes_old { self.seen.remove(&old); continue; }