Make handling of Comments
more iterator-like.
The current way of stepping through each comment in `Comments` is a bit weird. There is a `Vec<Comments>` and a `current` index, which is fine. The `Comments::next` method clones the current comment but doesn't advance `current`; the advancing instead happens in `print_comment`, which is where each cloned comment is actually finally used (or not, in some cases, if the comment fails to satisfy a predicate). This commit makes things more iterator-like: - `Comments::next` now advances `current` instead of `print_comment`. - `Comments::peek` is added so you can inspect a comment and check a predicate without consuming it. - This requires splitting `PrintState::comments` into immutable and mutable versions. The commit also moves the ref inside the `Option` of the return type, to save callers from having to use `as_ref`/`as_mut`. - It also requires adding `PrintState::peek_comment` alongside the existing `PrintState::next_comment`. (The lifetimes in the signature of `peek_comment` ended up more complex than I expected.) We now have a neat separation between consuming (`next`) and non-consuming (`peek`) uses of each comment. As well as being clearer, this will facilitate the next commit that avoids unnecessary cloning.
This commit is contained in:
parent
852a78ea8d
commit
5e7a80b2d2
2 changed files with 40 additions and 24 deletions
|
@ -139,8 +139,12 @@ impl std::ops::DerefMut for State<'_> {
|
|||
}
|
||||
|
||||
impl<'a> PrintState<'a> for State<'a> {
|
||||
fn comments(&mut self) -> &mut Option<Comments<'a>> {
|
||||
&mut self.comments
|
||||
fn comments(&self) -> Option<&Comments<'a>> {
|
||||
self.comments.as_ref()
|
||||
}
|
||||
|
||||
fn comments_mut(&mut self) -> Option<&mut Comments<'a>> {
|
||||
self.comments.as_mut()
|
||||
}
|
||||
|
||||
fn ann_post(&mut self, ident: Ident) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue