12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- use super::algorithm::Printer;
- use syn::{Expr, Stmt};
- impl Printer {
- pub fn stmt(&mut self, stmt: &Stmt) {
- match stmt {
- Stmt::Local(local) => {
- self.outer_attrs(&local.attrs);
- self.ibox(0);
- self.word("let ");
- self.pat(&local.pat);
- if let Some((_eq, init)) = &local.init {
- self.word(" = ");
- self.neverbreak();
- self.expr(init);
- }
- self.word(";");
- self.end();
- self.hardbreak();
- }
- Stmt::Item(item) => self.item(item),
- Stmt::Expr(expr) => {
- if break_after(expr) {
- self.ibox(0);
- self.expr_beginning_of_line(expr, true);
- if add_semi(expr) {
- self.word(";");
- }
- self.end();
- self.hardbreak();
- } else {
- self.expr_beginning_of_line(expr, true);
- }
- }
- Stmt::Semi(expr, _semi) => {
- if let Expr::Verbatim(tokens) = expr {
- if tokens.is_empty() {
- return;
- }
- }
- self.ibox(0);
- self.expr_beginning_of_line(expr, true);
- if !remove_semi(expr) {
- self.word(";");
- }
- self.end();
- self.hardbreak();
- }
- }
- }
- }
- pub fn add_semi(expr: &Expr) -> bool {
- match expr {
- Expr::Assign(_)
- | Expr::AssignOp(_)
- | Expr::Break(_)
- | Expr::Continue(_)
- | Expr::Return(_)
- | Expr::Yield(_) => true,
- Expr::Group(group) => add_semi(&group.expr),
- _ => false,
- }
- }
- pub fn break_after(expr: &Expr) -> bool {
- if let Expr::Group(group) = expr {
- if let Expr::Verbatim(verbatim) = group.expr.as_ref() {
- return !verbatim.is_empty();
- }
- }
- true
- }
- fn remove_semi(expr: &Expr) -> bool {
- match expr {
- Expr::ForLoop(_) | Expr::While(_) => true,
- Expr::Group(group) => remove_semi(&group.expr),
- Expr::If(expr) => match &expr.else_branch {
- Some((_else_token, else_branch)) => remove_semi(else_branch),
- None => true,
- },
- _ => false,
- }
- }
|