diff options
| author | Martin Haug <mhaug@live.de> | 2021-10-31 11:46:12 +0100 |
|---|---|---|
| committer | Martin Haug <mhaug@live.de> | 2021-11-05 13:44:49 +0100 |
| commit | 84d35efee38d137a77e368c50421ac24327371c6 (patch) | |
| tree | c2fa9f669743d35cbb79892770427dd843202894 /src/syntax/pretty.rs | |
| parent | 4875633acf4701705b9b3b014eb7d94268b897c2 (diff) | |
Less owning, more iterating
Diffstat (limited to 'src/syntax/pretty.rs')
| -rw-r--r-- | src/syntax/pretty.rs | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/src/syntax/pretty.rs b/src/syntax/pretty.rs index b1c7e02b..db364eaa 100644 --- a/src/syntax/pretty.rs +++ b/src/syntax/pretty.rs @@ -46,20 +46,25 @@ impl Printer { Write::write_fmt(self, fmt) } - /// Write a list of items joined by a joiner. - pub fn join<T, I, F>(&mut self, items: I, joiner: &str, mut write_item: F) + /// Write a list of items joined by a joiner and return how many there were. + pub fn join<T, I, F>(&mut self, items: I, joiner: &str, mut write_item: F) -> usize where I: IntoIterator<Item = T>, F: FnMut(T, &mut Self), { + let mut count = 0; let mut iter = items.into_iter(); if let Some(first) = iter.next() { write_item(first, self); + count += 1; } for item in iter { self.push_str(joiner); write_item(item, self); + count += 1; } + + count } /// Finish pretty printing and return the underlying buffer. @@ -165,7 +170,7 @@ impl Pretty for RawNode { impl Pretty for HeadingNode { fn pretty(&self, p: &mut Printer) { - for _ in 0 .. self.level().0 { + for _ in 0 .. self.level() { p.push('='); } p.push(' '); @@ -182,7 +187,7 @@ impl Pretty for ListNode { impl Pretty for EnumNode { fn pretty(&self, p: &mut Printer) { - if let Some(number) = self.number().0 { + if let Some(number) = self.number() { write!(p, "{}", number).unwrap(); } p.push_str(". "); @@ -237,8 +242,8 @@ impl Pretty for ArrayExpr { p.push('('); let items = self.items(); - p.join(&items, ", ", |item, p| item.pretty(p)); - if items.len() == 1 { + let len = p.join(items, ", ", |item, p| item.pretty(p)); + if len == 1 { p.push(','); } p.push(')'); @@ -249,11 +254,11 @@ impl Pretty for DictExpr { fn pretty(&self, p: &mut Printer) { p.push('('); - let items = self.items(); - if items.is_empty() { + let mut items = self.items().peekable(); + if items.peek().is_none() { p.push(':'); } else { - p.join(&items, ", ", |named, p| named.pretty(p)); + p.join(items, ", ", |named, p| named.pretty(p)); } p.push(')'); } @@ -287,7 +292,7 @@ impl Pretty for BlockExpr { fn pretty(&self, p: &mut Printer) { p.push('{'); - let exprs = self.exprs(); + let exprs: Vec<_> = self.exprs().collect(); if exprs.len() > 1 { p.push(' '); } @@ -342,8 +347,7 @@ impl Pretty for CallExpr { p.push(')'); }; - let arg_list = self.args(); - let args = arg_list.items(); + let args: Vec<_> = self.args().items().collect(); if let Some(Expr::Template(template)) = args .last() @@ -361,7 +365,7 @@ impl Pretty for CallExpr { impl Pretty for CallArgs { fn pretty(&self, p: &mut Printer) { - p.join(&self.items(), ", ", |item, p| item.pretty(p)); + p.join(self.items(), ", ", |item, p| item.pretty(p)); } } @@ -380,11 +384,12 @@ impl Pretty for CallArg { impl Pretty for ClosureExpr { fn pretty(&self, p: &mut Printer) { - if let [param] = self.params().as_slice() { + let params: Vec<_> = self.params().collect(); + if let [param] = params.as_slice() { param.pretty(p); } else { p.push('('); - p.join(self.params().iter(), ", ", |item, p| item.pretty(p)); + p.join(params.iter(), ", ", |item, p| item.pretty(p)); p.push(')'); } p.push_str(" => "); @@ -420,7 +425,7 @@ impl Pretty for LetExpr { self.binding().pretty(p); if let Some(Expr::Closure(closure)) = &self.init() { p.push('('); - p.join(closure.params().iter(), ", ", |item, p| item.pretty(p)); + p.join(closure.params(), ", ", |item, p| item.pretty(p)); p.push_str(") = "); closure.body().pretty(p); } else if let Some(init) = &self.init() { @@ -487,7 +492,9 @@ impl Pretty for Imports { fn pretty(&self, p: &mut Printer) { match self { Self::Wildcard => p.push('*'), - Self::Idents(idents) => p.join(idents, ", ", |item, p| item.pretty(p)), + Self::Idents(idents) => { + p.join(idents, ", ", |item, p| item.pretty(p)); + } } } } |
